@symbiote-native/cli 0.0.1 → 0.1.1

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 (122) hide show
  1. package/README.md +79 -447
  2. package/bundle.js +4 -33
  3. package/package.json +21 -5
  4. package/templates/js/angular/index.js +2 -0
  5. package/templates/js/angular/src/App.css +2 -4
  6. package/templates/js/react/App.css +1 -1
  7. package/templates/js/react/index.js +2 -0
  8. package/templates/js/solid/App.css +2 -4
  9. package/templates/js/solid/index.js +2 -0
  10. package/templates/js/svelte/App.svelte +2 -2
  11. package/templates/js/svelte/App.typescript.svelte +2 -2
  12. package/templates/js/svelte/index.js +2 -0
  13. package/templates/js/vue-sfc/App.typescript.vue +2 -2
  14. package/templates/js/vue-sfc/App.vue +2 -2
  15. package/templates/js/vue-sfc/index.js +2 -0
  16. package/templates/js/vue-tsx/App.css +2 -4
  17. package/templates/js/vue-tsx/index.js +2 -0
  18. package/templates/layers/navigation/app/angular/src/App.css +2 -4
  19. package/templates/layers/navigation/app/react/App.css +1 -1
  20. package/templates/layers/navigation/app/solid/App.css +2 -4
  21. package/templates/layers/navigation/app/svelte/App.css +2 -4
  22. package/templates/layers/navigation/app/vue-sfc/App.css +2 -4
  23. package/templates/layers/navigation/app/vue-tsx/App.css +2 -4
  24. package/templates/styling/js/angular/css-modules/src/App.module.css +78 -0
  25. package/templates/styling/js/angular/css-modules/src/App.ts +30 -6
  26. package/templates/styling/js/angular/stylesheet/src/App.ts +56 -6
  27. package/templates/styling/js/react/css-modules/App.jsx +17 -5
  28. package/templates/styling/js/react/css-modules/App.module.css +60 -0
  29. package/templates/styling/js/react/css-modules/App.tsx +17 -5
  30. package/templates/styling/js/react/stylesheet/App.jsx +48 -6
  31. package/templates/styling/js/react/stylesheet/App.tsx +48 -6
  32. package/templates/styling/js/solid/css-modules/App.jsx +29 -5
  33. package/templates/styling/js/solid/css-modules/App.module.css +78 -0
  34. package/templates/styling/js/solid/css-modules/App.tsx +29 -5
  35. package/templates/styling/js/solid/stylesheet/App.jsx +60 -6
  36. package/templates/styling/js/solid/stylesheet/App.tsx +60 -6
  37. package/templates/styling/js/svelte/css-modules/App.module.css +78 -0
  38. package/templates/styling/js/svelte/css-modules/App.svelte +27 -5
  39. package/templates/styling/js/svelte/css-modules/App.typescript.svelte +27 -5
  40. package/templates/styling/js/svelte/stylesheet/App.svelte +62 -6
  41. package/templates/styling/js/svelte/stylesheet/App.typescript.svelte +62 -6
  42. package/templates/styling/js/vue-sfc/css-modules/App.module.css +78 -0
  43. package/templates/styling/js/vue-sfc/css-modules/App.typescript.vue +29 -5
  44. package/templates/styling/js/vue-sfc/css-modules/App.vue +29 -5
  45. package/templates/styling/js/vue-sfc/stylesheet/App.typescript.vue +60 -6
  46. package/templates/styling/js/vue-sfc/stylesheet/App.vue +60 -6
  47. package/templates/styling/js/vue-tsx/css-modules/App.jsx +29 -5
  48. package/templates/styling/js/vue-tsx/css-modules/App.module.css +78 -0
  49. package/templates/styling/js/vue-tsx/css-modules/App.tsx +29 -5
  50. package/templates/styling/js/vue-tsx/stylesheet/App.jsx +60 -6
  51. package/templates/styling/js/vue-tsx/stylesheet/App.tsx +60 -6
  52. package/templates/styling/navigation/angular/css-modules/src/App.module.css +118 -0
  53. package/templates/styling/navigation/angular/css-modules/src/DetailsScreen.ts +12 -4
  54. package/templates/styling/navigation/angular/css-modules/src/MenuScreen.ts +38 -8
  55. package/templates/styling/navigation/angular/stylesheet/src/DetailsScreen.ts +39 -4
  56. package/templates/styling/navigation/angular/stylesheet/src/MenuScreen.ts +75 -8
  57. package/templates/styling/navigation/react/css-modules/App.jsx +56 -11
  58. package/templates/styling/navigation/react/css-modules/App.module.css +100 -0
  59. package/templates/styling/navigation/react/css-modules/App.tsx +56 -11
  60. package/templates/styling/navigation/react/stylesheet/App.jsx +107 -12
  61. package/templates/styling/navigation/react/stylesheet/App.tsx +107 -12
  62. package/templates/styling/navigation/solid/css-modules/App.jsx +68 -11
  63. package/templates/styling/navigation/solid/css-modules/App.module.css +118 -0
  64. package/templates/styling/navigation/solid/css-modules/App.tsx +68 -11
  65. package/templates/styling/navigation/solid/stylesheet/App.jsx +119 -12
  66. package/templates/styling/navigation/solid/stylesheet/App.tsx +119 -12
  67. package/templates/styling/navigation/svelte/css-modules/App.module.css +118 -0
  68. package/templates/styling/navigation/svelte/css-modules/DetailsScreen.svelte +14 -3
  69. package/templates/styling/navigation/svelte/css-modules/DetailsScreen.typescript.svelte +14 -3
  70. package/templates/styling/navigation/svelte/css-modules/MenuScreen.svelte +34 -6
  71. package/templates/styling/navigation/svelte/css-modules/MenuScreen.typescript.svelte +34 -6
  72. package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.svelte +41 -4
  73. package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.typescript.svelte +41 -4
  74. package/templates/styling/navigation/svelte/stylesheet/MenuScreen.svelte +80 -7
  75. package/templates/styling/navigation/svelte/stylesheet/MenuScreen.typescript.svelte +80 -7
  76. package/templates/styling/navigation/vue-sfc/css-modules/App.module.css +118 -0
  77. package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.typescript.vue +12 -3
  78. package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.vue +12 -3
  79. package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.typescript.vue +38 -6
  80. package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.vue +38 -6
  81. package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.typescript.vue +39 -4
  82. package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.vue +39 -4
  83. package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.typescript.vue +80 -7
  84. package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.vue +80 -7
  85. package/templates/styling/navigation/vue-tsx/css-modules/App.jsx +63 -18
  86. package/templates/styling/navigation/vue-tsx/css-modules/App.module.css +118 -0
  87. package/templates/styling/navigation/vue-tsx/css-modules/App.tsx +63 -18
  88. package/templates/styling/navigation/vue-tsx/stylesheet/App.jsx +116 -21
  89. package/templates/styling/navigation/vue-tsx/stylesheet/App.tsx +116 -21
  90. package/src/index.ts +0 -70
  91. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  92. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  93. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  94. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  95. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  96. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  97. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  98. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  99. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  100. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  101. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  102. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  103. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  104. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  105. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  106. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  107. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  108. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  109. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  110. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  111. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  112. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  113. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  114. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  115. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  116. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  117. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  118. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  119. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  120. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  121. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  122. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
@@ -1,32 +1,89 @@
1
1
  import { Stack, useStackNavigation } from '@symbiote-native/navigation/solid';
2
+ import { createSignal } from 'solid-js';
2
3
  import styles from './App.module.css';
3
4
 
4
5
  function MenuScreen() {
5
6
  const navigation = useStackNavigation();
7
+ const [count, setCount] = createSignal<number>(0);
6
8
 
7
9
  return (
8
- <view class={styles.container}>
9
- <text>Welcome to SymbioteNative!</text>
10
- <pressable onPress={() => navigation().push('Details')}>
11
- <text>Go to Details</text>
12
- </pressable>
13
- </view>
10
+ <safe-area-view class={styles['screen']}>
11
+ <view class={styles['brand-row']}>
12
+ <image
13
+ class={`${styles['brand-logo']} ${styles['brand-logo-react']}`}
14
+ resizeMode="contain"
15
+ source={require('./assets/react-native-logo.png')}
16
+ />
17
+ <image
18
+ class={styles['plus-icon']}
19
+ resizeMode="contain"
20
+ source={require('./assets/plus-icon.png')}
21
+ />
22
+ <image
23
+ class={`${styles['brand-logo']} ${styles['brand-logo-solid']}`}
24
+ resizeMode="contain"
25
+ source={require('./assets/solid-logo.png')}
26
+ />
27
+ </view>
28
+ <text class={styles['title']}>Welcome to SymbioteNative!</text>
29
+ <text class={styles['subtitle']}>Framework-agnostic React Native, driven by Solid.</text>
30
+
31
+ <view class={styles['counter-card']}>
32
+ <text class={styles['counter-label']}>TAPS</text>
33
+ <text class={styles['counter-value']}>{count()}</text>
34
+ </view>
35
+
36
+ <view class={styles['button-row']}>
37
+ <pressable class={styles['button-primary']} onPress={() => setCount(count() + 1)}>
38
+ <text class={styles['button-primary-text']}>Tap me</text>
39
+ </pressable>
40
+ <pressable class={styles['button-secondary']} onPress={() => navigation().push('Details')}>
41
+ <text class={styles['button-secondary-text']}>Go to Details</text>
42
+ </pressable>
43
+ </view>
44
+ </safe-area-view>
14
45
  );
15
46
  }
16
47
 
17
48
  function DetailsScreen() {
49
+ const navigation = useStackNavigation();
50
+
18
51
  return (
19
- <view class={styles.container}>
20
- <text>Details screen</text>
21
- </view>
52
+ <safe-area-view class={styles['screen']}>
53
+ <view class={styles['details-card']}>
54
+ <text class={styles['details-title']}>You made it!</text>
55
+ <text class={styles['details-body']}>
56
+ This screen was pushed by the Stack navigator — proof navigation actually works.
57
+ </text>
58
+ </view>
59
+ <pressable class={styles['button-secondary']} onPress={() => navigation().pop()}>
60
+ <text class={styles['button-secondary-text']}>Go back</text>
61
+ </pressable>
62
+ </safe-area-view>
22
63
  );
23
64
  }
24
65
 
66
+ const SCREEN_OPTIONS = {
67
+ headerTranslucent: true,
68
+ headerTintColor: '#ffffff',
69
+ headerTitleColor: '#ffffff',
70
+ headerStyle: { backgroundColor: '#0b1622' },
71
+ headerUserInterfaceStyle: 'dark' as const,
72
+ };
73
+
25
74
  export default function App() {
26
75
  return (
27
76
  <Stack initialRouteName="Menu">
28
- <Stack.Screen name="Menu" component={MenuScreen} options={{ title: 'Home' }} />
29
- <Stack.Screen name="Details" component={DetailsScreen} options={{ title: 'Details' }} />
77
+ <Stack.Screen
78
+ name="Menu"
79
+ component={MenuScreen}
80
+ options={{ title: 'Home', ...SCREEN_OPTIONS }}
81
+ />
82
+ <Stack.Screen
83
+ name="Details"
84
+ component={DetailsScreen}
85
+ options={{ title: 'Details', ...SCREEN_OPTIONS }}
86
+ />
30
87
  </Stack>
31
88
  );
32
89
  }
@@ -1,36 +1,143 @@
1
1
  import { Stack, useStackNavigation } from '@symbiote-native/navigation/solid';
2
+ import { createSignal } from 'solid-js';
2
3
  import { StyleSheet } from '@symbiote-native/solid';
3
4
 
4
5
  function MenuScreen() {
5
6
  const navigation = useStackNavigation();
7
+ const [count, setCount] = createSignal(0);
6
8
 
7
9
  return (
8
- <view style={styles.container}>
9
- <text>Welcome to SymbioteNative!</text>
10
- <pressable onPress={() => navigation().push('Details')}>
11
- <text>Go to Details</text>
12
- </pressable>
13
- </view>
10
+ <safe-area-view style={styles.screen}>
11
+ <view style={styles.brandRow}>
12
+ <image
13
+ style={[styles.brandLogo, styles.brandLogoReact]}
14
+ resizeMode="contain"
15
+ source={require('./assets/react-native-logo.png')}
16
+ />
17
+ <image style={styles.plusIcon} resizeMode="contain" source={require('./assets/plus-icon.png')} />
18
+ <image
19
+ style={[styles.brandLogo, styles.brandLogoSolid]}
20
+ resizeMode="contain"
21
+ source={require('./assets/solid-logo.png')}
22
+ />
23
+ </view>
24
+ <text style={styles.title}>Welcome to SymbioteNative!</text>
25
+ <text style={styles.subtitle}>Framework-agnostic React Native, driven by Solid.</text>
26
+
27
+ <view style={styles.counterCard}>
28
+ <text style={styles.counterLabel}>TAPS</text>
29
+ <text style={styles.counterValue}>{count()}</text>
30
+ </view>
31
+
32
+ <view style={styles.buttonRow}>
33
+ <pressable style={styles.buttonPrimary} onPress={() => setCount(count() + 1)}>
34
+ <text style={styles.buttonPrimaryText}>Tap me</text>
35
+ </pressable>
36
+ <pressable style={styles.buttonSecondary} onPress={() => navigation().push('Details')}>
37
+ <text style={styles.buttonSecondaryText}>Go to Details</text>
38
+ </pressable>
39
+ </view>
40
+ </safe-area-view>
14
41
  );
15
42
  }
16
43
 
17
44
  function DetailsScreen() {
45
+ const navigation = useStackNavigation();
46
+
18
47
  return (
19
- <view style={styles.container}>
20
- <text>Details screen</text>
21
- </view>
48
+ <safe-area-view style={styles.screen}>
49
+ <view style={styles.detailsCard}>
50
+ <text style={styles.detailsTitle}>You made it!</text>
51
+ <text style={styles.detailsBody}>
52
+ This screen was pushed by the Stack navigator — proof navigation actually works.
53
+ </text>
54
+ </view>
55
+ <pressable style={styles.buttonSecondary} onPress={() => navigation().pop()}>
56
+ <text style={styles.buttonSecondaryText}>Go back</text>
57
+ </pressable>
58
+ </safe-area-view>
22
59
  );
23
60
  }
24
61
 
62
+ const SCREEN_OPTIONS = {
63
+ headerTranslucent: true,
64
+ headerTintColor: '#ffffff',
65
+ headerTitleColor: '#ffffff',
66
+ headerStyle: { backgroundColor: '#0b1622' },
67
+ headerUserInterfaceStyle: 'dark',
68
+ };
69
+
25
70
  export default function App() {
26
71
  return (
27
72
  <Stack initialRouteName="Menu">
28
- <Stack.Screen name="Menu" component={MenuScreen} options={{ title: 'Home' }} />
29
- <Stack.Screen name="Details" component={DetailsScreen} options={{ title: 'Details' }} />
73
+ <Stack.Screen
74
+ name="Menu"
75
+ component={MenuScreen}
76
+ options={{ title: 'Home', ...SCREEN_OPTIONS }}
77
+ />
78
+ <Stack.Screen
79
+ name="Details"
80
+ component={DetailsScreen}
81
+ options={{ title: 'Details', ...SCREEN_OPTIONS }}
82
+ />
30
83
  </Stack>
31
84
  );
32
85
  }
33
86
 
34
87
  const styles = StyleSheet.create({
35
- container: { flex: 1, alignItems: 'center', justifyContent: 'center' },
88
+ screen: {
89
+ flex: 1,
90
+ backgroundColor: '#0b1622',
91
+ alignItems: 'center',
92
+ justifyContent: 'center',
93
+ gap: 24,
94
+ paddingVertical: 24,
95
+ paddingHorizontal: 32,
96
+ },
97
+ brandRow: { flexDirection: 'row', alignItems: 'center', gap: 28 },
98
+ brandLogo: { height: 64 },
99
+ brandLogoReact: { width: 70 },
100
+ brandLogoSolid: { width: 66 },
101
+ plusIcon: { width: 48, height: 48 },
102
+ title: { color: '#ffffff', fontSize: 22, fontWeight: 'bold', textAlign: 'center' },
103
+ subtitle: { color: '#cbd5e1', fontSize: 14, textAlign: 'center' },
104
+ counterCard: {
105
+ alignItems: 'center',
106
+ gap: 4,
107
+ paddingVertical: 20,
108
+ paddingHorizontal: 28,
109
+ borderRadius: 16,
110
+ backgroundColor: '#13243a',
111
+ },
112
+ counterLabel: { color: '#41506a', fontSize: 12, letterSpacing: 1 },
113
+ counterValue: { color: '#2c4f7c', fontSize: 32, fontWeight: 'bold' },
114
+ buttonRow: { flexDirection: 'row', gap: 12 },
115
+ buttonPrimary: {
116
+ alignItems: 'center',
117
+ justifyContent: 'center',
118
+ borderRadius: 12,
119
+ paddingVertical: 14,
120
+ paddingHorizontal: 22,
121
+ backgroundColor: '#2c4f7c',
122
+ },
123
+ buttonSecondary: {
124
+ alignItems: 'center',
125
+ justifyContent: 'center',
126
+ borderRadius: 12,
127
+ paddingVertical: 14,
128
+ paddingHorizontal: 22,
129
+ borderWidth: 1.5,
130
+ borderColor: '#41506a',
131
+ },
132
+ buttonPrimaryText: { color: '#ffffff', fontSize: 15, fontWeight: 'bold' },
133
+ buttonSecondaryText: { color: '#ffffff', fontSize: 15, fontWeight: 'bold' },
134
+ detailsCard: {
135
+ alignItems: 'center',
136
+ gap: 10,
137
+ padding: 24,
138
+ borderRadius: 16,
139
+ backgroundColor: '#13243a',
140
+ },
141
+ detailsTitle: { color: '#ffffff', fontSize: 18, fontWeight: 'bold' },
142
+ detailsBody: { color: '#cbd5e1', fontSize: 14, textAlign: 'center' },
36
143
  });
@@ -1,36 +1,143 @@
1
1
  import { Stack, useStackNavigation } from '@symbiote-native/navigation/solid';
2
+ import { createSignal } from 'solid-js';
2
3
  import { StyleSheet } from '@symbiote-native/solid';
3
4
 
4
5
  function MenuScreen() {
5
6
  const navigation = useStackNavigation();
7
+ const [count, setCount] = createSignal<number>(0);
6
8
 
7
9
  return (
8
- <view style={styles.container}>
9
- <text>Welcome to SymbioteNative!</text>
10
- <pressable onPress={() => navigation().push('Details')}>
11
- <text>Go to Details</text>
12
- </pressable>
13
- </view>
10
+ <safe-area-view style={styles.screen}>
11
+ <view style={styles.brandRow}>
12
+ <image
13
+ style={[styles.brandLogo, styles.brandLogoReact]}
14
+ resizeMode="contain"
15
+ source={require('./assets/react-native-logo.png')}
16
+ />
17
+ <image style={styles.plusIcon} resizeMode="contain" source={require('./assets/plus-icon.png')} />
18
+ <image
19
+ style={[styles.brandLogo, styles.brandLogoSolid]}
20
+ resizeMode="contain"
21
+ source={require('./assets/solid-logo.png')}
22
+ />
23
+ </view>
24
+ <text style={styles.title}>Welcome to SymbioteNative!</text>
25
+ <text style={styles.subtitle}>Framework-agnostic React Native, driven by Solid.</text>
26
+
27
+ <view style={styles.counterCard}>
28
+ <text style={styles.counterLabel}>TAPS</text>
29
+ <text style={styles.counterValue}>{count()}</text>
30
+ </view>
31
+
32
+ <view style={styles.buttonRow}>
33
+ <pressable style={styles.buttonPrimary} onPress={() => setCount(count() + 1)}>
34
+ <text style={styles.buttonPrimaryText}>Tap me</text>
35
+ </pressable>
36
+ <pressable style={styles.buttonSecondary} onPress={() => navigation().push('Details')}>
37
+ <text style={styles.buttonSecondaryText}>Go to Details</text>
38
+ </pressable>
39
+ </view>
40
+ </safe-area-view>
14
41
  );
15
42
  }
16
43
 
17
44
  function DetailsScreen() {
45
+ const navigation = useStackNavigation();
46
+
18
47
  return (
19
- <view style={styles.container}>
20
- <text>Details screen</text>
21
- </view>
48
+ <safe-area-view style={styles.screen}>
49
+ <view style={styles.detailsCard}>
50
+ <text style={styles.detailsTitle}>You made it!</text>
51
+ <text style={styles.detailsBody}>
52
+ This screen was pushed by the Stack navigator — proof navigation actually works.
53
+ </text>
54
+ </view>
55
+ <pressable style={styles.buttonSecondary} onPress={() => navigation().pop()}>
56
+ <text style={styles.buttonSecondaryText}>Go back</text>
57
+ </pressable>
58
+ </safe-area-view>
22
59
  );
23
60
  }
24
61
 
62
+ const SCREEN_OPTIONS = {
63
+ headerTranslucent: true,
64
+ headerTintColor: '#ffffff',
65
+ headerTitleColor: '#ffffff',
66
+ headerStyle: { backgroundColor: '#0b1622' },
67
+ headerUserInterfaceStyle: 'dark' as const,
68
+ };
69
+
25
70
  export default function App() {
26
71
  return (
27
72
  <Stack initialRouteName="Menu">
28
- <Stack.Screen name="Menu" component={MenuScreen} options={{ title: 'Home' }} />
29
- <Stack.Screen name="Details" component={DetailsScreen} options={{ title: 'Details' }} />
73
+ <Stack.Screen
74
+ name="Menu"
75
+ component={MenuScreen}
76
+ options={{ title: 'Home', ...SCREEN_OPTIONS }}
77
+ />
78
+ <Stack.Screen
79
+ name="Details"
80
+ component={DetailsScreen}
81
+ options={{ title: 'Details', ...SCREEN_OPTIONS }}
82
+ />
30
83
  </Stack>
31
84
  );
32
85
  }
33
86
 
34
87
  const styles = StyleSheet.create({
35
- container: { flex: 1, alignItems: 'center', justifyContent: 'center' },
88
+ screen: {
89
+ flex: 1,
90
+ backgroundColor: '#0b1622',
91
+ alignItems: 'center',
92
+ justifyContent: 'center',
93
+ gap: 24,
94
+ paddingVertical: 24,
95
+ paddingHorizontal: 32,
96
+ },
97
+ brandRow: { flexDirection: 'row', alignItems: 'center', gap: 28 },
98
+ brandLogo: { height: 64 },
99
+ brandLogoReact: { width: 70 },
100
+ brandLogoSolid: { width: 66 },
101
+ plusIcon: { width: 48, height: 48 },
102
+ title: { color: '#ffffff', fontSize: 22, fontWeight: 'bold', textAlign: 'center' },
103
+ subtitle: { color: '#cbd5e1', fontSize: 14, textAlign: 'center' },
104
+ counterCard: {
105
+ alignItems: 'center',
106
+ gap: 4,
107
+ paddingVertical: 20,
108
+ paddingHorizontal: 28,
109
+ borderRadius: 16,
110
+ backgroundColor: '#13243a',
111
+ },
112
+ counterLabel: { color: '#41506a', fontSize: 12, letterSpacing: 1 },
113
+ counterValue: { color: '#2c4f7c', fontSize: 32, fontWeight: 'bold' },
114
+ buttonRow: { flexDirection: 'row', gap: 12 },
115
+ buttonPrimary: {
116
+ alignItems: 'center',
117
+ justifyContent: 'center',
118
+ borderRadius: 12,
119
+ paddingVertical: 14,
120
+ paddingHorizontal: 22,
121
+ backgroundColor: '#2c4f7c',
122
+ },
123
+ buttonSecondary: {
124
+ alignItems: 'center',
125
+ justifyContent: 'center',
126
+ borderRadius: 12,
127
+ paddingVertical: 14,
128
+ paddingHorizontal: 22,
129
+ borderWidth: 1.5,
130
+ borderColor: '#41506a',
131
+ },
132
+ buttonPrimaryText: { color: '#ffffff', fontSize: 15, fontWeight: 'bold' },
133
+ buttonSecondaryText: { color: '#ffffff', fontSize: 15, fontWeight: 'bold' },
134
+ detailsCard: {
135
+ alignItems: 'center',
136
+ gap: 10,
137
+ padding: 24,
138
+ borderRadius: 16,
139
+ backgroundColor: '#13243a',
140
+ },
141
+ detailsTitle: { color: '#ffffff', fontSize: 18, fontWeight: 'bold' },
142
+ detailsBody: { color: '#cbd5e1', fontSize: 14, textAlign: 'center' },
36
143
  });
@@ -0,0 +1,118 @@
1
+ .screen {
2
+ flex: 1;
3
+ background-color: #0b1622;
4
+ align-items: center;
5
+ justify-content: center;
6
+ gap: 24px;
7
+ padding: 24px 32px;
8
+ }
9
+
10
+ .brand-row {
11
+ flex-direction: row;
12
+ align-items: center;
13
+ gap: 28px;
14
+ }
15
+
16
+ .brand-logo {
17
+ height: 64px;
18
+ }
19
+
20
+ .brand-logo-react {
21
+ width: 70px;
22
+ }
23
+
24
+ .brand-logo-svelte {
25
+ width: 54px;
26
+ }
27
+
28
+ .plus-icon {
29
+ width: 48px;
30
+ height: 48px;
31
+ }
32
+
33
+ .title {
34
+ color: #ffffff;
35
+ font-size: 22px;
36
+ font-weight: bold;
37
+ text-align: center;
38
+ }
39
+
40
+ .subtitle {
41
+ color: #cbd5e1;
42
+ font-size: 14px;
43
+ text-align: center;
44
+ }
45
+
46
+ .counter-card {
47
+ align-items: center;
48
+ gap: 4px;
49
+ padding: 20px 28px;
50
+ border-radius: 16px;
51
+ background-color: #13243a;
52
+ }
53
+
54
+ .counter-label {
55
+ color: #41506a;
56
+ font-size: 12px;
57
+ letter-spacing: 1px;
58
+ }
59
+
60
+ .counter-value {
61
+ color: #ff3e00;
62
+ font-size: 32px;
63
+ font-weight: bold;
64
+ }
65
+
66
+ .button-row {
67
+ flex-direction: row;
68
+ gap: 12px;
69
+ }
70
+
71
+ .button-primary {
72
+ align-items: center;
73
+ justify-content: center;
74
+ border-radius: 12px;
75
+ padding: 14px 22px;
76
+ background-color: #ff3e00;
77
+ }
78
+
79
+ .button-secondary {
80
+ align-items: center;
81
+ justify-content: center;
82
+ border-radius: 12px;
83
+ padding: 14px 22px;
84
+ border-width: 1.5px;
85
+ border-color: #41506a;
86
+ }
87
+
88
+ .button-primary-text {
89
+ color: #ffffff;
90
+ font-size: 15px;
91
+ font-weight: bold;
92
+ }
93
+
94
+ .button-secondary-text {
95
+ color: #ffffff;
96
+ font-size: 15px;
97
+ font-weight: bold;
98
+ }
99
+
100
+ .details-card {
101
+ align-items: center;
102
+ gap: 10px;
103
+ padding: 24px;
104
+ border-radius: 16px;
105
+ background-color: #13243a;
106
+ }
107
+
108
+ .details-title {
109
+ color: #ffffff;
110
+ font-size: 18px;
111
+ font-weight: bold;
112
+ }
113
+
114
+ .details-body {
115
+ color: #cbd5e1;
116
+ font-size: 14px;
117
+ text-align: center;
118
+ }
@@ -1,7 +1,18 @@
1
1
  <script>
2
+ import { useStackNavigation } from '@symbiote-native/navigation/svelte';
2
3
  import styles from './App.module.css';
4
+
5
+ const navigation = useStackNavigation();
3
6
  </script>
4
7
 
5
- <view class={styles.container}>
6
- <text>Details screen</text>
7
- </view>
8
+ <safe-area-view class={styles['screen']}>
9
+ <view class={styles['details-card']}>
10
+ <text class={styles['details-title']}>You made it!</text>
11
+ <text class={styles['details-body']}>
12
+ This screen was pushed by the Stack navigator — proof navigation actually works.
13
+ </text>
14
+ </view>
15
+ <pressable class={styles['button-secondary']} onPress={() => navigation.current.pop()}>
16
+ <text class={styles['button-secondary-text']}>Go back</text>
17
+ </pressable>
18
+ </safe-area-view>
@@ -1,7 +1,18 @@
1
1
  <script lang="ts">
2
+ import { useStackNavigation } from '@symbiote-native/navigation/svelte';
2
3
  import styles from './App.module.css';
4
+
5
+ const navigation = useStackNavigation();
3
6
  </script>
4
7
 
5
- <view class={styles.container}>
6
- <text>Details screen</text>
7
- </view>
8
+ <safe-area-view class={styles['screen']}>
9
+ <view class={styles['details-card']}>
10
+ <text class={styles['details-title']}>You made it!</text>
11
+ <text class={styles['details-body']}>
12
+ This screen was pushed by the Stack navigator — proof navigation actually works.
13
+ </text>
14
+ </view>
15
+ <pressable class={styles['button-secondary']} onPress={() => navigation.current.pop()}>
16
+ <text class={styles['button-secondary-text']}>Go back</text>
17
+ </pressable>
18
+ </safe-area-view>
@@ -1,13 +1,41 @@
1
1
  <script>
2
2
  import { useStackNavigation } from '@symbiote-native/navigation/svelte';
3
+ import { PLUS_ICON_URI, REACT_NATIVE_LOGO_URI, SVELTE_LOGO_URI } from './image-uris';
3
4
  import styles from './App.module.css';
4
5
 
5
6
  const navigation = useStackNavigation();
7
+ let count = $state(0);
6
8
  </script>
7
9
 
8
- <view class={styles.container}>
9
- <text>Welcome to SymbioteNative!</text>
10
- <pressable onPress={() => navigation.current.push('Details')}>
11
- <text>Go to Details</text>
12
- </pressable>
13
- </view>
10
+ <safe-area-view class={styles['screen']}>
11
+ <view class={styles['brand-row']}>
12
+ <image
13
+ class={`${styles['brand-logo']} ${styles['brand-logo-react']}`}
14
+ resizeMode="contain"
15
+ source={{ uri: REACT_NATIVE_LOGO_URI }}
16
+ />
17
+ <image class={styles['plus-icon']} resizeMode="contain" source={{ uri: PLUS_ICON_URI }} />
18
+ <image
19
+ class={`${styles['brand-logo']} ${styles['brand-logo-svelte']}`}
20
+ resizeMode="contain"
21
+ source={{ uri: SVELTE_LOGO_URI }}
22
+ />
23
+ </view>
24
+
25
+ <text class={styles['title']}>Welcome to SymbioteNative!</text>
26
+ <text class={styles['subtitle']}>Framework-agnostic React Native, driven by Svelte.</text>
27
+
28
+ <view class={styles['counter-card']}>
29
+ <text class={styles['counter-label']}>TAPS</text>
30
+ <text class={styles['counter-value']}>{count}</text>
31
+ </view>
32
+
33
+ <view class={styles['button-row']}>
34
+ <pressable class={styles['button-primary']} onPress={() => (count += 1)}>
35
+ <text class={styles['button-primary-text']}>Tap me</text>
36
+ </pressable>
37
+ <pressable class={styles['button-secondary']} onPress={() => navigation.current.push('Details')}>
38
+ <text class={styles['button-secondary-text']}>Go to Details</text>
39
+ </pressable>
40
+ </view>
41
+ </safe-area-view>
@@ -1,13 +1,41 @@
1
1
  <script lang="ts">
2
2
  import { useStackNavigation } from '@symbiote-native/navigation/svelte';
3
+ import { PLUS_ICON_URI, REACT_NATIVE_LOGO_URI, SVELTE_LOGO_URI } from './image-uris';
3
4
  import styles from './App.module.css';
4
5
 
5
6
  const navigation = useStackNavigation();
7
+ let count = $state<number>(0);
6
8
  </script>
7
9
 
8
- <view class={styles.container}>
9
- <text>Welcome to SymbioteNative!</text>
10
- <pressable onPress={() => navigation.current.push('Details')}>
11
- <text>Go to Details</text>
12
- </pressable>
13
- </view>
10
+ <safe-area-view class={styles['screen']}>
11
+ <view class={styles['brand-row']}>
12
+ <image
13
+ class={`${styles['brand-logo']} ${styles['brand-logo-react']}`}
14
+ resizeMode="contain"
15
+ source={{ uri: REACT_NATIVE_LOGO_URI }}
16
+ />
17
+ <image class={styles['plus-icon']} resizeMode="contain" source={{ uri: PLUS_ICON_URI }} />
18
+ <image
19
+ class={`${styles['brand-logo']} ${styles['brand-logo-svelte']}`}
20
+ resizeMode="contain"
21
+ source={{ uri: SVELTE_LOGO_URI }}
22
+ />
23
+ </view>
24
+
25
+ <text class={styles['title']}>Welcome to SymbioteNative!</text>
26
+ <text class={styles['subtitle']}>Framework-agnostic React Native, driven by Svelte.</text>
27
+
28
+ <view class={styles['counter-card']}>
29
+ <text class={styles['counter-label']}>TAPS</text>
30
+ <text class={styles['counter-value']}>{count}</text>
31
+ </view>
32
+
33
+ <view class={styles['button-row']}>
34
+ <pressable class={styles['button-primary']} onPress={() => (count += 1)}>
35
+ <text class={styles['button-primary-text']}>Tap me</text>
36
+ </pressable>
37
+ <pressable class={styles['button-secondary']} onPress={() => navigation.current.push('Details')}>
38
+ <text class={styles['button-secondary-text']}>Go to Details</text>
39
+ </pressable>
40
+ </view>
41
+ </safe-area-view>