@mr.dj2u/library-registry 0.2.0 → 0.3.0

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.
Files changed (86) hide show
  1. package/README.md +3 -0
  2. package/assets/mds/env/convex.env.example +1 -0
  3. package/assets/mds/env/firebase.env.example +6 -0
  4. package/assets/mds/env/supabase.env.example +3 -0
  5. package/assets/mds/project/auth-base.md +17 -0
  6. package/assets/mds/project/auth-convex.md +33 -0
  7. package/assets/mds/project/auth-firebase.md +22 -0
  8. package/assets/mds/project/auth-supabase.md +46 -0
  9. package/assets/mds/src/app/(auth)/reset-password.tsx +5 -0
  10. package/assets/mds/src/app/(auth)/sign-in.tsx +5 -0
  11. package/assets/mds/src/app/(auth)/sign-up.tsx +5 -0
  12. package/assets/mds/src/app/legal/updates.tsx +1 -0
  13. package/assets/mds/src/app/onboarding/complete.tsx +2 -0
  14. package/assets/mds/src/app/onboarding/features.tsx +1 -0
  15. package/assets/mds/src/app/onboarding/legal.tsx +2 -0
  16. package/assets/mds/src/app/onboarding.tsx +1 -1
  17. package/assets/mds/src/app/settings.tsx +10 -1
  18. package/assets/mds/src/db/adapter.ts +195 -0
  19. package/assets/mds/src/db/firebase.ts +77 -0
  20. package/assets/mds/src/db/index.firebase.ts +19 -0
  21. package/assets/mds/src/db/index.supabase.ts +22 -0
  22. package/assets/mds/src/db/supabase.ts +337 -0
  23. package/assets/mds/src/features/auth/adapters/base-auth-adapter.tsx +82 -0
  24. package/assets/mds/src/features/auth/adapters/convex-auth-adapter.tsx +156 -0
  25. package/assets/mds/src/features/auth/adapters/firebase-auth-adapter.tsx +147 -0
  26. package/assets/mds/src/features/auth/adapters/supabase-auth-adapter.tsx +166 -0
  27. package/assets/mds/src/features/auth/auth-guard-logic.ts +19 -0
  28. package/assets/mds/src/features/auth/auth-guard.tsx +77 -0
  29. package/assets/mds/src/features/auth/auth-provider.tsx +60 -0
  30. package/assets/mds/src/features/auth/auth-screen.tsx +265 -0
  31. package/assets/mds/src/features/auth/auth-types.ts +45 -0
  32. package/assets/mds/src/features/exposition/data-screen.tsx +4 -2
  33. package/assets/mds/src/features/exposition/expo-sdk-56-screen.tsx +119 -76
  34. package/assets/mds/src/features/exposition/exposition-screen.tsx +10 -11
  35. package/assets/mds/src/features/exposition/stylist-screen.tsx +62 -11
  36. package/assets/mds/src/features/legal/legal-acceptance-adapter.ts +190 -0
  37. package/assets/mds/src/features/legal/legal-acceptance-config.ts +79 -0
  38. package/assets/mds/src/features/legal/legal-agreement-screen.tsx +9 -4
  39. package/assets/mds/src/features/legal/legal-document-modal.tsx +7 -3
  40. package/assets/mds/src/features/legal/legal-document-view.tsx +1 -0
  41. package/assets/mds/src/features/legal/legal-documents.ts +17 -3
  42. package/assets/mds/src/features/legal/legal-update-screen.tsx +297 -0
  43. package/assets/mds/src/features/legal/use-legal-acceptance.ts +1 -38
  44. package/assets/mds/src/features/onboarding/complete-screen.tsx +138 -0
  45. package/assets/mds/src/features/onboarding/features-screen.tsx +129 -0
  46. package/assets/mds/src/features/onboarding/legal-review-screen.tsx +242 -0
  47. package/assets/mds/src/features/onboarding/onboarding-config-with-legal.ts +104 -0
  48. package/assets/mds/src/features/onboarding/onboarding-config.ts +104 -0
  49. package/assets/mds/src/features/onboarding/onboarding-persistence-sync.tsx +1 -0
  50. package/assets/mds/src/features/onboarding/welcome-screen.tsx +130 -0
  51. package/assets/mds/src/features/onboarding-state/adapters/memory-onboarding-state-adapter.ts +15 -0
  52. package/assets/mds/src/features/onboarding-state/adapters/supabase-onboarding-state-adapter.ts +45 -0
  53. package/assets/mds/src/features/onboarding-state/adapters/zustand-onboarding-state-adapter.ts +16 -0
  54. package/assets/mds/src/features/onboarding-state/adapters/zustand-supabase-onboarding-state-adapter.ts +53 -0
  55. package/assets/mds/src/features/onboarding-state/onboarding-state-core.ts +108 -0
  56. package/assets/mds/src/features/onboarding-state/onboarding-state-memory.ts +106 -0
  57. package/assets/mds/src/features/onboarding-state/onboarding-state-supabase.ts +246 -0
  58. package/assets/mds/src/features/onboarding-state/onboarding-state-types.ts +64 -0
  59. package/assets/mds/src/features/onboarding-state/onboarding-state-zustand-supabase.ts +120 -0
  60. package/assets/mds/src/features/onboarding-state/onboarding-state-zustand.ts +71 -0
  61. package/assets/mds/src/features/onboarding-state/onboarding-state.ts +22 -0
  62. package/assets/mds/src/features/onboarding-state/onboarding-store.ts +39 -0
  63. package/assets/mds/src/features/settings/settings-screen-logic.ts +122 -0
  64. package/assets/mds/src/features/settings/settings-screen.tsx +274 -28
  65. package/assets/mds/src/services/convex.ts +40 -0
  66. package/assets/mds/src/services/firebase.ts +70 -0
  67. package/assets/mds/src/services/supabase.ts +50 -0
  68. package/assets/mds/src/theme/color-utils.ts +42 -0
  69. package/assets/mds/src/theme/provider.tsx +15 -5
  70. package/assets/mds/src/types/database.ts +13 -0
  71. package/assets/mds/supabase/migrations/0001_mds_auth_onboarding.sql +107 -0
  72. package/dist/catalog.d.ts.map +1 -1
  73. package/dist/catalog.js +444 -29
  74. package/dist/catalog.js.map +1 -1
  75. package/dist/types.d.ts +5 -1
  76. package/dist/types.d.ts.map +1 -1
  77. package/package.json +1 -1
  78. package/assets/mds/src/app/onboarding/account-setup.tsx +0 -1
  79. package/assets/mds/src/app/onboarding/agreement.tsx +0 -1
  80. package/assets/mds/src/app/onboarding/terms.tsx +0 -1
  81. package/assets/mds/src/features/onboarding/account-setup-screen.tsx +0 -54
  82. package/assets/mds/src/features/onboarding/agreement-screen.tsx +0 -6
  83. package/assets/mds/src/features/onboarding/components/legal-document-view.tsx +0 -103
  84. package/assets/mds/src/features/onboarding/legal-documents.ts +0 -80
  85. package/assets/mds/src/features/onboarding/onboarding-screen.tsx +0 -167
  86. package/assets/mds/src/features/onboarding/terms-screen.tsx +0 -6
@@ -152,7 +152,7 @@ const highlights: {
152
152
  },
153
153
  ];
154
154
 
155
- function ExpoLogoSvg({ size }: { size: number }) {
155
+ function ExpoLogoSvg({ size, fill }: { size: number; fill: string }) {
156
156
  return (
157
157
  <Svg
158
158
  width={size}
@@ -163,18 +163,24 @@ function ExpoLogoSvg({ size }: { size: number }) {
163
163
  >
164
164
  <Path
165
165
  d="M9.477 7.638c.164-.24.343-.27.488-.27.145 0 .387.03.551.27 2.13 2.901 6.55 10.56 6.959 10.976.605.618 1.436.233 1.918-.468.475-.69.607-1.174.607-1.69 0-.352-6.883-13.05-7.576-14.106-.667-1.017-.884-1.274-2.025-1.274h-.854c-1.138 0-1.302.257-1.969 1.274C6.883 3.406 0 16.104 0 16.456c0 .517.132 1 .607 1.69.482.7 1.313 1.086 1.918.468.41-.417 4.822-8.075 6.952-10.977z"
166
- fill="#111827"
166
+ fill={fill}
167
167
  />
168
168
  </Svg>
169
169
  );
170
170
  }
171
171
 
172
172
  function ExpoIconMark({ visible, size }: { visible: boolean; size: number }) {
173
+ const theme = useAppTheme();
174
+ const colors = theme.activeColors;
173
175
  if (!visible) return null;
174
176
  if (Platform.OS === 'web') {
175
177
  return (
176
- <View style={styles.logoFrame}>
177
- <ExpoLogoSvg size={size} />
178
+ <View
179
+ style={[
180
+ styles.logoFrame,
181
+ { backgroundColor: colors.background, borderColor: colors.primary },
182
+ ]}>
183
+ <ExpoLogoSvg size={size} fill={colors.text} />
178
184
  </View>
179
185
  );
180
186
  }
@@ -183,13 +189,15 @@ function ExpoIconMark({ visible, size }: { visible: boolean; size: number }) {
183
189
  <ExpoUIIcon
184
190
  name={'app.fill' as any}
185
191
  size={size}
186
- color="#111827"
192
+ color={colors.text}
187
193
  accessibilityLabel="Expo app icon"
188
194
  />
189
195
  );
190
196
  }
191
197
 
192
198
  function UniversalComponentLab() {
199
+ const theme = useAppTheme();
200
+ const colors = theme.activeColors;
193
201
  const [count, setCount] = useState(0);
194
202
  const [showIcon, setShowIcon] = useState(true);
195
203
  const [likesSuperStack, setLikesSuperStack] = useState(true);
@@ -198,21 +206,38 @@ function UniversalComponentLab() {
198
206
  const [isSheetOpen, setSheetOpen] = useState(false);
199
207
  const [isOpen, setOpen] = useState(true);
200
208
  const name = useNativeState('Ada Lovelace');
209
+ const headingStyle = { ...styles.universalHeading, color: colors.text };
210
+ const bodyStyle = { ...styles.universalBody, color: colors.text };
211
+ const statusStyle = {
212
+ ...styles.statusPill,
213
+ backgroundColor: colors.success,
214
+ color: colors.background,
215
+ };
216
+ const inputStyle = {
217
+ ...styles.textInput,
218
+ backgroundColor: colors.background,
219
+ borderColor: colors.primary,
220
+ };
221
+ const inputTextStyle = { ...styles.textInputText, color: colors.text };
201
222
 
202
223
  return (
203
- <View style={styles.universalExampleBox}>
224
+ <View
225
+ style={[
226
+ styles.universalExampleBox,
227
+ { backgroundColor: colors.surface, borderColor: colors.primary },
228
+ ]}>
204
229
  <Host matchContents={{ vertical: true }} style={styles.universalHost}>
205
230
  <Column spacing={14}>
206
231
  <Row spacing={10} alignment="center">
207
232
  <ExpoIconMark visible={showIcon} size={logoSize} />
208
233
  <Column spacing={3}>
209
- <ExpoUIText textStyle={styles.universalHeading}>Universal component lab</ExpoUIText>
234
+ <ExpoUIText textStyle={headingStyle}>Universal component lab</ExpoUIText>
210
235
  <ExpoUIText
211
- textStyle={styles.universalBody}
236
+ textStyle={bodyStyle}
212
237
  >{`Count: ${count} | Density: ${density}`}</ExpoUIText>
213
238
  </Column>
214
239
  <Spacer flexible />
215
- <ExpoUIText textStyle={styles.statusPill}>
240
+ <ExpoUIText textStyle={statusStyle}>
216
241
  {likesSuperStack ? 'Approved' : 'Reviewing'}
217
242
  </ExpoUIText>
218
243
  </Row>
@@ -222,7 +247,7 @@ function UniversalComponentLab() {
222
247
  isOpen={isOpen}
223
248
  onOpenChange={setOpen}
224
249
  >
225
- <ExpoUIText textStyle={styles.universalBody}>
250
+ <ExpoUIText textStyle={bodyStyle}>
226
251
  Host, Column, Row, Collapsible, Button, Switch, Checkbox, Slider, Picker, TextInput,
227
252
  and BottomSheet are all live here in one universal tree.
228
253
  </ExpoUIText>
@@ -247,7 +272,7 @@ function UniversalComponentLab() {
247
272
  />
248
273
 
249
274
  <Column spacing={6}>
250
- <ExpoUIText textStyle={styles.universalBody}>{`Logo size: ${logoSize}`}</ExpoUIText>
275
+ <ExpoUIText textStyle={bodyStyle}>{`Logo size: ${logoSize}`}</ExpoUIText>
251
276
  <ExpoUISlider min={28} max={72} step={4} value={logoSize} onValueChange={setLogoSize} />
252
277
  </Column>
253
278
  <ExpoUIPicker selectedValue={density} onValueChange={setDensity}>
@@ -258,11 +283,11 @@ function UniversalComponentLab() {
258
283
  <ExpoUITextInput
259
284
  value={name}
260
285
  placeholder="Display name"
261
- placeholderTextColor="#64748b"
262
- style={styles.textInput}
263
- textStyle={styles.textInputText}
286
+ placeholderTextColor={colors.text}
287
+ style={inputStyle}
288
+ textStyle={inputTextStyle}
264
289
  />
265
- <ExpoUIText textStyle={styles.universalBody}>{`Input value: ${name.value}`}</ExpoUIText>
290
+ <ExpoUIText textStyle={bodyStyle}>{`Input value: ${name.value}`}</ExpoUIText>
266
291
 
267
292
  <BottomSheet
268
293
  isPresented={isSheetOpen}
@@ -270,8 +295,8 @@ function UniversalComponentLab() {
270
295
  snapPoints={[{ height: 320 }, 'half']}
271
296
  >
272
297
  <Column spacing={10}>
273
- <ExpoUIText textStyle={styles.universalHeading}>BottomSheet example</ExpoUIText>
274
- <ExpoUIText textStyle={styles.universalBody}>
298
+ <ExpoUIText textStyle={headingStyle}>BottomSheet example</ExpoUIText>
299
+ <ExpoUIText textStyle={bodyStyle}>
275
300
  This sheet is rendered by Expo UI BottomSheet and opened by the universal Button.
276
301
  </ExpoUIText>
277
302
  <ExpoUIButton label="Close sheet" onPress={() => setSheetOpen(false)} />
@@ -284,21 +309,30 @@ function UniversalComponentLab() {
284
309
  }
285
310
 
286
311
  function NativeStateExample() {
312
+ const theme = useAppTheme();
313
+ const colors = theme.activeColors;
287
314
  const text = useNativeState('Ada Lovelace');
288
315
  return (
289
- <View style={styles.exampleBox}>
316
+ <View
317
+ style={[styles.exampleBox, { backgroundColor: colors.surface, borderColor: colors.primary }]}>
290
318
  <Host matchContents={{ vertical: true }} style={styles.universalHost}>
291
319
  <Column spacing={8}>
292
- <ExpoUIText textStyle={styles.universalHeading}>Native-owned text field</ExpoUIText>
320
+ <ExpoUIText textStyle={{ ...styles.universalHeading, color: colors.text }}>
321
+ Native-owned text field
322
+ </ExpoUIText>
293
323
  <ExpoUITextInput
294
324
  value={text}
295
325
  placeholder="Display name"
296
- placeholderTextColor="#64748b"
297
- style={styles.textInput}
298
- textStyle={styles.textInputText}
326
+ placeholderTextColor={colors.text}
327
+ style={{
328
+ ...styles.textInput,
329
+ backgroundColor: colors.background,
330
+ borderColor: colors.primary,
331
+ }}
332
+ textStyle={{ ...styles.textInputText, color: colors.text }}
299
333
  />
300
334
  <ExpoUIText
301
- textStyle={styles.universalBody}
335
+ textStyle={{ ...styles.universalBody, color: colors.text }}
302
336
  >{`Current native state: ${text.value}`}</ExpoUIText>
303
337
  </Column>
304
338
  </Host>
@@ -307,16 +341,21 @@ function NativeStateExample() {
307
341
  }
308
342
 
309
343
  function DropInExample() {
344
+ const theme = useAppTheme();
345
+ const colors = theme.activeColors;
310
346
  const [enabled, setEnabled] = useState(true);
311
347
  const [level, setLevel] = useState(3);
312
348
  return (
313
- <View style={styles.exampleBox}>
349
+ <View
350
+ style={[styles.exampleBox, { backgroundColor: colors.surface, borderColor: colors.primary }]}>
314
351
  <Host matchContents={{ vertical: true }} style={styles.universalHost}>
315
352
  <Column spacing={12}>
316
- <ExpoUIText textStyle={styles.exampleTitle}>Drop-in controls wired together</ExpoUIText>
353
+ <ExpoUIText textStyle={{ ...styles.exampleTitle, color: colors.text }}>
354
+ Drop-in controls wired together
355
+ </ExpoUIText>
317
356
  <ExpoUISwitch label="Enabled" value={enabled} onValueChange={setEnabled} />
318
357
  <Column spacing={6}>
319
- <ExpoUIText textStyle={styles.exampleBody}>{`Selected intensity: ${level}`}</ExpoUIText>
358
+ <ExpoUIText textStyle={{ ...styles.exampleBody, color: colors.text }}>{`Selected intensity: ${level}`}</ExpoUIText>
320
359
  <ExpoUISlider
321
360
  min={1}
322
361
  max={5}
@@ -333,9 +372,12 @@ function DropInExample() {
333
372
  }
334
373
 
335
374
  function InlineModuleExample() {
375
+ const theme = useAppTheme();
376
+ const colors = theme.activeColors;
336
377
  return (
337
- <View style={styles.exampleBox}>
338
- <Text style={styles.exampleTitle}>Inline module shape</Text>
378
+ <View
379
+ style={[styles.exampleBox, { backgroundColor: colors.surface, borderColor: colors.primary }]}>
380
+ <Text style={[styles.exampleTitle, { color: colors.text }]}>Inline module shape</Text>
339
381
  <Text style={styles.codeLine}>modules/LocalGreeting/index.ts</Text>
340
382
  <Text style={styles.codeLine}>modules/LocalGreeting/ios/LocalGreeting.swift</Text>
341
383
  <Text style={styles.codeLine}>modules/LocalGreeting/android/LocalGreeting.kt</Text>
@@ -344,10 +386,13 @@ function InlineModuleExample() {
344
386
  }
345
387
 
346
388
  function NativeTabsExample() {
389
+ const theme = useAppTheme();
390
+ const colors = theme.activeColors;
347
391
  return (
348
- <View style={styles.exampleBox}>
349
- <Text style={styles.exampleTitle}>No fake tab preview here</Text>
350
- <Text style={styles.exampleBody}>
392
+ <View
393
+ style={[styles.exampleBox, { backgroundColor: colors.surface, borderColor: colors.primary }]}>
394
+ <Text style={[styles.exampleTitle, { color: colors.text }]}>No fake tab preview here</Text>
395
+ <Text style={[styles.exampleBody, { color: colors.text }]}>
351
396
  In generated tabs apps, the actual tab bar uses expo-router NativeTabs when Expo Native Tabs
352
397
  are enabled. Keep mobile tab counts tight because Android native tabs are best with five or
353
398
  fewer destinations.
@@ -357,37 +402,58 @@ function NativeTabsExample() {
357
402
  }
358
403
 
359
404
  function RuntimeExample() {
405
+ const theme = useAppTheme();
406
+ const colors = theme.activeColors;
407
+ const labelStyle = [
408
+ styles.componentLabel,
409
+ { backgroundColor: colors.primary, color: colors.background },
410
+ ];
360
411
  return (
361
- <View style={styles.exampleBox}>
412
+ <View
413
+ style={[styles.exampleBox, { backgroundColor: colors.surface, borderColor: colors.primary }]}>
362
414
  <View style={styles.componentLabelGrid}>
363
- <Text style={styles.componentLabel}>React Native 0.85</Text>
364
- <Text style={styles.componentLabel}>React 19.2</Text>
365
- <Text style={styles.componentLabel}>Hermes V1</Text>
366
- <Text style={styles.componentLabel}>Precompiled modules</Text>
415
+ <Text style={labelStyle}>React Native 0.85</Text>
416
+ <Text style={labelStyle}>React 19.2</Text>
417
+ <Text style={labelStyle}>Hermes V1</Text>
418
+ <Text style={labelStyle}>Precompiled modules</Text>
367
419
  </View>
368
420
  </View>
369
421
  );
370
422
  }
371
423
 
372
424
  function WidgetsExample() {
425
+ const theme = useAppTheme();
426
+ const colors = theme.activeColors;
373
427
  return (
374
- <View style={styles.exampleBox}>
375
- <View style={styles.widgetTile}>
376
- <Text style={styles.widgetTitle}>Today</Text>
377
- <Text style={styles.widgetBody}>3 generated-app checks ready</Text>
428
+ <View
429
+ style={[styles.exampleBox, { backgroundColor: colors.surface, borderColor: colors.primary }]}>
430
+ <View
431
+ style={[
432
+ styles.widgetTile,
433
+ { backgroundColor: colors.background, borderColor: colors.primary },
434
+ ]}>
435
+ <Text style={[styles.widgetTitle, { color: colors.text }]}>Today</Text>
436
+ <Text style={[styles.widgetBody, { color: colors.text }]}>3 generated-app checks ready</Text>
378
437
  </View>
379
438
  </View>
380
439
  );
381
440
  }
382
441
 
383
442
  function AudioExample() {
443
+ const theme = useAppTheme();
444
+ const colors = theme.activeColors;
445
+ const transportStyle = [
446
+ styles.transportButton,
447
+ { backgroundColor: colors.background, borderColor: colors.primary, color: colors.text },
448
+ ];
384
449
  return (
385
- <View style={styles.exampleBox}>
450
+ <View
451
+ style={[styles.exampleBox, { backgroundColor: colors.surface, borderColor: colors.primary }]}>
386
452
  <View style={styles.transportRow}>
387
- <Text style={styles.transportButton}>expo-audio player</Text>
388
- <Text style={styles.transportButton}>haptic confirmation</Text>
453
+ <Text style={transportStyle}>expo-audio player</Text>
454
+ <Text style={transportStyle}>haptic confirmation</Text>
389
455
  </View>
390
- <Text style={styles.exampleBody}>
456
+ <Text style={[styles.exampleBody, { color: colors.text }]}>
391
457
  Add expo-audio when the product needs real playback; keep haptics for important control
392
458
  transitions.
393
459
  </Text>
@@ -438,7 +504,7 @@ export default function ExpoSdk56Screen() {
438
504
  <Text
439
505
  key={link.href}
440
506
  onPress={() => Linking.openURL(link.href)}
441
- style={styles.link}
507
+ style={[styles.link, { color: colors.secondary }]}
442
508
  >
443
509
  {link.label}
444
510
  </Text>
@@ -448,11 +514,15 @@ export default function ExpoSdk56Screen() {
448
514
  </View>
449
515
  </PackageCard>
450
516
  ))}
451
- <View style={styles.linksCard}>
452
- <Text style={styles.linksTitle}>Video sources</Text>
517
+ <View
518
+ style={[
519
+ styles.linksCard,
520
+ { backgroundColor: colors.surface, borderColor: colors.primary },
521
+ ]}>
522
+ <Text style={[styles.linksTitle, { color: colors.text }]}>Video sources</Text>
453
523
  <Text
454
524
  onPress={() => Linking.openURL('https://www.youtube.com/watch?v=MKqGbv-Tssg&t')}
455
- style={styles.link}
525
+ style={[styles.link, { color: colors.secondary }]}
456
526
  >
457
527
  {
458
528
  "What's New in Expo SDK 56: Expo UI, Inline Swift/Kotlin Modules, and Faster Builds by Expo"
@@ -460,7 +530,7 @@ export default function ExpoSdk56Screen() {
460
530
  </Text>
461
531
  <Text
462
532
  onPress={() => Linking.openURL('https://www.youtube.com/watch?v=ywvywq0AGPM')}
463
- style={styles.link}
533
+ style={[styles.link, { color: colors.secondary }]}
464
534
  >
465
535
  Everything new in Expo SDK 56 by Code with Beto
466
536
  </Text>
@@ -495,8 +565,6 @@ const styles = StyleSheet.create({
495
565
  paddingTop: 8,
496
566
  },
497
567
  exampleBox: {
498
- backgroundColor: '#eff6ff',
499
- borderColor: '#bfdbfe',
500
568
  borderRadius: 12,
501
569
  borderWidth: 1,
502
570
  gap: 12,
@@ -504,8 +572,6 @@ const styles = StyleSheet.create({
504
572
  alignSelf: 'stretch',
505
573
  },
506
574
  universalExampleBox: {
507
- backgroundColor: '#eff6ff',
508
- borderColor: '#bfdbfe',
509
575
  borderRadius: 12,
510
576
  borderWidth: 1,
511
577
  gap: 12,
@@ -531,7 +597,6 @@ const styles = StyleSheet.create({
531
597
  alignSelf: 'stretch',
532
598
  },
533
599
  collapsibleTitle: {
534
- color: '#0f2a5f',
535
600
  fontSize: 14,
536
601
  fontWeight: '900',
537
602
  marginBottom: 2,
@@ -543,20 +608,16 @@ const styles = StyleSheet.create({
543
608
  lineHeight: 19,
544
609
  },
545
610
  exampleTitle: {
546
- color: '#1e3a8a',
547
611
  fontSize: 13,
548
612
  fontWeight: '900',
549
613
  },
550
614
  exampleBody: {
551
- color: '#1e3a8a',
552
615
  fontSize: 13,
553
616
  fontWeight: '600',
554
617
  lineHeight: 19,
555
618
  },
556
619
  logoFrame: {
557
620
  alignItems: 'center',
558
- backgroundColor: '#ffffff',
559
- borderColor: '#dbeafe',
560
621
  borderRadius: 14,
561
622
  borderWidth: 1,
562
623
  height: 76,
@@ -564,9 +625,7 @@ const styles = StyleSheet.create({
564
625
  width: 76,
565
626
  },
566
627
  statusPill: {
567
- backgroundColor: '#dcfce7',
568
628
  borderRadius: 999,
569
- color: '#166534',
570
629
  fontSize: 12,
571
630
  fontWeight: '900',
572
631
  includeFontPadding: false,
@@ -577,8 +636,6 @@ const styles = StyleSheet.create({
577
636
  textAlignVertical: 'center',
578
637
  },
579
638
  textInput: {
580
- backgroundColor: '#ffffff',
581
- borderColor: '#bfdbfe',
582
639
  borderRadius: 10,
583
640
  borderWidth: 1,
584
641
  paddingHorizontal: 10,
@@ -590,7 +647,6 @@ const styles = StyleSheet.create({
590
647
  fontWeight: '700',
591
648
  },
592
649
  listItemTitle: {
593
- color: '#0f2a5f',
594
650
  fontSize: 15,
595
651
  fontWeight: '900',
596
652
  },
@@ -601,9 +657,7 @@ const styles = StyleSheet.create({
601
657
  lineHeight: 19,
602
658
  },
603
659
  listBadge: {
604
- backgroundColor: '#e0f2fe',
605
660
  borderRadius: 999,
606
- color: '#075985',
607
661
  fontSize: 11,
608
662
  fontWeight: '900',
609
663
  overflow: 'hidden',
@@ -636,9 +690,7 @@ const styles = StyleSheet.create({
636
690
  },
637
691
  componentLabel: {
638
692
  alignSelf: 'flex-start',
639
- backgroundColor: '#dbeafe',
640
693
  borderRadius: 999,
641
- color: '#1e3a8a',
642
694
  fontSize: 12,
643
695
  fontWeight: '800',
644
696
  includeFontPadding: false,
@@ -649,8 +701,6 @@ const styles = StyleSheet.create({
649
701
  textAlignVertical: 'center',
650
702
  },
651
703
  widgetTile: {
652
- backgroundColor: '#ffffff',
653
- borderColor: '#bfdbfe',
654
704
  borderRadius: 14,
655
705
  borderWidth: 1,
656
706
  padding: 16,
@@ -672,11 +722,8 @@ const styles = StyleSheet.create({
672
722
  gap: 8,
673
723
  },
674
724
  transportButton: {
675
- backgroundColor: '#ffffff',
676
- borderColor: '#bfdbfe',
677
725
  borderRadius: 8,
678
726
  borderWidth: 1,
679
- color: '#1e3a8a',
680
727
  fontSize: 13,
681
728
  fontWeight: '800',
682
729
  overflow: 'hidden',
@@ -688,20 +735,16 @@ const styles = StyleSheet.create({
688
735
  paddingTop: 2,
689
736
  },
690
737
  linksCard: {
691
- backgroundColor: '#eef2ff',
692
- borderColor: '#c7d2fe',
693
738
  borderRadius: 12,
694
739
  borderWidth: 1,
695
740
  gap: 8,
696
741
  padding: 14,
697
742
  },
698
743
  linksTitle: {
699
- color: '#312e81',
700
744
  fontSize: 16,
701
745
  fontWeight: '900',
702
746
  },
703
747
  link: {
704
- color: '#1d4ed8',
705
748
  fontSize: 14,
706
749
  fontWeight: '800',
707
750
  lineHeight: 20,
@@ -44,7 +44,7 @@ export default function ExpositionScreen() {
44
44
  title="Stylist color editing"
45
45
  body="Stylist uses this package for the hue slider, color preview, and manual palette picker that writes theme tokens.">
46
46
  <Text
47
- style={styles.link}
47
+ style={[styles.link, { color: colors.secondary }]}
48
48
  onPress={() => Linking.openURL('https://github.com/alabsi91/reanimated-color-picker')}>
49
49
  Reanimated Color Picker
50
50
  </Text>
@@ -54,7 +54,7 @@ export default function ExpositionScreen() {
54
54
  title="Stylist local preferences"
55
55
  body="Stylist stores local-only preferences such as the Google Fonts API key, dismissed banners, and editor settings with Async Storage.">
56
56
  <Text
57
- style={styles.link}
57
+ style={[styles.link, { color: colors.secondary }]}
58
58
  onPress={() =>
59
59
  Linking.openURL('https://react-native-async-storage.github.io/async-storage/')
60
60
  }>
@@ -66,7 +66,7 @@ export default function ExpositionScreen() {
66
66
  title="Stylist safe spacing"
67
67
  body="Stylist reads safe-area insets so editor controls stay clear of cutouts, native tabs, and device navigation areas.">
68
68
  <Text
69
- style={styles.link}
69
+ style={[styles.link, { color: colors.secondary }]}
70
70
  onPress={() =>
71
71
  Linking.openURL('https://docs.expo.dev/versions/latest/sdk/safe-area-context/')
72
72
  }>
@@ -78,7 +78,7 @@ export default function ExpositionScreen() {
78
78
  title="Stylist palette families"
79
79
  body="Stylist uses Tailwind color families and shade scales to drive the palette-family mode and accessible token previews.">
80
80
  <Text
81
- style={styles.link}
81
+ style={[styles.link, { color: colors.secondary }]}
82
82
  onPress={() => Linking.openURL('https://tailwindcss.com/docs/customizing-colors')}>
83
83
  Tailwind CSS - Colors
84
84
  </Text>
@@ -88,7 +88,7 @@ export default function ExpositionScreen() {
88
88
  title="Stylist sync endpoint"
89
89
  body="Stylist uses an Expo Router +api route so both native and web can sync theme output files by calling /exposition/stylist-sync.">
90
90
  <Text
91
- style={styles.link}
91
+ style={[styles.link, { color: colors.secondary }]}
92
92
  onPress={() => Linking.openURL('https://docs.expo.dev/router/web/api-routes/')}>
93
93
  Expo Router - API Routes
94
94
  </Text>
@@ -99,7 +99,7 @@ export default function ExpositionScreen() {
99
99
  body="Press the button to see the Reanimated timing demo. Worklets make this kind of UI-thread animation possible.">
100
100
  <AnimatedPressable label="Press and hold" />
101
101
  <Text
102
- style={styles.link}
102
+ style={[styles.link, { color: colors.secondary }]}
103
103
  onPress={() => Linking.openURL('https://docs.swmansion.com/react-native-reanimated')}>
104
104
  Software Mansion - Reanimated
105
105
  </Text>
@@ -110,7 +110,7 @@ export default function ExpositionScreen() {
110
110
  body="Drag the card below. If your product does not need touch-heavy interactions, this demo helps you decide what to remove.">
111
111
  <GestureCard title="Drag me" body="This card springs back when the gesture ends." />
112
112
  <Text
113
- style={styles.link}
113
+ style={[styles.link, { color: colors.secondary }]}
114
114
  onPress={() =>
115
115
  Linking.openURL('https://docs.swmansion.com/react-native-gesture-handler')
116
116
  }>
@@ -123,7 +123,7 @@ export default function ExpositionScreen() {
123
123
  body="Screens support the navigation layer with native lifecycle and memory behavior.">
124
124
  <ScreensCard />
125
125
  <Text
126
- style={styles.link}
126
+ style={[styles.link, { color: colors.secondary }]}
127
127
  onPress={() => Linking.openURL('https://docs.swmansion.com/react-native-screens')}>
128
128
  Software Mansion - Screens
129
129
  </Text>
@@ -136,7 +136,7 @@ export default function ExpositionScreen() {
136
136
  <SoftwareMansionLogo width={150} height={80} />
137
137
  </View>
138
138
  <Text
139
- style={styles.link}
139
+ style={[styles.link, { color: colors.secondary }]}
140
140
  onPress={() => Linking.openURL('https://docs.expo.dev/versions/latest/sdk/svg')}>
141
141
  Expo SDK - SVG
142
142
  </Text>
@@ -147,7 +147,7 @@ export default function ExpositionScreen() {
147
147
  body="Use this when forms, chat, notes, or auth flows need better keyboard control than manual offsets.">
148
148
  <KeyboardForm />
149
149
  <Text
150
- style={styles.link}
150
+ style={[styles.link, { color: colors.secondary }]}
151
151
  onPress={() =>
152
152
  Linking.openURL('https://kirillzyusko.github.io/react-native-keyboard-controller/')
153
153
  }>
@@ -179,7 +179,6 @@ const styles = StyleSheet.create({
179
179
  lineHeight: 24,
180
180
  },
181
181
  link: {
182
- color: '#1d4ed8',
183
182
  fontSize: 14,
184
183
  fontWeight: '800',
185
184
  lineHeight: 20,