@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.
- package/README.md +3 -0
- package/assets/mds/env/convex.env.example +1 -0
- package/assets/mds/env/firebase.env.example +6 -0
- package/assets/mds/env/supabase.env.example +3 -0
- package/assets/mds/project/auth-base.md +17 -0
- package/assets/mds/project/auth-convex.md +33 -0
- package/assets/mds/project/auth-firebase.md +22 -0
- package/assets/mds/project/auth-supabase.md +46 -0
- package/assets/mds/src/app/(auth)/reset-password.tsx +5 -0
- package/assets/mds/src/app/(auth)/sign-in.tsx +5 -0
- package/assets/mds/src/app/(auth)/sign-up.tsx +5 -0
- package/assets/mds/src/app/legal/updates.tsx +1 -0
- package/assets/mds/src/app/onboarding/complete.tsx +2 -0
- package/assets/mds/src/app/onboarding/features.tsx +1 -0
- package/assets/mds/src/app/onboarding/legal.tsx +2 -0
- package/assets/mds/src/app/onboarding.tsx +1 -1
- package/assets/mds/src/app/settings.tsx +10 -1
- package/assets/mds/src/db/adapter.ts +195 -0
- package/assets/mds/src/db/firebase.ts +77 -0
- package/assets/mds/src/db/index.firebase.ts +19 -0
- package/assets/mds/src/db/index.supabase.ts +22 -0
- package/assets/mds/src/db/supabase.ts +337 -0
- package/assets/mds/src/features/auth/adapters/base-auth-adapter.tsx +82 -0
- package/assets/mds/src/features/auth/adapters/convex-auth-adapter.tsx +156 -0
- package/assets/mds/src/features/auth/adapters/firebase-auth-adapter.tsx +147 -0
- package/assets/mds/src/features/auth/adapters/supabase-auth-adapter.tsx +166 -0
- package/assets/mds/src/features/auth/auth-guard-logic.ts +19 -0
- package/assets/mds/src/features/auth/auth-guard.tsx +77 -0
- package/assets/mds/src/features/auth/auth-provider.tsx +60 -0
- package/assets/mds/src/features/auth/auth-screen.tsx +265 -0
- package/assets/mds/src/features/auth/auth-types.ts +45 -0
- package/assets/mds/src/features/exposition/data-screen.tsx +4 -2
- package/assets/mds/src/features/exposition/expo-sdk-56-screen.tsx +119 -76
- package/assets/mds/src/features/exposition/exposition-screen.tsx +10 -11
- package/assets/mds/src/features/exposition/stylist-screen.tsx +62 -11
- package/assets/mds/src/features/legal/legal-acceptance-adapter.ts +190 -0
- package/assets/mds/src/features/legal/legal-acceptance-config.ts +79 -0
- package/assets/mds/src/features/legal/legal-agreement-screen.tsx +9 -4
- package/assets/mds/src/features/legal/legal-document-modal.tsx +7 -3
- package/assets/mds/src/features/legal/legal-document-view.tsx +1 -0
- package/assets/mds/src/features/legal/legal-documents.ts +17 -3
- package/assets/mds/src/features/legal/legal-update-screen.tsx +297 -0
- package/assets/mds/src/features/legal/use-legal-acceptance.ts +1 -38
- package/assets/mds/src/features/onboarding/complete-screen.tsx +138 -0
- package/assets/mds/src/features/onboarding/features-screen.tsx +129 -0
- package/assets/mds/src/features/onboarding/legal-review-screen.tsx +242 -0
- package/assets/mds/src/features/onboarding/onboarding-config-with-legal.ts +104 -0
- package/assets/mds/src/features/onboarding/onboarding-config.ts +104 -0
- package/assets/mds/src/features/onboarding/onboarding-persistence-sync.tsx +1 -0
- package/assets/mds/src/features/onboarding/welcome-screen.tsx +130 -0
- package/assets/mds/src/features/onboarding-state/adapters/memory-onboarding-state-adapter.ts +15 -0
- package/assets/mds/src/features/onboarding-state/adapters/supabase-onboarding-state-adapter.ts +45 -0
- package/assets/mds/src/features/onboarding-state/adapters/zustand-onboarding-state-adapter.ts +16 -0
- package/assets/mds/src/features/onboarding-state/adapters/zustand-supabase-onboarding-state-adapter.ts +53 -0
- package/assets/mds/src/features/onboarding-state/onboarding-state-core.ts +108 -0
- package/assets/mds/src/features/onboarding-state/onboarding-state-memory.ts +106 -0
- package/assets/mds/src/features/onboarding-state/onboarding-state-supabase.ts +246 -0
- package/assets/mds/src/features/onboarding-state/onboarding-state-types.ts +64 -0
- package/assets/mds/src/features/onboarding-state/onboarding-state-zustand-supabase.ts +120 -0
- package/assets/mds/src/features/onboarding-state/onboarding-state-zustand.ts +71 -0
- package/assets/mds/src/features/onboarding-state/onboarding-state.ts +22 -0
- package/assets/mds/src/features/onboarding-state/onboarding-store.ts +39 -0
- package/assets/mds/src/features/settings/settings-screen-logic.ts +122 -0
- package/assets/mds/src/features/settings/settings-screen.tsx +274 -28
- package/assets/mds/src/services/convex.ts +40 -0
- package/assets/mds/src/services/firebase.ts +70 -0
- package/assets/mds/src/services/supabase.ts +50 -0
- package/assets/mds/src/theme/color-utils.ts +42 -0
- package/assets/mds/src/theme/provider.tsx +15 -5
- package/assets/mds/src/types/database.ts +13 -0
- package/assets/mds/supabase/migrations/0001_mds_auth_onboarding.sql +107 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +444 -29
- package/dist/catalog.js.map +1 -1
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/assets/mds/src/app/onboarding/account-setup.tsx +0 -1
- package/assets/mds/src/app/onboarding/agreement.tsx +0 -1
- package/assets/mds/src/app/onboarding/terms.tsx +0 -1
- package/assets/mds/src/features/onboarding/account-setup-screen.tsx +0 -54
- package/assets/mds/src/features/onboarding/agreement-screen.tsx +0 -6
- package/assets/mds/src/features/onboarding/components/legal-document-view.tsx +0 -103
- package/assets/mds/src/features/onboarding/legal-documents.ts +0 -80
- package/assets/mds/src/features/onboarding/onboarding-screen.tsx +0 -167
- 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=
|
|
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
|
|
177
|
-
|
|
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=
|
|
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
|
|
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={
|
|
234
|
+
<ExpoUIText textStyle={headingStyle}>Universal component lab</ExpoUIText>
|
|
210
235
|
<ExpoUIText
|
|
211
|
-
textStyle={
|
|
236
|
+
textStyle={bodyStyle}
|
|
212
237
|
>{`Count: ${count} | Density: ${density}`}</ExpoUIText>
|
|
213
238
|
</Column>
|
|
214
239
|
<Spacer flexible />
|
|
215
|
-
<ExpoUIText textStyle={
|
|
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={
|
|
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={
|
|
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=
|
|
262
|
-
style={
|
|
263
|
-
textStyle={
|
|
286
|
+
placeholderTextColor={colors.text}
|
|
287
|
+
style={inputStyle}
|
|
288
|
+
textStyle={inputTextStyle}
|
|
264
289
|
/>
|
|
265
|
-
<ExpoUIText textStyle={
|
|
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={
|
|
274
|
-
<ExpoUIText textStyle={
|
|
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
|
|
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
|
|
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=
|
|
297
|
-
style={
|
|
298
|
-
|
|
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
|
|
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
|
|
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
|
|
338
|
-
|
|
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
|
|
349
|
-
|
|
350
|
-
<Text style={styles.
|
|
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
|
|
412
|
+
<View
|
|
413
|
+
style={[styles.exampleBox, { backgroundColor: colors.surface, borderColor: colors.primary }]}>
|
|
362
414
|
<View style={styles.componentLabelGrid}>
|
|
363
|
-
<Text style={
|
|
364
|
-
<Text style={
|
|
365
|
-
<Text style={
|
|
366
|
-
<Text style={
|
|
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
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
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
|
|
450
|
+
<View
|
|
451
|
+
style={[styles.exampleBox, { backgroundColor: colors.surface, borderColor: colors.primary }]}>
|
|
386
452
|
<View style={styles.transportRow}>
|
|
387
|
-
<Text style={
|
|
388
|
-
<Text style={
|
|
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
|
|
452
|
-
|
|
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,
|