diff --git a/.changeset/slick-worlds-rule.md b/.changeset/slick-worlds-rule.md new file mode 100644 index 0000000..4fe9db4 --- /dev/null +++ b/.changeset/slick-worlds-rule.md @@ -0,0 +1,14 @@ +--- +'@youversion/platform-react-ui': minor +'@youversion/platform-core': minor +'@youversion/platform-react-hooks': minor +--- + +feat(ui): add dark mode theme support to BibleTextView and BibleReader + +- Add theme prop (light/dark) to BibleTextView for text theme control +- Implement theme inheritance from YouVersionProvider via useTheme hook +- Add data-yv-sdk and data-yv-theme attributes for CSS styling +- Pass theme prop from BibleReader to BibleTextView +- Add yv:bg-background wrapper to all BibleTextView Storybook stories +- Rename prop from 'background' to 'theme' for semantic clarity diff --git a/packages/ui/src/components/bible-reader.tsx b/packages/ui/src/components/bible-reader.tsx index fa8529b..f10dbef 100644 --- a/packages/ui/src/components/bible-reader.tsx +++ b/packages/ui/src/components/bible-reader.tsx @@ -158,6 +158,7 @@ function Content() { currentFontFamily, lineHeight, showVerseNumbers, + background, } = useBibleReaderContext(); const { books } = useBooks(versionId); const { version } = useVersion(versionId); @@ -185,6 +186,7 @@ function Content() { ( +
+

+ Important: The background and padding for this Story was added manually to showcase the text + being influenced by the theme prop for the BibleTextView component. Otherwise, the text on a + light theme would be white on white (aka unreadable) +

+
+ +
+
+ ), +}; diff --git a/packages/ui/src/components/verse.tsx b/packages/ui/src/components/verse.tsx index 0e1936d..d0fed8b 100644 --- a/packages/ui/src/components/verse.tsx +++ b/packages/ui/src/components/verse.tsx @@ -3,7 +3,7 @@ import { useEffect, forwardRef, useState, useRef, type ReactNode } from 'react'; import { createRoot, type Root } from 'react-dom/client'; import DOMPurify from 'isomorphic-dompurify'; -import { usePassage } from '@youversion/platform-react-hooks'; +import { usePassage, useTheme } from '@youversion/platform-react-hooks'; import { Popover, PopoverContent, PopoverTrigger, PopoverClose } from '@/components/ui/popover'; import { Button } from './ui/button'; import { Footnote } from './icons/footnote'; @@ -416,6 +416,7 @@ export type BibleTextViewProps = { versionId: number; showVerseNumbers?: boolean; renderNotes?: boolean; + theme?: 'light' | 'dark'; }; /** @@ -429,6 +430,7 @@ export const BibleTextView = ({ versionId, showVerseNumbers, renderNotes, + theme, }: BibleTextViewProps): React.ReactElement => { const { passage, loading, error } = usePassage({ versionId, @@ -436,42 +438,50 @@ export const BibleTextView = ({ include_headings: true, include_notes: true, }); + const providerTheme = useTheme(); + const currentTheme = theme || providerTheme; if (loading) { return ( - Loading...'} - fontFamily={fontFamily} - fontSize={fontSize} - lineHeight={lineHeight} - showVerseNumbers={showVerseNumbers} - renderNotes={renderNotes} - /> +
+ Loading...'} + fontFamily={fontFamily} + fontSize={fontSize} + lineHeight={lineHeight} + showVerseNumbers={showVerseNumbers} + renderNotes={renderNotes} + /> +
); } if (error) { return ( +
+ We have run into an error...'} + fontFamily={fontFamily} + fontSize={fontSize} + lineHeight={lineHeight} + showVerseNumbers={showVerseNumbers} + renderNotes={renderNotes} + /> +
+ ); + } + + return ( +
We have run into an error...'} + html={passage?.content || ''} fontFamily={fontFamily} fontSize={fontSize} lineHeight={lineHeight} showVerseNumbers={showVerseNumbers} renderNotes={renderNotes} + reference={passage?.reference} /> - ); - } - - return ( - +
); };