@youversion/platform-react-ui 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,346 +1,178 @@
1
+ ![License](https://img.shields.io/badge/license-Apache%20License%202.0-blue)
2
+ ![React >= 19.0.0](https://img.shields.io/badge/React-%3E%3D%2019.0.0-61dafb?logo=react&logoColor=white)
3
+ ![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)
4
+
1
5
  # @youversion/platform-react-ui
2
6
 
3
- React SDK for YouVersion Platform (web).
7
+ Pre-built React components for building Bible-based applications with the YouVersion Platform SDK. Get styled, production-ready components that work seamlessly with Bible content.
8
+
9
+ ## Overview
10
+
11
+ `@youversion/platform-react-ui` provides ready-to-use React components for Bible-focused applications. Features include pre-styled components with theming support, light and dark mode out of the box, scoped CSS to prevent conflicts, and accessibility-first design.
12
+
13
+ This package depends on [@youversion/platform-react-hooks](../hooks/README.md) and [@youversion/platform-core](../core/README.md).
14
+
15
+ > **📚 Full Documentation:** [developers.youversion.com/sdks/react](https://developers.youversion.com/sdks/react)
4
16
 
5
17
  ## Installation
6
18
 
7
19
  ```bash
8
20
  pnpm add @youversion/platform-react-ui
9
- # or
10
- npm install @youversion/platform-react-ui
11
- # or
12
- yarn add @youversion/platform-react-ui
13
21
  ```
14
22
 
15
- ## Quick Start
23
+ ### Peer Dependencies
16
24
 
17
- ### Import the styles
25
+ Requires React 19.0.0 or higher:
18
26
 
19
- For the components to be styled, import the CSS once at the app’s global entry.
27
+ ```bash
28
+ pnpm install react@19.0.0
29
+ ```
20
30
 
21
- - Next.js App Router: import in your app root (for example, [examples/nextjs/src/app/layout.tsx](examples/nextjs/src/app/layout.tsx:1))
22
- ```ts
23
- // app/layout.tsx
24
- import '@youversion/platform-react-ui/styles.css';
25
- ```
26
- - Vite/SPA: import it once in your main entry file (e.g., main.tsx) or a global stylesheet that is imported there:
27
- ```ts
28
- // main.tsx
29
- import '@youversion/platform-react-ui/styles.css';
30
- ```
31
+ ### Prerequisites
31
32
 
32
- ### Add the Providers
33
+ - YouVersion Platform App Key ([Get from platform.youversion.com](https://platform.youversion.com/))
33
34
 
34
- Wrap your app with the required providers. YVPProvider handles authentication, while BibleSDKProvider enables Bible-related components like BibleTextView.
35
+ ## When to Use This Package
36
+
37
+ Use `@youversion/platform-react-ui` when you need:
38
+ - ✅ Production-ready Bible components for your React app
39
+ - ✅ Pre-styled components with light/dark mode
40
+ - ✅ Minimal setup—wrap your app with providers and use components
41
+ - ✅ Consistent, accessible UI out of the box
42
+
43
+ **Use other packages instead if:**
44
+ - ❌ Need low-level API access → Use [@youversion/platform-core](../core/README.md)
45
+ - ❌ Want custom UI → Use [@youversion/platform-react-hooks](../hooks/README.md)
46
+
47
+ ## Related Packages
48
+
49
+ - **[@youversion/platform-core](../core/README.md)** - Low-level TypeScript SDK for direct API access
50
+ - **[@youversion/platform-react-hooks](../hooks/README.md)** - React hooks for declarative data fetching
51
+
52
+ ## Setup
53
+
54
+ Import styles and wrap your app with required providers:
35
55
 
36
56
  ```tsx
37
57
  import { BibleSDKProvider, YVPProvider } from '@youversion/platform-react-ui';
58
+ import '@youversion/platform-react-ui/styles.css';
38
59
 
39
60
  function App() {
40
61
  return (
41
- <BibleSDKProvider appId="your-app-id">
42
- <YVPProvider config={{ appId: 'your-app-id'}}>
43
- <YourApp />
62
+ <BibleSDKProvider appKey="YOUR_APP_KEY">
63
+ <YVPProvider config={{ appKey: "YOUR_APP_KEY" }}>
64
+ {/* All components work here */}
44
65
  </YVPProvider>
45
66
  </BibleSDKProvider>
46
67
  );
47
68
  }
48
69
  ```
49
70
 
50
- ## Theming
51
-
52
- The React SDK’s theme is fully scoped to its own wrapper to avoid conflicts with host apps and ShadCN UI variables.
71
+ > **⚠️ Missing Provider Error:** If components don't render correctly, check that both `BibleSDKProvider` and `YVPProvider` wrap your component tree.
53
72
 
54
- - Dark and light modes are controlled via the theme prop on [YVPProvider()](packages/ui/src/providers/YVPProvider.tsx:32)
55
- - CSS variables are defined under the SDK wrapper only, preventing collisions with app-level variables
73
+ ## Quick Start
56
74
 
57
- Basic usage (set dark or light):
75
+ **Next.js App Router:**
58
76
 
59
77
  ```tsx
60
- import { BibleSDKProvider, YVPProvider } from '@youversion/platform-react-ui';
78
+ // app/layout.tsx
61
79
  import '@youversion/platform-react-ui/styles.css';
80
+ import { BibleSDKProvider, YVPProvider } from '@youversion/platform-react-ui';
62
81
 
63
- export default function App() {
82
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
64
83
  return (
65
- <BibleSDKProvider appId="YOUR_APP_ID">
66
- <YVPProvider
67
- config={{ appId: 'YOUR_APP_ID'}}
68
- theme="dark" // 'light' | 'dark' (default is 'light')
69
- >
70
- <YourApp />
71
- </YVPProvider>
72
- </BibleSDKProvider>
84
+ <html lang="en">
85
+ <body>
86
+ <BibleSDKProvider appKey={process.env.NEXT_PUBLIC_APP_KEY!}>
87
+ <YVPProvider config={{ appKey: process.env.NEXT_PUBLIC_APP_KEY! }}>
88
+ {children}
89
+ </YVPProvider>
90
+ </BibleSDKProvider>
91
+ </body>
92
+ </html>
73
93
  );
74
94
  }
75
95
  ```
76
96
 
77
- Toggle theme at runtime:
97
+ ```tsx
98
+ // app/page.tsx
99
+ import { VerseOfTheDay } from '@youversion/platform-react-ui';
100
+
101
+ export default function Home() {
102
+ return <VerseOfTheDay versionId={111} />;
103
+ }
104
+ ```
105
+
106
+ ## Features
107
+
108
+ - Ready-to-use UI components for Bible content
109
+ - Light and dark mode toggling
110
+ - CSS variable overrides for customization
111
+ - Verse display with proper formatting
112
+ - Bible version and chapter selection
113
+ - Full TypeScript support
114
+ - Accessibility features
115
+
116
+ ## Theming
117
+
118
+ Toggle theme via the `YVPProvider`:
78
119
 
79
120
  ```tsx
80
121
  import { useState } from 'react';
81
122
  import { BibleSDKProvider, YVPProvider } from '@youversion/platform-react-ui';
82
- import '@youversion/platform-react-ui/styles.css';
83
123
 
84
124
  export default function App() {
85
125
  const [theme, setTheme] = useState<'light' | 'dark'>('light');
86
126
 
87
127
  return (
88
- <BibleSDKProvider appId="YOUR_APP_ID">
89
- <YVPProvider
90
- config={{ appId: 'YOUR_APP_ID' }}
91
- theme={theme}
92
- >
128
+ <BibleSDKProvider appKey="YOUR_APP_KEY">
129
+ <YVPProvider config={{ appKey: "YOUR_APP_KEY" }} theme={theme}>
93
130
  <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
94
131
  Toggle theme
95
132
  </button>
96
- <YourApp />
97
133
  </YVPProvider>
98
134
  </BibleSDKProvider>
99
135
  );
100
136
  }
101
137
  ```
102
138
 
103
- ## Customizing Styles
104
-
105
- The React SDK uses scoped CSS variables prefixed with `--yv-` to avoid conflicts with your app's styles. You can override these variables to customize colors, fonts, and Bible reader appearance.
106
-
107
- ### Overriding CSS Variables
108
-
109
- Add custom styles after importing `@youversion/platform-react-ui/styles.css`:
139
+ Customize via CSS variables:
110
140
 
111
141
  ```css
112
142
  [data-yv-sdk] {
113
- /* Override theme colors */
114
- --yv-primary: #your-color;
115
- --yv-background: #your-bg-color;
116
-
117
- /* Override Bible reader styles */
143
+ --yv-primary: #your-primary-color;
144
+ --yv-background: #your-background-color;
118
145
  --yv-reader-font-size: 18px;
119
- --yv-reader-line-height: 1.5;
120
- --yv-reader-font-family: 'Your Font', serif;
121
- }
122
- ```
123
-
124
- ### Key Customizable Variables
125
-
126
- #### Theme Colors
127
- - `--yv-background`, `--yv-foreground`: Main background and text colors
128
- - `--yv-primary`, `--yv-primary-foreground`: Primary button colors
129
- - `--yv-secondary`, `--yv-secondary-foreground`: Secondary colors
130
- - `--yv-muted`, `--yv-muted-foreground`: Muted text colors
131
- - `--yv-accent`, `--yv-accent-foreground`: Accent colors
132
- - `--yv-destructive`, `--yv-destructive-foreground`: Error/destructive colors
133
-
134
- #### Bible Reader
135
- - `--yv-reader-font-family`: Font stack for Bible text (defaults to Inter and Source Serif Pro)
136
- - `--yv-reader-font-size`: Font size for verses (default: 20px)
137
- - `--yv-reader-line-height`: Line height for verses (default: 1.625)
138
- - `--yv-red`, `--yv-red-dark-mode`: Color for words of Jesus
139
-
140
- #### Color Palettes
141
- The SDK includes predefined palettes (teal, blue, purple, etc.) that can be overridden or used in your components via Tailwind classes like `yv:text-teal-30`.
142
-
143
- ## Components
144
-
145
- ### SignInButton
146
-
147
- ```tsx
148
- import { SignInButton } from '@youversion/platform-react-ui';
149
-
150
- export default function Page() {
151
- return (
152
- <main className="flex flex-col items-center gap-4">
153
- <SignInButton />
154
- </main>
155
- );
156
146
  }
157
147
  ```
158
148
 
159
- ### Verse
160
-
161
- The Verse component provides sub-components for rendering Bible verses.
162
-
163
- #### Verse.Text
164
-
165
- Renders a single verse with superscript number and text.
166
-
167
- ```tsx
168
- import { Verse } from '@youversion/platform-react-ui';
169
-
170
- export default function Page() {
171
- return (
172
- <Verse.Text number={16} text="For God so loved the world..." size="lg" />
173
- );
174
- }
175
- ```
176
-
177
- Props:
178
- - `number`: The verse number.
179
- - `text`: The verse text.
180
- - `size`: Optional size variant ('default' | 'lg', default: 'default').
181
-
182
- #### Verse.Html
183
-
184
- Renders HTML content for Bible verses with optional styling.
185
-
186
- ```tsx
187
- import { Verse } from '@youversion/platform-react-ui';
188
-
189
- export default function Page() {
190
- return (
191
- <Verse.Html html="<p>Verse content</p>" fontFamily="serif" fontSize={20} lineHeight={1.5} />
192
- );
193
- }
194
- ```
195
-
196
- Props:
197
- - `html`: The HTML content of the verse(s).
198
- - `fontFamily`: Optional font family for the text.
199
- - `fontSize`: Optional font size in pixels.
200
- - `lineHeight`: Optional line height.
201
-
202
- ### BibleTextView
203
-
204
- Renders Bible verses or passages from the YouVersion API. Requires the app to be wrapped with `BibleSDKProvider`.
205
-
206
- ```tsx
207
- import { BibleTextView } from '@youversion/platform-react-ui';
208
-
209
- export default function Page() {
210
- return (
211
- <BibleTextView
212
- reference="JHN.3.16"
213
- versionId={1}
214
- fontFamily="serif"
215
- fontSize={20}
216
- lineHeight={1.5}
217
- />
218
- );
219
- }
220
- ```
149
+ ## Troubleshooting
221
150
 
222
- Props:
223
- - `reference`: The Bible reference (e.g., "JHN.3.16" for John 3:16).
224
- - `versionId`: The Bible version ID (e.g., 1 for KJV).
225
- - `fontFamily`: Optional font family for the text.
226
- - `fontSize`: Optional font size in pixels.
227
- - `lineHeight`: Optional line height.
151
+ ### Styles Not Applied
228
152
 
229
- ## Hooks
153
+ **Solution:** Ensure you imported `@youversion/platform-react-ui/styles.css` at your app's root entry point (e.g., `app/layout.tsx` for Next.js).
230
154
 
231
- ### useAuthentication
155
+ ### Next.js Error: "Global CSS cannot be imported from within node_modules"
232
156
 
233
- Provides the auth state and actions (sign in/out, fetch profile). See implementation in [/src/hooks/useAuthentication.ts](./src/hooks/useAuthentication.ts).
157
+ **Solution:** Move the import to your root layout file:
234
158
 
235
159
  ```tsx
236
- import { useAuthentication } from '@youversion/platform-react-ui';
237
-
238
- export function AuthControls() {
239
- const { isAuthenticated, isLoading, signIn, signOut, fetchUserInfo } = useAuthentication();
240
-
241
- if (isLoading) return <p>Loading…</p>;
242
-
243
- return isAuthenticated ? (
244
- <div className="flex items-center gap-2">
245
- <button onClick={() => fetchUserInfo()} className="rounded-md px-4 py-2 bg-secondary text-secondary-foreground">
246
- Fetch profile
247
- </button>
248
- <button onClick={() => signOut()} className="rounded-md px-4 py-2 bg-destructive text-white">
249
- Sign out
250
- </button>
251
- </div>
252
- ) : (
253
- <button onClick={() => signIn()} className="rounded-md px-4 py-2 bg-primary text-primary-foreground">
254
- Sign in with YouVersion
255
- </button>
256
- );
257
- }
160
+ // app/layout.tsx
161
+ import '@youversion/platform-react-ui/styles.css';
258
162
  ```
259
163
 
260
-
261
164
  ## Development
262
165
 
263
- ### Project Structure
166
+ See [CONTRIBUTING.md](../../CONTRIBUTING.md) for development instructions including Storybook setup.
264
167
 
265
- ```
266
- packages/ui/
267
- ├── .storybook/ # Storybook configuration
268
- ├── src/
269
- │ ├── components/ # UI components (SignInButton, etc.)
270
- │ ├── hooks/ # React hooks (useAuthentication)
271
- │ ├── lib/ # Utility functions
272
- │ ├── providers/ # YVPProvider and context
273
- │ ├── styles/ # Global styles and CSS
274
- │ └── test/ # Test utilities
275
- ├── scripts/ # Build scripts
276
- ├── chromatic.config.json # Chromatic visual regression config
277
- └── package.json
278
- ```
279
-
280
- ### Storybook
281
-
282
- Storybook is used for component development and documentation.
283
-
284
- **Environment Setup:**
285
-
286
- Copy the `.env.example` file into a `.env.local` file in `packages/ui/` with the following environment variables for Storybook to work properly:
287
-
288
- ```bash
289
- # Required for Storybook components that interact with YouVersion API
290
- STORYBOOK_YOUVERSION_APP_ID="your-app-id"
291
-
292
- # Optional: Required for Chromatic visual regression testing
293
- CHROMATIC_PROJECT_TOKEN="your-chromatic-token"
294
- ```
295
-
296
- **Start Storybook:**
297
- ```bash
298
- pnpm storybook
299
- ```
300
-
301
- **Build Storybook:**
302
- ```bash
303
- pnpm build-storybook
304
- ```
305
-
306
- ### Visual Testing with Chromatic
307
-
308
- Chromatic provides visual regression testing for Storybook components.
309
-
310
- **Run Chromatic:**
311
- ```bash
312
- pnpm chromatic
313
- ```
314
-
315
- This command:
316
- - Uses `dotenv` to load `.env.local`
317
- - Requires `CHROMATIC_PROJECT_TOKEN` in `.env.local` (see Storybook section above)
318
- - Runs visual regression tests on component stories
319
- - Only tests changed components (see [chromatic.config.json](chromatic.config.json))
320
-
321
- ### Commands
322
-
323
- See [package.json](package.json) for all available scripts:
324
- - `pnpm build` - Build all outputs (CSS, JS, types)
325
- - `pnpm dev` - Watch mode for development
326
- - `pnpm test` - Run Vitest tests
327
- - `pnpm test:watch` - Run tests in watch mode
328
- - `pnpm typecheck` - Type check without emitting
329
- - `pnpm lint` - Run ESLint
330
-
331
- ## Troubleshooting
168
+ ## License
332
169
 
333
- - Styles not applied:
334
- - Ensure you imported `@youversion/platform-react-ui/styles.css` at your app's global entry (e.g., [examples/nextjs/src/app/layout.tsx](../../examples/nextjs/src/app/layout.tsx)).
335
- - Do not import the CSS from inside component modules.
336
- - Next.js error “Global CSS cannot be imported from within node_modules”:
337
- - Move the import to your root layout (App Router)
338
- - Storybook components not working:
339
- - Ensure `STORYBOOK_YOUVERSION_APP_ID` is set in `.env.local`
340
- - Components will use fallback demo values if environment variables are not set
341
- - Chromatic not running:
342
- - Ensure `CHROMATIC_PROJECT_TOKEN` is set in `.env.local`
170
+ See [LICENSE](../../LICENSE)
343
171
 
344
- ## License
172
+ ## Support
345
173
 
346
- License is TBD.
174
+ - GitHub Issues: [Create an issue](https://github.com/youversion/platform-sdk-react/issues)
175
+ - Platform Docs: [platform.youversion.com](https://platform.youversion.com/)
176
+ - React Hooks: [@youversion/platform-react-hooks](../hooks/README.md)
177
+ - Core SDK: [@youversion/platform-core](../core/README.md)
178
+ - Monorepo: [YouVersion Platform SDK](../../README.md)
@@ -13,7 +13,14 @@ export type RootProps = {
13
13
  children?: ReactNode;
14
14
  };
15
15
  declare function Root({ book: controlledBook, defaultBook, onBookChange, chapter: controlledChapter, defaultChapter, onChapterChange, versionId, background, children, }: RootProps): import("react/jsx-runtime").JSX.Element;
16
- export type TriggerProps = React.ComponentProps<typeof PopoverTrigger>;
16
+ export type TriggerProps = Omit<React.ComponentProps<typeof PopoverTrigger>, 'children'> & {
17
+ children?: React.ReactNode | ((props: {
18
+ book: string;
19
+ chapter: string;
20
+ currentBook: BibleBook | undefined;
21
+ loading: boolean;
22
+ }) => React.ReactNode);
23
+ };
17
24
  declare function Trigger({ asChild, children, ...props }: TriggerProps): import("react/jsx-runtime").JSX.Element;
18
25
  export declare const BibleChapterPicker: {
19
26
  Root: typeof Root;
@@ -1 +1 @@
1
- {"version":3,"file":"bible-chapter-picker.d.ts","sourceRoot":"","sources":["../../src/components/bible-chapter-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG3D,OAAO,EAAW,cAAc,EAAgC,MAAM,cAAc,CAAC;AAuBrF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,iBAAS,IAAI,CAAC,EACZ,IAAI,EAAE,cAAc,EACpB,WAAgB,EAChB,YAAY,EACZ,OAAO,EAAE,iBAAiB,EAC1B,cAAmB,EACnB,eAAe,EACf,SAAS,EACT,UAAoB,EACpB,QAAQ,GACT,EAAE,SAAS,2CA2JX;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,CAAC;AAEvE,iBAAS,OAAO,CAAC,EAAE,OAAc,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,2CAgBpE;AAED,eAAO,MAAM,kBAAkB;;;CAAuC,CAAC"}
1
+ {"version":3,"file":"bible-chapter-picker.d.ts","sourceRoot":"","sources":["../../src/components/bible-chapter-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG3D,OAAO,EAAW,cAAc,EAAgC,MAAM,cAAc,CAAC;AAuBrF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,iBAAS,IAAI,CAAC,EACZ,IAAI,EAAE,cAAc,EACpB,WAAgB,EAChB,YAAY,EACZ,OAAO,EAAE,iBAAiB,EAC1B,cAAmB,EACnB,eAAe,EACf,SAAS,EACT,UAAoB,EACpB,QAAQ,GACT,EAAE,SAAS,2CA2JX;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IACzF,QAAQ,CAAC,EACL,KAAK,CAAC,SAAS,GACf,CAAC,CAAC,KAAK,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,SAAS,GAAG,SAAS,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC;KAClB,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;CAC5B,CAAC;AAEF,iBAAS,OAAO,CAAC,EAAE,OAAc,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,2CAqBpE;AAED,eAAO,MAAM,kBAAkB;;;CAAuC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { type ReactNode } from 'react';
2
+ export type RootProps = {
3
+ book?: string;
4
+ defaultBook?: string;
5
+ onBookChange?: (book: string) => void;
6
+ chapter?: string;
7
+ defaultChapter?: string;
8
+ onChapterChange?: (chapter: string) => void;
9
+ versionId?: number;
10
+ defaultVersionId?: number;
11
+ onVersionChange?: (versionId: number) => void;
12
+ fontFamily?: string;
13
+ fontSize?: number;
14
+ lineHeight?: number;
15
+ showVerseNumbers?: boolean;
16
+ background?: 'light' | 'dark';
17
+ children?: ReactNode;
18
+ };
19
+ declare function Root({ book: controlledBook, defaultBook, onBookChange, chapter: controlledChapter, defaultChapter, onChapterChange, versionId: controlledVersionId, defaultVersionId, onVersionChange, fontFamily, fontSize, lineHeight, showVerseNumbers, background, children, }: RootProps): import("react/jsx-runtime").JSX.Element;
20
+ declare function Content(): import("react/jsx-runtime").JSX.Element;
21
+ declare function Toolbar({ border }: {
22
+ border?: 'top' | 'bottom';
23
+ }): import("react/jsx-runtime").JSX.Element;
24
+ export declare const BibleReader: {
25
+ Root: typeof Root;
26
+ Content: typeof Content;
27
+ Toolbar: typeof Toolbar;
28
+ };
29
+ export type BibleReaderRootProps = RootProps;
30
+ export {};
31
+ //# sourceMappingURL=bible-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bible-reader.d.ts","sourceRoot":"","sources":["../../src/components/bible-reader.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAiC3E,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,iBAAS,IAAI,CAAC,EACZ,IAAI,EAAE,cAAc,EACpB,WAAmB,EACnB,YAAY,EACZ,OAAO,EAAE,iBAAiB,EAC1B,cAAoB,EACpB,eAAe,EACf,SAAS,EAAE,mBAAmB,EAC9B,gBAAsB,EACtB,eAAe,EACf,UAAU,EACV,QAAa,EACb,UAAU,EACV,gBAAuB,EACvB,UAAoB,EACpB,QAAQ,GACT,EAAE,SAAS,2CA4CX;AAED,iBAAS,OAAO,4CA8Cf;AAED,iBAAS,OAAO,CAAC,EAAE,MAAc,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;CAAE,2CA+CjE;AAED,eAAO,MAAM,WAAW;;;;CAAgD,CAAC;AACzE,MAAM,MAAM,oBAAoB,GAAG,SAAS,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { BibleReader } from './bible-reader';
3
+ declare const meta: Meta<typeof BibleReader.Root>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof BibleReader.Root>;
6
+ /**
7
+ * Default uncontrolled story: Component manages its own state with John 1 NIV as default
8
+ */
9
+ export declare const Default: Story;
10
+ /**
11
+ * Dark theme
12
+ */
13
+ export declare const DarkTheme: Story;
14
+ /**
15
+ * Custom styling with larger font and increased line height
16
+ */
17
+ export declare const CustomStyling: Story;
18
+ //# sourceMappingURL=bible-reader.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bible-reader.stories.d.ts","sourceRoot":"","sources":["../../src/components/bible-reader.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAAC,IAAI,CA0CvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAiBrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,KAiBvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,KAiB3B,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import { PopoverTrigger } from './ui/popover';
3
+ import type { BibleVersion } from '@youversion/platform-core';
3
4
  export type RootProps = {
4
5
  versionId: number;
5
6
  onVersionChange?: (versionId: number) => void;
@@ -8,13 +9,19 @@ export type RootProps = {
8
9
  children?: ReactNode;
9
10
  };
10
11
  declare function Root({ versionId: controlledVersionId, onVersionChange, background, side, children, }: RootProps): import("react/jsx-runtime").JSX.Element;
11
- export type TriggerProps = React.ComponentProps<typeof PopoverTrigger>;
12
- declare function Trigger({ asChild, children, ...props }: TriggerProps): import("react/jsx-runtime").JSX.Element;
12
+ export type BibleVersionPickerTriggerProps = Omit<React.ComponentProps<typeof PopoverTrigger>, 'children'> & {
13
+ children?: React.ReactNode | ((props: {
14
+ version: BibleVersion | null;
15
+ loading: boolean;
16
+ }) => React.ReactNode);
17
+ };
18
+ declare function Trigger({ asChild, children, ...props }: BibleVersionPickerTriggerProps): import("react/jsx-runtime").JSX.Element;
13
19
  declare function Content(): import("react/jsx-runtime").JSX.Element;
14
20
  export declare const BibleVersionPicker: {
15
21
  Root: typeof Root;
16
22
  Trigger: typeof Trigger;
17
23
  Content: typeof Content;
18
24
  };
25
+ export type BibleVersionPickerRootProps = RootProps;
19
26
  export {};
20
27
  //# sourceMappingURL=bible-version-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bible-version-picker.d.ts","sourceRoot":"","sources":["../../src/components/bible-version-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAU7F,OAAO,EAAW,cAAc,EAAgC,MAAM,cAAc,CAAC;AAsCrF,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,iBAAS,IAAI,CAAC,EACZ,SAAS,EAAE,mBAAmB,EAC9B,eAAe,EACf,UAAoB,EACpB,IAAY,EACZ,QAAQ,GACT,EAAE,SAAS,2CAqDX;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,CAAC;AAEvE,iBAAS,OAAO,CAAC,EAAE,OAAc,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,2CAgBpE;AAED,iBAAS,OAAO,4CA0Lf;AAED,eAAO,MAAM,kBAAkB;;;;CAAgD,CAAC"}
1
+ {"version":3,"file":"bible-version-picker.d.ts","sourceRoot":"","sources":["../../src/components/bible-version-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAU7F,OAAO,EAAW,cAAc,EAAgC,MAAM,cAAc,CAAC;AAErF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAoC9D,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,iBAAS,IAAI,CAAC,EACZ,SAAS,EAAE,mBAAmB,EAC9B,eAAe,EACf,UAAoB,EACpB,IAAY,EACZ,QAAQ,GACT,EAAE,SAAS,2CAqDX;AAED,MAAM,MAAM,8BAA8B,GAAG,IAAI,CAC/C,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,EAC3C,UAAU,CACX,GAAG;IACF,QAAQ,CAAC,EACL,KAAK,CAAC,SAAS,GACf,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;CACtF,CAAC;AAEF,iBAAS,OAAO,CAAC,EAAE,OAAc,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,8BAA8B,2CAqBtF;AAED,iBAAS,OAAO,4CA0Lf;AAED,eAAO,MAAM,kBAAkB;;;;CAAgD,CAAC;AAChF,MAAM,MAAM,2BAA2B,GAAG,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bible-version-picker.stories.d.ts","sourceRoot":"","sources":["../../src/components/bible-version-picker.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AA8B5E,QAAA,MAAM,IAAI;;2DAV8D,SAAS;;;;yBAdpD,KAAK,CAAC,aAAa;;;;;;;;;;;;;;;;;;CAgDV,CAAC;AAEvC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAM7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAmB/B,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,KAmC1C,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,KA4BtC,CAAC"}
1
+ {"version":3,"file":"bible-version-picker.stories.d.ts","sourceRoot":"","sources":["../../src/components/bible-version-picker.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AA0B5E,QAAA,MAAM,IAAI;;2DAV8D,SAAS;;;;yBAVpD,KAAK,CAAC,aAAa;;;;;;;;;;;;;;;;;;CA4CV,CAAC;AAEvC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAM7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAmB/B,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,KAmC1C,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,KA4BtC,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { StoryObj } from "@storybook/react-vite";
2
- import { BibleWidgetView } from "./bible-widget-view";
1
+ import type { StoryObj } from '@storybook/react-vite';
2
+ import { BibleWidgetView } from './bible-widget-view';
3
3
  declare const meta: {
4
4
  title: string;
5
5
  component: typeof BibleWidgetView;
@@ -1 +1 @@
1
- {"version":3,"file":"bible-widget-view.stories.d.ts","sourceRoot":"","sources":["../../src/components/bible-widget-view.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,QAAA,MAAM,IAAI;;;;;;yBAOE,KAAK,CAAC,aAAa,KAAG,KAAK,CAAC,YAAY;;;;;;;;;;;;CAmBZ,CAAC;AAEzC,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AACF,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAC"}
1
+ {"version":3,"file":"bible-widget-view.stories.d.ts","sourceRoot":"","sources":["../../src/components/bible-widget-view.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,QAAA,MAAM,IAAI;;;;;;yBAOE,KAAK,CAAC,aAAa,KAAG,KAAK,CAAC,YAAY;;;;;;;;;;;;CAiBZ,CAAC;AAEzC,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AACF,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAC"}
@@ -1,4 +1,6 @@
1
1
  export { BibleChapterPicker, type RootProps, type TriggerProps } from './bible-chapter-picker';
2
+ export { BibleReader, type BibleReaderRootProps } from './bible-reader';
3
+ export { BibleVersionPicker, type BibleVersionPickerRootProps, type BibleVersionPickerTriggerProps, } from './bible-version-picker';
2
4
  export { SignInButton, type SignInButtonProps } from './SignInButton';
3
5
  export { VerseOfTheDay, type VerseOfTheDayProps } from './verse-of-the-day';
4
6
  export { BibleTextView, type BibleTextViewProps } from './verse';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,KAAK,2BAA2B,EAChC,KAAK,8BAA8B,GACpC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAC"}