pakstr 0.0.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/android-template/app/build.gradle.kts +59 -0
- package/android-template/app/proguard-rules.pro +21 -0
- package/android-template/app/src/androidTest/java/com/nostrappshell/app/ExampleInstrumentedTest.kt +24 -0
- package/android-template/app/src/main/AndroidManifest.xml +32 -0
- package/android-template/app/src/main/assets/nip07.js +35 -0
- package/android-template/app/src/main/assets/www/assets/hero-CLDdwZDr.png +0 -0
- package/android-template/app/src/main/assets/www/assets/index-CsUDhMuy.css +1 -0
- package/android-template/app/src/main/assets/www/assets/index-D-e3tQW5.js +56 -0
- package/android-template/app/src/main/assets/www/assets/vite-BF8QNONU.svg +1 -0
- package/android-template/app/src/main/assets/www/favicon.svg +1 -0
- package/android-template/app/src/main/assets/www/icons.svg +24 -0
- package/android-template/app/src/main/assets/www/index.html +14 -0
- package/android-template/app/src/main/assets/www/test.html +17 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/ApplicationClass.kt +11 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/Config.kt +7 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/LocalServer.kt +51 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/MainActivity.kt +160 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/ShellRuntime.kt +125 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/WebViewController.kt +139 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/signer/AmberSigner.kt +167 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/signer/BunkerSigner.kt +28 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/signer/FakeSigner.kt +31 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/signer/NostrBridge.kt +97 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/signer/SignerManager.kt +155 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/signer/SignerType.kt +9 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/signer/interfaces/NostrSigner.kt +25 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/ui/theme/Color.kt +11 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/ui/theme/Theme.kt +57 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/ui/theme/Type.kt +34 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/utils/AppPreferences.kt +31 -0
- package/android-template/app/src/main/java/com/nostrappshell/app/utils/SignerPickerBottomSheet.kt +40 -0
- package/android-template/app/src/main/res/drawable/bg_bottom_sheet.xml +7 -0
- package/android-template/app/src/main/res/drawable/custom_loader.xml +25 -0
- package/android-template/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
- package/android-template/app/src/main/res/drawable/ic_launcher_foreground.xml +30 -0
- package/android-template/app/src/main/res/drawable/ic_menu_browser.xml +9 -0
- package/android-template/app/src/main/res/drawable/selector_radio_card.xml +17 -0
- package/android-template/app/src/main/res/drawable/selector_radio_checkmark.xml +5 -0
- package/android-template/app/src/main/res/drawable/selector_radio_tint.xml +5 -0
- package/android-template/app/src/main/res/layout/activity_layout.xml +21 -0
- package/android-template/app/src/main/res/layout/dialog_picker.xml +101 -0
- package/android-template/app/src/main/res/mipmap-anydpi/ic_launcher.xml +6 -0
- package/android-template/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml +6 -0
- package/android-template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- package/android-template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- package/android-template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- package/android-template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- package/android-template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- package/android-template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- package/android-template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- package/android-template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- package/android-template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- package/android-template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- package/android-template/app/src/main/res/values/colors.xml +10 -0
- package/android-template/app/src/main/res/values/dimes.xml +6 -0
- package/android-template/app/src/main/res/values/strings.xml +3 -0
- package/android-template/app/src/main/res/values/themes.xml +13 -0
- package/android-template/app/src/main/res/xml/backup_rules.xml +13 -0
- package/android-template/app/src/main/res/xml/data_extraction_rules.xml +19 -0
- package/android-template/app/src/main/res/xml/network_security_config.xml +7 -0
- package/android-template/app/src/test/java/com/nostrappshell/app/ExampleUnitTest.kt +17 -0
- package/android-template/build.gradle.kts +5 -0
- package/android-template/gradle/gradle-daemon-jvm.properties +12 -0
- package/android-template/gradle/libs.versions.toml +41 -0
- package/android-template/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android-template/gradle/wrapper/gradle-wrapper.properties +9 -0
- package/android-template/gradle.properties +15 -0
- package/android-template/gradlew +251 -0
- package/android-template/gradlew.bat +94 -0
- package/android-template/settings.gradle.kts +27 -0
- package/bin/cli.js +10 -0
- package/bin/cli.ts +5 -0
- package/package.json +49 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
plugins {
|
|
2
|
+
alias(libs.plugins.android.application)
|
|
3
|
+
alias(libs.plugins.kotlin.compose)
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
android {
|
|
7
|
+
namespace = "com.nostrappshell.app"
|
|
8
|
+
compileSdk = 36
|
|
9
|
+
|
|
10
|
+
defaultConfig {
|
|
11
|
+
applicationId = "com.nostrappshell.app"
|
|
12
|
+
minSdk = 28
|
|
13
|
+
targetSdk = 36
|
|
14
|
+
versionCode = 1
|
|
15
|
+
versionName = "1.0"
|
|
16
|
+
|
|
17
|
+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
buildTypes {
|
|
21
|
+
release {
|
|
22
|
+
isMinifyEnabled = false
|
|
23
|
+
proguardFiles(
|
|
24
|
+
getDefaultProguardFile("proguard-android-optimize.txt"),
|
|
25
|
+
"proguard-rules.pro"
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
compileOptions {
|
|
30
|
+
sourceCompatibility = JavaVersion.VERSION_11
|
|
31
|
+
targetCompatibility = JavaVersion.VERSION_11
|
|
32
|
+
}
|
|
33
|
+
buildFeatures {
|
|
34
|
+
compose = true
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
dependencies {
|
|
39
|
+
implementation(libs.androidx.core.ktx)
|
|
40
|
+
implementation(libs.androidx.lifecycle.runtime.ktx)
|
|
41
|
+
implementation(libs.androidx.activity.compose)
|
|
42
|
+
implementation(platform(libs.androidx.compose.bom))
|
|
43
|
+
implementation(libs.androidx.compose.ui)
|
|
44
|
+
implementation(libs.androidx.compose.ui.graphics)
|
|
45
|
+
implementation(libs.androidx.compose.ui.tooling.preview)
|
|
46
|
+
implementation(libs.androidx.compose.material3)
|
|
47
|
+
testImplementation(libs.junit)
|
|
48
|
+
androidTestImplementation(libs.androidx.junit)
|
|
49
|
+
androidTestImplementation(libs.androidx.espresso.core)
|
|
50
|
+
androidTestImplementation(platform(libs.androidx.compose.bom))
|
|
51
|
+
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
|
|
52
|
+
debugImplementation(libs.androidx.compose.ui.tooling)
|
|
53
|
+
debugImplementation(libs.androidx.compose.ui.test.manifest)
|
|
54
|
+
implementation(libs.nanohttpd)
|
|
55
|
+
implementation(libs.androidx.appcompat)
|
|
56
|
+
|
|
57
|
+
implementation(libs.material)
|
|
58
|
+
implementation(libs.androidx.core.splashscreen)
|
|
59
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Add project specific ProGuard rules here.
|
|
2
|
+
# You can control the set of applied configuration files using the
|
|
3
|
+
# proguardFiles setting in build.gradle.
|
|
4
|
+
#
|
|
5
|
+
# For more details, see
|
|
6
|
+
# http://developer.android.com/guide/developing/tools/proguard.html
|
|
7
|
+
|
|
8
|
+
# If your project uses WebView with JS, uncomment the following
|
|
9
|
+
# and specify the fully qualified class name to the JavaScript interface
|
|
10
|
+
# class:
|
|
11
|
+
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
|
12
|
+
# public *;
|
|
13
|
+
#}
|
|
14
|
+
|
|
15
|
+
# Uncomment this to preserve the line number information for
|
|
16
|
+
# debugging stack traces.
|
|
17
|
+
#-keepattributes SourceFile,LineNumberTable
|
|
18
|
+
|
|
19
|
+
# If you keep the line number information, uncomment this to
|
|
20
|
+
# hide the original source file name.
|
|
21
|
+
#-renamesourcefileattribute SourceFile
|
package/android-template/app/src/androidTest/java/com/nostrappshell/app/ExampleInstrumentedTest.kt
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package com.nostrappshell.app
|
|
2
|
+
|
|
3
|
+
import androidx.test.platform.app.InstrumentationRegistry
|
|
4
|
+
import androidx.test.ext.junit.runners.AndroidJUnit4
|
|
5
|
+
|
|
6
|
+
import org.junit.Test
|
|
7
|
+
import org.junit.runner.RunWith
|
|
8
|
+
|
|
9
|
+
import org.junit.Assert.*
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Instrumented test, which will execute on an Android device.
|
|
13
|
+
*
|
|
14
|
+
* See [testing documentation](http://d.android.com/tools/testing).
|
|
15
|
+
*/
|
|
16
|
+
@RunWith(AndroidJUnit4::class)
|
|
17
|
+
class ExampleInstrumentedTest {
|
|
18
|
+
@Test
|
|
19
|
+
fun useAppContext() {
|
|
20
|
+
// Context of the app under test.
|
|
21
|
+
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
|
22
|
+
assertEquals("com.makakrug.nostrappshell", appContext.packageName)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
3
|
+
|
|
4
|
+
<uses-permission android:name="android.permission.INTERNET" />
|
|
5
|
+
|
|
6
|
+
<application
|
|
7
|
+
android:name=".ApplicationClass"
|
|
8
|
+
android:allowBackup="true"
|
|
9
|
+
android:dataExtractionRules="@xml/data_extraction_rules"
|
|
10
|
+
android:fullBackupContent="@xml/backup_rules"
|
|
11
|
+
android:icon="@mipmap/ic_launcher"
|
|
12
|
+
android:label="@string/app_name"
|
|
13
|
+
android:roundIcon="@mipmap/ic_launcher_round"
|
|
14
|
+
android:supportsRtl="true"
|
|
15
|
+
android:networkSecurityConfig="@xml/network_security_config"
|
|
16
|
+
android:usesCleartextTraffic="true">
|
|
17
|
+
|
|
18
|
+
<activity
|
|
19
|
+
android:name=".MainActivity"
|
|
20
|
+
android:exported="true"
|
|
21
|
+
android:theme="@style/Theme.App.Starting">
|
|
22
|
+
|
|
23
|
+
<intent-filter>
|
|
24
|
+
<action android:name="android.intent.action.MAIN" />
|
|
25
|
+
<category android:name="android.intent.category.LAUNCHER" />
|
|
26
|
+
</intent-filter>
|
|
27
|
+
|
|
28
|
+
</activity>
|
|
29
|
+
|
|
30
|
+
</application>
|
|
31
|
+
|
|
32
|
+
</manifest>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
|
|
3
|
+
if (window.nostr) return;
|
|
4
|
+
|
|
5
|
+
const pending = new Map();
|
|
6
|
+
|
|
7
|
+
function callNative(method, payload) {
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
|
|
10
|
+
const id = crypto.randomUUID();
|
|
11
|
+
|
|
12
|
+
pending.set(id, { resolve, reject });
|
|
13
|
+
|
|
14
|
+
window.AndroidBridge.call(
|
|
15
|
+
method,
|
|
16
|
+
id,
|
|
17
|
+
payload ? JSON.stringify(payload) : ""
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
window.__nostrResolve = (id, result) => {
|
|
23
|
+
const p = pending.get(id);
|
|
24
|
+
if (!p) return;
|
|
25
|
+
|
|
26
|
+
pending.delete(id);
|
|
27
|
+
p.resolve(result);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
window.nostr = {
|
|
31
|
+
getPublicKey: () => callNative("getPublicKey"),
|
|
32
|
+
signEvent: (e) => callNative("signEvent", e)
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--text:#6b6375;--text-h:#08060d;--bg:#fff;--border:#e5e4e7;--code-bg:#f4f3ec;--accent:#aa3bff;--accent-bg:#aa3bff1a;--accent-border:#aa3bff80;--social-bg:#f4f3ec80;--shadow:#0000001a 0 10px 15px -3px, #0000000d 0 4px 6px -2px;--sans:system-ui, "Segoe UI", Roboto, sans-serif;--heading:system-ui, "Segoe UI", Roboto, sans-serif;--mono:ui-monospace, Consolas, monospace;font:18px/145% var(--sans);letter-spacing:.18px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;color:var(--text);background:var(--bg);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}@media (width<=1024px){:root{font-size:16px}}@media (prefers-color-scheme:dark){:root{--text:#9ca3af;--text-h:#f3f4f6;--bg:#16171d;--border:#2e303a;--code-bg:#1f2028;--accent:#c084fc;--accent-bg:#c084fc26;--accent-border:#c084fc80;--social-bg:#2f303a80;--shadow:#0006 0 10px 15px -3px, #00000040 0 4px 6px -2px}#social .button-icon{filter:invert()brightness(2)}}body{margin:0}h1,h2{font-family:var(--heading);color:var(--text-h);font-weight:500}h1{letter-spacing:-1.68px;margin:32px 0;font-size:56px}@media (width<=1024px){h1{margin:20px 0;font-size:36px}}h2{letter-spacing:-.24px;margin:0 0 8px;font-size:24px;line-height:118%}@media (width<=1024px){h2{font-size:20px}}p{margin:0}code,.counter{font-family:var(--mono);color:var(--text-h);border-radius:4px;display:inline-flex}code{background:var(--code-bg);padding:4px 8px;font-size:15px;line-height:135%}.counter{color:var(--accent);background:var(--accent-bg);border:2px solid #0000;border-radius:5px;margin-bottom:24px;padding:5px 10px;font-size:16px;transition:border-color .3s}.counter:hover{border-color:var(--accent-border)}.counter:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.hero{position:relative}.hero .base,.hero .framework,.hero .vite{margin:0 auto;inset-inline:0}.hero .base{z-index:0;width:170px;position:relative}.hero .framework,.hero .vite{position:absolute}.hero .framework{z-index:1;height:28px;top:34px;transform:perspective(2000px)rotate(300deg)rotateX(44deg)rotateY(39deg)scale(1.4)}.hero .vite{z-index:0;width:auto;height:26px;top:107px;transform:perspective(2000px)rotate(300deg)rotateX(40deg)rotateY(39deg)scale(.8)}#app{text-align:center;border-inline:1px solid var(--border);box-sizing:border-box;flex-direction:column;width:1126px;max-width:100%;min-height:100svh;margin:0 auto;display:flex}#center{flex-direction:column;flex-grow:1;place-content:center;place-items:center;gap:25px;display:flex}@media (width<=1024px){#center{gap:18px;padding:32px 20px 24px}}#next-steps{border-top:1px solid var(--border);text-align:left;display:flex}#next-steps>div{flex:1 1 0;padding:32px}@media (width<=1024px){#next-steps>div{padding:24px 20px}}#next-steps .icon{width:22px;height:22px;margin-bottom:16px}@media (width<=1024px){#next-steps{text-align:center;flex-direction:column}}#docs{border-right:1px solid var(--border)}@media (width<=1024px){#docs{border-right:none;border-bottom:1px solid var(--border)}}#next-steps ul{gap:8px;margin:32px 0 0;padding:0;list-style:none;display:flex}#next-steps ul .logo{height:18px}#next-steps ul a{color:var(--text-h);background:var(--social-bg);border-radius:6px;align-items:center;gap:8px;padding:6px 12px;font-size:16px;text-decoration:none;transition:box-shadow .3s;display:flex}#next-steps ul a:hover{box-shadow:var(--shadow)}#next-steps ul a .button-icon{width:18px;height:18px}@media (width<=1024px){#next-steps ul{flex-wrap:wrap;justify-content:center;margin-top:20px}#next-steps ul li{flex:calc(50% - 8px)}#next-steps ul a{box-sizing:border-box;justify-content:center;width:100%}}#spacer{border-top:1px solid var(--border);height:88px}@media (width<=1024px){#spacer{height:48px}}.ticks{width:100%;position:relative}.ticks:before,.ticks:after{content:"";border:5px solid #0000;position:absolute;top:-4.5px}.ticks:before{border-left-color:var(--border);left:0}.ticks:after{border-right-color:var(--border);right:0}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20aria-hidden='true'%20width='32'%20height='32'%20viewBox='0%200%20256%20256'%3e%3cpath%20fill='%23007ACC'%20d='M0%20128v128h256V0H0z'/%3e%3cpath%20fill='%23FFF'%20d='m56.612%20128.85l-.081%2010.483h33.32v94.68h23.568v-94.68h33.321v-10.28c0-5.69-.122-10.444-.284-10.566c-.122-.162-20.4-.244-44.983-.203l-44.74.122l-.121%2010.443Zm149.955-10.742c6.501%201.625%2011.459%204.51%2016.01%209.224c2.357%202.52%205.851%207.111%206.136%208.208c.08.325-11.053%207.802-17.798%2011.988c-.244.162-1.22-.894-2.317-2.52c-3.291-4.795-6.745-6.867-12.028-7.233c-7.76-.528-12.759%203.535-12.718%2010.321c0%201.992.284%203.17%201.097%204.795c1.707%203.536%204.876%205.649%2014.832%209.956c18.326%207.883%2026.168%2013.084%2031.045%2020.48c5.445%208.249%206.664%2021.415%202.966%2031.208c-4.063%2010.646-14.14%2017.879-28.323%2020.276c-4.388.772-14.79.65-19.504-.203c-10.28-1.828-20.033-6.908-26.047-13.572c-2.357-2.6-6.949-9.387-6.664-9.874c.122-.163%201.178-.813%202.356-1.504c1.138-.65%205.446-3.129%209.509-5.485l7.355-4.267l1.544%202.276c2.154%203.29%206.867%207.801%209.712%209.305c8.167%204.307%2019.383%203.698%2024.909-1.26c2.357-2.153%203.332-4.388%203.332-7.68c0-2.966-.366-4.266-1.91-6.501c-1.99-2.845-6.054-5.242-17.595-10.24c-13.206-5.69-18.895-9.224-24.096-14.832c-3.007-3.25-5.852-8.452-7.03-12.8c-.975-3.617-1.22-12.678-.447-16.335c2.723-12.76%2012.353-21.659%2026.25-24.3c4.51-.853%2014.994-.528%2019.424.569Z'/%3e%3c/svg%3e`,t=`/assets/vite-BF8QNONU.svg`,n=`/assets/hero-CLDdwZDr.png`;function r(e){let t=0,n=n=>{t=n,e.innerHTML=`Count is ${t}`};e.addEventListener(`click`,()=>n(t+1)),n(0)}console.log(`🔥 NostrAppShell ENTRY LOADED`),document.body.insertAdjacentHTML(`afterbegin`,`
|
|
2
|
+
<div style="
|
|
3
|
+
background:#ff1744;
|
|
4
|
+
color:white;
|
|
5
|
+
padding:12px;
|
|
6
|
+
font-size:18px;
|
|
7
|
+
font-weight:bold;
|
|
8
|
+
text-align:center;
|
|
9
|
+
position:sticky;
|
|
10
|
+
top:0;
|
|
11
|
+
z-index:9999;
|
|
12
|
+
">
|
|
13
|
+
🚀 CLI TEST ACTIVE (WEB UPDATED SUCCESSFULLY)
|
|
14
|
+
</div>
|
|
15
|
+
`),document.querySelector(`#app`).innerHTML=`
|
|
16
|
+
<section id="center">
|
|
17
|
+
<div class="hero">
|
|
18
|
+
<img src="${n}" class="base" width="170" height="179">
|
|
19
|
+
<img src="${e}" class="framework" alt="TypeScript logo"/>
|
|
20
|
+
<img src="${t}" class="vite" alt="Vite logo" />
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div>
|
|
24
|
+
<h1>NostrAppShell Test</h1>
|
|
25
|
+
<p>If you see this banner, CLI → APK pipeline is working.</p>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<button id="counter" type="button" class="counter"></button>
|
|
29
|
+
</section>
|
|
30
|
+
|
|
31
|
+
<div class="ticks"></div>
|
|
32
|
+
|
|
33
|
+
<section id="next-steps">
|
|
34
|
+
<div id="docs">
|
|
35
|
+
<h2>Documentation</h2>
|
|
36
|
+
<p>Build pipeline verification</p>
|
|
37
|
+
<ul>
|
|
38
|
+
<li><a href="https://vite.dev/" target="_blank">Vite</a></li>
|
|
39
|
+
<li><a href="https://www.typescriptlang.org" target="_blank">TypeScript</a></li>
|
|
40
|
+
</ul>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div id="social">
|
|
44
|
+
<h2>Network</h2>
|
|
45
|
+
<ul>
|
|
46
|
+
<li><a href="https://github.com/vitejs/vite" target="_blank">GitHub</a></li>
|
|
47
|
+
<li><a href="https://chat.vite.dev/" target="_blank">Discord</a></li>
|
|
48
|
+
<li><a href="https://x.com/vite_js" target="_blank">X</a></li>
|
|
49
|
+
<li><a href="https://bsky.app/profile/vite.dev" target="_blank">Bluesky</a></li>
|
|
50
|
+
</ul>
|
|
51
|
+
</div>
|
|
52
|
+
</section>
|
|
53
|
+
|
|
54
|
+
<div class="ticks"></div>
|
|
55
|
+
<section id="spacer"></section>
|
|
56
|
+
`,r(document.querySelector(`#counter`));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="77" height="47" fill="none" aria-labelledby="vite-logo-title" viewBox="0 0 77 47"><title id="vite-logo-title">Vite</title><style>.parenthesis{fill:#000}@media (prefers-color-scheme:dark){.parenthesis{fill:#fff}}</style><path fill="#9135ff" d="M40.151 45.71c-.663.844-2.02.374-2.02-.699V34.708a2.26 2.26 0 0 0-2.262-2.262H24.493c-.92 0-1.457-1.04-.92-1.788l7.479-10.471c1.07-1.498 0-3.578-1.842-3.578H15.443c-.92 0-1.456-1.04-.92-1.788l9.696-13.576c.213-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.472c-1.07 1.497 0 3.578 1.842 3.578h11.376c.944 0 1.474 1.087.89 1.83L40.153 45.712z"/><mask id="a" width="48" height="47" x="14" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M40.047 45.71c-.663.843-2.02.374-2.02-.699V34.708a2.26 2.26 0 0 0-2.262-2.262H24.389c-.92 0-1.457-1.04-.92-1.788l7.479-10.472c1.07-1.497 0-3.578-1.842-3.578H15.34c-.92 0-1.456-1.04-.92-1.788l9.696-13.575c.213-.297.556-.474.92-.474H53.93c.92 0 1.456 1.04.92 1.788L47.37 13.03c-1.07 1.498 0 3.578 1.842 3.578h11.376c.944 0 1.474 1.088.89 1.831L40.049 45.712z"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#eee6ff" rx="5.508" ry="14.704" transform="rotate(269.814 20.96 11.29)scale(-1 1)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#eee6ff" rx="10.399" ry="29.851" transform="rotate(89.814 -16.902 -8.275)scale(1 -1)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#8900ff" rx="5.508" ry="30.487" transform="rotate(89.814 -19.197 -7.127)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#8900ff" rx="5.508" ry="30.599" transform="rotate(89.814 -25.928 4.177)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#8900ff" rx="5.508" ry="30.599" transform="rotate(89.814 -25.738 5.52)scale(1 -1)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#eee6ff" rx="14.072" ry="22.078" transform="rotate(93.35 31.245 55.578)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#8900ff" rx="3.47" ry="21.501" transform="rotate(89.009 35.419 55.202)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#8900ff" rx="3.47" ry="21.501" transform="rotate(89.009 35.419 55.202)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx="14.592" cy="9.743" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(39.51 14.592 9.743)"/></g><g filter="url(#k)"><ellipse cx="61.728" cy="-5.321" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 61.728 -5.32)"/></g><g filter="url(#l)"><ellipse cx="55.618" cy="7.104" fill="#00c2ff" rx="5.971" ry="9.665" transform="rotate(37.892 55.618 7.104)"/></g><g filter="url(#m)"><ellipse cx="12.326" cy="39.103" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 12.326 39.103)"/></g><g filter="url(#n)"><ellipse cx="12.326" cy="39.103" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 12.326 39.103)"/></g><g filter="url(#o)"><ellipse cx="49.857" cy="30.678" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 49.857 30.678)"/></g><g filter="url(#p)"><ellipse cx="52.623" cy="33.171" fill="#00c2ff" rx="5.971" ry="15.297" transform="rotate(37.892 52.623 33.17)"/></g></g><path d="M6.919 0c-9.198 13.166-9.252 33.575 0 46.789h6.215c-9.25-13.214-9.196-33.623 0-46.789zm62.424 0h-6.215c9.198 13.166 9.252 33.575 0 46.789h6.215c9.25-13.214 9.196-33.623 0-46.789" class="parenthesis"/><defs><filter id="b" width="60.045" height="41.654" x="-5.564" y="16.92" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-40.407" y="-6.762" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-35.435" y="2.801" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-30.84" y="20.8" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-29.307" y="21.949" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="29.961" y="-17.13" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="37.754" y="3.055" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="37.754" y="3.055" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-13.43" y="-22.082" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="34.321" y="-37.644" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="38.847" y="-10.552" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-15.081" y="6.78" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-15.081" y="6.78" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="22.45" y="-1.645" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="32.919" y="11.36" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter></defs></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="46" fill="none" viewBox="0 0 48 46"><path fill="#863bff" d="M25.946 44.938c-.664.845-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.287c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.497 0-3.578-1.842-3.578H1.237c-.92 0-1.456-1.04-.92-1.788L10.013.474c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.579 1.842 3.579h11.377c.943 0 1.473 1.088.89 1.83L25.947 44.94z" style="fill:#863bff;fill:color(display-p3 .5252 .23 1);fill-opacity:1"/><mask id="a" width="48" height="46" x="0" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M25.842 44.938c-.664.844-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.183c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.498 0-3.579-1.842-3.579H1.133c-.92 0-1.456-1.04-.92-1.787L9.91.473c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.578 1.842 3.578h11.377c.943 0 1.473 1.088.89 1.832L25.843 44.94z" style="fill:#000;fill-opacity:1"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#ede6ff" rx="5.508" ry="14.704" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -4.47 31.516)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#ede6ff" rx="10.399" ry="29.851" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -39.328 7.883)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#7e14ff" rx="5.508" ry="30.487" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -25.913 -14.639)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -32.644 -3.334)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -34.34 30.47)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#ede6ff" rx="14.072" ry="22.078" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="rotate(93.35 24.506 48.493)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx=".387" cy="8.972" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(39.51 .387 8.972)"/></g><g filter="url(#k)"><ellipse cx="47.523" cy="-6.092" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 47.523 -6.092)"/></g><g filter="url(#l)"><ellipse cx="41.412" cy="6.333" fill="#47bfff" rx="5.971" ry="9.665" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 41.412 6.333)"/></g><g filter="url(#m)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#n)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#o)"><ellipse cx="35.651" cy="29.907" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 35.651 29.907)"/></g><g filter="url(#p)"><ellipse cx="38.418" cy="32.4" fill="#47bfff" rx="5.971" ry="15.297" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 38.418 32.4)"/></g></g><defs><filter id="b" width="60.045" height="41.654" x="-19.77" y="16.149" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-54.613" y="-7.533" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-49.64" y="2.03" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-45.045" y="20.029" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-43.513" y="21.178" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="15.756" y="-17.901" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-27.636" y="-22.853" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="20.116" y="-38.415" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="24.641" y="-11.323" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="8.244" y="-2.416" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="18.713" y="10.588" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter></defs></svg>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<symbol id="bluesky-icon" viewBox="0 0 16 17">
|
|
3
|
+
<g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
|
|
4
|
+
<defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
|
|
5
|
+
</symbol>
|
|
6
|
+
<symbol id="discord-icon" viewBox="0 0 20 19">
|
|
7
|
+
<path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
|
|
8
|
+
</symbol>
|
|
9
|
+
<symbol id="documentation-icon" viewBox="0 0 21 20">
|
|
10
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
|
|
11
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
|
|
12
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
|
|
13
|
+
</symbol>
|
|
14
|
+
<symbol id="github-icon" viewBox="0 0 19 19">
|
|
15
|
+
<path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
|
|
16
|
+
</symbol>
|
|
17
|
+
<symbol id="social-icon" viewBox="0 0 20 20">
|
|
18
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
|
|
19
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
|
|
20
|
+
</symbol>
|
|
21
|
+
<symbol id="x-icon" viewBox="0 0 19 19">
|
|
22
|
+
<path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
|
|
23
|
+
</symbol>
|
|
24
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>vanilla-test</title>
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-D-e3tQW5.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CsUDhMuy.css">
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div id="app"></div>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<body>
|
|
4
|
+
|
|
5
|
+
<button onclick="test()">Test Nostr</button>
|
|
6
|
+
|
|
7
|
+
<pre id="out"></pre>
|
|
8
|
+
|
|
9
|
+
<script>
|
|
10
|
+
async function test() {
|
|
11
|
+
const pk = await window.nostr.getPublicKey();
|
|
12
|
+
document.getElementById("out").innerText = pk;
|
|
13
|
+
}
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
</body>
|
|
17
|
+
</html>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
package com.nostrappshell.app
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.webkit.MimeTypeMap
|
|
5
|
+
import fi.iki.elonen.NanoHTTPD
|
|
6
|
+
import java.io.IOException
|
|
7
|
+
import java.util.Locale
|
|
8
|
+
|
|
9
|
+
class LocalServer(private val context: Context, port: Int) : NanoHTTPD(port) {
|
|
10
|
+
|
|
11
|
+
override fun serve(session: IHTTPSession?): Response {
|
|
12
|
+
// Fallback to root if URI is null
|
|
13
|
+
val uri = session?.uri ?: "/"
|
|
14
|
+
|
|
15
|
+
// Map the root URL to index.html, otherwise target the requested file in the assets folder
|
|
16
|
+
val filePath = when {
|
|
17
|
+
|
|
18
|
+
uri == "/" -> "www/test.html"
|
|
19
|
+
|
|
20
|
+
uri.contains(".") -> "www$uri" // css, js, images
|
|
21
|
+
|
|
22
|
+
else -> "www/test.html" // SPA ROUTES FALLBACK
|
|
23
|
+
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return try {
|
|
27
|
+
// Open the file directly from the app's assets
|
|
28
|
+
val inputStream = context.assets.open(filePath)
|
|
29
|
+
|
|
30
|
+
// Stream the file chunk-by-chunk to optimize memory usage
|
|
31
|
+
newChunkedResponse(Response.Status.OK, getMimeType(filePath), inputStream)
|
|
32
|
+
} catch (e: IOException) {
|
|
33
|
+
// Return clean 404 response if the file does not exist or cannot be read
|
|
34
|
+
newFixedLengthResponse(Response.Status.NOT_FOUND, "text/plain", "404 Not Found")
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Automatically detects the correct MIME type based on the file extension.
|
|
40
|
+
*/
|
|
41
|
+
private fun getMimeType(file: String): String {
|
|
42
|
+
// Extract extension from file path (e.g., "style.css" -> "css")
|
|
43
|
+
val extension = MimeTypeMap.getFileExtensionFromUrl(file)
|
|
44
|
+
?.lowercase(Locale.ROOT)
|
|
45
|
+
?: ""
|
|
46
|
+
|
|
47
|
+
// Use Android's built-in map to resolve the exact MIME type (handles PNG, JPG, JSON, WOFF2, etc.) [1]
|
|
48
|
+
return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
|
|
49
|
+
?: "application/octet-stream" // Standard fallback for unknown binary files
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
package com.nostrappshell.app
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.os.Bundle
|
|
5
|
+
import android.view.View
|
|
6
|
+
import android.webkit.WebView
|
|
7
|
+
import android.widget.FrameLayout
|
|
8
|
+
import androidx.activity.ComponentActivity
|
|
9
|
+
import androidx.activity.OnBackPressedCallback
|
|
10
|
+
import androidx.activity.enableEdgeToEdge
|
|
11
|
+
import androidx.activity.result.contract.ActivityResultContracts
|
|
12
|
+
import androidx.appcompat.app.AppCompatActivity
|
|
13
|
+
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
|
|
14
|
+
import androidx.core.view.ViewCompat
|
|
15
|
+
import androidx.core.view.WindowInsetsCompat
|
|
16
|
+
import androidx.core.view.updatePadding
|
|
17
|
+
import androidx.lifecycle.lifecycleScope
|
|
18
|
+
import com.nostrappshell.app.signer.SignerManager
|
|
19
|
+
import com.nostrappshell.app.signer.interfaces.NostrSigner
|
|
20
|
+
import com.nostrappshell.app.utils.AppPreferences
|
|
21
|
+
import com.nostrappshell.app.utils.SignerPickerBottomSheet
|
|
22
|
+
import kotlinx.coroutines.launch
|
|
23
|
+
|
|
24
|
+
class MainActivity : AppCompatActivity() {
|
|
25
|
+
|
|
26
|
+
private lateinit var runtime: ShellRuntime
|
|
27
|
+
private lateinit var container: FrameLayout
|
|
28
|
+
private lateinit var webView: WebView
|
|
29
|
+
|
|
30
|
+
private lateinit var loader: View
|
|
31
|
+
|
|
32
|
+
private lateinit var signerManager: SignerManager
|
|
33
|
+
|
|
34
|
+
private var activeSigner: NostrSigner? = null
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
private val amberLauncher =
|
|
38
|
+
|
|
39
|
+
registerForActivityResult(
|
|
40
|
+
|
|
41
|
+
ActivityResultContracts.StartActivityForResult()
|
|
42
|
+
|
|
43
|
+
) { result ->
|
|
44
|
+
|
|
45
|
+
signerManager.handleAmberResult(result)
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
50
|
+
val splashScreen = installSplashScreen()
|
|
51
|
+
enableEdgeToEdge()
|
|
52
|
+
|
|
53
|
+
super.onCreate(savedInstanceState)
|
|
54
|
+
setContentView(R.layout.activity_layout)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
signerManager = SignerManager(
|
|
58
|
+
|
|
59
|
+
this
|
|
60
|
+
|
|
61
|
+
) { intent ->
|
|
62
|
+
|
|
63
|
+
amberLauncher.launch(intent)
|
|
64
|
+
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
val isFirstRun = AppPreferences.getBoolean("isFirstRun", true)
|
|
68
|
+
|
|
69
|
+
// if (isFirstRun) {
|
|
70
|
+
//showTwoOptionsPicker(prefs)
|
|
71
|
+
showSignerPicker()
|
|
72
|
+
// }
|
|
73
|
+
|
|
74
|
+
initViews()
|
|
75
|
+
|
|
76
|
+
ViewCompat.setOnApplyWindowInsetsListener(container) { view, insets ->
|
|
77
|
+
val bars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
|
78
|
+
|
|
79
|
+
view.updatePadding(
|
|
80
|
+
top = bars.top,
|
|
81
|
+
bottom = bars.bottom
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
insets
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
runtime = ShellRuntime(
|
|
88
|
+
|
|
89
|
+
this,
|
|
90
|
+
|
|
91
|
+
webView,
|
|
92
|
+
|
|
93
|
+
signerManager
|
|
94
|
+
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
|
|
98
|
+
|
|
99
|
+
override fun handleOnBackPressed() {
|
|
100
|
+
|
|
101
|
+
val webView = runtime.getWebview()
|
|
102
|
+
|
|
103
|
+
if (webView.canGoBack()) {
|
|
104
|
+
webView.goBack()
|
|
105
|
+
} else {
|
|
106
|
+
finish()
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
})
|
|
111
|
+
loader.visibility = View.VISIBLE
|
|
112
|
+
runtime.start()
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private fun initViews() {
|
|
116
|
+
container = findViewById(R.id.mainContainer)
|
|
117
|
+
webView = findViewById(R.id.webView)
|
|
118
|
+
loader = findViewById(R.id.loader)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
override fun onDestroy() {
|
|
122
|
+
runtime.stop()
|
|
123
|
+
super.onDestroy()
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
private fun showSignerPicker() {
|
|
128
|
+
|
|
129
|
+
val picker = SignerPickerBottomSheet { selectedType ->
|
|
130
|
+
|
|
131
|
+
signerManager.setActiveType(selectedType)
|
|
132
|
+
|
|
133
|
+
activeSigner = signerManager.getSigner()
|
|
134
|
+
|
|
135
|
+
handleSignerSetup()
|
|
136
|
+
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
picker.show(
|
|
140
|
+
|
|
141
|
+
supportFragmentManager,
|
|
142
|
+
|
|
143
|
+
"SignerPicker"
|
|
144
|
+
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
private fun handleSignerSetup() {
|
|
150
|
+
|
|
151
|
+
AppPreferences.saveBoolean(
|
|
152
|
+
|
|
153
|
+
"isFirstRun",
|
|
154
|
+
|
|
155
|
+
false
|
|
156
|
+
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
}
|
|
160
|
+
}
|