Rotate support carousel continuously and move View all to its header
This commit is contained in:
1 parent
ba508a0c37
commit
85986c1fd9
5 files changed
+53
-24
No files matched your search
+1
-1
@@ -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.
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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 |
@@ -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
|
||||
|
||||
Reference in new issue
Block a user