diff --git a/packages/app/src/Element/AsyncButton.css b/packages/app/src/Element/Button/AsyncButton.css
similarity index 100%
rename from packages/app/src/Element/AsyncButton.css
rename to packages/app/src/Element/Button/AsyncButton.css
diff --git a/packages/app/src/Element/AsyncButton.tsx b/packages/app/src/Element/Button/AsyncButton.tsx
similarity index 95%
rename from packages/app/src/Element/AsyncButton.tsx
rename to packages/app/src/Element/Button/AsyncButton.tsx
index 862ca45f3..1876b10bb 100644
--- a/packages/app/src/Element/AsyncButton.tsx
+++ b/packages/app/src/Element/Button/AsyncButton.tsx
@@ -1,6 +1,6 @@
import "./AsyncButton.css";
import React, { ForwardedRef } from "react";
-import Spinner from "../Icons/Spinner";
+import Spinner from "../../Icons/Spinner";
import useLoading from "@/Hooks/useLoading";
import classNames from "classnames";
diff --git a/packages/app/src/Element/AsyncIcon.tsx b/packages/app/src/Element/Button/AsyncIcon.tsx
similarity index 100%
rename from packages/app/src/Element/AsyncIcon.tsx
rename to packages/app/src/Element/Button/AsyncIcon.tsx
diff --git a/packages/app/src/Element/BackButton.css b/packages/app/src/Element/Button/BackButton.css
similarity index 100%
rename from packages/app/src/Element/BackButton.css
rename to packages/app/src/Element/Button/BackButton.css
diff --git a/packages/app/src/Element/BackButton.tsx b/packages/app/src/Element/Button/BackButton.tsx
similarity index 94%
rename from packages/app/src/Element/BackButton.tsx
rename to packages/app/src/Element/Button/BackButton.tsx
index 41d990d9a..2680c01b3 100644
--- a/packages/app/src/Element/BackButton.tsx
+++ b/packages/app/src/Element/Button/BackButton.tsx
@@ -3,7 +3,7 @@ import { useIntl } from "react-intl";
import Icon from "@/Icons/Icon";
-import messages from "./messages";
+import messages from "../messages";
interface BackButtonProps {
text?: string;
diff --git a/packages/app/src/Element/IconButton.tsx b/packages/app/src/Element/Button/IconButton.tsx
similarity index 100%
rename from packages/app/src/Element/IconButton.tsx
rename to packages/app/src/Element/Button/IconButton.tsx
diff --git a/packages/app/src/Element/LogoutButton.tsx b/packages/app/src/Element/Button/LogoutButton.tsx
similarity index 94%
rename from packages/app/src/Element/LogoutButton.tsx
rename to packages/app/src/Element/Button/LogoutButton.tsx
index b002d0c89..0d138a668 100644
--- a/packages/app/src/Element/LogoutButton.tsx
+++ b/packages/app/src/Element/Button/LogoutButton.tsx
@@ -3,7 +3,7 @@ import { useNavigate } from "react-router-dom";
import { logout } from "@/Login";
import useLogin from "@/Hooks/useLogin";
-import messages from "./messages";
+import messages from "../messages";
export default function LogoutButton() {
const navigate = useNavigate();
diff --git a/packages/app/src/Element/Chat/WriteMessage.tsx b/packages/app/src/Element/Chat/WriteMessage.tsx
index 1340cf475..9c4e78927 100644
--- a/packages/app/src/Element/Chat/WriteMessage.tsx
+++ b/packages/app/src/Element/Chat/WriteMessage.tsx
@@ -2,7 +2,7 @@ import { useState } from "react";
import useEventPublisher from "@/Hooks/useEventPublisher";
import Textarea from "../Textarea";
import { Chat } from "@/chat";
-import { AsyncIcon } from "@/Element/AsyncIcon";
+import { AsyncIcon } from "@/Element/Button/AsyncIcon";
export default function WriteMessage({ chat }: { chat: Chat }) {
const [msg, setMsg] = useState("");
diff --git a/packages/app/src/Element/CodeBlock.css b/packages/app/src/Element/CodeBlock.css
deleted file mode 100644
index af8a21e86..000000000
--- a/packages/app/src/Element/CodeBlock.css
+++ /dev/null
@@ -1,14 +0,0 @@
-.codeblock {
- overflow: auto;
- position: relative;
-}
-
-.codeblock pre {
- overflow: auto;
- line-height: 1.4;
- font-size: var(--font-size);
-}
-
-.hljs {
- background: #f6f8fa;
-}
diff --git a/packages/app/src/Element/CodeBlock.tsx b/packages/app/src/Element/CodeBlock.tsx
deleted file mode 100644
index 825c1ccbe..000000000
--- a/packages/app/src/Element/CodeBlock.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { useEffect } from "react";
-import "highlight.js/styles/github.css";
-import "./CodeBlock.css";
-
-const CodeBlock = ({ content, language }: { content: string; language?: string }) => {
- useEffect(() => {
- const importHljs = async () => {
- const hljs = (await import("highlight.js")).default;
- hljs.highlightAll();
- };
-
- importHljs();
- });
-
- return (
-
- );
-};
-
-export default CodeBlock;
diff --git a/packages/app/src/Element/HyperText.tsx b/packages/app/src/Element/Embed/HyperText.tsx
similarity index 100%
rename from packages/app/src/Element/HyperText.tsx
rename to packages/app/src/Element/Embed/HyperText.tsx
diff --git a/packages/app/src/Element/Embed/PubkeyList.tsx b/packages/app/src/Element/Embed/PubkeyList.tsx
index 86bb60ddd..cbba09cc8 100644
--- a/packages/app/src/Element/Embed/PubkeyList.tsx
+++ b/packages/app/src/Element/Embed/PubkeyList.tsx
@@ -4,7 +4,7 @@ import { LNURL } from "@snort/shared";
import { dedupe, findTag, hexToBech32, getDisplayName } from "@/SnortUtils";
import FollowListBase from "@/Element/User/FollowListBase";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { useWallet } from "@/Wallet";
import { Toastore } from "@/Toaster";
import { UserCache } from "@/Cache";
diff --git a/packages/app/src/Element/Event/Create/NoteBroadcaster.tsx b/packages/app/src/Element/Event/Create/NoteBroadcaster.tsx
index 9b8860b54..d59dd5385 100644
--- a/packages/app/src/Element/Event/Create/NoteBroadcaster.tsx
+++ b/packages/app/src/Element/Event/Create/NoteBroadcaster.tsx
@@ -3,7 +3,7 @@ import { FormattedMessage, useIntl } from "react-intl";
import { unwrap } from "@snort/shared";
import { NostrEvent, OkResponse } from "@snort/system";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import Icon from "@/Icons/Icon";
import { getRelayName, sanitizeRelayUrl } from "@/SnortUtils";
import { removeRelay } from "@/Login";
diff --git a/packages/app/src/Element/Event/Create/NoteCreator.tsx b/packages/app/src/Element/Event/Create/NoteCreator.tsx
index 8dee72b5a..e3b0f2c93 100644
--- a/packages/app/src/Element/Event/Create/NoteCreator.tsx
+++ b/packages/app/src/Element/Event/Create/NoteCreator.tsx
@@ -16,8 +16,8 @@ import Note from "@/Element/Event/Note";
import { ClipboardEventHandler, DragEvent } from "react";
import useLogin from "@/Hooks/useLogin";
import { GetPowWorker } from "@/index";
-import AsyncButton from "@/Element/AsyncButton";
-import { AsyncIcon } from "@/Element/AsyncIcon";
+import AsyncButton from "@/Element/Button/AsyncButton";
+import { AsyncIcon } from "@/Element/Button/AsyncIcon";
import { fetchNip05Pubkey } from "@snort/shared";
import { ZapTarget } from "@/Zapper";
import { useNoteCreator } from "@/State/NoteCreator";
diff --git a/packages/app/src/Element/Event/NoteFooter.tsx b/packages/app/src/Element/Event/NoteFooter.tsx
index 5ba905ac4..2df349e81 100644
--- a/packages/app/src/Element/Event/NoteFooter.tsx
+++ b/packages/app/src/Element/Event/NoteFooter.tsx
@@ -12,7 +12,7 @@ import useEventPublisher from "@/Hooks/useEventPublisher";
import { delay, findTag, getDisplayName } from "@/SnortUtils";
import SendSats from "@/Element/SendSats";
import { ZapsSummary } from "@/Element/Event/Zap";
-import { AsyncIcon, AsyncIconProps } from "@/Element/AsyncIcon";
+import { AsyncIcon, AsyncIconProps } from "@/Element/Button/AsyncIcon";
import { useWallet } from "@/Wallet";
import useLogin from "@/Hooks/useLogin";
diff --git a/packages/app/src/Element/Event/Thread.tsx b/packages/app/src/Element/Event/Thread.tsx
index 7e45e30a6..79a1e0b42 100644
--- a/packages/app/src/Element/Event/Thread.tsx
+++ b/packages/app/src/Element/Event/Thread.tsx
@@ -6,7 +6,7 @@ import { TaggedNostrEvent, u256, NostrPrefix, EventExt, parseNostrLink, NostrLin
import classNames from "classnames";
import { getAllLinkReactions, getLinkReactions } from "@/SnortUtils";
-import BackButton from "@/Element/BackButton";
+import BackButton from "@/Element/Button/BackButton";
import Note from "@/Element/Event/Note";
import NoteGhost from "@/Element/Event/NoteGhost";
import Collapsed from "@/Element/Collapsed";
diff --git a/packages/app/src/Element/Articles.tsx b/packages/app/src/Element/Feed/Articles.tsx
similarity index 96%
rename from packages/app/src/Element/Articles.tsx
rename to packages/app/src/Element/Feed/Articles.tsx
index 0cc436cb0..4cd8d6ca8 100644
--- a/packages/app/src/Element/Articles.tsx
+++ b/packages/app/src/Element/Feed/Articles.tsx
@@ -3,7 +3,7 @@ import { useReactions } from "@snort/system-react";
import { useArticles } from "@/Feed/ArticlesFeed";
import { orderDescending } from "@/SnortUtils";
-import Note from "./Event/Note";
+import Note from "../Event/Note";
import { useContext } from "react";
import { DeckContext } from "@/Pages/DeckLayout";
diff --git a/packages/app/src/Element/RootTabs.css b/packages/app/src/Element/Feed/RootTabs.css
similarity index 100%
rename from packages/app/src/Element/RootTabs.css
rename to packages/app/src/Element/Feed/RootTabs.css
diff --git a/packages/app/src/Element/RootTabs.tsx b/packages/app/src/Element/Feed/RootTabs.tsx
similarity index 100%
rename from packages/app/src/Element/RootTabs.tsx
rename to packages/app/src/Element/Feed/RootTabs.tsx
diff --git a/packages/app/src/Element/FixedTabs.css b/packages/app/src/Element/FixedTabs.css
deleted file mode 100644
index 2c568719d..000000000
--- a/packages/app/src/Element/FixedTabs.css
+++ /dev/null
@@ -1,34 +0,0 @@
-.fixed-tabs {
- display: flex;
- align-items: center;
- flex-direction: row;
- white-space: nowrap;
- text-align: center;
- user-select: none;
-}
-
-.fixed-tabs > a {
- flex: 1;
- padding: 16px;
- color: var(--font-tertiary-color);
- font-weight: 500;
- font-size: 16px;
- letter-spacing: 0.2px;
- cursor: pointer;
- text-decoration: none;
-}
-
-.fixed-tabs > a.active {
- border-bottom: 1px solid var(--highlight);
- color: var(--font-color);
-}
-
-.fixed-tabs > a.disabled {
- opacity: 0.3;
- cursor: not-allowed;
- pointer-events: none;
-}
-
-.fixed-tabs > a:hover {
- border-color: var(--highlight);
-}
diff --git a/packages/app/src/Element/FixedTabs.tsx b/packages/app/src/Element/FixedTabs.tsx
deleted file mode 100644
index edf2a1f3a..000000000
--- a/packages/app/src/Element/FixedTabs.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import "./FixedTabs.css";
-import { ReactNode } from "react";
-
-export function FixedTabs({ children }: { children: ReactNode }) {
- return {children}
;
-}
diff --git a/packages/app/src/Element/Logo.tsx b/packages/app/src/Element/Logo.tsx
deleted file mode 100644
index 7647e2ab4..000000000
--- a/packages/app/src/Element/Logo.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { useNavigate } from "react-router-dom";
-
-const Logo = () => {
- const navigate = useNavigate();
- return (
- navigate("/")}>
- {CONFIG.appNameCapitalized}
-
- );
-};
-
-export default Logo;
diff --git a/packages/app/src/Element/Nip5Service.tsx b/packages/app/src/Element/Nip5Service.tsx
index 96ad72908..d49487b10 100644
--- a/packages/app/src/Element/Nip5Service.tsx
+++ b/packages/app/src/Element/Nip5Service.tsx
@@ -14,7 +14,7 @@ import {
HandleRegisterResponse,
CheckRegisterResponse,
} from "@/Nip05/ServiceProvider";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import SendSats from "@/Element/SendSats";
import Copy from "@/Element/Copy";
import { useUserProfile } from "@snort/system-react";
diff --git a/packages/app/src/Element/Offline.tsx b/packages/app/src/Element/Offline.tsx
index eb5b8b979..afb5e1ea1 100644
--- a/packages/app/src/Element/Offline.tsx
+++ b/packages/app/src/Element/Offline.tsx
@@ -1,5 +1,5 @@
import Icon from "@/Icons/Icon";
-import AsyncButton from "./AsyncButton";
+import AsyncButton from "./Button/AsyncButton";
import { FormattedMessage } from "react-intl";
import classNames from "classnames";
diff --git a/packages/app/src/Element/PinPrompt.tsx b/packages/app/src/Element/PinPrompt.tsx
index c6b01d485..5703a2152 100644
--- a/packages/app/src/Element/PinPrompt.tsx
+++ b/packages/app/src/Element/PinPrompt.tsx
@@ -8,7 +8,7 @@ import { EventPublisher, InvalidPinError, PinEncrypted } from "@snort/system";
import useEventPublisher from "@/Hooks/useEventPublisher";
import { LoginStore, createPublisher, sessionNeedsPin } from "@/Login";
import Modal from "./Modal";
-import AsyncButton from "./AsyncButton";
+import AsyncButton from "./Button/AsyncButton";
import { GetPowWorker } from "@/index";
export function PinPrompt({
diff --git a/packages/app/src/Element/ReBroadcaster.tsx b/packages/app/src/Element/ReBroadcaster.tsx
index e28fdd01e..88dbe1d1f 100644
--- a/packages/app/src/Element/ReBroadcaster.tsx
+++ b/packages/app/src/Element/ReBroadcaster.tsx
@@ -6,7 +6,7 @@ import { SnortContext } from "@snort/system-react";
import Modal from "@/Element/Modal";
import messages from "./messages";
import useLogin from "@/Hooks/useLogin";
-import AsyncButton from "./AsyncButton";
+import AsyncButton from "./Button/AsyncButton";
export function ReBroadcaster({ onClose, ev }: { onClose: () => void; ev: TaggedNostrEvent }) {
const [selected, setSelected] = useState>();
diff --git a/packages/app/src/Element/Relay/Relay.tsx b/packages/app/src/Element/Relay/Relay.tsx
index 0cb3dbdef..1f2fd660f 100644
--- a/packages/app/src/Element/Relay/Relay.tsx
+++ b/packages/app/src/Element/Relay/Relay.tsx
@@ -11,7 +11,7 @@ import { getRelayName, unwrap } from "@/SnortUtils";
import useLogin from "@/Hooks/useLogin";
import { removeRelay, setRelays } from "@/Login";
import { RelayFavicon } from "./RelaysMetadata";
-import { AsyncIcon } from "@/Element/AsyncIcon";
+import { AsyncIcon } from "@/Element/Button/AsyncIcon";
export interface RelayProps {
addr: string;
diff --git a/packages/app/src/Element/SendSats.tsx b/packages/app/src/Element/SendSats.tsx
index 176f80b36..6245ae10d 100644
--- a/packages/app/src/Element/SendSats.tsx
+++ b/packages/app/src/Element/SendSats.tsx
@@ -15,7 +15,7 @@ import Copy from "@/Element/Copy";
import { debounce } from "@/SnortUtils";
import { LNWallet, useWallet } from "@/Wallet";
import useLogin from "@/Hooks/useLogin";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { ZapTarget, ZapTargetResult, Zapper } from "@/Zapper";
import messages from "./messages";
diff --git a/packages/app/src/Element/Text.tsx b/packages/app/src/Element/Text.tsx
index 0bf8efe18..00c13ff3b 100644
--- a/packages/app/src/Element/Text.tsx
+++ b/packages/app/src/Element/Text.tsx
@@ -5,7 +5,7 @@ import classNames from "classnames";
import Invoice from "@/Element/Embed/Invoice";
import Hashtag from "@/Element/Embed/Hashtag";
-import HyperText from "@/Element/HyperText";
+import HyperText from "@/Element/Embed/HyperText";
import CashuNuts from "@/Element/Embed/CashuNuts";
import RevealMedia from "./Event/RevealMedia";
import { ProxyImg } from "./ProxyImg";
@@ -262,7 +262,6 @@ export default function Text({
chunks.push();
}
if (element.type === "code_block") {
- //chunks.push();
chunks.push({element.content}
);
}
if (element.type === "text") {
diff --git a/packages/app/src/Element/TrendingHashtags.tsx b/packages/app/src/Element/Trending/TrendingHashtags.tsx
similarity index 97%
rename from packages/app/src/Element/TrendingHashtags.tsx
rename to packages/app/src/Element/Trending/TrendingHashtags.tsx
index e7739395a..f72abf365 100644
--- a/packages/app/src/Element/TrendingHashtags.tsx
+++ b/packages/app/src/Element/Trending/TrendingHashtags.tsx
@@ -2,7 +2,7 @@ import { ReactNode, useEffect, useState } from "react";
import PageSpinner from "@/Element/PageSpinner";
import NostrBandApi from "@/External/NostrBand";
-import { ErrorOrOffline } from "./ErrorOrOffline";
+import { ErrorOrOffline } from "../ErrorOrOffline";
import { HashTagHeader } from "@/Pages/HashTagsPage";
import { useLocale } from "@/IntlProvider";
import classNames from "classnames";
diff --git a/packages/app/src/Element/TrendingPosts.tsx b/packages/app/src/Element/Trending/TrendingPosts.tsx
similarity index 100%
rename from packages/app/src/Element/TrendingPosts.tsx
rename to packages/app/src/Element/Trending/TrendingPosts.tsx
diff --git a/packages/app/src/Element/TrendingUsers.tsx b/packages/app/src/Element/Trending/TrendingUsers.tsx
similarity index 95%
rename from packages/app/src/Element/TrendingUsers.tsx
rename to packages/app/src/Element/Trending/TrendingUsers.tsx
index db8ecf29f..2257bea2d 100644
--- a/packages/app/src/Element/TrendingUsers.tsx
+++ b/packages/app/src/Element/Trending/TrendingUsers.tsx
@@ -4,7 +4,7 @@ import { HexKey } from "@snort/system";
import FollowListBase from "@/Element/User/FollowListBase";
import PageSpinner from "@/Element/PageSpinner";
import NostrBandApi from "@/External/NostrBand";
-import { ErrorOrOffline } from "./ErrorOrOffline";
+import { ErrorOrOffline } from "../ErrorOrOffline";
export default function TrendingUsers({ title, count = Infinity }: { title?: ReactNode; count?: number }) {
const [userList, setUserList] = useState();
diff --git a/packages/app/src/Element/User/FollowButton.tsx b/packages/app/src/Element/User/FollowButton.tsx
index 9c7c6c9fe..6d39da61d 100644
--- a/packages/app/src/Element/User/FollowButton.tsx
+++ b/packages/app/src/Element/User/FollowButton.tsx
@@ -4,7 +4,7 @@ import { HexKey } from "@snort/system";
import useEventPublisher from "@/Hooks/useEventPublisher";
import { parseId } from "@/SnortUtils";
import useLogin from "@/Hooks/useLogin";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import messages from "../messages";
import { FollowsFeed } from "@/Cache";
diff --git a/packages/app/src/Element/User/FollowListBase.tsx b/packages/app/src/Element/User/FollowListBase.tsx
index fe56c2271..8a3589b68 100644
--- a/packages/app/src/Element/User/FollowListBase.tsx
+++ b/packages/app/src/Element/User/FollowListBase.tsx
@@ -9,7 +9,7 @@ import useLogin from "@/Hooks/useLogin";
import messages from "../messages";
import { FollowsFeed } from "@/Cache";
-import AsyncButton from "../AsyncButton";
+import AsyncButton from "../Button/AsyncButton";
import { setFollows } from "@/Login";
export interface FollowListBaseProps {
diff --git a/packages/app/src/Pages/DeckLayout.tsx b/packages/app/src/Pages/DeckLayout.tsx
index 014fc12cf..b1293330c 100644
--- a/packages/app/src/Pages/DeckLayout.tsx
+++ b/packages/app/src/Pages/DeckLayout.tsx
@@ -7,15 +7,15 @@ import { NostrLink, TaggedNostrEvent } from "@snort/system";
import useLoginFeed from "@/Feed/LoginFeed";
import { useLoginRelays } from "@/Hooks/useLoginRelays";
import { useTheme } from "@/Hooks/useTheme";
-import Articles from "@/Element/Articles";
+import Articles from "@/Element/Feed/Articles";
import TimelineFollows from "@/Element/Feed/TimelineFollows";
import { transformTextCached } from "@/Hooks/useTextTransformCache";
import Icon from "@/Icons/Icon";
-import NotificationsPage from "./Notifications";
+import NotificationsPage from "./Notifications/Notifications";
import useImgProxy from "@/Hooks/useImgProxy";
import Modal from "@/Element/Modal";
import { Thread } from "@/Element/Event/Thread";
-import { RootTabs } from "@/Element/RootTabs";
+import { RootTabs } from "@/Element/Feed/RootTabs";
import { SpotlightMedia } from "@/Element/SpotlightMedia";
import { ThreadContext, ThreadContextWrapper } from "@/Hooks/useThreadContext";
import Toaster from "@/Toaster";
diff --git a/packages/app/src/Pages/Discover.tsx b/packages/app/src/Pages/Discover.tsx
index 466d1b7aa..48ad3fb47 100644
--- a/packages/app/src/Pages/Discover.tsx
+++ b/packages/app/src/Pages/Discover.tsx
@@ -1,7 +1,7 @@
import SuggestedProfiles from "@/Element/SuggestedProfiles";
import { Tab, TabElement } from "@/Element/Tabs";
-import TrendingNotes from "@/Element/TrendingPosts";
-import TrendingUsers from "@/Element/TrendingUsers";
+import TrendingNotes from "@/Element/Trending/TrendingPosts";
+import TrendingUsers from "@/Element/Trending/TrendingUsers";
import { useState } from "react";
import { useIntl } from "react-intl";
diff --git a/packages/app/src/Pages/DonatePage.tsx b/packages/app/src/Pages/DonatePage.tsx
index 4b9ee623b..838748319 100644
--- a/packages/app/src/Pages/DonatePage.tsx
+++ b/packages/app/src/Pages/DonatePage.tsx
@@ -8,7 +8,7 @@ import ZapButton from "@/Element/Event/ZapButton";
import { bech32ToHex } from "@/SnortUtils";
import SnortApi, { RevenueSplit, RevenueToday } from "@/External/SnortApi";
import Modal from "@/Element/Modal";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import QrCode from "@/Element/QrCode";
import Copy from "@/Element/Copy";
diff --git a/packages/app/src/Pages/ErrorPage.tsx b/packages/app/src/Pages/ErrorPage.tsx
index 25aa09ea3..6e5ccc6db 100644
--- a/packages/app/src/Pages/ErrorPage.tsx
+++ b/packages/app/src/Pages/ErrorPage.tsx
@@ -1,5 +1,5 @@
import { db } from "@/Db";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { FormattedMessage } from "react-intl";
import { useRouteError } from "react-router-dom";
diff --git a/packages/app/src/Pages/HashTagsPage.tsx b/packages/app/src/Pages/HashTagsPage.tsx
index cd7c542c1..de3bd2862 100644
--- a/packages/app/src/Pages/HashTagsPage.tsx
+++ b/packages/app/src/Pages/HashTagsPage.tsx
@@ -9,7 +9,7 @@ import Timeline from "@/Element/Feed/Timeline";
import useEventPublisher from "@/Hooks/useEventPublisher";
import useLogin from "@/Hooks/useLogin";
import { setTags } from "@/Login";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import ProfileImage from "@/Element/User/ProfileImage";
import classNames from "classnames";
import { formatShort } from "@/Number";
diff --git a/packages/app/src/Pages/Layout/RightColumn.tsx b/packages/app/src/Pages/Layout/RightColumn.tsx
index ab577b04d..0d1986a38 100644
--- a/packages/app/src/Pages/Layout/RightColumn.tsx
+++ b/packages/app/src/Pages/Layout/RightColumn.tsx
@@ -1,7 +1,7 @@
import SearchBox from "@/Element/SearchBox";
-import TrendingUsers from "@/Element/TrendingUsers";
-import TrendingHashtags from "@/Element/TrendingHashtags";
-import TrendingNotes from "@/Element/TrendingPosts";
+import TrendingUsers from "@/Element/Trending/TrendingUsers";
+import TrendingHashtags from "@/Element/Trending/TrendingHashtags";
+import TrendingNotes from "@/Element/Trending/TrendingPosts";
import { FormattedMessage } from "react-intl";
import classNames from "classnames";
diff --git a/packages/app/src/Pages/Messages/MessagesPage.tsx b/packages/app/src/Pages/Messages/MessagesPage.tsx
index cc88a8dfb..9d15b64a4 100644
--- a/packages/app/src/Pages/Messages/MessagesPage.tsx
+++ b/packages/app/src/Pages/Messages/MessagesPage.tsx
@@ -2,7 +2,7 @@ import React, { useEffect, useMemo, useState } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import { useNavigate, useParams } from "react-router-dom";
-import UnreadCount from "@/Element/UnreadCount";
+import UnreadCount from "@/Pages/Messages/UnreadCount";
import ProfileImage from "@/Element/User/ProfileImage";
import { parseId } from "@/SnortUtils";
import NoteToSelf from "@/Element/User/NoteToSelf";
diff --git a/packages/app/src/Element/UnreadCount.css b/packages/app/src/Pages/Messages/UnreadCount.css
similarity index 100%
rename from packages/app/src/Element/UnreadCount.css
rename to packages/app/src/Pages/Messages/UnreadCount.css
diff --git a/packages/app/src/Element/UnreadCount.tsx b/packages/app/src/Pages/Messages/UnreadCount.tsx
similarity index 100%
rename from packages/app/src/Element/UnreadCount.tsx
rename to packages/app/src/Pages/Messages/UnreadCount.tsx
diff --git a/packages/app/src/Element/NotificationChart.tsx b/packages/app/src/Pages/Notifications/NotificationChart.tsx
similarity index 98%
rename from packages/app/src/Element/NotificationChart.tsx
rename to packages/app/src/Pages/Notifications/NotificationChart.tsx
index bb235e863..490d1b1c1 100644
--- a/packages/app/src/Element/NotificationChart.tsx
+++ b/packages/app/src/Pages/Notifications/NotificationChart.tsx
@@ -7,8 +7,8 @@ import { TaggedNostrEvent, EventKind } from "@snort/system";
import classNames from "classnames";
import { useState, useMemo } from "react";
import { FormattedMessage } from "react-intl";
-import { AsyncIcon } from "./AsyncIcon";
-import Tabs, { Tab } from "./Tabs";
+import { AsyncIcon } from "../../Element/Button/AsyncIcon";
+import Tabs, { Tab } from "../../Element/Tabs";
import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts";
interface StatSlot {
diff --git a/packages/app/src/Pages/Notifications.css b/packages/app/src/Pages/Notifications/Notifications.css
similarity index 100%
rename from packages/app/src/Pages/Notifications.css
rename to packages/app/src/Pages/Notifications/Notifications.css
diff --git a/packages/app/src/Pages/Notifications.tsx b/packages/app/src/Pages/Notifications/Notifications.tsx
similarity index 98%
rename from packages/app/src/Pages/Notifications.tsx
rename to packages/app/src/Pages/Notifications/Notifications.tsx
index 451283c42..0e6be0b0d 100644
--- a/packages/app/src/Pages/Notifications.tsx
+++ b/packages/app/src/Pages/Notifications/Notifications.tsx
@@ -20,7 +20,7 @@ import { LiveEvent } from "@/Element/LiveEvent";
import ProfilePreview from "@/Element/User/ProfilePreview";
import { ShowMoreInView } from "@/Element/Event/ShowMore";
import PageSpinner from "@/Element/PageSpinner";
-const NotificationGraph = lazy(() => import("@/Element/NotificationChart"));
+const NotificationGraph = lazy(() => import("@/Pages/Notifications/NotificationChart"));
function notificationContext(ev: TaggedNostrEvent) {
switch (ev.kind) {
diff --git a/packages/app/src/Pages/Profile/ProfilePage.tsx b/packages/app/src/Pages/Profile/ProfilePage.tsx
index 3e60f43d2..973985e90 100644
--- a/packages/app/src/Pages/Profile/ProfilePage.tsx
+++ b/packages/app/src/Pages/Profile/ProfilePage.tsx
@@ -35,7 +35,7 @@ import ProfileImage from "@/Element/User/ProfileImage";
import BlockList from "@/Element/User/BlockList";
import MutedList from "@/Element/User/MutedList";
import FollowsList from "@/Element/User/FollowListBase";
-import IconButton from "@/Element/IconButton";
+import IconButton from "@/Element/Button/IconButton";
import FollowsYou from "@/Element/User/FollowsYou";
import QrCode from "@/Element/QrCode";
import Modal from "@/Element/Modal";
diff --git a/packages/app/src/Pages/Root.tsx b/packages/app/src/Pages/Root.tsx
index c2d593b2e..a8fac6282 100644
--- a/packages/app/src/Pages/Root.tsx
+++ b/packages/app/src/Pages/Root.tsx
@@ -10,16 +10,16 @@ import { TimelineSubject } from "@/Feed/TimelineFeed";
import { debounce, getRelayName, sha256 } from "@/SnortUtils";
import useLogin from "@/Hooks/useLogin";
import Discover from "@/Pages/Discover";
-import TrendingUsers from "@/Element/TrendingUsers";
-import TrendingNotes from "@/Element/TrendingPosts";
+import TrendingUsers from "@/Element/Trending/TrendingUsers";
+import TrendingNotes from "@/Element/Trending/TrendingPosts";
import HashTagsPage from "@/Pages/HashTagsPage";
import SuggestedProfiles from "@/Element/SuggestedProfiles";
import { TaskList } from "@/Tasks/TaskList";
import TimelineFollows from "@/Element/Feed/TimelineFollows";
-import { RootTabs } from "@/Element/RootTabs";
+import { RootTabs } from "@/Element/Feed/RootTabs";
import { DeckContext } from "@/Pages/DeckLayout";
import { TopicsPage } from "./TopicsPage";
-import TrendingHashtags from "@/Element/TrendingHashtags";
+import TrendingHashtags from "@/Element/Trending/TrendingHashtags";
import messages from "./messages";
diff --git a/packages/app/src/Pages/SearchPage.tsx b/packages/app/src/Pages/SearchPage.tsx
index 901be0887..a7a16bfb6 100644
--- a/packages/app/src/Pages/SearchPage.tsx
+++ b/packages/app/src/Pages/SearchPage.tsx
@@ -5,9 +5,9 @@ import Tabs, { Tab } from "@/Element/Tabs";
import { useEffect, useState } from "react";
import { debounce } from "@/SnortUtils";
import { router } from "@/index";
-import TrendingUsers from "@/Element/TrendingUsers";
+import TrendingUsers from "@/Element/Trending/TrendingUsers";
-import TrendingNotes from "@/Element/TrendingPosts";
+import TrendingNotes from "@/Element/Trending/TrendingPosts";
const NOTES = 0;
const PROFILES = 1;
diff --git a/packages/app/src/Pages/WalletPage.tsx b/packages/app/src/Pages/WalletPage.tsx
index 89a751669..927504643 100644
--- a/packages/app/src/Pages/WalletPage.tsx
+++ b/packages/app/src/Pages/WalletPage.tsx
@@ -6,7 +6,7 @@ import { FormattedMessage, FormattedNumber, useIntl } from "react-intl";
import NoteTime from "@/Element/Event/NoteTime";
import { WalletInvoice, Sats, WalletInfo, WalletInvoiceState, useWallet, LNWallet, Wallets } from "@/Wallet";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { unwrap } from "@/SnortUtils";
import { WebLNWallet } from "@/Wallet/WebLN";
import Icon from "@/Icons/Icon";
diff --git a/packages/app/src/Pages/ZapPool.tsx b/packages/app/src/Pages/ZapPool.tsx
index 04ab3a402..f310dffdf 100644
--- a/packages/app/src/Pages/ZapPool.tsx
+++ b/packages/app/src/Pages/ZapPool.tsx
@@ -10,7 +10,7 @@ import useLogin from "@/Hooks/useLogin";
import { UploaderServices } from "@/Upload";
import { bech32ToHex, getRelayName, unwrap } from "@/SnortUtils";
import { ZapPoolController, ZapPoolRecipient, ZapPoolRecipientType } from "@/ZapPoolController";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { useWallet } from "@/Wallet";
import useEventPublisher from "@/Hooks/useEventPublisher";
diff --git a/packages/app/src/Pages/onboarding/discover.tsx b/packages/app/src/Pages/onboarding/discover.tsx
index e60edcf7c..02be6590e 100644
--- a/packages/app/src/Pages/onboarding/discover.tsx
+++ b/packages/app/src/Pages/onboarding/discover.tsx
@@ -1,8 +1,8 @@
import { FormattedMessage } from "react-intl";
import { useLocation, useNavigate } from "react-router-dom";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { NewUserState } from ".";
-import TrendingUsers from "@/Element/TrendingUsers";
+import TrendingUsers from "@/Element/Trending/TrendingUsers";
export function Discover() {
const location = useLocation();
diff --git a/packages/app/src/Pages/onboarding/moderation.tsx b/packages/app/src/Pages/onboarding/moderation.tsx
index f99ace7cd..7fb6240e9 100644
--- a/packages/app/src/Pages/onboarding/moderation.tsx
+++ b/packages/app/src/Pages/onboarding/moderation.tsx
@@ -3,7 +3,7 @@ import { FormattedMessage } from "react-intl";
import { useNavigate } from "react-router-dom";
import { unixNowMs } from "@snort/shared";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { appendDedupe } from "@/SnortUtils";
import { ToggleSwitch } from "@/Icons/Toggle";
import { updateAppData } from "@/Login";
diff --git a/packages/app/src/Pages/onboarding/profile.tsx b/packages/app/src/Pages/onboarding/profile.tsx
index 6cf15d165..967f035c4 100644
--- a/packages/app/src/Pages/onboarding/profile.tsx
+++ b/packages/app/src/Pages/onboarding/profile.tsx
@@ -1,4 +1,4 @@
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import AvatarEditor from "@/Element/User/AvatarEditor";
import { useContext, useState } from "react";
import { FormattedMessage } from "react-intl";
diff --git a/packages/app/src/Pages/onboarding/start.tsx b/packages/app/src/Pages/onboarding/start.tsx
index e229b498c..7ab824d57 100644
--- a/packages/app/src/Pages/onboarding/start.tsx
+++ b/packages/app/src/Pages/onboarding/start.tsx
@@ -3,7 +3,7 @@ import { useState } from "react";
import { Link, useNavigate } from "react-router-dom";
import { unwrap } from "@snort/shared";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import Icon from "@/Icons/Icon";
import { NewUserState } from ".";
import { LoginSessionType, LoginStore } from "@/Login";
diff --git a/packages/app/src/Pages/onboarding/topics.tsx b/packages/app/src/Pages/onboarding/topics.tsx
index b3d1fdfed..4c81bc00b 100644
--- a/packages/app/src/Pages/onboarding/topics.tsx
+++ b/packages/app/src/Pages/onboarding/topics.tsx
@@ -1,7 +1,7 @@
import { ReactNode, useState } from "react";
import { FormattedMessage } from "react-intl";
import { useNavigate } from "react-router-dom";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import classNames from "classnames";
import { appendDedupe } from "@/SnortUtils";
import useEventPublisher from "@/Hooks/useEventPublisher";
diff --git a/packages/app/src/Pages/settings/Cache.tsx b/packages/app/src/Pages/settings/Cache.tsx
index 5d3c1b95f..0ea0d57b1 100644
--- a/packages/app/src/Pages/settings/Cache.tsx
+++ b/packages/app/src/Pages/settings/Cache.tsx
@@ -10,7 +10,7 @@ import {
UserCache,
UserRelays,
} from "@/Cache";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { ReactNode, useSyncExternalStore } from "react";
import { FormattedMessage, FormattedNumber } from "react-intl";
diff --git a/packages/app/src/Pages/settings/Profile.tsx b/packages/app/src/Pages/settings/Profile.tsx
index 7e9445d1b..0909f47aa 100644
--- a/packages/app/src/Pages/settings/Profile.tsx
+++ b/packages/app/src/Pages/settings/Profile.tsx
@@ -7,7 +7,7 @@ import { useUserProfile } from "@snort/system-react";
import useEventPublisher from "@/Hooks/useEventPublisher";
import { openFile } from "@/SnortUtils";
import useFileUpload from "@/Upload";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { UserCache } from "@/Cache";
import useLogin from "@/Hooks/useLogin";
import Icon from "@/Icons/Icon";
diff --git a/packages/app/src/Pages/settings/Relays.tsx b/packages/app/src/Pages/settings/Relays.tsx
index c03ecd0d4..eacfeec81 100644
--- a/packages/app/src/Pages/settings/Relays.tsx
+++ b/packages/app/src/Pages/settings/Relays.tsx
@@ -7,7 +7,7 @@ import Relay from "@/Element/Relay/Relay";
import useEventPublisher from "@/Hooks/useEventPublisher";
import useLogin from "@/Hooks/useLogin";
import { setRelays } from "@/Login";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import SnortApi, { RelayDistance } from "@/External/SnortApi";
import { getCountry, getRelayName, sanitizeRelayUrl } from "@/SnortUtils";
import { formatShort } from "@/Number";
diff --git a/packages/app/src/Pages/settings/handle/LNAddress.tsx b/packages/app/src/Pages/settings/handle/LNAddress.tsx
index 6c9179d00..60fb73a08 100644
--- a/packages/app/src/Pages/settings/handle/LNAddress.tsx
+++ b/packages/app/src/Pages/settings/handle/LNAddress.tsx
@@ -3,7 +3,7 @@ import { FormattedMessage, useIntl } from "react-intl";
import { LNURL } from "@snort/shared";
import { ApiHost } from "@/Const";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import useEventPublisher from "@/Hooks/useEventPublisher";
import SnortServiceProvider, { ForwardType, ManageHandle } from "@/Nip05/SnortServiceProvider";
diff --git a/packages/app/src/Pages/settings/handle/TransferHandle.tsx b/packages/app/src/Pages/settings/handle/TransferHandle.tsx
index ea9899b9f..d57d4c3b1 100644
--- a/packages/app/src/Pages/settings/handle/TransferHandle.tsx
+++ b/packages/app/src/Pages/settings/handle/TransferHandle.tsx
@@ -3,7 +3,7 @@ import { FormattedMessage, useIntl } from "react-intl";
import { useNavigate } from "react-router-dom";
import { ApiHost } from "@/Const";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import useEventPublisher from "@/Hooks/useEventPublisher";
import { ServiceError } from "@/Nip05/ServiceProvider";
import SnortServiceProvider, { ManageHandle } from "@/Nip05/SnortServiceProvider";
diff --git a/packages/app/src/Pages/settings/wallet/Cashu.tsx b/packages/app/src/Pages/settings/wallet/Cashu.tsx
index ec457f64e..65597d88b 100644
--- a/packages/app/src/Pages/settings/wallet/Cashu.tsx
+++ b/packages/app/src/Pages/settings/wallet/Cashu.tsx
@@ -2,7 +2,7 @@ import { useState } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import { v4 as uuid } from "uuid";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { unwrap } from "@/SnortUtils";
import { WalletConfig, WalletKind, Wallets } from "@/Wallet";
import { useNavigate } from "react-router-dom";
diff --git a/packages/app/src/Pages/settings/wallet/LNC.tsx b/packages/app/src/Pages/settings/wallet/LNC.tsx
index 78eac6b03..46fbd36ea 100644
--- a/packages/app/src/Pages/settings/wallet/LNC.tsx
+++ b/packages/app/src/Pages/settings/wallet/LNC.tsx
@@ -3,7 +3,7 @@ import { FormattedMessage, useIntl } from "react-intl";
import { useNavigate } from "react-router-dom";
import { v4 as uuid } from "uuid";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { LNWallet, WalletInfo, WalletKind, Wallets } from "@/Wallet";
import { unwrap } from "@/SnortUtils";
diff --git a/packages/app/src/Pages/settings/wallet/LNDHub.tsx b/packages/app/src/Pages/settings/wallet/LNDHub.tsx
index 56f54b5f2..61761b05f 100644
--- a/packages/app/src/Pages/settings/wallet/LNDHub.tsx
+++ b/packages/app/src/Pages/settings/wallet/LNDHub.tsx
@@ -2,7 +2,7 @@ import { useState } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import { v4 as uuid } from "uuid";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { unwrap } from "@/SnortUtils";
import LNDHubWallet from "@/Wallet/LNDHub";
import { WalletConfig, WalletKind, Wallets } from "@/Wallet";
diff --git a/packages/app/src/Pages/settings/wallet/NWC.tsx b/packages/app/src/Pages/settings/wallet/NWC.tsx
index c04db480f..68ac26c6c 100644
--- a/packages/app/src/Pages/settings/wallet/NWC.tsx
+++ b/packages/app/src/Pages/settings/wallet/NWC.tsx
@@ -2,7 +2,7 @@ import { useState } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import { v4 as uuid } from "uuid";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import { unwrap } from "@/SnortUtils";
import { WalletConfig, WalletKind, Wallets } from "@/Wallet";
import { Link, useNavigate } from "react-router-dom";
diff --git a/packages/app/src/Pages/subscribe/RenewSub.tsx b/packages/app/src/Pages/subscribe/RenewSub.tsx
index 5bdc369f0..efd99eb57 100644
--- a/packages/app/src/Pages/subscribe/RenewSub.tsx
+++ b/packages/app/src/Pages/subscribe/RenewSub.tsx
@@ -2,7 +2,7 @@ import { useState } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import { unixNow, unwrap } from "@snort/shared";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import SendSats from "@/Element/SendSats";
import useEventPublisher from "@/Hooks/useEventPublisher";
import SnortApi, { Subscription, SubscriptionError } from "@/External/SnortApi";
diff --git a/packages/app/src/Pages/subscribe/index.tsx b/packages/app/src/Pages/subscribe/index.tsx
index 5a584db48..a2b642386 100644
--- a/packages/app/src/Pages/subscribe/index.tsx
+++ b/packages/app/src/Pages/subscribe/index.tsx
@@ -7,7 +7,7 @@ import { RouteObject } from "react-router-dom";
import { formatShort } from "@/Number";
import { LockedFeatures, Plans, SubscriptionType } from "@/Subscription";
import ManageSubscriptionPage from "@/Pages/subscribe/ManageSubscription";
-import AsyncButton from "@/Element/AsyncButton";
+import AsyncButton from "@/Element/Button/AsyncButton";
import useEventPublisher from "@/Hooks/useEventPublisher";
import SnortApi, { SubscriptionError, SubscriptionErrorCode } from "@/External/SnortApi";
import SendSats from "@/Element/SendSats";
diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx
index 1eee4e60d..6c4ae348a 100644
--- a/packages/app/src/index.tsx
+++ b/packages/app/src/index.tsx
@@ -31,7 +31,7 @@ import { getCountry, unwrap } from "@/SnortUtils";
import Layout from "@/Pages/Layout";
import ProfilePage from "@/Pages/Profile/ProfilePage";
import { RootRoutes, RootTabRoutes } from "@/Pages/Root";
-import NotificationsPage from "@/Pages/Notifications";
+import NotificationsPage from "@/Pages/Notifications/Notifications";
import SettingsPage, { SettingsRoutes } from "@/Pages/SettingsPage";
import ErrorPage from "@/Pages/ErrorPage";
import NostrAddressPage from "@/Pages/NostrAddressPage";