feat: dynamic app catalog, Gitea app polish, registry sync

App catalog served from Gitea repos (app-catalog) with 35 apps.
Nodes fetch catalog dynamically — new apps appear without frontend
rebuild. Test app added and removed to verify pipeline.

Gitea manifest updated with internal_port/nginx_proxy for iframe.
Updated catalog.json, nginx configs, app session configs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-04-12 08:20:18 -04:00
parent 1147dbd882
commit 3078d4b69e
18 changed files with 892 additions and 142 deletions

View File

@@ -186,7 +186,7 @@ fun NESController(
}
}
// A/B Buttons in inlay (same size as D-pad inlay, more right margin)
// A/B/C Buttons in inlay (same size as D-pad inlay, more right margin)
Inlay(c, Modifier.align(Alignment.CenterEnd).padding(end = 48.dp).size(140.dp)) {
Row(
Modifier.fillMaxSize(),
@@ -194,15 +194,20 @@ fun NESController(
verticalAlignment = Alignment.CenterVertically,
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Spacer(Modifier.height(10.dp))
RoundBtn(c, 52.dp) { onKey("Escape") }
Text("B", color = c.labelMuted, fontSize = 9.sp, fontWeight = FontWeight.Bold)
RoundBtn(c, 42.dp) { onKey("c") }
Text("C", color = c.labelMuted, fontSize = 8.sp, fontWeight = FontWeight.Bold)
}
Spacer(Modifier.width(16.dp))
Spacer(Modifier.width(10.dp))
Column(horizontalAlignment = Alignment.CenterHorizontally) {
RoundBtn(c, 52.dp) { onKey("Return") }
Text("A", color = c.labelMuted, fontSize = 9.sp, fontWeight = FontWeight.Bold)
Spacer(Modifier.height(10.dp))
Spacer(Modifier.height(8.dp))
RoundBtn(c, 42.dp) { onKey("b") }
Text("B", color = c.labelMuted, fontSize = 8.sp, fontWeight = FontWeight.Bold)
}
Spacer(Modifier.width(10.dp))
Column(horizontalAlignment = Alignment.CenterHorizontally) {
RoundBtn(c, 42.dp) { onKey("a") }
Text("A", color = c.labelMuted, fontSize = 8.sp, fontWeight = FontWeight.Bold)
Spacer(Modifier.height(8.dp))
}
}
}

View File

@@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -24,7 +25,9 @@ import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.archipelago.app.R
import com.archipelago.app.ui.theme.ControllerStyle
import com.archipelago.app.ui.theme.NES
@@ -113,16 +116,27 @@ fun NESPortraitController(
Spacer(Modifier.height(12.dp))
// A/B Buttons
// A/B/C Buttons
Inlay(c, Modifier.fillMaxWidth()) {
Row(
Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 10.dp),
Modifier.fillMaxWidth().padding(horizontal = 12.dp, vertical = 10.dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
) {
RoundBtn(c, 52.dp) { onKey("Escape") }
Spacer(Modifier.width(24.dp))
RoundBtn(c, 52.dp) { onKey("Return") }
Column(horizontalAlignment = Alignment.CenterHorizontally) {
RoundBtn(c, 46.dp) { onKey("c") }
Text("C", color = c.labelMuted, fontSize = 8.sp, fontWeight = FontWeight.Bold)
}
Spacer(Modifier.width(16.dp))
Column(horizontalAlignment = Alignment.CenterHorizontally) {
RoundBtn(c, 46.dp) { onKey("b") }
Text("B", color = c.labelMuted, fontSize = 8.sp, fontWeight = FontWeight.Bold)
}
Spacer(Modifier.width(16.dp))
Column(horizontalAlignment = Alignment.CenterHorizontally) {
RoundBtn(c, 46.dp) { onKey("a") }
Text("A", color = c.labelMuted, fontSize = 8.sp, fontWeight = FontWeight.Bold)
}
}
}