🚀 Launch v1.0 pre-alpha testing
@ -38,4 +38,9 @@
|
|||||||
<!-- Permissions -->
|
<!-- Permissions -->
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="32" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="29" />
|
||||||
</manifest>
|
</manifest>
|
||||||
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 3.4 KiB |
BIN
android/app/src/main/res/mipmap-ldpi/ic_launcher.png
Normal file
After Width: | Height: | Size: 845 B |
BIN
android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 9.7 KiB |
@ -7,7 +7,7 @@ buildscript {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:8.0.0'
|
classpath 'com.android.tools.build:gradle:8.3.1'
|
||||||
classpath 'com.google.gms:google-services:4.3.15'
|
classpath 'com.google.gms:google-services:4.3.15'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@ -6,8 +6,6 @@ const config: CapacitorConfig = {
|
|||||||
webDir: "dist",
|
webDir: "dist",
|
||||||
server: {
|
server: {
|
||||||
androidScheme: "https",
|
androidScheme: "https",
|
||||||
url: "http://localhost:5173",
|
|
||||||
cleartext: true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,8 +122,8 @@
|
|||||||
504EC2FC1FED79650016851F /* Project object */ = {
|
504EC2FC1FED79650016851F /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastSwiftUpdateCheck = 0920;
|
LastSwiftUpdateCheck = 920;
|
||||||
LastUpgradeCheck = 0920;
|
LastUpgradeCheck = 920;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
504EC3031FED79650016851F = {
|
504EC3031FED79650016851F = {
|
||||||
CreatedOnToolsVersion = 9.2;
|
CreatedOnToolsVersion = 9.2;
|
||||||
@ -347,6 +347,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = Solian;
|
INFOPLIST_KEY_CFBundleDisplayName = Solian;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
@ -368,6 +369,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = Solian;
|
INFOPLIST_KEY_CFBundleDisplayName = Solian;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 48 KiB |
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"filename" : "AppIcon-512@2x.png",
|
|
||||||
"idiom": "universal",
|
"idiom": "universal",
|
||||||
"platform" : "ios",
|
"size": "1024x1024",
|
||||||
"size" : "1024x1024"
|
"filename": "AppIcon-512@2x.png",
|
||||||
|
"platform": "ios"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": {
|
"info": {
|
||||||
|
@ -2,18 +2,51 @@
|
|||||||
"images": [
|
"images": [
|
||||||
{
|
{
|
||||||
"idiom": "universal",
|
"idiom": "universal",
|
||||||
"filename" : "splash-2732x2732-2.png",
|
"filename": "Default@1x~universal~anyany.png",
|
||||||
"scale": "1x"
|
"scale": "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom": "universal",
|
"idiom": "universal",
|
||||||
"filename" : "splash-2732x2732-1.png",
|
"filename": "Default@2x~universal~anyany.png",
|
||||||
"scale": "2x"
|
"scale": "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom": "universal",
|
"idiom": "universal",
|
||||||
"filename" : "splash-2732x2732.png",
|
"filename": "Default@3x~universal~anyany.png",
|
||||||
"scale": "3x"
|
"scale": "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances": [
|
||||||
|
{
|
||||||
|
"appearance": "luminosity",
|
||||||
|
"value": "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"idiom": "universal",
|
||||||
|
"scale": "1x",
|
||||||
|
"filename": "Default@1x~universal~anyany-dark.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances": [
|
||||||
|
{
|
||||||
|
"appearance": "luminosity",
|
||||||
|
"value": "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"idiom": "universal",
|
||||||
|
"scale": "2x",
|
||||||
|
"filename": "Default@2x~universal~anyany-dark.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances": [
|
||||||
|
{
|
||||||
|
"appearance": "luminosity",
|
||||||
|
"value": "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"idiom": "universal",
|
||||||
|
"scale": "3x",
|
||||||
|
"filename": "Default@3x~universal~anyany-dark.png"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info": {
|
"info": {
|
||||||
|
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany-dark.png
vendored
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany.png
vendored
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany-dark.png
vendored
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany.png
vendored
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany-dark.png
vendored
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany.png
vendored
Normal file
After Width: | Height: | Size: 50 KiB |
@ -43,7 +43,15 @@
|
|||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
</array>
|
</array>
|
||||||
|
<key>LSApplicationCategoryType</key>
|
||||||
|
<string></string>
|
||||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||||
<false/>
|
<false/>
|
||||||
|
<key>NSPhotoLibraryAddUsageDescription</key>
|
||||||
|
<string>Allow Solian full access your photo library so that you can share photos more easily.</string>
|
||||||
|
<key>NSPhotoLibraryUsageDescription</key>
|
||||||
|
<string>Allow Solian access your photo library so that you can share photos.</string>
|
||||||
|
<key>NSCameraUsageDescription</key>
|
||||||
|
<string>Allow Solian use your camera so that you can take photo for your post.</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
"vuetify": "^3.5.12"
|
"vuetify": "^3.5.12"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@capacitor/assets": "^3.0.4",
|
||||||
"@capacitor/cli": "^5.7.4",
|
"@capacitor/cli": "^5.7.4",
|
||||||
"@rushstack/eslint-patch": "^1.3.3",
|
"@rushstack/eslint-patch": "^1.3.3",
|
||||||
"@tsconfig/node20": "^20.1.2",
|
"@tsconfig/node20": "^20.1.2",
|
||||||
|
46
public/manifest.webmanifest
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "../icons/icon-48.webp",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "48x48",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "../icons/icon-72.webp",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "72x72",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "../icons/icon-96.webp",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "96x96",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "../icons/icon-128.webp",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "128x128",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "../icons/icon-192.webp",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "../icons/icon-256.webp",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "256x256",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "../icons/icon-512.webp",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"purpose": "any maskable"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
BIN
resources/icon-background.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
resources/icon-foreground.png
Executable file
After Width: | Height: | Size: 70 KiB |
BIN
resources/icon-only.png
Executable file
After Width: | Height: | Size: 70 KiB |
BIN
resources/splash-dark.png
Normal file
After Width: | Height: | Size: 112 KiB |
BIN
resources/splash.png
Normal file
After Width: | Height: | Size: 134 KiB |
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<v-app>
|
<v-app>
|
||||||
<v-system-bar v-if="safeAreaHeight > 0" color="primary" :order="1" :height="safeAreaHeight" />
|
<v-system-bar v-show="ui.safeArea.top > 0" color="primary" :order="1" :height="ui.safeArea.top" />
|
||||||
|
|
||||||
<router-view />
|
<router-view />
|
||||||
</v-app>
|
</v-app>
|
||||||
@ -8,13 +8,22 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onMounted, ref } from "vue"
|
import { onMounted, ref } from "vue"
|
||||||
|
import { Capacitor } from "@capacitor/core"
|
||||||
|
import { useUI } from "@/stores/ui"
|
||||||
|
|
||||||
const safeAreaHeight = ref(0)
|
const ui = useUI()
|
||||||
|
|
||||||
function updateSafeArea() {
|
function updateSafeArea() {
|
||||||
const property = getComputedStyle(document.documentElement).getPropertyValue("--safe-area-top")
|
const topProperty = getComputedStyle(document.documentElement).getPropertyValue("--safe-area-top")
|
||||||
safeAreaHeight.value = parseInt(property.replace("px", ""))
|
ui.safeArea.top = parseInt(topProperty.replace("px", ""))
|
||||||
|
const bottomProperty = getComputedStyle(document.documentElement).getPropertyValue("--safe-area-top")
|
||||||
|
ui.safeArea.bottom = parseInt(bottomProperty.replace("px", ""))
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => updateSafeArea())
|
onMounted(() => {
|
||||||
|
updateSafeArea()
|
||||||
|
for (let idx = 1; idx <= 10; idx++) {
|
||||||
|
setTimeout(() => updateSafeArea(), 250 * idx)
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<v-navigation-drawer v-model="drawerOpen" color="grey-lighten-5" width="320" :order="0" floating>
|
<v-navigation-drawer v-model="drawerOpen" color="grey-lighten-5" width="320" :order="0" floating>
|
||||||
<div class="flex flex-col h-full">
|
<div class="flex flex-col h-full">
|
||||||
<div
|
<div class="flex items-center px-3 pb-2.5 border-opacity-15" style="border-bottom-width: thin"
|
||||||
class="flex items-center px-3 pb-2.5 border-opacity-15"
|
:style="`padding-top: max(${safeAreaTop}, 16px)`">
|
||||||
style="border-bottom-width: thin"
|
|
||||||
:style="`padding-top: max(${safeAreaTop}, 16px)`"
|
|
||||||
>
|
|
||||||
<img src="/favicon.png" width="36" height="36" class="block" />
|
<img src="/favicon.png" width="36" height="36" class="block" />
|
||||||
<div class="ms-6 font-medium">Solar Network</div>
|
<div class="ms-6 font-medium">Solar Network</div>
|
||||||
</div>
|
</div>
|
||||||
@ -15,14 +12,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- User info -->
|
<!-- User info -->
|
||||||
<v-list
|
<v-list class="border-opacity-15 h-[64px]" style="border-top-width: thin"
|
||||||
class="border-opacity-15 h-[64px]"
|
:style="`margin-bottom: ${safeAreaBottom}`">
|
||||||
style="border-top-width: thin"
|
|
||||||
:style="`margin-bottom: ${safeAreaBottom}`"
|
|
||||||
>
|
|
||||||
<v-list-item :subtitle="username" :title="nickname">
|
<v-list-item :subtitle="username" :title="nickname">
|
||||||
<template #prepend>
|
<template #prepend>
|
||||||
<v-avatar icon="mdi-account-circle" :image="id.userinfo.data?.avatar" />
|
<v-avatar icon="mdi-account-circle" :image="id.userinfo.data?.picture" />
|
||||||
</template>
|
</template>
|
||||||
<template #append>
|
<template #append>
|
||||||
<v-menu v-if="id.userinfo.isLoggedIn">
|
<v-menu v-if="id.userinfo.isLoggedIn">
|
||||||
@ -31,12 +25,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<v-list density="compact">
|
<v-list density="compact">
|
||||||
<v-list-item
|
<v-list-item title="Solarpass" prepend-icon="mdi-passport-biometric" target="_blank"
|
||||||
title="Solarpass"
|
:href="passportUrl" />
|
||||||
prepend-icon="mdi-passport-biometric"
|
|
||||||
target="_blank"
|
|
||||||
:href="passportUrl"
|
|
||||||
/>
|
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-menu>
|
</v-menu>
|
||||||
|
|
||||||
@ -67,24 +57,11 @@
|
|||||||
<router-view />
|
<router-view />
|
||||||
</v-main>
|
</v-main>
|
||||||
|
|
||||||
<v-menu
|
<v-menu open-on-hover open-on-click :open-delay="0" :close-delay="0" location="top"
|
||||||
open-on-hover
|
transition="scroll-y-reverse-transition">
|
||||||
open-on-click
|
|
||||||
:open-delay="0"
|
|
||||||
:close-delay="0"
|
|
||||||
location="top"
|
|
||||||
transition="scroll-y-reverse-transition"
|
|
||||||
>
|
|
||||||
<template v-slot:activator="{ props }">
|
<template v-slot:activator="{ props }">
|
||||||
<v-fab
|
<v-fab v-bind="props" appear class="editor-fab" icon="mdi-pencil" color="primary" size="64"
|
||||||
v-bind="props"
|
:active="id.userinfo.isLoggedIn" />
|
||||||
appear
|
|
||||||
class="editor-fab"
|
|
||||||
icon="mdi-pencil"
|
|
||||||
color="primary"
|
|
||||||
size="64"
|
|
||||||
:active="id.userinfo.isLoggedIn"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<div class="flex flex-col items-center gap-4 mb-4">
|
<div class="flex flex-col items-center gap-4 mb-4">
|
||||||
@ -102,17 +79,20 @@ import { computed, ref } from "vue"
|
|||||||
import { useEditor } from "@/stores/editor"
|
import { useEditor } from "@/stores/editor"
|
||||||
import { useUserinfo } from "@/stores/userinfo"
|
import { useUserinfo } from "@/stores/userinfo"
|
||||||
import { useWellKnown } from "@/stores/wellKnown"
|
import { useWellKnown } from "@/stores/wellKnown"
|
||||||
|
import { useUI } from "@/stores/ui"
|
||||||
import PostTools from "@/components/publish/PostTools.vue"
|
import PostTools from "@/components/publish/PostTools.vue"
|
||||||
import RealmTools from "@/components/realms/RealmTools.vue"
|
import RealmTools from "@/components/realms/RealmTools.vue"
|
||||||
import RealmList from "@/components/realms/RealmList.vue"
|
import RealmList from "@/components/realms/RealmList.vue"
|
||||||
import NotificationList from "@/components/NotificationList.vue"
|
import NotificationList from "@/components/NotificationList.vue"
|
||||||
|
|
||||||
|
const ui = useUI()
|
||||||
|
|
||||||
const safeAreaTop = computed(() => {
|
const safeAreaTop = computed(() => {
|
||||||
return getComputedStyle(document.documentElement).getPropertyValue("--safe-area-top")
|
return `${ui.safeArea.top}px`
|
||||||
})
|
})
|
||||||
|
|
||||||
const safeAreaBottom = computed(() => {
|
const safeAreaBottom = computed(() => {
|
||||||
return getComputedStyle(document.documentElement).getPropertyValue("--safe-area-bottom")
|
return `${ui.safeArea.bottom}px`
|
||||||
})
|
})
|
||||||
|
|
||||||
const id = useUserinfo()
|
const id = useUserinfo()
|
||||||
|
11
src/stores/ui.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { defineStore } from "pinia"
|
||||||
|
import { reactive } from "vue"
|
||||||
|
|
||||||
|
export const useUI = defineStore("ui", () => {
|
||||||
|
const safeArea = reactive({
|
||||||
|
top: 0,
|
||||||
|
bottom: 0,
|
||||||
|
})
|
||||||
|
|
||||||
|
return { safeArea }
|
||||||
|
})
|