Author SHA1 Message Date
gosangam 1984797ad3 feat: auth user feedbacks 2026-07-14 18:26:20 +05:30
gosangam 1582df0ed5 chore: refactor settings route 2026-07-14 18:16:32 +05:30
gosangam 1683abc2e9 fix: offline-content renamed to downloads 2026-07-14 16:51:17 +05:30
gosangam 12a5c15121 feat: add daily vani 2026-07-11 00:57:35 +05:30
gosangam 8bc27bb8a1 feat: add daily vani 2026-07-11 00:45:51 +05:30
gosangam 89391279bb feat: add daily vani 2026-07-11 00:31:37 +05:30
gosangam 7f716397a0 feat: kautilya URL update 2026-07-03 13:32:08 +05:30
gosangam 4586f1c22c fix: offline content layout fix 2026-07-02 23:25:40 +05:30
gosangam b6471f9430 fix: offline content for iOS 2026-07-02 21:52:35 +05:30
gosangam 380c23e469 feat: offline content 2026-07-02 21:32:22 +05:30
gosangam 0b67a1142f feat: audio track history 2026-07-02 19:23:22 +05:30
gosangam be28585294 fix: comments drawer fix 2026-07-02 18:57:24 +05:30
gosangam 1462844e95 feat: books sequence update 2026-07-02 17:49:17 +05:30
gosangam 9916810d18 fix: bg reference purport update 2026-06-23 15:13:27 +05:30
gosangam 7b81bbc791 feat: enhance user limits 2026-06-23 14:21:59 +05:30
gosangam f92b41384e feat: add replace_hero hook to custom section 2026-06-21 23:36:25 +05:30
gosangam 5cd75c27f9 fix: user post feed view 2026-06-21 20:00:14 +05:30
gosangam 5679f7a639 fix: user post feed view 2026-06-21 18:35:48 +05:30
gosangam 25db9d0eee feat: add friend request tab in notifications 2026-06-18 22:45:40 +05:30
gosangam 0178f89f2b test: rybbit proxy ip 2026-06-18 01:09:09 +05:30
gosangam b6dc762984 fix: rybbit proxy fix 2026-06-18 00:58:36 +05:30
gosangam 1fe10adb1e fix: rybbit proxy fix 2026-06-18 00:51:09 +05:30
gosangam 84cb273941 fix: feed card follow ui 2026-06-18 00:21:06 +05:30
gosangam 071eb4d58a fix: book transcript browser navigation 2026-06-17 18:00:13 +05:30
gosangam bc1798b31b fix: ui fixes in transcript listing for books 2026-06-17 14:14:45 +05:30
gosangam fc2aef0c3d fix: ui fixes in transcript lusting for books 2026-06-17 14:02:06 +05:30
gosangam 89f94c1a6e fix: ui fixes in transcript nav 2026-06-17 13:48:59 +05:30
175 changed files with 3706 additions and 1346 deletions
@@ -4,7 +4,7 @@ import { PageHeader } from "@/components/layout/page-header";
import { FindInPage } from "@/components/layout/find-in-page"; import { FindInPage } from "@/components/layout/find-in-page";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import { getBookMeta, getSingleVerse, getChapterVerseIndex } from "@/lib/api"; import { getBookMeta, getSingleVerse, getChapterVerseIndex } from "@/lib/api";
import { ChapterViewer } from "@/app/(app)/books/chapter-viewer"; import { ChapterViewer } from "@/app/(app)/(reader)/books/chapter-viewer";
import type { MobileNavGroup } from "@/components/layout/mobile-nav"; import type { MobileNavGroup } from "@/components/layout/mobile-nav";
import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og"; import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
@@ -72,11 +72,16 @@ export function BooksGrid({ books }: { books: BookInfo[] }) {
); );
const filtered = useMemo(() => { const filtered = useMemo(() => {
if (!query.trim()) return books; const base = query.trim()
const q = normalize(query.trim()); ? normalizedBooks
return normalizedBooks .filter((entry) =>
.filter((entry) => entry.searchText.includes(q)) entry.searchText.includes(normalize(query.trim())),
.map((entry) => entry.book); )
.map((entry) => entry.book)
: books;
return [...base].sort((a, b) =>
normalize(a.title).localeCompare(normalize(b.title)),
);
}, [books, normalizedBooks, query]); }, [books, normalizedBooks, query]);
return ( return (
@@ -12,7 +12,7 @@ import {
type VerseIndexEntry, type VerseIndexEntry,
type VerseRecord, type VerseRecord,
} from "@/lib/api"; } from "@/lib/api";
import { ChapterViewer } from "@/app/(app)/books/chapter-viewer"; import { ChapterViewer } from "@/app/(app)/(reader)/books/chapter-viewer";
import type { MobileNavGroup } from "@/components/layout/mobile-nav"; import type { MobileNavGroup } from "@/components/layout/mobile-nav";
import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og"; import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
@@ -6,7 +6,7 @@ import { PageHeader } from "@/components/layout/page-header";
import { FindInPage } from "@/components/layout/find-in-page"; import { FindInPage } from "@/components/layout/find-in-page";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import { getBookMeta, getSingleVerse, getChapterVerseIndex } from "@/lib/api"; import { getBookMeta, getSingleVerse, getChapterVerseIndex } from "@/lib/api";
import { ChapterViewer } from "@/app/(app)/books/chapter-viewer"; import { ChapterViewer } from "@/app/(app)/(reader)/books/chapter-viewer";
import type { MobileNavGroup } from "@/components/layout/mobile-nav"; import type { MobileNavGroup } from "@/components/layout/mobile-nav";
import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og"; import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
@@ -219,9 +219,17 @@ function VerseCard({
Purport Purport
</h3> </h3>
<div className="text-base text-foreground leading-relaxed space-y-3"> <div className="text-base text-foreground leading-relaxed space-y-3">
{verse.purport.map((p, i) => ( {verse.purport.map((p, i) =>
<p key={i} dangerouslySetInnerHTML={{ __html: p }} /> // Cited ślokas come wrapped in <blockquote class="shloka"> — a
))} // block element that can't live inside a <p>, so render those
// in a <div> (styled centered + accent via globals.css); plain
// prose paragraphs stay as <p>.
/^\s*<blockquote/i.test(p) ? (
<div key={i} dangerouslySetInnerHTML={{ __html: p }} />
) : (
<p key={i} dangerouslySetInnerHTML={{ __html: p }} />
),
)}
</div> </div>
</div> </div>
)} )}
@@ -11,7 +11,7 @@ import {
type VerseIndexEntry, type VerseIndexEntry,
type VerseRecord, type VerseRecord,
} from "@/lib/api"; } from "@/lib/api";
import { ChapterViewer } from "@/app/(app)/books/chapter-viewer"; import { ChapterViewer } from "@/app/(app)/(reader)/books/chapter-viewer";
import type { MobileNavGroup } from "@/components/layout/mobile-nav"; import type { MobileNavGroup } from "@/components/layout/mobile-nav";
import type { Metadata } from "next"; import type { Metadata } from "next";
import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og"; import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
@@ -15,7 +15,7 @@ import {
type VerseRecord, type VerseRecord,
} from "@/lib/api"; } from "@/lib/api";
import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og"; import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
import { ChapterViewer } from "@/app/(app)/books/chapter-viewer"; import { ChapterViewer } from "@/app/(app)/(reader)/books/chapter-viewer";
import type { MobileNavGroup } from "@/components/layout/mobile-nav"; import type { MobileNavGroup } from "@/components/layout/mobile-nav";
type NbsMeta = { type NbsMeta = {
@@ -6,7 +6,7 @@ import { PageHeader } from "@/components/layout/page-header";
import { FindInPage } from "@/components/layout/find-in-page"; import { FindInPage } from "@/components/layout/find-in-page";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import { getBookMeta, getSingleVerse, getChapterVerseIndex } from "@/lib/api"; import { getBookMeta, getSingleVerse, getChapterVerseIndex } from "@/lib/api";
import { ChapterViewer } from "@/app/(app)/books/chapter-viewer"; import { ChapterViewer } from "@/app/(app)/(reader)/books/chapter-viewer";
import type { MobileNavGroup } from "@/components/layout/mobile-nav"; import type { MobileNavGroup } from "@/components/layout/mobile-nav";
import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og"; import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
@@ -4,7 +4,7 @@ import { PageHeader } from "@/components/layout/page-header";
import { FindInPage } from "@/components/layout/find-in-page"; import { FindInPage } from "@/components/layout/find-in-page";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import { getBookMeta, getSingleVerse, getChapterVerseIndex } from "@/lib/api"; import { getBookMeta, getSingleVerse, getChapterVerseIndex } from "@/lib/api";
import { ChapterViewer } from "@/app/(app)/books/chapter-viewer"; import { ChapterViewer } from "@/app/(app)/(reader)/books/chapter-viewer";
import type { MobileNavGroup } from "@/components/layout/mobile-nav"; import type { MobileNavGroup } from "@/components/layout/mobile-nav";
import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og"; import { ogForVerse, extractQuoteFromHl, buildOgMeta } from "@/lib/og";
+37
View File
@@ -0,0 +1,37 @@
import { Suspense } from "react";
import { TextSelectionToolbar } from "@/components/text-selection-toolbar";
import { TextHighlighter } from "@/components/text-highlighter";
import { PageBookmarks } from "@/components/social/page-bookmarks";
/**
* Reader layout — the annotation surface for the actual scripture library
* (books, letters, lectures, essays, glossary, journals, magazines, other
* documents, disciples).
*
* The text-selection toolbar and its two companions (the `?hl=` highlighter
* and the persistent in-text bookmark marks) only make sense over long-form
* scripture prose. Mounting them in this nested route group — rather than the
* parent `(app)` layout — keeps them off the home feed, search, profiles,
* settings, downloads, Kautilya, etc., so a stray text selection on chrome
* text no longer pops the toolbar.
*
* This is a route group: it adds NO path segment, so every URL underneath is
* unchanged (`/books/...`, `/letters/...`, …). All the outer `(app)` chrome
* (header, sidebar, footer, bottom nav) still wraps these pages.
*/
export default function ReaderLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<>
{children}
<TextSelectionToolbar />
<Suspense fallback={null}>
<TextHighlighter />
</Suspense>
<PageBookmarks />
</>
);
}

Some files were not shown because too many files have changed in this diff Show More