@symbiote-native/cli 0.1.0 → 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 (120) hide show
  1. package/bundle.js +4 -33
  2. package/package.json +1 -1
  3. package/templates/js/angular/index.js +2 -0
  4. package/templates/js/angular/src/App.css +2 -4
  5. package/templates/js/react/App.css +1 -1
  6. package/templates/js/react/index.js +2 -0
  7. package/templates/js/solid/App.css +2 -4
  8. package/templates/js/solid/index.js +2 -0
  9. package/templates/js/svelte/App.svelte +2 -2
  10. package/templates/js/svelte/App.typescript.svelte +2 -2
  11. package/templates/js/svelte/index.js +2 -0
  12. package/templates/js/vue-sfc/App.typescript.vue +2 -2
  13. package/templates/js/vue-sfc/App.vue +2 -2
  14. package/templates/js/vue-sfc/index.js +2 -0
  15. package/templates/js/vue-tsx/App.css +2 -4
  16. package/templates/js/vue-tsx/index.js +2 -0
  17. package/templates/layers/navigation/app/angular/src/App.css +2 -4
  18. package/templates/layers/navigation/app/react/App.css +1 -1
  19. package/templates/layers/navigation/app/solid/App.css +2 -4
  20. package/templates/layers/navigation/app/svelte/App.css +2 -4
  21. package/templates/layers/navigation/app/vue-sfc/App.css +2 -4
  22. package/templates/layers/navigation/app/vue-tsx/App.css +2 -4
  23. package/templates/styling/js/angular/css-modules/src/App.module.css +78 -0
  24. package/templates/styling/js/angular/css-modules/src/App.ts +30 -6
  25. package/templates/styling/js/angular/stylesheet/src/App.ts +56 -6
  26. package/templates/styling/js/react/css-modules/App.jsx +17 -5
  27. package/templates/styling/js/react/css-modules/App.module.css +60 -0
  28. package/templates/styling/js/react/css-modules/App.tsx +17 -5
  29. package/templates/styling/js/react/stylesheet/App.jsx +48 -6
  30. package/templates/styling/js/react/stylesheet/App.tsx +48 -6
  31. package/templates/styling/js/solid/css-modules/App.jsx +29 -5
  32. package/templates/styling/js/solid/css-modules/App.module.css +78 -0
  33. package/templates/styling/js/solid/css-modules/App.tsx +29 -5
  34. package/templates/styling/js/solid/stylesheet/App.jsx +60 -6
  35. package/templates/styling/js/solid/stylesheet/App.tsx +60 -6
  36. package/templates/styling/js/svelte/css-modules/App.module.css +78 -0
  37. package/templates/styling/js/svelte/css-modules/App.svelte +27 -5
  38. package/templates/styling/js/svelte/css-modules/App.typescript.svelte +27 -5
  39. package/templates/styling/js/svelte/stylesheet/App.svelte +62 -6
  40. package/templates/styling/js/svelte/stylesheet/App.typescript.svelte +62 -6
  41. package/templates/styling/js/vue-sfc/css-modules/App.module.css +78 -0
  42. package/templates/styling/js/vue-sfc/css-modules/App.typescript.vue +29 -5
  43. package/templates/styling/js/vue-sfc/css-modules/App.vue +29 -5
  44. package/templates/styling/js/vue-sfc/stylesheet/App.typescript.vue +60 -6
  45. package/templates/styling/js/vue-sfc/stylesheet/App.vue +60 -6
  46. package/templates/styling/js/vue-tsx/css-modules/App.jsx +29 -5
  47. package/templates/styling/js/vue-tsx/css-modules/App.module.css +78 -0
  48. package/templates/styling/js/vue-tsx/css-modules/App.tsx +29 -5
  49. package/templates/styling/js/vue-tsx/stylesheet/App.jsx +60 -6
  50. package/templates/styling/js/vue-tsx/stylesheet/App.tsx +60 -6
  51. package/templates/styling/navigation/angular/css-modules/src/App.module.css +118 -0
  52. package/templates/styling/navigation/angular/css-modules/src/DetailsScreen.ts +12 -4
  53. package/templates/styling/navigation/angular/css-modules/src/MenuScreen.ts +38 -8
  54. package/templates/styling/navigation/angular/stylesheet/src/DetailsScreen.ts +39 -4
  55. package/templates/styling/navigation/angular/stylesheet/src/MenuScreen.ts +75 -8
  56. package/templates/styling/navigation/react/css-modules/App.jsx +56 -11
  57. package/templates/styling/navigation/react/css-modules/App.module.css +100 -0
  58. package/templates/styling/navigation/react/css-modules/App.tsx +56 -11
  59. package/templates/styling/navigation/react/stylesheet/App.jsx +107 -12
  60. package/templates/styling/navigation/react/stylesheet/App.tsx +107 -12
  61. package/templates/styling/navigation/solid/css-modules/App.jsx +68 -11
  62. package/templates/styling/navigation/solid/css-modules/App.module.css +118 -0
  63. package/templates/styling/navigation/solid/css-modules/App.tsx +68 -11
  64. package/templates/styling/navigation/solid/stylesheet/App.jsx +119 -12
  65. package/templates/styling/navigation/solid/stylesheet/App.tsx +119 -12
  66. package/templates/styling/navigation/svelte/css-modules/App.module.css +118 -0
  67. package/templates/styling/navigation/svelte/css-modules/DetailsScreen.svelte +14 -3
  68. package/templates/styling/navigation/svelte/css-modules/DetailsScreen.typescript.svelte +14 -3
  69. package/templates/styling/navigation/svelte/css-modules/MenuScreen.svelte +34 -6
  70. package/templates/styling/navigation/svelte/css-modules/MenuScreen.typescript.svelte +34 -6
  71. package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.svelte +41 -4
  72. package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.typescript.svelte +41 -4
  73. package/templates/styling/navigation/svelte/stylesheet/MenuScreen.svelte +80 -7
  74. package/templates/styling/navigation/svelte/stylesheet/MenuScreen.typescript.svelte +80 -7
  75. package/templates/styling/navigation/vue-sfc/css-modules/App.module.css +118 -0
  76. package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.typescript.vue +12 -3
  77. package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.vue +12 -3
  78. package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.typescript.vue +38 -6
  79. package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.vue +38 -6
  80. package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.typescript.vue +39 -4
  81. package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.vue +39 -4
  82. package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.typescript.vue +80 -7
  83. package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.vue +80 -7
  84. package/templates/styling/navigation/vue-tsx/css-modules/App.jsx +63 -18
  85. package/templates/styling/navigation/vue-tsx/css-modules/App.module.css +118 -0
  86. package/templates/styling/navigation/vue-tsx/css-modules/App.tsx +63 -18
  87. package/templates/styling/navigation/vue-tsx/stylesheet/App.jsx +116 -21
  88. package/templates/styling/navigation/vue-tsx/stylesheet/App.tsx +116 -21
  89. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  90. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  91. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  92. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  93. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  94. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  95. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  96. /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  97. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  98. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  99. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  100. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  101. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  102. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  103. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  104. /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  105. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  106. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  107. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  108. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  109. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  110. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  111. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  112. /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
  113. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
  114. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
  115. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
  116. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
  117. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
  118. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
  119. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
  120. /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
@@ -5,16 +5,70 @@ export default {
5
5
  setup() {
6
6
  const count = ref(0);
7
7
  return () => (
8
- <view style={styles.container}>
9
- <text>Welcome to SymbioteNative!</text>
10
- <pressable onPress={() => count.value++}>
11
- <text>Taps: {count.value}</text>
8
+ <safe-area-view style={styles.screen}>
9
+ <view style={styles.brandRow}>
10
+ <image
11
+ style={[styles.brandLogo, styles.brandLogoReact]}
12
+ resizeMode="contain"
13
+ source={require('./assets/react-native-logo.png')}
14
+ />
15
+ <image style={styles.plusIcon} resizeMode="contain" source={require('./assets/plus-icon.png')} />
16
+ <image
17
+ style={[styles.brandLogo, styles.brandLogoVue]}
18
+ resizeMode="contain"
19
+ source={require('./assets/vue-logo.png')}
20
+ />
21
+ </view>
22
+ <text style={styles.title}>Welcome to SymbioteNative!</text>
23
+ <text style={styles.subtitle}>Framework-agnostic React Native, driven by Vue.</text>
24
+
25
+ <view style={styles.counterCard}>
26
+ <text style={styles.counterLabel}>TAPS</text>
27
+ <text style={styles.counterValue}>{count.value}</text>
28
+ </view>
29
+
30
+ <pressable style={styles.buttonPrimary} onPress={() => count.value++}>
31
+ <text style={styles.buttonPrimaryText}>Tap me</text>
12
32
  </pressable>
13
- </view>
33
+ </safe-area-view>
14
34
  );
15
35
  },
16
36
  };
17
37
 
18
38
  const styles = StyleSheet.create({
19
- container: { flex: 1, alignItems: 'center', justifyContent: 'center' },
39
+ screen: {
40
+ flex: 1,
41
+ backgroundColor: '#0b1622',
42
+ alignItems: 'center',
43
+ justifyContent: 'center',
44
+ gap: 24,
45
+ paddingVertical: 24,
46
+ paddingHorizontal: 32,
47
+ },
48
+ brandRow: { flexDirection: 'row', alignItems: 'center', gap: 28 },
49
+ brandLogo: { height: 64 },
50
+ brandLogoReact: { width: 70 },
51
+ brandLogoVue: { width: 74 },
52
+ plusIcon: { width: 48, height: 48 },
53
+ title: { color: '#ffffff', fontSize: 22, fontWeight: 'bold', textAlign: 'center' },
54
+ subtitle: { color: '#cbd5e1', fontSize: 14, textAlign: 'center' },
55
+ counterCard: {
56
+ alignItems: 'center',
57
+ gap: 4,
58
+ paddingVertical: 20,
59
+ paddingHorizontal: 28,
60
+ borderRadius: 16,
61
+ backgroundColor: '#13243a',
62
+ },
63
+ counterLabel: { color: '#41506a', fontSize: 12, letterSpacing: 1 },
64
+ counterValue: { color: '#42b883', fontSize: 32, fontWeight: 'bold' },
65
+ buttonPrimary: {
66
+ alignItems: 'center',
67
+ justifyContent: 'center',
68
+ borderRadius: 12,
69
+ paddingVertical: 14,
70
+ paddingHorizontal: 22,
71
+ backgroundColor: '#42b883',
72
+ },
73
+ buttonPrimaryText: { color: '#0b1622', fontSize: 15, fontWeight: 'bold' },
20
74
  });
@@ -5,16 +5,70 @@ export default {
5
5
  setup() {
6
6
  const count = ref(0);
7
7
  return () => (
8
- <view style={styles.container}>
9
- <text>Welcome to SymbioteNative!</text>
10
- <pressable onPress={() => count.value++}>
11
- <text>Taps: {count.value}</text>
8
+ <safe-area-view style={styles.screen}>
9
+ <view style={styles.brandRow}>
10
+ <image
11
+ style={[styles.brandLogo, styles.brandLogoReact]}
12
+ resizeMode="contain"
13
+ source={require('./assets/react-native-logo.png')}
14
+ />
15
+ <image style={styles.plusIcon} resizeMode="contain" source={require('./assets/plus-icon.png')} />
16
+ <image
17
+ style={[styles.brandLogo, styles.brandLogoVue]}
18
+ resizeMode="contain"
19
+ source={require('./assets/vue-logo.png')}
20
+ />
21
+ </view>
22
+ <text style={styles.title}>Welcome to SymbioteNative!</text>
23
+ <text style={styles.subtitle}>Framework-agnostic React Native, driven by Vue.</text>
24
+
25
+ <view style={styles.counterCard}>
26
+ <text style={styles.counterLabel}>TAPS</text>
27
+ <text style={styles.counterValue}>{count.value}</text>
28
+ </view>
29
+
30
+ <pressable style={styles.buttonPrimary} onPress={() => count.value++}>
31
+ <text style={styles.buttonPrimaryText}>Tap me</text>
12
32
  </pressable>
13
- </view>
33
+ </safe-area-view>
14
34
  );
15
35
  },
16
36
  };
17
37
 
18
38
  const styles = StyleSheet.create({
19
- container: { flex: 1, alignItems: 'center', justifyContent: 'center' },
39
+ screen: {
40
+ flex: 1,
41
+ backgroundColor: '#0b1622',
42
+ alignItems: 'center',
43
+ justifyContent: 'center',
44
+ gap: 24,
45
+ paddingVertical: 24,
46
+ paddingHorizontal: 32,
47
+ },
48
+ brandRow: { flexDirection: 'row', alignItems: 'center', gap: 28 },
49
+ brandLogo: { height: 64 },
50
+ brandLogoReact: { width: 70 },
51
+ brandLogoVue: { width: 74 },
52
+ plusIcon: { width: 48, height: 48 },
53
+ title: { color: '#ffffff', fontSize: 22, fontWeight: 'bold', textAlign: 'center' },
54
+ subtitle: { color: '#cbd5e1', fontSize: 14, textAlign: 'center' },
55
+ counterCard: {
56
+ alignItems: 'center',
57
+ gap: 4,
58
+ paddingVertical: 20,
59
+ paddingHorizontal: 28,
60
+ borderRadius: 16,
61
+ backgroundColor: '#13243a',
62
+ },
63
+ counterLabel: { color: '#41506a', fontSize: 12, letterSpacing: 1 },
64
+ counterValue: { color: '#42b883', fontSize: 32, fontWeight: 'bold' },
65
+ buttonPrimary: {
66
+ alignItems: 'center',
67
+ justifyContent: 'center',
68
+ borderRadius: 12,
69
+ paddingVertical: 14,
70
+ paddingHorizontal: 22,
71
+ backgroundColor: '#42b883',
72
+ },
73
+ buttonPrimaryText: { color: '#0b1622', fontSize: 15, fontWeight: 'bold' },
20
74
  });
@@ -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-angular {
25
+ width: 61px;
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: #dd0031;
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: #dd0031;
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,5 +1,6 @@
1
1
  import { Component } from '@angular/core';
2
2
  import { SYMBIOTE_ELEMENTS } from '@symbiote-native/angular';
3
+ import { injectStackNavigation } from '@symbiote-native/navigation/angular';
3
4
  import stylesModule from './App.module.css';
4
5
 
5
6
  @Component({
@@ -7,11 +8,18 @@ import stylesModule from './App.module.css';
7
8
  standalone: true,
8
9
  imports: [SYMBIOTE_ELEMENTS],
9
10
  template: `
10
- <view [class]="containerClass">
11
- <text>Details screen</text>
12
- </view>
11
+ <safe-area-view [class]="stylesModule['screen']">
12
+ <view [class]="stylesModule['details-card']">
13
+ <text [class]="stylesModule['details-title']">You made it!</text>
14
+ <text [class]="stylesModule['details-body']">This screen was pushed by the Stack navigator — proof navigation actually works.</text>
15
+ </view>
16
+ <pressable [class]="stylesModule['button-secondary']" (press)="navigation.pop()">
17
+ <text [class]="stylesModule['button-secondary-text']">Go back</text>
18
+ </pressable>
19
+ </safe-area-view>
13
20
  `,
14
21
  })
15
22
  export class DetailsScreen {
16
- readonly containerClass = stylesModule.container;
23
+ readonly stylesModule = stylesModule;
24
+ readonly navigation = injectStackNavigation();
17
25
  }
@@ -1,4 +1,4 @@
1
- import { Component } from '@angular/core';
1
+ import { Component, signal } from '@angular/core';
2
2
  import { SYMBIOTE_ELEMENTS } from '@symbiote-native/angular';
3
3
  import { injectStackNavigation } from '@symbiote-native/navigation/angular';
4
4
  import stylesModule from './App.module.css';
@@ -8,15 +8,45 @@ import stylesModule from './App.module.css';
8
8
  standalone: true,
9
9
  imports: [SYMBIOTE_ELEMENTS],
10
10
  template: `
11
- <view [class]="containerClass">
12
- <text>Welcome to SymbioteNative!</text>
13
- <pressable (press)="navigation.push('Details')">
14
- <text>Go to Details</text>
15
- </pressable>
16
- </view>
11
+ <safe-area-view [class]="stylesModule['screen']">
12
+ <view [class]="stylesModule['brand-row']">
13
+ <image
14
+ [class]="stylesModule['brand-logo'] + ' ' + stylesModule['brand-logo-react']"
15
+ resizeMode="contain"
16
+ [source]="reactNativeLogo"
17
+ ></image>
18
+ <image [class]="stylesModule['plus-icon']" resizeMode="contain" [source]="plusIcon"></image>
19
+ <image
20
+ [class]="stylesModule['brand-logo'] + ' ' + stylesModule['brand-logo-angular']"
21
+ resizeMode="contain"
22
+ [source]="angularLogo"
23
+ ></image>
24
+ </view>
25
+
26
+ <text [class]="stylesModule['title']">Welcome to SymbioteNative!</text>
27
+ <text [class]="stylesModule['subtitle']">Framework-agnostic React Native, driven by Angular.</text>
28
+
29
+ <view [class]="stylesModule['counter-card']">
30
+ <text [class]="stylesModule['counter-label']">TAPS</text>
31
+ <text [class]="stylesModule['counter-value']">{{ count() }}</text>
32
+ </view>
33
+
34
+ <view [class]="stylesModule['button-row']">
35
+ <pressable [class]="stylesModule['button-primary']" (press)="count.update(v => v + 1)">
36
+ <text [class]="stylesModule['button-primary-text']">Tap me</text>
37
+ </pressable>
38
+ <pressable [class]="stylesModule['button-secondary']" (press)="navigation.push('Details')">
39
+ <text [class]="stylesModule['button-secondary-text']">Go to Details</text>
40
+ </pressable>
41
+ </view>
42
+ </safe-area-view>
17
43
  `,
18
44
  })
19
45
  export class MenuScreen {
20
- readonly containerClass = stylesModule.container;
46
+ readonly stylesModule = stylesModule;
21
47
  readonly navigation = injectStackNavigation();
48
+ readonly count = signal(0);
49
+ readonly reactNativeLogo = require('./assets/react-native-logo.png');
50
+ readonly plusIcon = require('./assets/plus-icon.png');
51
+ readonly angularLogo = require('./assets/angular-logo.png');
22
52
  }
@@ -1,18 +1,53 @@
1
1
  import { Component } from '@angular/core';
2
2
  import { SYMBIOTE_ELEMENTS, StyleSheet } from '@symbiote-native/angular';
3
+ import { injectStackNavigation } from '@symbiote-native/navigation/angular';
3
4
 
4
5
  @Component({
5
6
  selector: 'DetailsScreen',
6
7
  standalone: true,
7
8
  imports: [SYMBIOTE_ELEMENTS],
8
9
  template: `
9
- <view [style]="styles.container">
10
- <text>Details screen</text>
11
- </view>
10
+ <safe-area-view [style]="styles.screen">
11
+ <view [style]="styles.detailsCard">
12
+ <text [style]="styles.detailsTitle">You made it!</text>
13
+ <text [style]="styles.detailsBody">This screen was pushed by the Stack navigator — proof navigation actually works.</text>
14
+ </view>
15
+ <pressable [style]="styles.buttonSecondary" (press)="navigation.pop()">
16
+ <text [style]="styles.buttonSecondaryText">Go back</text>
17
+ </pressable>
18
+ </safe-area-view>
12
19
  `,
13
20
  })
14
21
  export class DetailsScreen {
15
22
  readonly styles = StyleSheet.create({
16
- container: { flex: 1, alignItems: 'center', justifyContent: 'center' },
23
+ screen: {
24
+ flex: 1,
25
+ backgroundColor: '#0b1622',
26
+ alignItems: 'center',
27
+ justifyContent: 'center',
28
+ gap: 24,
29
+ paddingVertical: 24,
30
+ paddingHorizontal: 32,
31
+ },
32
+ detailsCard: {
33
+ alignItems: 'center',
34
+ gap: 10,
35
+ padding: 24,
36
+ borderRadius: 16,
37
+ backgroundColor: '#13243a',
38
+ },
39
+ detailsTitle: { color: '#ffffff', fontSize: 18, fontWeight: 'bold' },
40
+ detailsBody: { color: '#cbd5e1', fontSize: 14, textAlign: 'center' },
41
+ buttonSecondary: {
42
+ alignItems: 'center',
43
+ justifyContent: 'center',
44
+ borderRadius: 12,
45
+ paddingVertical: 14,
46
+ paddingHorizontal: 22,
47
+ borderWidth: 1.5,
48
+ borderColor: '#41506a',
49
+ },
50
+ buttonSecondaryText: { color: '#ffffff', fontSize: 15, fontWeight: 'bold' },
17
51
  });
52
+ readonly navigation = injectStackNavigation();
18
53
  }
@@ -1,4 +1,4 @@
1
- import { Component } from '@angular/core';
1
+ import { Component, signal } from '@angular/core';
2
2
  import { SYMBIOTE_ELEMENTS, StyleSheet } from '@symbiote-native/angular';
3
3
  import { injectStackNavigation } from '@symbiote-native/navigation/angular';
4
4
 
@@ -7,17 +7,84 @@ import { injectStackNavigation } from '@symbiote-native/navigation/angular';
7
7
  standalone: true,
8
8
  imports: [SYMBIOTE_ELEMENTS],
9
9
  template: `
10
- <view [style]="styles.container">
11
- <text>Welcome to SymbioteNative!</text>
12
- <pressable (press)="navigation.push('Details')">
13
- <text>Go to Details</text>
14
- </pressable>
15
- </view>
10
+ <safe-area-view [style]="styles.screen">
11
+ <view [style]="styles.brandRow">
12
+ <image [style]="[styles.brandLogo, styles.brandLogoReact]" resizeMode="contain" [source]="reactNativeLogo"></image>
13
+ <image [style]="styles.plusIcon" resizeMode="contain" [source]="plusIcon"></image>
14
+ <image [style]="[styles.brandLogo, styles.brandLogoAngular]" resizeMode="contain" [source]="angularLogo"></image>
15
+ </view>
16
+
17
+ <text [style]="styles.title">Welcome to SymbioteNative!</text>
18
+ <text [style]="styles.subtitle">Framework-agnostic React Native, driven by Angular.</text>
19
+
20
+ <view [style]="styles.counterCard">
21
+ <text [style]="styles.counterLabel">TAPS</text>
22
+ <text [style]="styles.counterValue">{{ count() }}</text>
23
+ </view>
24
+
25
+ <view [style]="styles.buttonRow">
26
+ <pressable [style]="styles.buttonPrimary" (press)="count.update(v => v + 1)">
27
+ <text [style]="styles.buttonPrimaryText">Tap me</text>
28
+ </pressable>
29
+ <pressable [style]="styles.buttonSecondary" (press)="navigation.push('Details')">
30
+ <text [style]="styles.buttonSecondaryText">Go to Details</text>
31
+ </pressable>
32
+ </view>
33
+ </safe-area-view>
16
34
  `,
17
35
  })
18
36
  export class MenuScreen {
19
37
  readonly styles = StyleSheet.create({
20
- container: { flex: 1, alignItems: 'center', justifyContent: 'center' },
38
+ screen: {
39
+ flex: 1,
40
+ backgroundColor: '#0b1622',
41
+ alignItems: 'center',
42
+ justifyContent: 'center',
43
+ gap: 24,
44
+ paddingVertical: 24,
45
+ paddingHorizontal: 32,
46
+ },
47
+ brandRow: { flexDirection: 'row', alignItems: 'center', gap: 28 },
48
+ brandLogo: { height: 64 },
49
+ brandLogoReact: { width: 70 },
50
+ brandLogoAngular: { width: 61 },
51
+ plusIcon: { width: 48, height: 48 },
52
+ title: { color: '#ffffff', fontSize: 22, fontWeight: 'bold', textAlign: 'center' },
53
+ subtitle: { color: '#cbd5e1', fontSize: 14, textAlign: 'center' },
54
+ counterCard: {
55
+ alignItems: 'center',
56
+ gap: 4,
57
+ paddingVertical: 20,
58
+ paddingHorizontal: 28,
59
+ borderRadius: 16,
60
+ backgroundColor: '#13243a',
61
+ },
62
+ counterLabel: { color: '#41506a', fontSize: 12, letterSpacing: 1 },
63
+ counterValue: { color: '#dd0031', fontSize: 32, fontWeight: 'bold' },
64
+ buttonRow: { flexDirection: 'row', gap: 12 },
65
+ buttonPrimary: {
66
+ alignItems: 'center',
67
+ justifyContent: 'center',
68
+ borderRadius: 12,
69
+ paddingVertical: 14,
70
+ paddingHorizontal: 22,
71
+ backgroundColor: '#dd0031',
72
+ },
73
+ buttonSecondary: {
74
+ alignItems: 'center',
75
+ justifyContent: 'center',
76
+ borderRadius: 12,
77
+ paddingVertical: 14,
78
+ paddingHorizontal: 22,
79
+ borderWidth: 1.5,
80
+ borderColor: '#41506a',
81
+ },
82
+ buttonPrimaryText: { color: '#ffffff', fontSize: 15, fontWeight: 'bold' },
83
+ buttonSecondaryText: { color: '#ffffff', fontSize: 15, fontWeight: 'bold' },
21
84
  });
22
85
  readonly navigation = injectStackNavigation();
86
+ readonly count = signal(0);
87
+ readonly reactNativeLogo = require('./assets/react-native-logo.png');
88
+ readonly plusIcon = require('./assets/plus-icon.png');
89
+ readonly angularLogo = require('./assets/angular-logo.png');
23
90
  }
@@ -1,32 +1,77 @@
1
1
  import { Stack, useStackNavigation } from '@symbiote-native/navigation/react';
2
+ import { useState } from 'react';
2
3
  import styles from './App.module.css';
3
4
 
4
5
  function MenuScreen() {
5
6
  const navigation = useStackNavigation();
7
+ const [count, setCount] = useState(0);
6
8
 
7
9
  return (
8
- <view className={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 className={styles['screen']}>
11
+ <image
12
+ className={styles['brand-logo']}
13
+ resizeMode="contain"
14
+ source={require('./assets/react-native-logo.png')}
15
+ />
16
+ <text className={styles['title']}>Welcome to SymbioteNative!</text>
17
+ <text className={styles['subtitle']}>Framework-agnostic React Native, driven by React.</text>
18
+
19
+ <view className={styles['counter-card']}>
20
+ <text className={styles['counter-label']}>TAPS</text>
21
+ <text className={styles['counter-value']}>{count}</text>
22
+ </view>
23
+
24
+ <view className={styles['button-row']}>
25
+ <pressable className={styles['button-primary']} onPress={() => setCount(count + 1)}>
26
+ <text className={styles['button-primary-text']}>Tap me</text>
27
+ </pressable>
28
+ <pressable className={styles['button-secondary']} onPress={() => navigation.push('Details')}>
29
+ <text className={styles['button-secondary-text']}>Go to Details</text>
30
+ </pressable>
31
+ </view>
32
+ </safe-area-view>
14
33
  );
15
34
  }
16
35
 
17
36
  function DetailsScreen() {
37
+ const navigation = useStackNavigation();
38
+
18
39
  return (
19
- <view className={styles.container}>
20
- <text>Details screen</text>
21
- </view>
40
+ <safe-area-view className={styles['screen']}>
41
+ <view className={styles['details-card']}>
42
+ <text className={styles['details-title']}>You made it!</text>
43
+ <text className={styles['details-body']}>
44
+ This screen was pushed by the Stack navigator — proof navigation actually works.
45
+ </text>
46
+ </view>
47
+ <pressable className={styles['button-secondary']} onPress={() => navigation.pop()}>
48
+ <text className={styles['button-secondary-text']}>Go back</text>
49
+ </pressable>
50
+ </safe-area-view>
22
51
  );
23
52
  }
24
53
 
54
+ const SCREEN_OPTIONS = {
55
+ headerTranslucent: true,
56
+ headerTintColor: '#ffffff',
57
+ headerTitleColor: '#ffffff',
58
+ headerStyle: { backgroundColor: '#0b1622' },
59
+ headerUserInterfaceStyle: 'dark',
60
+ };
61
+
25
62
  export default function App() {
26
63
  return (
27
64
  <Stack initialRouteName="Menu">
28
- <Stack.Screen name="Menu" component={MenuScreen} options={{ title: 'Home' }} />
29
- <Stack.Screen name="Details" component={DetailsScreen} options={{ title: 'Details' }} />
65
+ <Stack.Screen
66
+ name="Menu"
67
+ component={MenuScreen}
68
+ options={{ title: 'Home', ...SCREEN_OPTIONS }}
69
+ />
70
+ <Stack.Screen
71
+ name="Details"
72
+ component={DetailsScreen}
73
+ options={{ title: 'Details', ...SCREEN_OPTIONS }}
74
+ />
30
75
  </Stack>
31
76
  );
32
77
  }