diff --git a/README.md b/README.md index f2582843..8ef91abc 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ A self-hostable bookmark-everything app with a touch of AI for the data hoarders - ✨ AI-based (aka chatgpt) automatic tagging. - 🔖 [Chrome plugin](https://chromewebstore.google.com/detail/hoarder/kgcjekpmcjjogibpjebkhaanilehneje) for quick bookmarking. - 📱 An iOS app that's pending apple's review. +- 🌙 Dark mode support. - 💾 Self-hosting first. - [Planned] Archiving the content for offline reading. diff --git a/apps/web/app/dashboard/admin/page.tsx b/apps/web/app/dashboard/admin/page.tsx index 7b4c3cdd..c44d3142 100644 --- a/apps/web/app/dashboard/admin/page.tsx +++ b/apps/web/app/dashboard/admin/page.tsx @@ -2,6 +2,7 @@ import { useRouter } from "next/navigation"; import { ActionButton } from "@/components/ui/action-button"; +import { Separator } from "@/components/ui/separator"; import LoadingSpinner from "@/components/ui/spinner"; import { Table, @@ -96,7 +97,7 @@ function ServerStatsSection() { -
+

Background Jobs

@@ -190,13 +191,13 @@ export default function AdminPage() { } return ( -
+

Admin

-
+ -
+ -
+
); diff --git a/apps/web/app/dashboard/bookmarks/layout.tsx b/apps/web/app/dashboard/bookmarks/layout.tsx index 8691e822..a2356d23 100644 --- a/apps/web/app/dashboard/bookmarks/layout.tsx +++ b/apps/web/app/dashboard/bookmarks/layout.tsx @@ -1,6 +1,7 @@ import React from "react"; import TopNav from "@/components/dashboard/bookmarks/TopNav"; import UploadDropzone from "@/components/dashboard/UploadDropzone"; +import { Separator } from "@/components/ui/separator"; export default function BookmarksLayout({ children, @@ -13,7 +14,7 @@ export default function BookmarksLayout({
-
+
{children}
diff --git a/apps/web/app/dashboard/layout.tsx b/apps/web/app/dashboard/layout.tsx index b2d3806b..68c0bfbd 100644 --- a/apps/web/app/dashboard/layout.tsx +++ b/apps/web/app/dashboard/layout.tsx @@ -15,7 +15,7 @@ export default async function Dashboard({
-
+
{serverConfig.demoMode && }
diff --git a/apps/web/app/dashboard/lists/page.tsx b/apps/web/app/dashboard/lists/page.tsx index a8c53eb6..d379b1bb 100644 --- a/apps/web/app/dashboard/lists/page.tsx +++ b/apps/web/app/dashboard/lists/page.tsx @@ -1,4 +1,5 @@ import AllListsView from "@/components/dashboard/lists/AllListsView"; +import { Separator } from "@/components/ui/separator"; import { api } from "@/server/api/client"; export default async function ListsPage() { @@ -7,7 +8,7 @@ export default async function ListsPage() { return (

📋 All Lists

-
+
); diff --git a/apps/web/app/dashboard/search/page.tsx b/apps/web/app/dashboard/search/page.tsx index 26b984a7..f09041f3 100644 --- a/apps/web/app/dashboard/search/page.tsx +++ b/apps/web/app/dashboard/search/page.tsx @@ -3,6 +3,7 @@ import { Suspense, useRef } from "react"; import BookmarksGrid from "@/components/dashboard/bookmarks/BookmarksGrid"; import { SearchInput } from "@/components/dashboard/search/SearchInput"; +import { Separator } from "@/components/ui/separator"; import { useBookmarkSearch } from "@/lib/hooks/bookmark-search"; import Loading from "../bookmarks/loading"; @@ -16,7 +17,7 @@ function SearchComp() { return (
-
+ {data ? : }
); diff --git a/apps/web/app/dashboard/settings/page.tsx b/apps/web/app/dashboard/settings/page.tsx index 71712eb9..f75bc298 100644 --- a/apps/web/app/dashboard/settings/page.tsx +++ b/apps/web/app/dashboard/settings/page.tsx @@ -3,7 +3,7 @@ import { ChangePassword } from "@/components/dashboard/settings/ChangePassword"; export default async function Settings() { return ( -
+

Settings

diff --git a/apps/web/app/dashboard/tags/page.tsx b/apps/web/app/dashboard/tags/page.tsx index dec11527..ec09e34e 100644 --- a/apps/web/app/dashboard/tags/page.tsx +++ b/apps/web/app/dashboard/tags/page.tsx @@ -7,7 +7,7 @@ import { getServerAuthSession } from "@/server/auth"; function TagPill({ name, count }: { name: string; count: number }) { return ( {name} {count} @@ -38,7 +38,7 @@ export default async function TagsPage() { return (
All Tags -
+
{tagPill}
); diff --git a/apps/web/components/dashboard/bookmarks/BookmarkPreview.tsx b/apps/web/components/dashboard/bookmarks/BookmarkPreview.tsx index 2c393fe7..96e1c19b 100644 --- a/apps/web/components/dashboard/bookmarks/BookmarkPreview.tsx +++ b/apps/web/components/dashboard/bookmarks/BookmarkPreview.tsx @@ -3,6 +3,7 @@ import Image from "next/image"; import Link from "next/link"; import { ScrollArea } from "@/components/ui/scroll-area"; +import { Separator } from "@/components/ui/separator"; import { Skeleton } from "@/components/ui/skeleton"; import { Tooltip, @@ -82,7 +83,7 @@ function LinkHeader({ bookmark }: { bookmark: ZBookmark }) { View Original -
+
); } @@ -103,7 +104,7 @@ function TextContentSection({ bookmark }: { bookmark: ZBookmark }) { dangerouslySetInnerHTML={{ __html: bookmark.content.htmlContent || "", }} - className="prose mx-auto" + className="prose dark:prose-invert mx-auto" /> ); } @@ -111,7 +112,9 @@ function TextContentSection({ bookmark }: { bookmark: ZBookmark }) { } case "text": { content = ( - {bookmark.content.text} + + {bookmark.content.text} + ); break; } @@ -195,7 +198,7 @@ export default function BookmarkPreview({
{isBookmarkStillCrawling(bookmark) ? : content}
-
+
{linkHeader}
diff --git a/apps/web/components/dashboard/bookmarks/Bookmarks.tsx b/apps/web/components/dashboard/bookmarks/Bookmarks.tsx index cee620c9..81dd9361 100644 --- a/apps/web/components/dashboard/bookmarks/Bookmarks.tsx +++ b/apps/web/components/dashboard/bookmarks/Bookmarks.tsx @@ -1,4 +1,5 @@ import { redirect } from "next/navigation"; +import { Separator } from "@/components/ui/separator"; import { api } from "@/server/api/client"; import { getServerAuthSession } from "@/server/auth"; @@ -27,7 +28,7 @@ export default async function Bookmarks({ return (
{header} - {showDivider &&
} + {showDivider && } + {children} ); diff --git a/apps/web/components/dashboard/bookmarks/EditorCard.tsx b/apps/web/components/dashboard/bookmarks/EditorCard.tsx index dfcf1f6c..d8a3c117 100644 --- a/apps/web/components/dashboard/bookmarks/EditorCard.tsx +++ b/apps/web/components/dashboard/bookmarks/EditorCard.tsx @@ -1,6 +1,7 @@ import type { SubmitErrorHandler, SubmitHandler } from "react-hook-form"; import { ActionButton } from "@/components/ui/action-button"; import { Form, FormControl, FormField, FormItem } from "@/components/ui/form"; +import { Separator } from "@/components/ui/separator"; import { Textarea } from "@/components/ui/textarea"; import { toast } from "@/components/ui/use-toast"; import { api } from "@/lib/trpc"; @@ -55,12 +56,12 @@ export default function EditorCard({ className }: { className?: string }) {

NEW ITEM

-
+
diff --git a/apps/web/components/dashboard/bookmarks/TagsEditor.tsx b/apps/web/components/dashboard/bookmarks/TagsEditor.tsx index bebd53df..e11410b8 100644 --- a/apps/web/components/dashboard/bookmarks/TagsEditor.tsx +++ b/apps/web/components/dashboard/bookmarks/TagsEditor.tsx @@ -99,6 +99,17 @@ export function TagsEditor({ bookmark }: { bookmark: ZBookmark }) { closeMenuOnSelect={false} isClearable={false} isLoading={isExistingTagsLoading || isMutating} + theme={(theme) => ({ + ...theme, + // This color scheme doesn't support disabled options. + colors: { + ...theme.colors, + primary: "hsl(var(--accent))", + primary50: "hsl(var(--accent))", + primary75: "hsl(var(--accent))", + primary25: "hsl(var(--accent))", + }, + })} styles={{ multiValueRemove: () => ({ "background-color": "transparent", @@ -110,6 +121,14 @@ export function TagsEditor({ bookmark }: { bookmark: ZBookmark }) { overflowY: "auto", scrollbarWidth: "none", }), + control: (styles) => ({ + ...styles, + "background-color": "hsl(var(--background))", + "border-color": "hsl(var(--border))", + ":hover": { + "border-color": "hsl(var(--border))", + }, + }), }} components={{ MultiValueContainer: ({ children, data }) => ( @@ -118,7 +137,7 @@ export function TagsEditor({ bookmark }: { bookmark: ZBookmark }) { "flex min-h-8 space-x-1 rounded px-2", (data as { attachedBy: string }).attachedBy == "ai" ? "bg-gradient-to-tr from-purple-500 to-purple-400 text-white" - : "bg-gray-200", + : "bg-accent", )} > {children} @@ -137,8 +156,9 @@ export function TagsEditor({ bookmark }: { bookmark: ZBookmark }) { }} classNames={{ multiValueRemove: () => "my-auto", - valueContainer: () => "gap-2", - menuList: () => "text-sm", + valueContainer: () => "gap-2 bg-background", + menuList: () => "text-sm bg-background", + option: () => "text-red-500", }} /> ); diff --git a/apps/web/components/dashboard/bookmarks/TextCard.tsx b/apps/web/components/dashboard/bookmarks/TextCard.tsx index 75733063..82664390 100644 --- a/apps/web/components/dashboard/bookmarks/TextCard.tsx +++ b/apps/web/components/dashboard/bookmarks/TextCard.tsx @@ -58,7 +58,7 @@ export default function TextCard({ ), )} > - + {bookmarkedText.text}
diff --git a/apps/web/components/dashboard/lists/AllListsView.tsx b/apps/web/components/dashboard/lists/AllListsView.tsx index acb94edb..4159bc14 100644 --- a/apps/web/components/dashboard/lists/AllListsView.tsx +++ b/apps/web/components/dashboard/lists/AllListsView.tsx @@ -20,7 +20,7 @@ function ListItem({ }) { return ( -
+

{icon} {name}

diff --git a/apps/web/components/dashboard/settings/ApiKeySettings.tsx b/apps/web/components/dashboard/settings/ApiKeySettings.tsx index a3680863..1455e1b6 100644 --- a/apps/web/components/dashboard/settings/ApiKeySettings.tsx +++ b/apps/web/components/dashboard/settings/ApiKeySettings.tsx @@ -1,3 +1,4 @@ +import { Separator } from "@/components/ui/separator"; import { Table, TableBody, @@ -16,7 +17,7 @@ export default async function ApiKeys() { return (
API Keys -
+
diff --git a/apps/web/components/dashboard/settings/ChangePassword.tsx b/apps/web/components/dashboard/settings/ChangePassword.tsx index d976f3e4..a2ca0870 100644 --- a/apps/web/components/dashboard/settings/ChangePassword.tsx +++ b/apps/web/components/dashboard/settings/ChangePassword.tsx @@ -11,6 +11,7 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; +import { Separator } from "@/components/ui/separator"; import { toast } from "@/components/ui/use-toast"; import { api } from "@/lib/trpc"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -55,7 +56,7 @@ export function ChangePassword() { return (
Change Password -
+ -
    +
      } path="/dashboard/bookmarks" /> } path="/dashboard/search" /> } path="/dashboard/lists" /> diff --git a/apps/web/components/dashboard/sidebar/ModileSidebarItem.tsx b/apps/web/components/dashboard/sidebar/ModileSidebarItem.tsx index d2b4aad3..3382f47b 100644 --- a/apps/web/components/dashboard/sidebar/ModileSidebarItem.tsx +++ b/apps/web/components/dashboard/sidebar/ModileSidebarItem.tsx @@ -15,8 +15,8 @@ export default function MobileSidebarItem({ return (
    • diff --git a/apps/web/components/dashboard/sidebar/Sidebar.tsx b/apps/web/components/dashboard/sidebar/Sidebar.tsx index 0351b889..1c18e90c 100644 --- a/apps/web/components/dashboard/sidebar/Sidebar.tsx +++ b/apps/web/components/dashboard/sidebar/Sidebar.tsx @@ -22,12 +22,12 @@ export default async function Sidebar() { return (