@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.
- package/bundle.js +4 -33
- package/package.json +1 -1
- package/templates/js/angular/index.js +2 -0
- package/templates/js/angular/src/App.css +2 -4
- package/templates/js/react/App.css +1 -1
- package/templates/js/react/index.js +2 -0
- package/templates/js/solid/App.css +2 -4
- package/templates/js/solid/index.js +2 -0
- package/templates/js/svelte/App.svelte +2 -2
- package/templates/js/svelte/App.typescript.svelte +2 -2
- package/templates/js/svelte/index.js +2 -0
- package/templates/js/vue-sfc/App.typescript.vue +2 -2
- package/templates/js/vue-sfc/App.vue +2 -2
- package/templates/js/vue-sfc/index.js +2 -0
- package/templates/js/vue-tsx/App.css +2 -4
- package/templates/js/vue-tsx/index.js +2 -0
- package/templates/layers/navigation/app/angular/src/App.css +2 -4
- package/templates/layers/navigation/app/react/App.css +1 -1
- package/templates/layers/navigation/app/solid/App.css +2 -4
- package/templates/layers/navigation/app/svelte/App.css +2 -4
- package/templates/layers/navigation/app/vue-sfc/App.css +2 -4
- package/templates/layers/navigation/app/vue-tsx/App.css +2 -4
- package/templates/styling/js/angular/css-modules/src/App.module.css +78 -0
- package/templates/styling/js/angular/css-modules/src/App.ts +30 -6
- package/templates/styling/js/angular/stylesheet/src/App.ts +56 -6
- package/templates/styling/js/react/css-modules/App.jsx +17 -5
- package/templates/styling/js/react/css-modules/App.module.css +60 -0
- package/templates/styling/js/react/css-modules/App.tsx +17 -5
- package/templates/styling/js/react/stylesheet/App.jsx +48 -6
- package/templates/styling/js/react/stylesheet/App.tsx +48 -6
- package/templates/styling/js/solid/css-modules/App.jsx +29 -5
- package/templates/styling/js/solid/css-modules/App.module.css +78 -0
- package/templates/styling/js/solid/css-modules/App.tsx +29 -5
- package/templates/styling/js/solid/stylesheet/App.jsx +60 -6
- package/templates/styling/js/solid/stylesheet/App.tsx +60 -6
- package/templates/styling/js/svelte/css-modules/App.module.css +78 -0
- package/templates/styling/js/svelte/css-modules/App.svelte +27 -5
- package/templates/styling/js/svelte/css-modules/App.typescript.svelte +27 -5
- package/templates/styling/js/svelte/stylesheet/App.svelte +62 -6
- package/templates/styling/js/svelte/stylesheet/App.typescript.svelte +62 -6
- package/templates/styling/js/vue-sfc/css-modules/App.module.css +78 -0
- package/templates/styling/js/vue-sfc/css-modules/App.typescript.vue +29 -5
- package/templates/styling/js/vue-sfc/css-modules/App.vue +29 -5
- package/templates/styling/js/vue-sfc/stylesheet/App.typescript.vue +60 -6
- package/templates/styling/js/vue-sfc/stylesheet/App.vue +60 -6
- package/templates/styling/js/vue-tsx/css-modules/App.jsx +29 -5
- package/templates/styling/js/vue-tsx/css-modules/App.module.css +78 -0
- package/templates/styling/js/vue-tsx/css-modules/App.tsx +29 -5
- package/templates/styling/js/vue-tsx/stylesheet/App.jsx +60 -6
- package/templates/styling/js/vue-tsx/stylesheet/App.tsx +60 -6
- package/templates/styling/navigation/angular/css-modules/src/App.module.css +118 -0
- package/templates/styling/navigation/angular/css-modules/src/DetailsScreen.ts +12 -4
- package/templates/styling/navigation/angular/css-modules/src/MenuScreen.ts +38 -8
- package/templates/styling/navigation/angular/stylesheet/src/DetailsScreen.ts +39 -4
- package/templates/styling/navigation/angular/stylesheet/src/MenuScreen.ts +75 -8
- package/templates/styling/navigation/react/css-modules/App.jsx +56 -11
- package/templates/styling/navigation/react/css-modules/App.module.css +100 -0
- package/templates/styling/navigation/react/css-modules/App.tsx +56 -11
- package/templates/styling/navigation/react/stylesheet/App.jsx +107 -12
- package/templates/styling/navigation/react/stylesheet/App.tsx +107 -12
- package/templates/styling/navigation/solid/css-modules/App.jsx +68 -11
- package/templates/styling/navigation/solid/css-modules/App.module.css +118 -0
- package/templates/styling/navigation/solid/css-modules/App.tsx +68 -11
- package/templates/styling/navigation/solid/stylesheet/App.jsx +119 -12
- package/templates/styling/navigation/solid/stylesheet/App.tsx +119 -12
- package/templates/styling/navigation/svelte/css-modules/App.module.css +118 -0
- package/templates/styling/navigation/svelte/css-modules/DetailsScreen.svelte +14 -3
- package/templates/styling/navigation/svelte/css-modules/DetailsScreen.typescript.svelte +14 -3
- package/templates/styling/navigation/svelte/css-modules/MenuScreen.svelte +34 -6
- package/templates/styling/navigation/svelte/css-modules/MenuScreen.typescript.svelte +34 -6
- package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.svelte +41 -4
- package/templates/styling/navigation/svelte/stylesheet/DetailsScreen.typescript.svelte +41 -4
- package/templates/styling/navigation/svelte/stylesheet/MenuScreen.svelte +80 -7
- package/templates/styling/navigation/svelte/stylesheet/MenuScreen.typescript.svelte +80 -7
- package/templates/styling/navigation/vue-sfc/css-modules/App.module.css +118 -0
- package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.typescript.vue +12 -3
- package/templates/styling/navigation/vue-sfc/css-modules/DetailsScreen.vue +12 -3
- package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.typescript.vue +38 -6
- package/templates/styling/navigation/vue-sfc/css-modules/MenuScreen.vue +38 -6
- package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.typescript.vue +39 -4
- package/templates/styling/navigation/vue-sfc/stylesheet/DetailsScreen.vue +39 -4
- package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.typescript.vue +80 -7
- package/templates/styling/navigation/vue-sfc/stylesheet/MenuScreen.vue +80 -7
- package/templates/styling/navigation/vue-tsx/css-modules/App.jsx +63 -18
- package/templates/styling/navigation/vue-tsx/css-modules/App.module.css +118 -0
- package/templates/styling/navigation/vue-tsx/css-modules/App.tsx +63 -18
- package/templates/styling/navigation/vue-tsx/stylesheet/App.jsx +116 -21
- package/templates/styling/navigation/vue-tsx/stylesheet/App.tsx +116 -21
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/angular/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/solid/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/svelte/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@3x.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55.png +0 -0
- /package/templates/{native/bootsplash-logo → bootsplash-logo}/vue/ios/Canary/Images.xcassets/BootSplashLogo-498e55.imageset/logo-498e55@2x.png +0 -0
- /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.
|
|
9
|
-
<
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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.
|
|
9
|
-
<
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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]="
|
|
11
|
-
<
|
|
12
|
-
|
|
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
|
|
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]="
|
|
12
|
-
<
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
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.
|
|
10
|
-
<
|
|
11
|
-
|
|
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
|
-
|
|
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.
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
|
9
|
-
<
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
20
|
-
<
|
|
21
|
-
|
|
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
|
|
29
|
-
|
|
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
|
}
|