Split app.svelte into smaller pieces, nest components under ui

This commit is contained in:
Jonathan Staab 2023-04-10 09:36:01 -05:00
parent 859fc921ac
commit 35f1431ae2
100 changed files with 594 additions and 573 deletions

View File

@ -1,5 +1,8 @@
# Current
- [ ] Refactor
- Move global modals to child components?
- [ ] Relays bounty
- [ ] Ability to create custom feeds
- [ ] Fix tag-style event mentions. Probably transform all mentions into entities in parse

View File

@ -1,317 +0,0 @@
<script lang="ts">
import "@fortawesome/fontawesome-free/css/fontawesome.css"
import "@fortawesome/fontawesome-free/css/solid.css"
import {onMount} from "svelte"
import {Router, Route, links, navigate} from "svelte-routing"
import {globalHistory} from "svelte-routing/src/history"
import {cubicInOut} from "svelte/easing"
import {writable, get} from "svelte/store"
import {fly, fade} from "svelte/transition"
import {createMap, first} from "hurdak/lib/hurdak"
import {find, is, identity, nthArg, pluck} from "ramda"
import {log, warn} from "src/util/logger"
import {timedelta, hexToBech32, bech32ToHex, shuffle, now, sleep} from "src/util/misc"
import {displayPerson, Tags, isLike} from "src/util/nostr"
import cmd from "src/agent/cmd"
import {onReady, relays, people} from "src/agent/tables"
import keys from "src/agent/keys"
import network from "src/agent/network"
import pool from "src/agent/pool"
import {getUserRelays, initializeRelayList} from "src/agent/relays"
import sync from "src/agent/sync"
import * as tables from "src/agent/tables"
import user from "src/agent/user"
import {loadAppData} from "src/app"
import {theme, getThemeVariables} from "src/app/ui"
import {modal, openModals, routes, menuIsOpen, logUsage} from "src/app/ui"
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import Modal from "src/partials/Modal.svelte"
import Spinner from "src/partials/Spinner.svelte"
import Notifications from "src/routes/Notifications.svelte"
import Bech32Entity from "src/routes/Bech32Entity.svelte"
import ChatDetail from "src/routes/ChatDetail.svelte"
import ChatList from "src/routes/ChatList.svelte"
import Debug from "src/routes/Debug.svelte"
import Feeds from "src/routes/Feeds.svelte"
import Keys from "src/routes/Keys.svelte"
import Login from "src/routes/Login.svelte"
import Logout from "src/routes/Logout.svelte"
import MessagesDetail from "src/routes/MessagesDetail.svelte"
import MessagesList from "src/routes/MessagesList.svelte"
import NotFound from "src/routes/NotFound.svelte"
import PersonDetail from "src/routes/PersonDetail.svelte"
import Search from "src/routes/Search.svelte"
import Scan from "src/routes/Scan.svelte"
import RelayDetail from "src/routes/RelayDetail.svelte"
import RelayList from "src/routes/RelayList.svelte"
import EnsureData from "src/views/EnsureData.svelte"
import Profile from "src/views/Profile.svelte"
import Settings from "src/views/Settings.svelte"
import SideNav from "src/views/SideNav.svelte"
import Toast from "src/views/Toast.svelte"
import TopNav from "src/views/TopNav.svelte"
import ChatEdit from "src/views/chat/ChatEdit.svelte"
import ConnectUser from "src/views/login/ConnectUser.svelte"
import PrivKeyLogin from "src/views/login/PrivKeyLogin.svelte"
import PubKeyLogin from "src/views/login/PubKeyLogin.svelte"
import Onboarding from "src/views/onboarding/Onboarding.svelte"
import ForegroundButtons from "src/views/notes/ForegroundButtons.svelte"
import NoteCreate from "src/views/notes/NoteCreate.svelte"
import NoteDetail from "src/views/notes/NoteDetail.svelte"
import PersonList from "src/views/person/PersonList.svelte"
import PersonProfileInfo from "src/views/person/PersonProfileInfo.svelte"
import PersonShare from "src/views/person/PersonShare.svelte"
import AddRelay from "src/views/relays/AddRelay.svelte"
Object.assign(window, {cmd, user, keys, network, pool, sync, tables, bech32ToHex, hexToBech32})
export let url = location.pathname
let ready = false
let scrollY
const closeModal = async () => {
modal.clear()
menuIsOpen.set(false)
}
const style = document.createElement("style")
document.head.append(style)
$: style.textContent = `:root { ${getThemeVariables($theme)}; background: var(--gray-8); }`
const seenChallenges = new Set()
// When we get an AUTH challenge from our pool, attempt to authenticate
pool.Config.authHandler = async (url, challenge) => {
if (keys.canSign() && !seenChallenges.has(challenge)) {
seenChallenges.add(challenge)
const publishable = await cmd.authenticate(url, challenge)
return first(publishable.publish([{url}], null, "AUTH"))
}
}
onMount(() => {
// Log modals
const unsubModal = modal.subscribe($modal => {
if ($modal) {
logUsage(btoa(["modal", $modal.type].join(":")))
}
})
// Keep scroll position on body, but don't allow scrolling
const unsubOpenModals = openModals.subscribe(n => {
if (n > 0) {
// This is not idempotent, so don't duplicate it
if (document.body.style.position !== "fixed") {
scrollY = window.scrollY
document.body.style.top = `-${scrollY}px`
document.body.style.position = `fixed`
}
} else {
document.body.setAttribute("style", "")
window.scrollTo(0, scrollY)
}
})
// Remove identifying information, e.g. pubkeys, event ids, etc
const getPageName = () =>
location.pathname.slice(1).replace(/(npub|nprofile|note|nevent)[^\/]+/g, (_, m) => `<${m}>`)
// Log usage on navigate
const unsubHistory = globalHistory.listen(({location}) => {
url = location.pathname
if (!location.hash) {
logUsage(btoa(["page", getPageName()].join(":")))
}
})
logUsage(btoa(["page", getPageName()].join(":")))
return () => {
unsubHistory()
unsubModal()
unsubOpenModals()
}
})
onReady(() => {
ready = true
initializeRelayList()
const pubkey = user.getPubkey()
if (pubkey) {
loadAppData(pubkey)
const person = people.get(pubkey)
// Temporary migration for version 0.2.18. We changed where user profile
// is stored, so if they appear to have an incomplete profile on page load,
// go ahead and copy the person record over.
if (person && user.getRelays().length === 0) {
user.profile.update($p => ({...$p, ...person}))
}
}
const interval = setInterval(async () => {
const {dufflepudUrl} = user.getSettings()
if (!dufflepudUrl) {
return
}
// Find relays with old/missing metadata and refresh them. Only pick a
// few so we're not sending too many concurrent http requests
const staleRelays = shuffle(
await relays.all({
"refreshed_at:lt": now() - timedelta(7, "days"),
})
).slice(0, 10)
const freshRelays = await Promise.all(
staleRelays.map(async ({url}) => {
try {
const res = await fetch(dufflepudUrl + "/relay/info", {
method: "POST",
body: JSON.stringify({url}),
headers: {
"Content-Type": "application/json",
},
})
return {...(await res.json()), url, refreshed_at: now()}
} catch (e) {
if (!e.toString().includes("Failed to fetch")) {
warn(e)
}
return {url, refreshed_at: now()}
}
})
)
relays.bulkPatch(freshRelays.filter(identity))
}, 30_000)
return () => {
clearInterval(interval)
}
})
</script>
<Router {url}>
<div use:links>
{#if ready}
<div class="pt-16 text-gray-3 lg:ml-56">
<Route path="/notifications" component={Notifications} />
<Route path="/search">
<EnsureData enforcePeople={false}>
<Search />
</EnsureData>
</Route>
<Route path="/scan">
<EnsureData enforcePeople={false}>
<Scan />
</EnsureData>
</Route>
<Route path="/notes/:activeTab" let:params>
<EnsureData>
<Feeds activeTab={params.activeTab} />
</EnsureData>
</Route>
<Route path="/people/:npub/:activeTab" let:params>
{#key params.npub}
<PersonDetail npub={params.npub} activeTab={params.activeTab} />
{/key}
</Route>
<Route path="/chat" component={ChatList} />
<Route path="/chat/:entity" let:params>
{#key params.entity}
<ChatDetail entity={params.entity} />
{/key}
</Route>
<Route path="/messages" component={MessagesList} />
<Route path="/messages/:entity" let:params>
{#key params.entity}
<MessagesDetail entity={params.entity} />
{/key}
</Route>
<Route path="/keys" component={Keys} />
<Route path="/relays" component={RelayList} />
<Route path="/relays/:b64url" let:params>
{#key params.b64url}
<RelayDetail url={atob(params.b64url)} />
{/key}
</Route>
<Route path="/profile" component={Profile} />
<Route path="/settings" component={Settings} />
<Route path="/login" component={Login} />
<Route path="/logout" component={Logout} />
<Route path="/debug" component={Debug} />
<Route path="/:entity" let:params>
{#key params.entity}
<Bech32Entity entity={params.entity} />
{/key}
</Route>
<Route path="*" component={NotFound} />
</div>
{/if}
{#if !url.match(/messages|chat|relays$|keys|settings|logout$/)}
<ForegroundButtons />
{/if}
<SideNav />
<TopNav />
{#if $modal}
<Modal onEscape={$modal.noEscape ? null : closeModal}>
{#if $modal.type === "note/detail"}
{#key $modal.note.id}
<NoteDetail {...$modal} invertColors />
{/key}
{:else if $modal.type === "note/create"}
<NoteCreate pubkey={$modal.pubkey} nevent={$modal.nevent} />
{:else if $modal.type === "relay/add"}
<AddRelay />
{:else if $modal.type === "onboarding"}
<Onboarding stage={$modal.stage} />
{:else if $modal.type === "room/edit"}
<ChatEdit {...$modal} />
{:else if $modal.type === "login/privkey"}
<PrivKeyLogin />
{:else if $modal.type === "login/pubkey"}
<PubKeyLogin />
{:else if $modal.type === "login/connect"}
<ConnectUser />
{:else if $modal.type === "person/info"}
<PersonProfileInfo person={$modal.person} />
{:else if $modal.type === "person/share"}
<PersonShare person={$modal.person} />
{:else if $modal.type === "person/follows"}
<PersonList type="follows" pubkey={$modal.pubkey} />
{:else if $modal.type === "person/followers"}
<PersonList type="followers" pubkey={$modal.pubkey} />
{:else if $modal.type === "message"}
<Content size="lg">
<div class="text-center">{$modal.message}</div>
{#if $modal.spinner}
<Spinner delay={0} />
{/if}
</Content>
{/if}
</Modal>
{/if}
<Toast />
</div>
</Router>

View File

@ -16,6 +16,14 @@ export const routes = {
person: (pubkey, tab = "notes") => `/people/${nip19.npubEncode(pubkey)}/${tab}`,
}
export const location = (() => {
const store = writable(window.location)
globalHistory.listen(({location}) => store.set(location))
return store
})()
// Install prompt
export const installPrompt = writable(null)
@ -55,10 +63,10 @@ export const modal = {
set: data => {
if (data) {
modal.history.push(data)
navigate(location.pathname + `#m=${modal.history.length - 1}`)
navigate(window.location.pathname + `#m=${modal.history.length - 1}`)
} else {
modal.history = []
navigate(location.pathname)
navigate(window.location.pathname)
}
},
close: () => modal.set(null),
@ -72,8 +80,8 @@ export const modal = {
subscribe: cb => {
cb(last(modal.history))
return globalHistory.listen(({action}) => {
const match = location.hash.match(/\bm=(\d+)/)
return location.subscribe($location => {
const match = $location.hash.match(/\bm=(\d+)/)
const i = match ? parseInt(match[1]) : null
modal.history.splice(i === null ? -1 : i + 1)

View File

@ -1,7 +1,7 @@
import "src/app.css"
import Bugsnag from "@bugsnag/js"
import App from "src/App.svelte"
import App from "src/ui/App.svelte"
import {installPrompt} from "src/app/ui"
Bugsnag.start({

175
src/ui/App.svelte Normal file
View File

@ -0,0 +1,175 @@
<script lang="ts">
import "@fortawesome/fontawesome-free/css/fontawesome.css"
import "@fortawesome/fontawesome-free/css/solid.css"
import {onMount} from "svelte"
import {Router, links} from "svelte-routing"
import {globalHistory} from "svelte-routing/src/history"
import {first} from "hurdak/lib/hurdak"
import {identity} from "ramda"
import {warn} from "src/util/logger"
import {timedelta, hexToBech32, bech32ToHex, shuffle, now} from "src/util/misc"
import cmd from "src/agent/cmd"
import {onReady, relays, people} from "src/agent/tables"
import keys from "src/agent/keys"
import network from "src/agent/network"
import pool from "src/agent/pool"
import {initializeRelayList} from "src/agent/relays"
import sync from "src/agent/sync"
import * as tables from "src/agent/tables"
import user from "src/agent/user"
import {loadAppData} from "src/app"
import {theme, getThemeVariables} from "src/app/ui"
import {modal, openModals, logUsage} from "src/app/ui"
import SideNav from "src/ui/SideNav.svelte"
import Main from "src/ui/Main.svelte"
import Toast from "src/ui/Toast.svelte"
import TopNav from "src/ui/TopNav.svelte"
import Modal from "src/ui/Modal.svelte"
import ForegroundButtons from "src/ui/ForegroundButtons.svelte"
Object.assign(window, {cmd, user, keys, network, pool, sync, tables, bech32ToHex, hexToBech32})
export let url = location.pathname
let scrollY
const style = document.createElement("style")
document.head.append(style)
$: style.textContent = `:root { ${getThemeVariables($theme)}; background: var(--gray-8); }`
const seenChallenges = new Set()
// When we get an AUTH challenge from our pool, attempt to authenticate
pool.Config.authHandler = async (url, challenge) => {
if (keys.canSign() && !seenChallenges.has(challenge)) {
seenChallenges.add(challenge)
const publishable = await cmd.authenticate(url, challenge)
return first(publishable.publish([{url}], null, "AUTH"))
}
}
onMount(() => {
// Log modals
const unsubModal = modal.subscribe($modal => {
if ($modal) {
logUsage(btoa(["modal", $modal.type].join(":")))
}
})
// Keep scroll position on body, but don't allow scrolling
const unsubOpenModals = openModals.subscribe(n => {
if (n > 0) {
// This is not idempotent, so don't duplicate it
if (document.body.style.position !== "fixed") {
scrollY = window.scrollY
document.body.style.top = `-${scrollY}px`
document.body.style.position = `fixed`
}
} else {
document.body.setAttribute("style", "")
window.scrollTo(0, scrollY)
}
})
// Remove identifying information, e.g. pubkeys, event ids, etc
const getPageName = () =>
location.pathname.slice(1).replace(/(npub|nprofile|note|nevent)[^\/]+/g, (_, m) => `<${m}>`)
// Log usage on navigate
const unsubHistory = globalHistory.listen(({location}) => {
url = location.pathname
if (!location.hash) {
logUsage(btoa(["page", getPageName()].join(":")))
}
})
logUsage(btoa(["page", getPageName()].join(":")))
return () => {
unsubHistory()
unsubModal()
unsubOpenModals()
}
})
onReady(() => {
initializeRelayList()
const pubkey = user.getPubkey()
if (pubkey) {
loadAppData(pubkey)
const person = people.get(pubkey)
// Temporary migration for version 0.2.18. We changed where user profile
// is stored, so if they appear to have an incomplete profile on page load,
// go ahead and copy the person record over.
if (person && user.getRelays().length === 0) {
user.profile.update($p => ({...$p, ...person}))
}
}
const interval = setInterval(async () => {
const {dufflepudUrl} = user.getSettings()
if (!dufflepudUrl) {
return
}
// Find relays with old/missing metadata and refresh them. Only pick a
// few so we're not sending too many concurrent http requests
const staleRelays = shuffle(
await relays.all({
"refreshed_at:lt": now() - timedelta(7, "days"),
})
).slice(0, 10)
const freshRelays = await Promise.all(
staleRelays.map(async ({url}) => {
try {
const res = await fetch(dufflepudUrl + "/relay/info", {
method: "POST",
body: JSON.stringify({url}),
headers: {
"Content-Type": "application/json",
},
})
return {...(await res.json()), url, refreshed_at: now()}
} catch (e) {
if (!e.toString().includes("Failed to fetch")) {
warn(e)
}
return {url, refreshed_at: now()}
}
})
)
relays.bulkPatch(freshRelays.filter(identity))
}, 30_000)
return () => {
clearInterval(interval)
}
})
</script>
<Router {url}>
<div use:links>
<Main />
<ForegroundButtons />
<SideNav />
<TopNav />
<Modal />
<Toast />
</div>
</Router>

View File

@ -1,19 +1,25 @@
<script lang="ts">
import user from "src/agent/user"
import {modal} from "src/app/ui"
import {modal, location} from "src/app/ui"
export let pubkey = null
$: showCreateNote = $location.pathname.match(/messages|chat|relays$|keys|settings|logout$/)
const {canPublish} = user
const createNote = () => {
const pubkey = null // TODO use $location.pathname
modal.set({type: "note/create", pubkey})
}
</script>
<div class="fixed bottom-0 right-0 z-10 m-8 flex flex-col items-center gap-3">
{#if $canPublish}
{#if $canPublish && !showCreateNote}
<button
class="color-white flex h-16 w-16 items-center justify-center rounded-full
border border-accent-light bg-accent text-white shadow-2xl
transition-all hover:scale-105 hover:bg-accent-light"
on:click={() => modal.set({type: "note/create", pubkey})}>
on:click={createNote}>
<span class="fa-sold fa-plus fa-2xl" />
</button>
{/if}

86
src/ui/Main.svelte Normal file
View File

@ -0,0 +1,86 @@
<script lang="ts">
import {Route} from "svelte-routing"
import {onReady} from "src/agent/tables"
import Notifications from "src/ui/routes/Notifications.svelte"
import Bech32Entity from "src/ui/routes/Bech32Entity.svelte"
import ChatDetail from "src/ui/routes/ChatDetail.svelte"
import ChatList from "src/ui/routes/ChatList.svelte"
import Debug from "src/ui/routes/Debug.svelte"
import Feeds from "src/ui/routes/Feeds.svelte"
import Keys from "src/ui/routes/Keys.svelte"
import Login from "src/ui/routes/Login.svelte"
import Logout from "src/ui/routes/Logout.svelte"
import MessagesDetail from "src/ui/routes/MessagesDetail.svelte"
import MessagesList from "src/ui/routes/MessagesList.svelte"
import NotFound from "src/ui/routes/NotFound.svelte"
import PersonDetail from "src/ui/routes/PersonDetail.svelte"
import Search from "src/ui/routes/Search.svelte"
import Scan from "src/ui/routes/Scan.svelte"
import RelayDetail from "src/ui/routes/RelayDetail.svelte"
import RelayList from "src/ui/routes/RelayList.svelte"
import EnsureData from "src/ui/views/EnsureData.svelte"
import Profile from "src/ui/views/Profile.svelte"
import Settings from "src/ui/views/Settings.svelte"
let ready = false
onReady(() => {
ready = true
})
</script>
{#if ready}
<div class="pt-16 text-gray-3 lg:ml-56">
<Route path="/notifications" component={Notifications} />
<Route path="/search">
<EnsureData enforcePeople={false}>
<Search />
</EnsureData>
</Route>
<Route path="/scan">
<EnsureData enforcePeople={false}>
<Scan />
</EnsureData>
</Route>
<Route path="/notes/:activeTab" let:params>
<EnsureData>
<Feeds activeTab={params.activeTab} />
</EnsureData>
</Route>
<Route path="/people/:npub/:activeTab" let:params>
{#key params.npub}
<PersonDetail npub={params.npub} activeTab={params.activeTab} />
{/key}
</Route>
<Route path="/chat" component={ChatList} />
<Route path="/chat/:entity" let:params>
{#key params.entity}
<ChatDetail entity={params.entity} />
{/key}
</Route>
<Route path="/messages" component={MessagesList} />
<Route path="/messages/:entity" let:params>
{#key params.entity}
<MessagesDetail entity={params.entity} />
{/key}
</Route>
<Route path="/keys" component={Keys} />
<Route path="/relays" component={RelayList} />
<Route path="/relays/:b64url" let:params>
{#key params.b64url}
<RelayDetail url={atob(params.b64url)} />
{/key}
</Route>
<Route path="/profile" component={Profile} />
<Route path="/settings" component={Settings} />
<Route path="/login" component={Login} />
<Route path="/logout" component={Logout} />
<Route path="/debug" component={Debug} />
<Route path="/:entity" let:params>
{#key params.entity}
<Bech32Entity entity={params.entity} />
{/key}
</Route>
<Route path="*" component={NotFound} />
</div>
{/if}

61
src/ui/Modal.svelte Normal file
View File

@ -0,0 +1,61 @@
<script lang="ts">
import {modal, menuIsOpen} from "src/app/ui"
import Modal from "src/ui/partials/Modal.svelte"
import Content from "src/ui/partials/Content.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import ChatEdit from "src/ui/views/chat/ChatEdit.svelte"
import ConnectUser from "src/ui/views/login/ConnectUser.svelte"
import PrivKeyLogin from "src/ui/views/login/PrivKeyLogin.svelte"
import PubKeyLogin from "src/ui/views/login/PubKeyLogin.svelte"
import Onboarding from "src/ui/views/onboarding/Onboarding.svelte"
import NoteCreate from "src/ui/views/notes/NoteCreate.svelte"
import NoteDetail from "src/ui/views/notes/NoteDetail.svelte"
import PersonList from "src/ui/views/person/PersonList.svelte"
import PersonProfileInfo from "src/ui/views/person/PersonProfileInfo.svelte"
import PersonShare from "src/ui/views/person/PersonShare.svelte"
import AddRelay from "src/ui/views/relays/AddRelay.svelte"
const closeModal = async () => {
modal.clear()
menuIsOpen.set(false)
}
</script>
{#if $modal}
<Modal onEscape={$modal.noEscape ? null : closeModal}>
{#if $modal.type === "note/detail"}
{#key $modal.note.id}
<NoteDetail {...$modal} invertColors />
{/key}
{:else if $modal.type === "note/create"}
<NoteCreate pubkey={$modal.pubkey} nevent={$modal.nevent} />
{:else if $modal.type === "relay/add"}
<AddRelay />
{:else if $modal.type === "onboarding"}
<Onboarding stage={$modal.stage} />
{:else if $modal.type === "room/edit"}
<ChatEdit {...$modal} />
{:else if $modal.type === "login/privkey"}
<PrivKeyLogin />
{:else if $modal.type === "login/pubkey"}
<PubKeyLogin />
{:else if $modal.type === "login/connect"}
<ConnectUser />
{:else if $modal.type === "person/info"}
<PersonProfileInfo person={$modal.person} />
{:else if $modal.type === "person/share"}
<PersonShare person={$modal.person} />
{:else if $modal.type === "person/follows"}
<PersonList type="follows" pubkey={$modal.pubkey} />
{:else if $modal.type === "person/followers"}
<PersonList type="followers" pubkey={$modal.pubkey} />
{:else if $modal.type === "message"}
<Content size="lg">
<div class="text-center">{$modal.message}</div>
{#if $modal.spinner}
<Spinner delay={0} />
{/if}
</Content>
{/if}
</Modal>
{/if}

View File

@ -6,7 +6,7 @@
import {menuIsOpen, installPrompt, routes} from "src/app/ui"
import {newNotifications, newDirectMessages, newChatMessages} from "src/app/listener"
import {slowConnections} from "src/app/connection"
import PersonCircle from "src/partials/PersonCircle.svelte"
import PersonCircle from "src/ui/partials/PersonCircle.svelte"
const {profile, canPublish} = user

View File

@ -1,6 +1,6 @@
<script lang="ts">
import {onMount} from "svelte"
import Anchor from "src/partials/Anchor.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import {menuIsOpen} from "src/app/ui"
import {newNotifications} from "src/app/listener"
import {theme} from "src/app/ui"

View File

@ -3,7 +3,7 @@
import {killEvent} from "src/util/html"
import {displayPerson} from "src/util/nostr"
import {routes} from "src/app/ui"
import PersonCircle from "src/partials/PersonCircle.svelte"
import PersonCircle from "src/ui/partials/PersonCircle.svelte"
export let person
export let inert = false

View File

@ -4,7 +4,7 @@
import {navigate} from "svelte-routing"
import {prop, path as getPath, reverse, pluck, uniqBy, sortBy, last} from "ramda"
import {sleep, createScroller, Cursor} from "src/util/misc"
import Spinner from "src/partials/Spinner.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import user from "src/agent/user"
import {getPersonWithFallback} from "src/agent/tables"
import network from "src/agent/network"

View File

@ -3,9 +3,9 @@
import {last, pluck, propEq} from "ramda"
import {fuzzy} from "src/util/misc"
import {displayPerson} from "src/util/nostr"
import Badge from "src/partials/Badge.svelte"
import ContentEditable from "src/partials/ContentEditable.svelte"
import Suggestions from "src/partials/Suggestions.svelte"
import Badge from "src/ui/partials/Badge.svelte"
import ContentEditable from "src/ui/partials/ContentEditable.svelte"
import Suggestions from "src/ui/partials/Suggestions.svelte"
import {watch} from "src/agent/storage"
import {getPubkeyWriteRelays} from "src/agent/relays"

View File

@ -12,5 +12,5 @@
border-white bg-cover bg-center`
)}
style="background-image: url({src}); {$$props.style || ''}">
<slot></slot>
<slot />
</div>

View File

@ -1,9 +1,9 @@
<script lang="ts">
import {filter, identity} from "ramda"
import Input from "src/partials/Input.svelte"
import Modal from "src/partials/Modal.svelte"
import Content from "src/partials/Content.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Input from "src/ui/partials/Input.svelte"
import Modal from "src/ui/partials/Modal.svelte"
import Content from "src/ui/partials/Content.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import {listenForFile, stripExifData, blobToFile} from "src/util/html"
import {uploadFile, postJson} from "src/util/misc"
import user from "src/agent/user"

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -1,8 +1,8 @@
<script>
import cx from "classnames"
import {ellipsize} from "hurdak/lib/hurdak"
import Anchor from "src/partials/Anchor.svelte"
import Spinner from "src/partials/Spinner.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import user from "src/agent/user"
export let link

View File

@ -2,9 +2,9 @@
import {sortBy} from "ramda"
import {slide} from "svelte/transition"
import {annotateMedia} from "src/util/misc"
import Media from "src/partials/Media.svelte"
import Content from "src/partials/Content.svelte"
import Modal from "src/partials/Modal.svelte"
import Media from "src/ui/partials/Media.svelte"
import Content from "src/ui/partials/Content.svelte"
import Modal from "src/ui/partials/Modal.svelte"
export let links
export let onClose = null

View File

@ -1,6 +1,6 @@
<script lang="ts">
import Anchor from "src/partials/Anchor.svelte"
import Popover from "src/partials/Popover.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Popover from "src/ui/partials/Popover.svelte"
export let actions
export let size = ""
@ -16,7 +16,7 @@
class="relative flex flex-col gap-2"
on:click={() => instance.hide()}>
<div
class="absolute top-0 right-0 bottom-0 rounded-full bg-gray-8 w-32"
class="absolute top-0 right-0 bottom-0 w-32 rounded-full bg-gray-8"
style="filter: blur(15px) opacity(0.75)" />
{#each actions as { label, icon, onClick }}
@ -27,4 +27,3 @@
{/each}
</div>
</Popover>

View File

@ -2,7 +2,7 @@
import {ellipsize} from "hurdak/lib/hurdak"
import {parseContent} from "src/util/html"
import {displayPerson} from "src/util/nostr"
import Anchor from "src/partials/Anchor.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import {getPersonWithFallback} from "src/agent/tables"
export let person

View File

@ -1,7 +1,7 @@
<script lang="ts">
import {stringToHue, hsl} from "src/util/misc"
import ImageCircle from "src/partials/ImageCircle.svelte"
import LogoSvg from "src/partials/LogoSvg.svelte"
import ImageCircle from "src/ui/partials/ImageCircle.svelte"
import LogoSvg from "src/ui/partials/LogoSvg.svelte"
import cx from "classnames"
export let person

View File

@ -3,9 +3,9 @@
import {fly} from "svelte/transition"
import {noEvent} from "src/util/html"
import {displayPerson} from "src/util/nostr"
import Anchor from "src/partials/Anchor.svelte"
import PersonCircle from "src/partials/PersonCircle.svelte"
import PersonAbout from "src/partials/PersonAbout.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import PersonCircle from "src/ui/partials/PersonCircle.svelte"
import PersonAbout from "src/ui/partials/PersonAbout.svelte"
import {routes} from "src/app/ui"
export let person

View File

@ -1,7 +1,7 @@
<script lang="ts">
import QRCode from "qrcode"
import {onMount} from "svelte"
import Input from "src/partials/Input.svelte"
import Input from "src/ui/partials/Input.svelte"
import {copyToClipboard} from "src/util/html"
import {toast} from "src/app/ui"

View File

@ -5,7 +5,7 @@
import {poll, stringToHue, hsl} from "src/util/misc"
import {between} from "hurdak/lib/hurdak"
import {fly} from "svelte/transition"
import Anchor from "src/partials/Anchor.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import pool from "src/agent/pool"
export let relay

View File

@ -41,7 +41,7 @@
class:bg-gray-7={index === i}
class:border-accent={index === i}
on:click={() => select(item)}>
<slot name="item" item={item} />
<slot name="item" {item} />
</button>
{/each}
</div>

View File

@ -3,9 +3,9 @@
import {onMount} from "svelte"
import {nip19} from "nostr-tools"
import {warn} from "src/util/logger"
import Content from "src/partials/Content.svelte"
import NoteDetail from "src/views/notes/NoteDetail.svelte"
import PersonDetail from "src/routes/PersonDetail.svelte"
import Content from "src/ui/partials/Content.svelte"
import NoteDetail from "src/ui/views/notes/NoteDetail.svelte"
import PersonDetail from "src/ui/routes/PersonDetail.svelte"
import {sampleRelays} from "src/agent/relays"
export let entity

View File

@ -3,10 +3,10 @@
import {updateIn} from "hurdak/lib/hurdak"
import {now, formatTimestamp} from "src/util/misc"
import {toHex} from "src/util/nostr"
import Channel from "src/partials/Channel.svelte"
import Badge from "src/partials/Badge.svelte"
import Anchor from "src/partials/Anchor.svelte"
import NoteContent from "src/views/notes/NoteContent.svelte"
import Channel from "src/ui/partials/Channel.svelte"
import Badge from "src/ui/partials/Badge.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import NoteContent from "src/ui/views/notes/NoteContent.svelte"
import user from "src/agent/user"
import {getRelaysForEventChildren, sampleRelays} from "src/agent/relays"
import network from "src/agent/network"

View File

@ -1,10 +1,10 @@
<script>
import {onMount} from "svelte"
import {fuzzy} from "src/util/misc"
import Input from "src/partials/Input.svelte"
import Content from "src/partials/Content.svelte"
import Anchor from "src/partials/Anchor.svelte"
import ChatListItem from "src/views/chat/ChatListItem.svelte"
import Input from "src/ui/partials/Input.svelte"
import Content from "src/ui/partials/Content.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import ChatListItem from "src/ui/views/chat/ChatListItem.svelte"
import {watch} from "src/agent/storage"
import network from "src/agent/network"
import {getUserReadRelays} from "src/agent/relays"

View File

@ -3,7 +3,7 @@
import {fly} from "svelte/transition"
import {logs} from "src/util/logger.js"
import {formatTimestamp} from "src/util/misc"
import Content from "src/partials/Content.svelte"
import Content from "src/ui/partials/Content.svelte"
document.title = "Debug"
</script>

View File

@ -1,11 +1,11 @@
<script>
import {navigate} from "svelte-routing"
import {toTitle} from "hurdak/lib/hurdak"
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import Tabs from "src/partials/Tabs.svelte"
import Follows from "src/views/feed/Follows.svelte"
import Network from "src/views/feed/Network.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Content from "src/ui/partials/Content.svelte"
import Tabs from "src/ui/partials/Tabs.svelte"
import Follows from "src/ui/views/feed/Follows.svelte"
import Network from "src/ui/views/feed/Network.svelte"
import user from "src/agent/user"
export let activeTab

View File

@ -4,11 +4,11 @@
import {navigate} from "svelte-routing"
import {nip19} from "nostr-tools"
import {copyToClipboard} from "src/util/html"
import Input from "src/partials/Input.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import Toggle from "src/partials/Toggle.svelte"
import Heading from "src/partials/Heading.svelte"
import Input from "src/ui/partials/Input.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Content from "src/ui/partials/Content.svelte"
import Toggle from "src/ui/partials/Toggle.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import keys from "src/agent/keys"
import {toast} from "src/app/ui"

View File

@ -1,9 +1,9 @@
<script lang="ts">
import {fly} from "svelte/transition"
import {navigate} from "svelte-routing"
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import Heading from "src/partials/Heading.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Content from "src/ui/partials/Content.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import user from "src/agent/user"
import {modal} from "src/app/ui"
import {login} from "src/app"

View File

@ -1,7 +1,7 @@
<script>
import {fly} from "svelte/transition"
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Content from "src/ui/partials/Content.svelte"
import {dropAll} from "src/agent/storage"
let confirmed = false

View File

@ -4,9 +4,9 @@
import {toHex, displayPerson} from "src/util/nostr"
import {now, formatTimestamp} from "src/util/misc"
import {Tags} from "src/util/nostr"
import Channel from "src/partials/Channel.svelte"
import Anchor from "src/partials/Anchor.svelte"
import NoteContent from "src/views/notes/NoteContent.svelte"
import Channel from "src/ui/partials/Channel.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import NoteContent from "src/ui/views/notes/NoteContent.svelte"
import {getAllPubkeyRelays, sampleRelays} from "src/agent/relays"
import {getPersonWithFallback} from "src/agent/tables"
import {watch} from "src/agent/storage"
@ -16,8 +16,8 @@
import cmd from "src/agent/cmd"
import {routes} from "src/app/ui"
import {lastChecked} from "src/app/listener"
import PersonCircle from "src/partials/PersonCircle.svelte"
import PersonAbout from "src/partials/PersonAbout.svelte"
import PersonCircle from "src/ui/partials/PersonCircle.svelte"
import PersonAbout from "src/ui/partials/PersonAbout.svelte"
export let entity

View File

@ -1,9 +1,9 @@
<script>
import {sortBy} from "ramda"
import {toTitle} from "hurdak/lib/hurdak"
import Tabs from "src/partials/Tabs.svelte"
import Content from "src/partials/Content.svelte"
import MessagesListItem from "src/views/messages/MessagesListItem.svelte"
import Tabs from "src/ui/partials/Tabs.svelte"
import Content from "src/ui/partials/Content.svelte"
import MessagesListItem from "src/ui/views/messages/MessagesListItem.svelte"
import {watch} from "src/agent/storage"
let activeTab = "messages"

View File

@ -4,9 +4,9 @@
import {fly} from "svelte/transition"
import {now, timedelta, createScroller} from "src/util/misc"
import {findReplyId} from "src/util/nostr"
import Spinner from "src/partials/Spinner.svelte"
import Content from "src/partials/Content.svelte"
import Notification from "src/views/notifications/Notification.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import Content from "src/ui/partials/Content.svelte"
import Notification from "src/ui/views/notifications/Notification.svelte"
import {watch} from "src/agent/storage"
import user from "src/agent/user"
import {userEvents} from "src/agent/tables"

View File

@ -8,21 +8,21 @@
import {parseHex} from "src/util/html"
import {numberFmt} from "src/util/misc"
import {displayPerson, toHex} from "src/util/nostr"
import Tabs from "src/partials/Tabs.svelte"
import Content from "src/partials/Content.svelte"
import OverflowMenu from "src/partials/OverflowMenu.svelte"
import Spinner from "src/partials/Spinner.svelte"
import Notes from "src/views/person/Notes.svelte"
import Likes from "src/views/person/Likes.svelte"
import Relays from "src/views/person/Relays.svelte"
import Tabs from "src/ui/partials/Tabs.svelte"
import Content from "src/ui/partials/Content.svelte"
import OverflowMenu from "src/ui/partials/OverflowMenu.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import Notes from "src/ui/views/person/Notes.svelte"
import Likes from "src/ui/views/person/Likes.svelte"
import Relays from "src/ui/views/person/Relays.svelte"
import user from "src/agent/user"
import pool from "src/agent/pool"
import {sampleRelays, getPubkeyWriteRelays} from "src/agent/relays"
import network from "src/agent/network"
import {getPersonWithFallback} from "src/agent/tables"
import {routes, modal, theme, getThemeColor} from "src/app/ui"
import PersonCircle from "src/partials/PersonCircle.svelte"
import PersonAbout from "src/partials/PersonAbout.svelte"
import PersonCircle from "src/ui/partials/PersonCircle.svelte"
import PersonAbout from "src/ui/partials/PersonAbout.svelte"
export let npub
export let activeTab

View File

@ -1,9 +1,9 @@
<script lang="ts">
import {displayRelay} from "src/util/nostr"
import Content from "src/partials/Content.svelte"
import Feed from "src/views/feed/Feed.svelte"
import RelayTitle from "src/views/relays/RelayTitle.svelte"
import RelayActions from "src/views/relays/RelayActions.svelte"
import Content from "src/ui/partials/Content.svelte"
import Feed from "src/ui/views/feed/Feed.svelte"
import RelayTitle from "src/ui/views/relays/RelayTitle.svelte"
import RelayActions from "src/ui/views/relays/RelayActions.svelte"
import {relays} from "src/agent/tables"
export let url

View File

@ -1,9 +1,9 @@
<script>
import {fly} from "svelte/transition"
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import RelaySearch from "src/views/relays/RelaySearch.svelte"
import RelayCard from "src/views/relays/RelayCard.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Content from "src/ui/partials/Content.svelte"
import RelaySearch from "src/ui/views/relays/RelaySearch.svelte"
import RelayCard from "src/ui/views/relays/RelayCard.svelte"
import user from "src/agent/user"
import {modal} from "src/app/ui"

View File

@ -4,11 +4,11 @@
import {navigate} from "svelte-routing"
import {find} from "ramda"
import {nip05, nip19} from "nostr-tools"
import Heading from "src/partials/Heading.svelte"
import Input from "src/partials/Input.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Spinner from "src/partials/Spinner.svelte"
import Content from "src/partials/Content.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import Input from "src/ui/partials/Input.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import Content from "src/ui/partials/Content.svelte"
import {toast} from "src/app/ui"
let video,

View File

@ -1,7 +1,7 @@
<script>
import Heading from "src/partials/Heading.svelte"
import Content from "src/partials/Content.svelte"
import PersonSearch from "src/views/person/PersonSearch.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import Content from "src/ui/partials/Content.svelte"
import PersonSearch from "src/ui/views/person/PersonSearch.svelte"
</script>
<Content>

View File

@ -1,11 +1,11 @@
<script>
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import Modal from "src/partials/Modal.svelte"
import PersonInfo from "src/views/person/PersonInfo.svelte"
import RelaySearch from "src/views/relays/RelaySearch.svelte"
import RelayCard from "src/views/relays/RelayCard.svelte"
import PersonSearch from "src/views/person/PersonSearch.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Content from "src/ui/partials/Content.svelte"
import Modal from "src/ui/partials/Modal.svelte"
import PersonInfo from "src/ui/views/person/PersonInfo.svelte"
import RelaySearch from "src/ui/views/relays/RelaySearch.svelte"
import RelayCard from "src/ui/views/relays/RelayCard.svelte"
import PersonSearch from "src/ui/views/person/PersonSearch.svelte"
import {getPersonWithFallback} from "src/agent/tables"
import user from "src/agent/user"

View File

@ -2,13 +2,13 @@
import {onMount} from "svelte"
import {fly} from "svelte/transition"
import {navigate} from "svelte-routing"
import Input from "src/partials/Input.svelte"
import ImageInput from "src/partials/ImageInput.svelte"
import Textarea from "src/partials/Textarea.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Button from "src/partials/Button.svelte"
import Content from "src/partials/Content.svelte"
import Heading from "src/partials/Heading.svelte"
import Input from "src/ui/partials/Input.svelte"
import ImageInput from "src/ui/partials/ImageInput.svelte"
import Textarea from "src/ui/partials/Textarea.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Button from "src/ui/partials/Button.svelte"
import Content from "src/ui/partials/Content.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import user from "src/agent/user"
import {getUserWriteRelays} from "src/agent/relays"
import cmd from "src/agent/cmd"

View File

@ -2,12 +2,12 @@
import {onMount} from "svelte"
import {fly} from "svelte/transition"
import {navigate} from "svelte-routing"
import Toggle from "src/partials/Toggle.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Input from "src/partials/Input.svelte"
import Button from "src/partials/Button.svelte"
import Content from "src/partials/Content.svelte"
import Heading from "src/partials/Heading.svelte"
import Toggle from "src/ui/partials/Toggle.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Input from "src/ui/partials/Input.svelte"
import Button from "src/ui/partials/Button.svelte"
import Content from "src/ui/partials/Content.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import user from "src/agent/user"
import pool from "src/agent/pool"
import {toast} from "src/app/ui"

View File

@ -3,10 +3,10 @@
import {fly} from "svelte/transition"
import {error} from "src/util/logger"
import {stripExifData} from "src/util/html"
import Input from "src/partials/Input.svelte"
import Content from "src/partials/Content.svelte"
import Textarea from "src/partials/Textarea.svelte"
import Button from "src/partials/Button.svelte"
import Input from "src/ui/partials/Input.svelte"
import Content from "src/ui/partials/Content.svelte"
import Textarea from "src/ui/partials/Textarea.svelte"
import Button from "src/ui/partials/Button.svelte"
import {getUserWriteRelays} from "src/agent/relays"
import {rooms} from "src/agent/tables"
import cmd from "src/agent/cmd"

View File

@ -3,7 +3,7 @@
import {navigate} from "svelte-routing"
import {fly} from "svelte/transition"
import {ellipsize} from "hurdak/lib/hurdak"
import Anchor from "src/partials/Anchor.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import {rooms} from "src/agent/tables"
export let room

View File

@ -5,11 +5,11 @@
import {quantify} from "hurdak/lib/hurdak"
import {createScroller, now, timedelta, Cursor} from "src/util/misc"
import {asDisplayEvent, mergeFilter} from "src/util/nostr"
import Spinner from "src/partials/Spinner.svelte"
import Modal from "src/partials/Modal.svelte"
import Content from "src/partials/Content.svelte"
import RelayFeed from "src/views/feed/RelayFeed.svelte"
import Note from "src/views/notes/Note.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import Modal from "src/ui/partials/Modal.svelte"
import Content from "src/ui/partials/Content.svelte"
import RelayFeed from "src/ui/views/feed/RelayFeed.svelte"
import Note from "src/ui/views/notes/Note.svelte"
import user from "src/agent/user"
import network from "src/agent/network"
import {modal} from "src/app/ui"

View File

@ -1,6 +1,6 @@
<script>
import {shuffle} from "src/util/misc"
import Feed from "src/views/feed/Feed.svelte"
import Feed from "src/ui/views/feed/Feed.svelte"
import {getUserFollows} from "src/agent/social"
import {sampleRelays, getAllPubkeyWriteRelays} from "src/agent/relays"

View File

@ -1,6 +1,6 @@
<script>
import {shuffle} from "src/util/misc"
import Feed from "src/views/feed/Feed.svelte"
import Feed from "src/ui/views/feed/Feed.svelte"
import {getUserNetwork} from "src/agent/social"
import {sampleRelays, getAllPubkeyWriteRelays} from "src/agent/relays"

View File

@ -1,10 +1,10 @@
<script lang="ts">
import {displayRelay} from "src/util/nostr"
import Content from "src/partials/Content.svelte"
import Spinner from "src/partials/Spinner.svelte"
import RelayTitle from "src/views/relays/RelayTitle.svelte"
import RelayActions from "src/views/relays/RelayActions.svelte"
import Note from "src/views/notes/Note.svelte"
import Content from "src/ui/partials/Content.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import RelayTitle from "src/ui/views/relays/RelayTitle.svelte"
import RelayActions from "src/ui/views/relays/RelayActions.svelte"
import Note from "src/ui/views/notes/Note.svelte"
export let depth
export let showContext = false

View File

@ -5,13 +5,13 @@
import {navigate} from "svelte-routing"
import {sleep, shuffle} from "src/util/misc"
import {isRelay, userKinds} from "src/util/nostr"
import Content from "src/partials/Content.svelte"
import Spinner from "src/partials/Spinner.svelte"
import Input from "src/partials/Input.svelte"
import Heading from "src/partials/Heading.svelte"
import RelayCardSimple from "src/partials/RelayCardSimple.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Modal from "src/partials/Modal.svelte"
import Content from "src/ui/partials/Content.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import Input from "src/ui/partials/Input.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import RelayCardSimple from "src/ui/partials/RelayCardSimple.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Modal from "src/ui/partials/Modal.svelte"
import {watch} from "src/agent/storage"
import network from "src/agent/network"
import user from "src/agent/user"

View File

@ -1,9 +1,9 @@
<script lang="ts">
import {toHex} from "src/util/nostr"
import Input from "src/partials/Input.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import Heading from "src/partials/Heading.svelte"
import Input from "src/ui/partials/Input.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Content from "src/ui/partials/Content.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import keys from "src/agent/keys"
import {toast} from "src/app/ui"
import {login} from "src/app"

View File

@ -1,9 +1,9 @@
<script lang="ts">
import {toHex} from "src/util/nostr"
import Input from "src/partials/Input.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import Heading from "src/partials/Heading.svelte"
import Input from "src/ui/partials/Input.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Content from "src/ui/partials/Content.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import keys from "src/agent/keys"
import {toast} from "src/app/ui"
import {login} from "src/app"

View File

@ -5,8 +5,8 @@
import {displayPerson} from "src/util/nostr"
import {getPersonWithFallback} from "src/agent/tables"
import {lastChecked} from "src/app/listener"
import PersonCircle from "src/partials/PersonCircle.svelte"
import Card from "src/partials/Card.svelte"
import PersonCircle from "src/ui/partials/PersonCircle.svelte"
import Card from "src/ui/partials/Card.svelte"
export let contact

View File

@ -31,24 +31,24 @@
} from "src/util/misc"
import {isMobile, copyToClipboard} from "src/util/html"
import {invoiceAmount} from "src/util/lightning"
import QRCode from "src/partials/QRCode.svelte"
import OverflowMenu from "src/partials/OverflowMenu.svelte"
import ImageInput from "src/partials/ImageInput.svelte"
import Input from "src/partials/Input.svelte"
import Textarea from "src/partials/Textarea.svelte"
import CopyValue from "src/partials/CopyValue.svelte"
import Content from "src/partials/Content.svelte"
import Badge from "src/partials/Badge.svelte"
import Popover from "src/partials/Popover.svelte"
import PersonCircle from "src/partials/PersonCircle.svelte"
import PersonSummary from "src/views/person/PersonSummary.svelte"
import RelayCard from "src/views/relays/RelayCard.svelte"
import Modal from "src/partials/Modal.svelte"
import Media from "src/partials/Media.svelte"
import Anchor from "src/partials/Anchor.svelte"
import QRCode from "src/ui/partials/QRCode.svelte"
import OverflowMenu from "src/ui/partials/OverflowMenu.svelte"
import ImageInput from "src/ui/partials/ImageInput.svelte"
import Input from "src/ui/partials/Input.svelte"
import Textarea from "src/ui/partials/Textarea.svelte"
import CopyValue from "src/ui/partials/CopyValue.svelte"
import Content from "src/ui/partials/Content.svelte"
import Badge from "src/ui/partials/Badge.svelte"
import Popover from "src/ui/partials/Popover.svelte"
import PersonCircle from "src/ui/partials/PersonCircle.svelte"
import PersonSummary from "src/ui/views/person/PersonSummary.svelte"
import RelayCard from "src/ui/views/relays/RelayCard.svelte"
import Modal from "src/ui/partials/Modal.svelte"
import Media from "src/ui/partials/Media.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import {toast, modal} from "src/app/ui"
import Compose from "src/partials/Compose.svelte"
import Card from "src/partials/Card.svelte"
import Compose from "src/ui/partials/Compose.svelte"
import Card from "src/ui/partials/Card.svelte"
import user from "src/agent/user"
import pool from "src/agent/pool"
import keys from "src/agent/keys"
@ -59,7 +59,7 @@
import cmd from "src/agent/cmd"
import {routes} from "src/app/ui"
import {publishWithToast} from "src/app"
import NoteContent from "src/views/notes/NoteContent.svelte"
import NoteContent from "src/ui/views/notes/NoteContent.svelte"
export let note
export let feedRelay

View File

@ -6,11 +6,11 @@
import {warn} from "src/util/logger"
import {parseContent} from "src/util/html"
import {displayPerson, Tags} from "src/util/nostr"
import MediaSet from "src/partials/MediaSet.svelte"
import Card from "src/partials/Card.svelte"
import Spinner from "src/partials/Spinner.svelte"
import Anchor from "src/partials/Anchor.svelte"
import PersonCircle from "src/partials/PersonCircle.svelte"
import MediaSet from "src/ui/partials/MediaSet.svelte"
import Card from "src/ui/partials/Card.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import PersonCircle from "src/ui/partials/PersonCircle.svelte"
import {sampleRelays} from "src/agent/relays"
import user from "src/agent/user"
import network from "src/agent/network"

View File

@ -6,15 +6,15 @@
import {fly} from "svelte/transition"
import {fuzzy, annotateMedia} from "src/util/misc"
import {displayPerson} from "src/util/nostr"
import Button from "src/partials/Button.svelte"
import Compose from "src/partials/Compose.svelte"
import ImageInput from "src/partials/ImageInput.svelte"
import Media from "src/partials/Media.svelte"
import Input from "src/partials/Input.svelte"
import RelayCardSimple from "src/partials/RelayCardSimple.svelte"
import Content from "src/partials/Content.svelte"
import Modal from "src/partials/Modal.svelte"
import Heading from "src/partials/Heading.svelte"
import Button from "src/ui/partials/Button.svelte"
import Compose from "src/ui/partials/Compose.svelte"
import ImageInput from "src/ui/partials/ImageInput.svelte"
import Media from "src/ui/partials/Media.svelte"
import Input from "src/ui/partials/Input.svelte"
import RelayCardSimple from "src/ui/partials/RelayCardSimple.svelte"
import Content from "src/ui/partials/Content.svelte"
import Modal from "src/ui/partials/Modal.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import {getUserWriteRelays} from "src/agent/relays"
import {getPersonWithFallback} from "src/agent/tables"
import {watch} from "src/agent/storage"

View File

@ -5,11 +5,11 @@
import {first} from "hurdak/lib/hurdak"
import {log} from "src/util/logger"
import {asDisplayEvent} from "src/util/nostr"
import Content from "src/partials/Content.svelte"
import RelayFeed from "src/views/feed/RelayFeed.svelte"
import Modal from "src/partials/Modal.svelte"
import Spinner from "src/partials/Spinner.svelte"
import Note from "src/views/notes/Note.svelte"
import Content from "src/ui/partials/Content.svelte"
import RelayFeed from "src/ui/views/feed/RelayFeed.svelte"
import Modal from "src/ui/partials/Modal.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import Note from "src/ui/views/notes/Note.svelte"
import user from "src/agent/user"
import network from "src/agent/network"
import {sampleRelays} from "src/agent/relays"

View File

@ -3,11 +3,11 @@
import {closure, quantify} from "hurdak/lib/hurdak"
import {formatTimestamp, tryJson} from "src/util/misc"
import {Tags} from "src/util/nostr"
import Badge from "src/partials/Badge.svelte"
import Card from "src/partials/Card.svelte"
import Popover from "src/partials/Popover.svelte"
import NoteContent from "src/views/notes/NoteContent.svelte"
import NotificationSection from "src/views/notifications/NotificationSection.svelte"
import Badge from "src/ui/partials/Badge.svelte"
import Card from "src/ui/partials/Card.svelte"
import Popover from "src/ui/partials/Popover.svelte"
import NoteContent from "src/ui/views/notes/NoteContent.svelte"
import NotificationSection from "src/ui/views/notifications/NotificationSection.svelte"
import {getPersonWithFallback, userEvents} from "src/agent/tables"
import {modal} from "src/app/ui"

View File

@ -1,5 +1,5 @@
<script lang="ts">
import Badge from "src/partials/Badge.svelte"
import Badge from "src/ui/partials/Badge.svelte"
import {getPersonWithFallback} from "src/agent/tables"
export let pubkeys

View File

@ -6,11 +6,11 @@
import {navigate} from "svelte-routing"
import {shuffle} from "src/util/misc"
import {displayPerson} from "src/util/nostr"
import OnboardingIntro from "src/views/onboarding/OnboardingIntro.svelte"
import OnboardingKey from "src/views/onboarding/OnboardingKey.svelte"
import OnboardingRelays from "src/views/onboarding/OnboardingRelays.svelte"
import OnboardingFollows from "src/views/onboarding/OnboardingFollows.svelte"
import OnboardingComplete from "src/views/onboarding/OnboardingComplete.svelte"
import OnboardingIntro from "src/ui/views/onboarding/OnboardingIntro.svelte"
import OnboardingKey from "src/ui/views/onboarding/OnboardingKey.svelte"
import OnboardingRelays from "src/ui/views/onboarding/OnboardingRelays.svelte"
import OnboardingFollows from "src/ui/views/onboarding/OnboardingFollows.svelte"
import OnboardingComplete from "src/ui/views/onboarding/OnboardingComplete.svelte"
import {getFollows} from "src/agent/social"
import {getPubkeyWriteRelays, sampleRelays} from "src/agent/relays"
import {getPersonWithFallback} from "src/agent/tables"

View File

@ -1,8 +1,8 @@
<script lang="ts">
import Anchor from "src/partials/Anchor.svelte"
import Heading from "src/partials/Heading.svelte"
import Content from "src/partials/Content.svelte"
import Spinner from "src/partials/Spinner.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import Content from "src/ui/partials/Content.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
export let signup

View File

@ -1,11 +1,11 @@
<script lang="ts">
import {without} from "ramda"
import {fuzzy} from "src/util/misc"
import Input from "src/partials/Input.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Heading from "src/partials/Heading.svelte"
import Content from "src/partials/Content.svelte"
import PersonInfo from "src/partials/PersonInfo.svelte"
import Input from "src/ui/partials/Input.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import Content from "src/ui/partials/Content.svelte"
import PersonInfo from "src/ui/partials/PersonInfo.svelte"
import {getPersonWithFallback} from "src/agent/tables"
import {watch} from "src/agent/storage"
import {modal} from "src/app/ui"

View File

@ -1,7 +1,7 @@
<script lang="ts">
import Anchor from "src/partials/Anchor.svelte"
import Heading from "src/partials/Heading.svelte"
import Content from "src/partials/Content.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import Content from "src/ui/partials/Content.svelte"
import {modal} from "src/app/ui"
const tutorialUrl = "https://nostr.com/"

View File

@ -1,10 +1,10 @@
<script lang="ts">
import {nip19} from "nostr-tools"
import {copyToClipboard} from "src/util/html"
import Input from "src/partials/Input.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Heading from "src/partials/Heading.svelte"
import Content from "src/partials/Content.svelte"
import Input from "src/ui/partials/Input.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import Content from "src/ui/partials/Content.svelte"
import pool from "src/agent/pool"
import {modal, toast} from "src/app/ui"

View File

@ -1,11 +1,11 @@
<script lang="ts">
import {reject, pluck, whereEq} from "ramda"
import {fuzzy} from "src/util/misc"
import Input from "src/partials/Input.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Heading from "src/partials/Heading.svelte"
import Content from "src/partials/Content.svelte"
import RelayCard from "src/partials/RelayCard.svelte"
import Input from "src/ui/partials/Input.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import Content from "src/ui/partials/Content.svelte"
import RelayCard from "src/ui/partials/RelayCard.svelte"
import {watch} from "src/agent/storage"
import {modal} from "src/app/ui"

View File

@ -1,5 +1,5 @@
<script lang="ts">
import Feed from "src/views/feed/Feed.svelte"
import Feed from "src/ui/views/feed/Feed.svelte"
import {isLike} from "src/util/nostr"
import {timedelta} from "src/util/misc"

View File

@ -1,6 +1,6 @@
<script lang="ts">
import {timedelta} from "src/util/misc"
import Feed from "src/views/feed/Feed.svelte"
import Feed from "src/ui/views/feed/Feed.svelte"
export let pubkey
export let relays

View File

@ -1,6 +1,6 @@
<script lang="ts">
import {displayPerson} from "src/util/nostr"
import PersonInfo from "src/partials/PersonInfo.svelte"
import PersonInfo from "src/ui/partials/PersonInfo.svelte"
import {getPubkeyWriteRelays, sampleRelays} from "src/agent/relays"
import user from "src/agent/user"

View File

@ -2,9 +2,9 @@
import {onMount} from "svelte"
import {uniq, sortBy, pluck} from "ramda"
import {Tags} from "src/util/nostr"
import Content from "src/partials/Content.svelte"
import Spinner from "src/partials/Spinner.svelte"
import PersonInfo from "src/views/person/PersonInfo.svelte"
import Content from "src/ui/partials/Content.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import PersonInfo from "src/ui/views/person/PersonInfo.svelte"
import {sampleRelays, getPubkeyWriteRelays} from "src/agent/relays"
import {getPersonWithFallback} from "src/agent/tables"
import {watch} from "src/agent/storage"

View File

@ -1,8 +1,8 @@
<script lang="ts">
import {nip05, nip19} from "nostr-tools"
import Content from "src/partials/Content.svelte"
import RelayCard from "src/views/relays/RelayCard.svelte"
import CopyValue from "src/partials/CopyValue.svelte"
import Content from "src/ui/partials/Content.svelte"
import RelayCard from "src/ui/views/relays/RelayCard.svelte"
import CopyValue from "src/ui/partials/CopyValue.svelte"
import {onMount} from "svelte"
import {fly} from "svelte/transition"

View File

@ -1,9 +1,9 @@
<script>
import {fuzzy} from "src/util/misc"
import {personKinds} from "src/util/nostr"
import Input from "src/partials/Input.svelte"
import Spinner from "src/partials/Spinner.svelte"
import PersonInfo from "src/views/person/PersonInfo.svelte"
import Input from "src/ui/partials/Input.svelte"
import Spinner from "src/ui/partials/Spinner.svelte"
import PersonInfo from "src/ui/views/person/PersonInfo.svelte"
import {getUserReadRelays} from "src/agent/relays"
import {watch} from "src/agent/storage"
import network from "src/agent/network"

View File

@ -1,8 +1,8 @@
<script lang="ts">
import {pluck} from "ramda"
import {nip19} from "nostr-tools"
import Content from "src/partials/Content.svelte"
import QRCode from "src/partials/QRCode.svelte"
import Content from "src/ui/partials/Content.svelte"
import QRCode from "src/ui/partials/QRCode.svelte"
import {getPubkeyWriteRelays} from "src/agent/relays"
export let person

View File

@ -2,14 +2,14 @@
import {last} from "ramda"
import {navigate} from "svelte-routing"
import {displayPerson} from "src/util/nostr"
import Anchor from "src/partials/Anchor.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import user from "src/agent/user"
import {sampleRelays, getPubkeyWriteRelays} from "src/agent/relays"
import {getPersonWithFallback} from "src/agent/tables"
import {watch} from "src/agent/storage"
import {routes} from "src/app/ui"
import PersonCircle from "src/partials/PersonCircle.svelte"
import PersonAbout from "src/partials/PersonAbout.svelte"
import PersonCircle from "src/ui/partials/PersonCircle.svelte"
import PersonAbout from "src/ui/partials/PersonAbout.svelte"
export let pubkey

View File

@ -1,7 +1,7 @@
<script>
import {fly} from "svelte/transition"
import Content from "src/partials/Content.svelte"
import RelayCard from "src/views/relays/RelayCard.svelte"
import Content from "src/ui/partials/Content.svelte"
import RelayCard from "src/ui/views/relays/RelayCard.svelte"
export let relays
</script>

View File

@ -1,9 +1,9 @@
<script>
import {fly} from "svelte/transition"
import Input from "src/partials/Input.svelte"
import Content from "src/partials/Content.svelte"
import Heading from "src/partials/Heading.svelte"
import Button from "src/partials/Button.svelte"
import Input from "src/ui/partials/Input.svelte"
import Content from "src/ui/partials/Content.svelte"
import Heading from "src/ui/partials/Heading.svelte"
import Button from "src/ui/partials/Button.svelte"
import user from "src/agent/user"
import {toast, modal} from "src/app/ui"
import {loadAppData} from "src/app"

View File

@ -1,8 +1,8 @@
<script lang="ts">
import {find, last, propEq} from "ramda"
import Anchor from "src/partials/Anchor.svelte"
import Popover from "src/partials/Popover.svelte"
import OverflowMenu from "src/partials/OverflowMenu.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import Popover from "src/ui/partials/Popover.svelte"
import OverflowMenu from "src/ui/partials/OverflowMenu.svelte"
import user from "src/agent/user"
import {getRelayWithFallback} from "src/agent/tables"

View File

@ -2,8 +2,8 @@
import {find, propEq} from "ramda"
import {onMount} from "svelte"
import {poll} from "src/util/misc"
import Toggle from "src/partials/Toggle.svelte"
import RelayCard from "src/partials/RelayCard.svelte"
import Toggle from "src/ui/partials/Toggle.svelte"
import RelayCard from "src/ui/partials/RelayCard.svelte"
import pool from "src/agent/pool"
import user from "src/agent/user"
import keys from "src/agent/keys"

View File

@ -1,8 +1,8 @@
<script>
import {pluck} from "ramda"
import {fuzzy} from "src/util/misc"
import Input from "src/partials/Input.svelte"
import RelayCard from "src/views/relays/RelayCard.svelte"
import Input from "src/ui/partials/Input.svelte"
import RelayCard from "src/ui/views/relays/RelayCard.svelte"
import {watch} from "src/agent/storage"
import user from "src/agent/user"

View File

@ -3,7 +3,7 @@
import {between} from "hurdak/lib/hurdak"
import {displayRelay} from "src/util/nostr"
import {poll, stringToHue, hsl} from "src/util/misc"
import Anchor from "src/partials/Anchor.svelte"
import Anchor from "src/ui/partials/Anchor.svelte"
import pool from "src/agent/pool"
export let relay