Rotate support carousel continuously and move View all to its header

This commit is contained in:
Erick Sanchez committed 2026-10-26 11:52:32 -06:00
1 parent ba508a0c37
commit 85986c1fd9
5 files changed
+53 -24

No files matched your search

+1 -1
View File
@@ -49,7 +49,7 @@ Para actualizar, usa la misma cuenta y el mismo bundle ID efectivo de Sideloadly
## Juegos incluidos
El carrusel muestra los perfiles de esta copia; no proporciona ni descarga juegos. Debes añadir tus propios archivos del juego. Pulsa **Ver todos** debajo para consultar la lista completa de soporte. Busca por nombre, versión o Title ID; cada resultado enlaza a su ficha. El catálogo vuelve a leer los perfiles locales cada vez que lo abres.
El carrusel muestra los perfiles de esta copia; no proporciona ni descarga juegos. Debes añadir tus propios archivos del juego. Pulsa **Ver todos** arriba a la derecha para consultar la lista completa de soporte. Busca por nombre, versión o Title ID; cada resultado enlaza a su ficha. El catálogo vuelve a leer los perfiles locales cada vez que lo abres.
**Las pruebas propias cubren compilación y empaquetado en Mac, no una verificación automática de juego en iPhone.** Los perfiles y reportes de juego proceden de upstream; revisa [la ficha de tu juego](dm/games/README.md#games) antes de prepararlo. Un perfil no garantiza que cualquier versión funcione en cualquier iPhone.
+1 -1
View File
@@ -49,7 +49,7 @@ For updates, keep the same Apple account and effective bundle ID used in Sideloa
## Included game profiles
The home carousel shows the game profiles in your checkout; it does not provide or download games. You must add your own game files. Click **View all** below it to browse the complete support list. Search by name, version or Title ID; each result links to its game notes. The catalog reads the local profiles each time you open it.
The home carousel shows the game profiles in your checkout; it does not provide or download games. You must add your own game files. Click **View all** at the top right to browse the complete support list. Search by name, version or Title ID; each result links to its game notes. The catalog reads the local profiles each time you open it.
**Our own checks cover macOS compilation and packaging, not automatic iPhone gameplay verification.** Profiles and gameplay reports come from upstream and may concern Mac or iPhone; read [your game's notes](dm/games/README.md#games). A profile does not guarantee that every game version works on every device.
+50 -21
View File
@@ -170,6 +170,46 @@ import Darwin
}
}
struct SupportCarousel: View {
let games: [CatalogGame]
@Environment(\.accessibilityReduceMotion) private var reduceMotion
@State private var started = Date()
@State private var pausedAt: Date?
var body: some View {
GeometryReader { geometry in
TimelineView(.animation(minimumInterval:1.0 / 30.0,paused:pausedAt != nil || reduceMotion)) { context in
let width = CGFloat(games.count) * 177
let elapsed = max(0,(pausedAt ?? context.date).timeIntervalSince(started))
let offset = width > 0 && !reduceMotion ? CGFloat(elapsed * 22).truncatingRemainder(dividingBy:width) : 0
HStack(spacing:12) {
ForEach(0..<2,id:\.self) { copy in
ForEach(Array(games.enumerated()),id:\.element.id) { index, game in
let tint: Color = [.orange,.mint,.cyan,.purple,.pink][index % 5]
VStack(alignment:.leading,spacing:7) {
ZStack {
RoundedRectangle(cornerRadius:12).fill(tint.opacity(0.12))
Image(systemName:"gamecontroller").font(.system(size:29,weight:.light)).foregroundStyle(tint)
}.frame(height:66)
Text(game.name).font(.system(size:11,weight:.medium))
.foregroundStyle(Color(red:0.91,green:0.93,blue:0.88))
.lineLimit(2).frame(height:30,alignment:.topLeading)
}.frame(width:165).accessibilityHidden(copy == 1)
}
}
}.offset(x:-offset).frame(width:geometry.size.width,alignment:.leading)
}
}.frame(height:103).clipped()
.onHover { hovering in
if hovering { pausedAt = Date() }
else if let pause = pausedAt {
started = started.addingTimeInterval(Date().timeIntervalSince(pause))
pausedAt = nil
}
}
}
}
struct ContentView: View {
@StateObject private var model=BuildModel()
private let ink=Color(red:0.93,green:0.94,blue:0.90)
@@ -194,29 +234,18 @@ struct ContentView: View {
.font(.system(size:14)).foregroundStyle(.secondary)
}
VStack(alignment:.leading,spacing:10) {
Text(model.text("Juegos con soporte en la herramienta"))
.font(.system(size:14,weight:.semibold)).foregroundStyle(ink)
HStack {
Text(model.text("Juegos con soporte en la herramienta"))
.font(.system(size:14,weight:.semibold)).foregroundStyle(ink)
Spacer()
Button {model.openCatalog()} label: {
Label(model.text("Ver todos"),systemImage:"magnifyingglass")
.font(.system(size:12,weight:.semibold))
}.buttonStyle(.plain).foregroundStyle(lime).accessibilityIdentifier("view-all-games")
}
Text(model.text("No incluye ni descarga juegos. Debes añadir tus propios archivos."))
.font(.system(size:12)).foregroundStyle(.secondary)
ScrollView(.horizontal,showsIndicators:true) {
LazyHStack(spacing:12) {
ForEach(Array(model.catalog.enumerated()),id:\.element.id) { index, game in
let tint: Color = [.orange,.mint,.cyan,.purple,.pink][index % 5]
VStack(alignment:.leading,spacing:7) {
ZStack {
RoundedRectangle(cornerRadius:12).fill(tint.opacity(0.12))
Image(systemName:"gamecontroller").font(.system(size:29,weight:.light)).foregroundStyle(tint)
}.frame(height:66)
Text(game.name).font(.system(size:11,weight:.medium))
.foregroundStyle(ink).lineLimit(2).frame(height:30,alignment:.topLeading)
}.frame(width:165)
}
}.padding(.bottom,8)
}
Button {model.openCatalog()} label: {
Label(model.text("Ver todos"),systemImage:"magnifyingglass")
.font(.system(size:12,weight:.semibold))
}.buttonStyle(.plain).foregroundStyle(lime).accessibilityIdentifier("view-all-games")
SupportCarousel(games:model.catalog)
}
VStack(alignment:.leading,spacing:18) {
HStack(spacing:12) {
Binary file not shown.

Before

Width:  |  Height:  |  Size: 414 KiB

After

Width:  |  Height:  |  Size: 416 KiB

+1 -1
View File
@@ -153,7 +153,7 @@ bytes, not Nintendo key material.
## Game catalog
The home carousel lists all local game profiles as a support reference, with an explicit reminder that users must supply their own game files. **View all / Ver todos** below the carousel opens the searchable catalog. The native catalog reads every
The home carousel lists all local game profiles as a support reference, with an explicit reminder that users must supply their own game files. **View all / Ver todos** at the top right of the carousel opens the searchable catalog. The native catalog reads every
16-digit title directory containing `dm/games/<id>/game.tsv` from the current checkout
when opened. It shows the profile name, registered build display versions and title ID,
with a link to the corresponding repository game note. Search ignores case and accents