From 59b799b7048b423dbfb57e3ff66202f6d35c5ff5 Mon Sep 17 00:00:00 2001 From: AndreeTorres <00015722@uca.edu.sv> Date: Sat, 25 Jul 2026 09:09:03 -0600 Subject: [PATCH] =?UTF-8?q?chore:=20comentarios,=20logs=20y=20textos=20de?= =?UTF-8?q?=20sistema=20en=20ingl=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El proyecto se abre a contribuciones internacionales, así que el código deja de estar comentado en español. - 470 líneas de comentarios traducidas en las cuatro capas, los tests y los scripts, preservando el porqué de cada decisión (los comentarios que documentan lecciones caras se mantienen íntegros) - Mensajes de os.Logger en inglés: los lee quien depura, no el usuario - project.yml, workflows y scripts de build también en inglés - InfoPlist.xcstrings nuevo: el texto del permiso de Recordatorios era español fijo en el Info.plist y un usuario anglófono veía el diálogo del sistema en español; ahora se localiza es/en - Datos de muestra del renderizador en inglés y capturas regeneradas - Verificado: 64/64 claves del catálogo tienen traducción al inglés La UI sigue con claves en español (idioma de desarrollo) traducidas por catálogo, y los docs del proyecto siguen en español, como está decidido. --- .github/workflows/ci.yml | 4 +- .github/workflows/release.yml | 4 +- Corner/App/AppDelegate.swift | 48 +++---- Corner/Domain/DayClock.swift | 20 +-- Corner/Domain/HotCornerLogic.swift | 16 +-- Corner/Domain/ReminderSchedule.swift | 36 +++--- Corner/Domain/RolloverService.swift | 24 ++-- Corner/Domain/SyncPlanner.swift | 42 +++--- Corner/Domain/TaskCategory.swift | 14 +- Corner/Domain/TaskItem.swift | 28 ++-- Corner/Domain/TaskStore.swift | 144 ++++++++++----------- Corner/Resources/InfoPlist.xcstrings | 24 ++++ Corner/System/FloatingPanel.swift | 6 +- Corner/System/HotCornerMonitor.swift | 22 ++-- Corner/System/HotKeyCenter.swift | 16 +-- Corner/System/MenuBarController.swift | 32 ++--- Corner/System/NotificationScheduler.swift | 54 ++++---- Corner/System/PanelController.swift | 64 ++++----- Corner/System/QuickCaptureController.swift | 20 +-- Corner/System/ReminderSync.swift | 110 ++++++++-------- Corner/System/UpdateChecker.swift | 6 +- Corner/UI/CategoryChips.swift | 22 ++-- Corner/UI/CategoryColor.swift | 12 +- Corner/UI/NewTaskField.swift | 24 ++-- Corner/UI/PanelView.swift | 22 ++-- Corner/UI/QuickCaptureView.swift | 6 +- Corner/UI/TaskGroupRows.swift | 28 ++-- Corner/UI/TaskRow.swift | 24 ++-- Corner/UI/TodayView.swift | 10 +- Corner/UI/WeekView.swift | 10 +- CornerTests/DayClockTests.swift | 10 +- CornerTests/HotCornerLogicTests.swift | 18 +-- CornerTests/ReminderScheduleTests.swift | 16 +-- CornerTests/RolloverServiceTests.swift | 8 +- CornerTests/SyncPlannerTests.swift | 20 +-- CornerTests/TaskStoreTests.swift | 46 +++---- Scripts/generate-icon.sh | 2 +- Scripts/generate-icon.swift | 14 +- Scripts/make-demo-gif.sh | 20 +-- Scripts/render-preview.sh | 16 +-- Scripts/render-preview.swift | 20 +-- docs/img/corner-dark.png | Bin 65767 -> 59008 bytes docs/img/corner-light.png | Bin 65265 -> 58235 bytes project.yml | 12 +- 44 files changed, 559 insertions(+), 535 deletions(-) create mode 100644 Corner/Resources/InfoPlist.xcstrings diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e73f37b..bb50df5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,8 +7,8 @@ on: jobs: test: - # macos-14 valida que el proyecto compila y el dominio corre en Sonoma - # (el target mínimo declarado); macos-15 es el entorno principal. + # macos-14 verifies the project builds and the domain runs on Sonoma + # (the declared minimum target); macos-15 is the main environment. strategy: fail-fast: false matrix: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index adc5101..0365fff 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,7 +1,7 @@ name: Release -# Al pushear un tag vX.Y.Z: compila, empaqueta y publica el release. -# Los releases dejan de depender de la máquina de nadie. +# On pushing a vX.Y.Z tag: build, package and publish the release. +# Releases stop depending on anyone's machine. on: push: tags: ["v*"] diff --git a/Corner/App/AppDelegate.swift b/Corner/App/AppDelegate.swift index 0c409d2..1447194 100644 --- a/Corner/App/AppDelegate.swift +++ b/Corner/App/AppDelegate.swift @@ -2,7 +2,7 @@ import AppKit import SwiftData import Carbon.HIToolbox -/// Composition root: único lugar donde se cablean las piezas (ARCHITECTURE §2). +/// Composition root: the only place where the pieces are wired together (ARCHITECTURE §2). @main @MainActor final class AppDelegate: NSObject, NSApplicationDelegate { @@ -29,14 +29,14 @@ final class AppDelegate: NSObject, NSApplicationDelegate { } func applicationDidFinishLaunching(_ notification: Notification) { - // Como test host no se cablea nada: los tests instancian sus propias - // piezas, y el guard de instancia única mataría al test runner si la - // app real está corriendo a la vez. + // As a test host nothing is wired: tests build their own pieces, and + // the single-instance guard would kill the test runner while the real + // app is running. guard ProcessInfo.processInfo.environment["XCTestSessionIdentifier"] == nil else { return } terminateIfAlreadyRunning() - // Tooltips (.help) más ágiles: el default del sistema (~2 s) hace que - // el texto completo de una tarea truncada tarde en aparecer (SPEC §6.8). + // Snappier tooltips (.help): the system default (~2 s) makes the full + // text of a truncated task take too long to appear (SPEC §6.8). UserDefaults.standard.register(defaults: ["NSInitialToolTipDelay": 1000]) let clock = SystemDayClock() @@ -66,15 +66,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate { onToggleSync: { [weak self] in self?.toggleReminderSync() }, isSyncEnabled: { [weak self] in self?.reminderSync.isEnabled ?? false } ) - // Alarmas por tarea (SPEC §4.1.6): Corner solo notifica cuando el sync - // está apagado; con sync activo las entrega Recordatorios. + // Per-task alarms (SPEC §4.1.6): Corner only notifies when sync is off; + // with sync on, Reminders delivers them. notifications = NotificationScheduler(store: store) notifications.isDeliveryDelegated = { [weak self] in self?.reminderSync.isEnabled ?? false } notifications.onOpenPanel = { [weak self] in self?.togglePanelAtCursor() } - // Fan-out de los guardados locales a los dos interesados. + // Fan-out of local saves to the two interested parties. store.onDidSave = { [weak self] in self?.reminderSync.scheduleSync() self?.notifications.scheduleRefresh() @@ -83,7 +83,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate { reminderSync.start() notifications.scheduleRefresh() - // Cableado hot corner <-> panel (no se conocen entre sí, ARCHITECTURE §3.4). + // Hot corner <-> panel wiring (they don't know each other, ARCHITECTURE §3.4). hotCorner.onTrigger = { [weak self] screen in self?.panelController.show(on: screen) self?.hotCorner.suspend() @@ -92,7 +92,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate { self?.hotCorner.resumeAfterCooldown() } - // Atajos globales (SPEC §2): ⌥Espacio panel, ⇧⌥Espacio captura rápida. + // Global shortcuts (SPEC §2): ⌥Space panel, ⇧⌥Space quick capture. hotKeys = HotKeyCenter() hotKeys.onHotKey = { [weak self] id in switch id { @@ -105,7 +105,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate { hotKeys.register(id: 1, keyCode: UInt32(kVK_Space), modifiers: UInt32(optionKey)) hotKeys.register(id: 2, keyCode: UInt32(kVK_Space), modifiers: UInt32(optionKey | shiftKey)) - // Triggers del rollover (SPEC §4): arranque, medianoche, despertar de reposo. + // Rollover triggers (SPEC §4): launch, midnight, wake from sleep. rollover.performRolloverIfNeeded() dayChangeObserver = NotificationCenter.default.addObserver( forName: .NSCalendarDayChanged, object: nil, queue: .main @@ -130,8 +130,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate { if usedFallback { showStorageAlert() } - // Primera ejecución (SPEC §2): abrir el panel una única vez para que - // el usuario descubra qué instaló; el tip interno hace el resto. + // First run (SPEC §2): open the panel once so the user discovers what + // they installed; the in-panel tip does the rest. if !UserDefaults.standard.bool(forKey: "didLaunchBefore") { UserDefaults.standard.set(true, forKey: "didLaunchBefore") if let screen = cursorScreen { @@ -147,8 +147,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate { }) ?? NSScreen.main } - /// Toggle del panel por menú o atajo: abrir suspende el hot corner - /// igual que abrir por esquina (SPEC §2). + /// Panel toggle from the menu or a shortcut: opening suspends the hot + /// corner just like opening from the corner itself (SPEC §2). private func togglePanelAtCursor() { guard let screen = cursorScreen else { return } let wasVisible = panelController.isVisible @@ -161,7 +161,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate { quickCapture.toggle(on: screen) } - /// Alterna el sync con Recordatorios (SPEC §8); permiso denegado → alerta. + /// Toggles Reminders sync (SPEC §8); permission denied → alert. private func toggleReminderSync() { Task { @MainActor [weak self] in guard let self else { return } @@ -176,9 +176,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate { } } - // MARK: - Persistencia (ARCHITECTURE §4) + // MARK: - Persistence (ARCHITECTURE §4) - /// Store en Application Support; si falla, arranca en memoria con alerta única (SPEC §6.10). + /// Store in Application Support; on failure it starts in memory with a single alert (SPEC §6.10). private static func makeContainer() -> (ModelContainer, usedFallback: Bool) { let schema = Schema([TaskItem.self, TaskCategory.self]) do { @@ -192,7 +192,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate { } catch { NSLog("Corner: no se pudo abrir el store en disco, usando memoria: \(error)") let config = ModelConfiguration(isStoredInMemoryOnly: true) - // Si ni el store en memoria puede crearse, no hay app posible. + // If not even the in-memory store can be created, there is no app to run. let container = try! ModelContainer(for: schema, configurations: config) return (container, true) } @@ -206,8 +206,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate { alert.runModal() } - /// Un guardado o consulta falló en caliente (SPEC §6.10): avisar una sola - /// vez por sesión, nunca fallar en silencio. + /// A save or fetch failed at runtime (SPEC §6.10): warn once per session, + /// never fail silently. private var didShowPersistenceAlert = false private func showPersistenceAlertOnce(_ error: Error) { @@ -229,8 +229,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate { } } -/// Referencia débil para que los closures de notificaciones (no aislados) -/// reentren al MainActor sin capturar self. +/// Weak reference so the notification closures (non-isolated) can re-enter +/// the MainActor without capturing self. @MainActor private enum AppAccess { static weak var shared: AppDelegate? diff --git a/Corner/Domain/DayClock.swift b/Corner/Domain/DayClock.swift index 7e134b1..44278f4 100644 --- a/Corner/Domain/DayClock.swift +++ b/Corner/Domain/DayClock.swift @@ -1,30 +1,30 @@ import Foundation -/// Única fuente de "¿qué día es hoy?". Nadie llama Date() para lógica de fechas -/// fuera de este archivo (ARCHITECTURE §3.3); eso hace testeable el rollover -/// y la vista semanal con fechas fijas. +/// Single source of "what day is today?". Nobody calls Date() for date logic +/// outside this file (ARCHITECTURE §3.3); that is what makes the rollover +/// and the week view testable with fixed dates. protocol DayClock { var now: Date { get } var calendar: Calendar { get } } extension DayClock { - /// Hoy, normalizado a startOfDay. + /// Today, normalized to startOfDay. var today: Date { calendar.startOfDay(for: now) } func startOfDay(_ date: Date) -> Date { calendar.startOfDay(for: date) } - /// Los 7 días (startOfDay) de la semana actual, lunes a domingo. + /// The 7 days (startOfDay) of the current week, Monday to Sunday. func currentWeek() -> [Date] { var cal = calendar - cal.firstWeekday = 2 // lunes + cal.firstWeekday = 2 // Monday guard let interval = cal.dateInterval(of: .weekOfYear, for: now) else { return [] } return (0..<7).compactMap { cal.date(byAdding: .day, value: $0, to: interval.start) } } - /// Destinos de "Mover a…" (SPEC §4.1.5): mañana + días restantes de la - /// semana + lunes próximo en fin de semana. Ordenados; el primero es - /// siempre mañana. + /// "Move to…" destinations (SPEC §4.1.5): tomorrow + the remaining days of + /// the week + next Monday on weekends. Sorted; the first one is always + /// tomorrow. func moveDestinations() -> [Date] { let today = self.today var days = Set(currentWeek().filter { $0 > today }) @@ -45,7 +45,7 @@ struct SystemDayClock: DayClock { var calendar: Calendar { Calendar.current } } -/// Reloj fijo para tests. +/// Fixed clock for tests. struct FixedDayClock: DayClock { var now: Date var calendar: Calendar = Calendar(identifier: .gregorian) diff --git a/Corner/Domain/HotCornerLogic.swift b/Corner/Domain/HotCornerLogic.swift index e8b640d..e0845b0 100644 --- a/Corner/Domain/HotCornerLogic.swift +++ b/Corner/Domain/HotCornerLogic.swift @@ -1,10 +1,10 @@ import Foundation import CoreGraphics -/// Máquina de estados pura del hot corner (SPEC §2): permanencia, cooldown y -/// suspensión, sin timers ni AppKit — el crash de reordenar demostró que la -/// capa sin tests es donde viven los bugs, así que la decisión de "cuándo -/// disparar" se saca del monitor y se testea aquí. +/// Pure state machine for the hot corner (SPEC §2): dwell, cooldown and +/// suspension, with no timers or AppKit — the reorder crash proved that the +/// untested layer is where bugs live, so the "when to fire" decision was +/// pulled out of the monitor and is tested here. struct HotCornerLogic { var zoneSize: CGFloat = 12 var dwell: TimeInterval = 0.25 @@ -19,8 +19,8 @@ struct HotCornerLogic { case trigger } - /// Un tick de polling: posición del cursor, frame de la pantalla que lo - /// contiene (nil si ninguna) y el instante actual. + /// One polling tick: cursor position, frame of the screen containing it + /// (nil if none) and the current instant. mutating func poll(location: CGPoint, screenFrame: CGRect?, at now: Date) -> Verdict { guard !suspended, let frame = screenFrame else { dwellStart = nil @@ -45,13 +45,13 @@ struct HotCornerLogic { return .none } - /// El panel está visible: no re-disparar. + /// The panel is visible: do not fire again. mutating func suspend() { suspended = true dwellStart = nil } - /// El panel se cerró: reanudar con cooldown (SPEC §2). + /// The panel closed: resume with a cooldown (SPEC §2). mutating func resumeAfterCooldown(at now: Date) { suspended = false dwellStart = nil diff --git a/Corner/Domain/ReminderSchedule.swift b/Corner/Domain/ReminderSchedule.swift index 4087be1..a5b3ecb 100644 --- a/Corner/Domain/ReminderSchedule.swift +++ b/Corner/Domain/ReminderSchedule.swift @@ -1,36 +1,36 @@ import Foundation -/// Alarma pendiente de programar (SPEC §4.1.6). Struct neutral: el dominio -/// no conoce UserNotifications ni EventKit. +/// An alarm pending scheduling (SPEC §4.1.6). Neutral struct: the domain +/// knows nothing about UserNotifications or EventKit. struct PendingReminder: Equatable, Sendable { var taskID: UUID var title: String var fireDate: Date } -/// Qué alarmas deben estar programadas y a qué hora exacta. Función pura: -/// toda la política (pendientes, futuras, solo nivel superior) se testea aquí -/// en vez de dentro del scheduler del sistema. +/// Which alarms must be scheduled and at what exact time. Pure function: +/// the whole policy (pending, future, top-level only) is tested here +/// instead of inside the system scheduler. enum ReminderSchedule { - /// Vista mínima de una tarea para decidir su alarma. + /// Minimal view of a task for deciding its alarm. struct Candidate: Equatable, Sendable { var id: UUID var title: String - /// startOfDay del día asignado. + /// startOfDay of the assigned day. var day: Date var isDone: Bool var remindMinutes: Int? var isTopLevel: Bool } - /// Instante exacto del aviso: día asignado + minutos. + /// Exact instant of the alert: assigned day + minutes. static func fireDate(day: Date, minutes: Int, calendar: Calendar) -> Date { calendar.date(byAdding: .minute, value: minutes, to: calendar.startOfDay(for: day)) ?? day } - /// Alarmas a programar: nivel superior, pendientes, con hora, y cuyo - /// instante aún no pasó. Ordenadas por cercanía. + /// Alarms to schedule: top-level, pending, with a time, and whose instant + /// has not passed yet. Sorted by proximity. static func pending(from candidates: [Candidate], now: Date, calendar: Calendar = .current) -> [PendingReminder] { candidates.compactMap { candidate -> PendingReminder? in @@ -44,15 +44,15 @@ enum ReminderSchedule { .sorted { $0.fireDate < $1.fireDate } } - // MARK: - Opciones del menú "Recordarme" (SPEC §4.1.6) + // MARK: - "Remind me" menu options (SPEC §4.1.6) - /// Horas absolutas ofrecidas, en minutos desde medianoche. + /// Absolute times offered, in minutes from midnight. static let presetMinutes = [9 * 60, 12 * 60, 15 * 60, 18 * 60, 21 * 60] - /// Desplazamientos relativos ofrecidos, en minutos (solo para hoy). + /// Relative offsets offered, in minutes (today only). static let relativeOffsets = [5, 30, 60, 180] - /// Presets válidos para un día: en el día de hoy solo las horas que aún - /// no pasaron; en días futuros, todas. + /// Valid presets for a day: on today, only the times that have not passed + /// yet; on future days, all of them. static func availablePresets(for day: Date, now: Date, calendar: Calendar = .current) -> [Int] { let isToday = calendar.isDate(day, inSameDayAs: now) @@ -62,8 +62,8 @@ enum ReminderSchedule { return presetMinutes.filter { $0 > currentMinutes } } - /// Minutos del día correspondientes a "dentro de N minutos"; nil si eso - /// cruzaría a mañana (la alarma vive dentro de su día). + /// Minutes of the day for "in N minutes"; nil if that would cross into + /// tomorrow (an alarm lives within its own day). static func minutesFromNow(_ offset: Int, now: Date, calendar: Calendar = .current) -> Int? { let target = now.addingTimeInterval(TimeInterval(offset * 60)) @@ -72,7 +72,7 @@ enum ReminderSchedule { + calendar.component(.minute, from: target) } - /// "14:30" a partir de los minutos del día. + /// "14:30" from the minutes of the day. static func label(forMinutes minutes: Int) -> String { String(format: "%02d:%02d", minutes / 60, minutes % 60) } diff --git a/Corner/Domain/RolloverService.swift b/Corner/Domain/RolloverService.swift index df1445f..bd7ba88 100644 --- a/Corner/Domain/RolloverService.swift +++ b/Corner/Domain/RolloverService.swift @@ -2,12 +2,12 @@ import Foundation import SwiftData import os -/// Reasigna a hoy toda tarea pendiente con fecha pasada (SPEC §4, "rollover"). -/// Idempotente: correr dos veces el mismo día no hace nada la segunda vez. +/// Reassigns to today every pending task with a past date (SPEC §4, "rollover"). +/// Idempotent: running it twice on the same day does nothing the second time. /// -/// Este servicio NO se suscribe a notificaciones de sistema: el AppDelegate -/// (capa Sistema) escucha NSCalendarDayChanged y didWakeNotification y llama -/// a performRolloverIfNeeded() — así el dominio queda libre de AppKit +/// This service does NOT subscribe to system notifications: the AppDelegate +/// (System layer) listens to NSCalendarDayChanged and didWakeNotification and +/// calls performRolloverIfNeeded() — that keeps the domain free of AppKit /// (ARCHITECTURE §3.1). @MainActor final class RolloverService { @@ -25,9 +25,9 @@ final class RolloverService { func performRolloverIfNeeded() { let today = clock.today - // Consultas con predicado en base de datos: no se carga el historial - // completo en memoria (ARCHITECTURE §4). Solo tareas de nivel superior: - // las subtareas siguen a su padre (SPEC §4.2). + // Queries with a database predicate: the full history is never loaded into + // memory (ARCHITECTURE §4). Top-level tasks only: subtasks follow their + // parent (SPEC §4.2). let overdueDescriptor = FetchDescriptor( predicate: #Predicate { !$0.isDone && $0.assignedDay < today && $0.parent == nil }, sortBy: [SortDescriptor(\.assignedDay), SortDescriptor(\.sortOrder)] @@ -43,17 +43,17 @@ final class RolloverService { overdue = try context.fetch(overdueDescriptor) existingToday = try context.fetch(todayDescriptor) } catch { - log.error("fetch falló, rollover omitido: \(error, privacy: .public)") + log.error("fetch failed, rollover skipped: \(error, privacy: .public)") return } - // El indicador "arrastrada" solo aplica al día en que migró. + // The "rolled over" marker only applies to the day it migrated. guard !overdue.isEmpty else { return } for (index, task) in overdue.enumerated() { task.assignedDay = today task.rolledOver = true task.sortOrder = index - task.updatedAt = Date() // el rollover gana sobre un remoto viejo (SPEC §8) + task.updatedAt = Date() // the rollover wins over a stale remote version (SPEC §8) for subtask in task.subtasks ?? [] { subtask.assignedDay = today } } for (index, task) in existingToday.enumerated() { @@ -63,7 +63,7 @@ final class RolloverService { do { try context.save() } catch { - log.error("save falló tras rollover: \(error, privacy: .public)") + log.error("save failed after rollover: \(error, privacy: .public)") } onDidRollover() } diff --git a/Corner/Domain/SyncPlanner.swift b/Corner/Domain/SyncPlanner.swift index 0ffc942..7348d4c 100644 --- a/Corner/Domain/SyncPlanner.swift +++ b/Corner/Domain/SyncPlanner.swift @@ -1,21 +1,21 @@ import Foundation -/// Snapshot neutral de un recordatorio remoto (sin tipos de EventKit: -/// el dominio queda puro y testeable; el adaptador convierte). +/// Neutral snapshot of a remote reminder (no EventKit types: the domain +/// stays pure and testable; the adapter converts). struct RemoteReminder: Equatable, Sendable { var id: String var title: String - /// startOfDay; nil = sin fecha de vencimiento. + /// startOfDay; nil = no due date. var day: Date? var isDone: Bool var modifiedAt: Date - /// Lista de Recordatorios donde vive (SPEC §8 v2.1: lista = categoría). + /// Reminders list it lives in (SPEC §8 v2.1: list = category). var listID: String = "" - /// Hora del aviso en minutos del día; nil = sin alarma (SPEC §4.1.6). + /// Alert time in minutes of the day; nil = no alarm (SPEC §4.1.6). var remindMinutes: Int? = nil } -/// Vista mínima de una tarea local para planear el sync. +/// Minimal view of a local task for planning the sync. struct LocalTaskView: Equatable, Sendable { var id: UUID var reminderID: String? @@ -27,25 +27,25 @@ struct LocalTaskView: Equatable, Sendable { var remindMinutes: Int? = nil } -/// Qué hacer para converger local y remoto (SPEC §8). Función pura: -/// toda la política de conflictos vive aquí, con tests. +/// What to do to converge local and remote (SPEC §8). Pure function: +/// the entire conflict policy lives here, with tests. enum SyncAction: Equatable, Sendable { - /// Tarea local sin recordatorio → crearlo. + /// Local task with no reminder → create it. case pushCreate(taskID: UUID) - /// La versión local es más nueva → actualizar el recordatorio. + /// The local version is newer → update the reminder. case pushUpdate(taskID: UUID, reminderID: String) - /// La versión remota es más nueva → actualizar la tarea. + /// The remote version is newer → update the task. case pullUpdate(taskID: UUID, remote: RemoteReminder) - /// Recordatorio nuevo en la lista (iPhone/Siri) → crear tarea. + /// New reminder in the list (iPhone/Siri) → create the task. case pullCreate(RemoteReminder) - /// El recordatorio vinculado ya no existe → borrar la tarea local. + /// The linked reminder no longer exists → delete the local task. case deleteLocal(taskID: UUID) } enum SyncPlanner { - /// Última escritura gana; sin diferencias de contenido no hay acción. - /// `listForCategory` mapea categoría (nil = sin categoría) → lista de - /// Recordatorios esperada; una tarea en la lista equivocada difiere. + /// Last write wins; with no content differences there is no action. + /// `listForCategory` maps category (nil = uncategorized) → expected + /// Reminders list; a task in the wrong list counts as different. static func plan(local: [LocalTaskView], remote: [RemoteReminder], listForCategory: [UUID?: String] = [:]) -> [SyncAction] { var actions: [SyncAction] = [] @@ -61,9 +61,9 @@ enum SyncPlanner { continue } guard differs(task, match, listForCategory) else { continue } - // Empate de timestamps → gana lo local: garantiza convergencia - // (p. ej. un recordatorio sin fecha creado por Siri recibe la - // fecha que Corner le asignó, en vez de re-pull perpetuo). + // Timestamp tie → local wins: this guarantees convergence (e.g. a + // reminder created by Siri with no date takes the date Corner assigned + // instead of being pulled back forever). if task.updatedAt >= match.modifiedAt { actions.append(.pushUpdate(taskID: task.id, reminderID: reminderID)) } else { @@ -71,7 +71,7 @@ enum SyncPlanner { } } - // Lo que quedó en remoto sin pareja local es alta desde el iPhone/Siri. + // Whatever is left on the remote side with no local match is an addition from iPhone/Siri. for reminder in remoteByID.values.sorted(by: { $0.modifiedAt < $1.modifiedAt }) { actions.append(.pullCreate(reminder)) } @@ -86,7 +86,7 @@ enum SyncPlanner { || task.remindMinutes != reminder.remindMinutes { return true } - // Lista equivocada = categoría cambió en algún lado (SPEC §8 v2.1). + // Wrong list = the category changed on one side (SPEC §8 v2.1). if let expected = listForCategory[task.categoryID], expected != reminder.listID { return true } diff --git a/Corner/Domain/TaskCategory.swift b/Corner/Domain/TaskCategory.swift index f2c1373..ea79537 100644 --- a/Corner/Domain/TaskCategory.swift +++ b/Corner/Domain/TaskCategory.swift @@ -1,20 +1,20 @@ import Foundation import SwiftData -/// Categoría de tareas (SPEC §4.1): una tarea pertenece a lo sumo a una. -/// Mismas restricciones CloudKit que TaskItem (ARCHITECTURE §4): defaults en -/// todo, sin uniques, y la relación es opcional con inversa declarada. +/// Task category (SPEC §4.1): a task belongs to at most one. +/// Same CloudKit constraints as TaskItem (ARCHITECTURE §4): defaults on +/// everything, no uniques, and the relationship is optional with a declared inverse. @Model final class TaskCategory { var id: UUID = UUID() var name: String = "" - /// Color en hex ("#RRGGBB"); el dominio no conoce tipos de UI. + /// Hex color ("#RRGGBB"); the domain knows no UI types. var colorHex: String = "#8E8E93" var sortOrder: Int = 0 - /// Identificador de su lista espejo en Recordatorios (SPEC §8, v2.1). + /// Identifier of its mirror list in Reminders (SPEC §8, v2.1). var reminderListID: String? = nil - /// Inversa de TaskItem.category; al borrar la categoría, las tareas - /// quedan sin categoría (regla nullify por defecto). + /// Inverse of TaskItem.category; deleting the category leaves its tasks + /// uncategorized (default nullify rule). @Relationship(inverse: \TaskItem.category) var tasks: [TaskItem]? = nil diff --git a/Corner/Domain/TaskItem.swift b/Corner/Domain/TaskItem.swift index 8511784..ee7fcb3 100644 --- a/Corner/Domain/TaskItem.swift +++ b/Corner/Domain/TaskItem.swift @@ -1,36 +1,36 @@ import Foundation import SwiftData -/// Una tarea. Restricciones por compatibilidad CloudKit futura (ARCHITECTURE §4): -/// todos los atributos con default, sin @Attribute(.unique), sin relaciones. +/// A task. Constraints for future CloudKit compatibility (ARCHITECTURE §4): +/// every attribute has a default, no @Attribute(.unique), no relationships. @Model final class TaskItem { var id: UUID = UUID() var text: String = "" - /// Siempre normalizado a startOfDay; la comparación de días es por igualdad de este valor. + /// Always normalized to startOfDay; days are compared by equality of this value. var assignedDay: Date = Date() var isDone: Bool = false var completedAt: Date? = nil var createdAt: Date = Date() - /// Orden manual dentro del día. + /// Manual order within the day. var sortOrder: Int = 0 - /// true si migró desde un día anterior (se muestra con reloj ámbar durante hoy). + /// true if it migrated from an earlier day (shown with an amber clock during today). var rolledOver: Bool = false - /// Categoría opcional (SPEC §4.1). Relación opcional: requisito CloudKit. + /// Optional category (SPEC §4.1). Optional relationship: CloudKit requirement. var category: TaskCategory? = nil - /// Padre si esta tarea es una subtarea (SPEC §4.2). Un solo nivel: - /// las consultas de nivel superior filtran parent == nil. + /// Parent if this task is a subtask (SPEC §4.2). One level only: + /// top-level queries filter parent == nil. var parent: TaskItem? = nil - /// Subtareas; borrar el padre las borra (cascade). + /// Subtasks; deleting the parent deletes them (cascade). @Relationship(deleteRule: .cascade, inverse: \TaskItem.parent) var subtasks: [TaskItem]? = nil - /// Hora de aviso como minutos desde medianoche del día asignado - /// (SPEC §4.1.6); nil = sin alarma. No es fecha absoluta a propósito: - /// así la hora sobrevive al rollover y a "Mover a…". + /// Alert time as minutes from midnight of the assigned day (SPEC §4.1.6); + /// nil = no alarm. Deliberately not an absolute date: that way the time + /// survives the rollover and "Move to…". var remindMinutes: Int? = nil - /// Última modificación local; resuelve conflictos del sync (SPEC §8). + /// Last local modification; resolves sync conflicts (SPEC §8). var updatedAt: Date = Date() - /// calendarItemIdentifier del recordatorio vinculado; nil = sin sincronizar. + /// calendarItemIdentifier of the linked reminder; nil = not synced. var reminderID: String? = nil init(text: String, assignedDay: Date, sortOrder: Int = 0) { diff --git a/Corner/Domain/TaskStore.swift b/Corner/Domain/TaskStore.swift index b91ed7b..556d2a5 100644 --- a/Corner/Domain/TaskStore.swift +++ b/Corner/Domain/TaskStore.swift @@ -3,27 +3,27 @@ import SwiftData import Observation import os -/// Única puerta de lectura/escritura de tareas (ARCHITECTURE §3.2). -/// Las vistas jamás tocan SwiftData directo; eso permite activar CloudKit -/// o cambiar de motor sin tocar UI. +/// The single read/write gate for tasks (ARCHITECTURE §3.2). +/// Views never touch SwiftData directly; that is what allows enabling +/// CloudKit or swapping engines without touching the UI. @MainActor @Observable final class TaskStore { private let context: ModelContext private let clock: DayClock - /// Undo propio del panel (borrar tareas, SPEC §4). + /// The panel's own undo (deleting tasks, SPEC §4). @ObservationIgnored let undoManager = UndoManager() - /// Avisa a la capa Sistema que la persistencia falló (el AppDelegate - /// muestra alerta una sola vez, SPEC §6.10). Nunca fallar en silencio. + /// Tells the System layer that persistence failed (the AppDelegate shows + /// a single alert, SPEC §6.10). Never fail silently. @ObservationIgnored var onPersistenceError: ((Error) -> Void)? - /// Filtro de categoría activo; nil = "Todas". Persiste entre aperturas - /// del panel y entre sesiones (SPEC §4.1) — el panel se destruye al - /// cerrarse, así que este estado no puede vivir en la vista. + /// Active category filter; nil = "All". Persists across panel openings and + /// across sessions (SPEC §4.1) — the panel is destroyed when it closes, so + /// this state cannot live in the view. var filterID: UUID? { didSet { defaults.set(filterID?.uuidString, forKey: Self.filterKey) } } @@ -33,8 +33,8 @@ final class TaskStore { private static let filterKey = "selectedCategoryFilter" private static let welcomeKey = "welcomeTipDismissed" - /// Tip de bienvenida (SPEC §2, primera ejecución): visible hasta que el - /// usuario lo descarta; nunca vuelve. + /// Welcome tip (SPEC §2, first run): visible until the user dismisses it; + /// never comes back. private(set) var showsWelcomeTip = false func dismissWelcomeTip() { @@ -45,7 +45,7 @@ final class TaskStore { @ObservationIgnored private let log = Logger(subsystem: "com.andreetorres.corner", category: "TaskStore") - /// Snapshot observable; las vistas leen de aquí. Se refresca tras cada mutación. + /// Observable snapshot; views read from here. Refreshed after every mutation. private(set) var tasks: [TaskItem] = [] private(set) var categories: [TaskCategory] = [] @@ -54,7 +54,7 @@ final class TaskStore { self.clock = clock self.defaults = defaults refresh() - // Restaurar el filtro solo si la categoría aún existe. + // Restore the filter only if the category still exists. if let saved = defaults.string(forKey: Self.filterKey), let id = UUID(uuidString: saved), categories.contains(where: { $0.id == id }) { @@ -63,15 +63,15 @@ final class TaskStore { showsWelcomeTip = !defaults.bool(forKey: Self.welcomeKey) } - // MARK: - Lectura + // MARK: - Reading - /// Si un fetch falla, se conserva el último snapshot (la UI no se vacía) - /// y se reporta el error; nunca se degrada a lista vacía en silencio. + /// If a fetch fails the last snapshot is kept (the UI does not empty out) + /// and the error is reported; it never silently degrades to an empty list. /// - /// El snapshot se acota a la ventana visible (semana actual en adelante): - /// el historial de semanas pasadas permanece en disco pero no en memoria, - /// así el consumo queda constante sin importar los meses de uso - /// (ARCHITECTURE §4). El rollover hace su propia consulta de vencidas. + /// The snapshot is bounded to the visible window (current week onward): + /// the history of past weeks stays on disk but not in memory, so usage + /// stays constant no matter how many months of use (ARCHITECTURE §4). + /// The rollover runs its own query for overdue tasks. func refresh() { let weekStart = clock.currentWeek().first ?? clock.today var descriptor = FetchDescriptor( @@ -86,14 +86,14 @@ final class TaskStore { tasks = try context.fetch(descriptor) categories = try context.fetch(categoryDescriptor) } catch { - log.error("refresh falló: \(error, privacy: .public)") + log.error("refresh failed: \(error, privacy: .public)") onPersistenceError?(error) } - log.info("refresh: \(self.tasks.count) tareas en ventana, \(self.categories.count) categorías") + log.info("refresh: \(self.tasks.count) tasks in window, \(self.categories.count) categories") } - /// Tareas de nivel superior de un día: pendientes primero (orden manual), - /// hechas al final (SPEC §4). Las subtareas no aparecen aquí (SPEC §4.2). + /// Top-level tasks for a day: pending first (manual order), done at the + /// end (SPEC §4). Subtasks do not appear here (SPEC §4.2). func tasks(for day: Date) -> [TaskItem] { let d = clock.startOfDay(day) let ofDay = tasks.filter { $0.assignedDay == d && $0.parent == nil } @@ -104,21 +104,21 @@ final class TaskStore { return pending + done } - /// Subtareas en orden de creación; las hechas no se reordenan (SPEC §4.2). + /// Subtasks in creation order; done ones are not reordered (SPEC §4.2). func subtasks(of task: TaskItem) -> [TaskItem] { (task.subtasks ?? []).sorted { $0.sortOrder < $1.sortOrder } } func todayTasks() -> [TaskItem] { tasks(for: clock.today) } - /// Semana actual (lunes-domingo) como pares (día, tareas). + /// Current week (Monday-Sunday) as (day, tasks) pairs. func weekTasks() -> [(day: Date, tasks: [TaskItem])] { clock.currentWeek().map { ($0, tasks(for: $0)) } } var today: Date { clock.today } - // MARK: - Mutaciones + // MARK: - Mutations @discardableResult func add(_ text: String, to day: Date, category: TaskCategory? = nil) -> TaskItem? { @@ -138,8 +138,8 @@ final class TaskStore { save() } - /// Pone o quita la hora de aviso de una tarea de nivel superior - /// (SPEC §4.1.6). Los minutos son desde medianoche del día asignado. + /// Sets or clears the alert time of a top-level task (SPEC §4.1.6). + /// Minutes are counted from midnight of the assigned day. func setReminder(_ task: TaskItem, minutes: Int?) { guard task.parent == nil else { return } task.remindMinutes = minutes @@ -147,7 +147,7 @@ final class TaskStore { save() } - /// Candidatas para programar alarmas (la política vive en ReminderSchedule). + /// Candidates for scheduling alarms (the policy lives in ReminderSchedule). func reminderCandidates() -> [ReminderSchedule.Candidate] { tasks.map { ReminderSchedule.Candidate(id: $0.id, title: $0.text, day: $0.assignedDay, @@ -156,14 +156,14 @@ final class TaskStore { } } - /// Destinos disponibles para "Mover a…" (SPEC §4.1.5). + /// Available destinations for "Move to…" (SPEC §4.1.5). func moveDestinations() -> [Date] { clock.moveDestinations() } - /// Mueve una tarea pendiente de nivel superior a otro día; sus subtareas - /// viajan con ella. Llega al final de las pendientes del destino y deja - /// de contar como "arrastrada" (SPEC §4.1.5). + /// Moves a pending top-level task to another day; its subtasks travel with + /// it. It lands at the end of the destination's pending tasks and stops + /// counting as "rolled over" (SPEC §4.1.5). func move(_ task: TaskItem, to day: Date) { guard task.parent == nil, !task.isDone else { return } let destination = clock.startOfDay(day) @@ -179,7 +179,7 @@ final class TaskStore { save() } - // MARK: - Categorías (SPEC §4.1) + // MARK: - Categories (SPEC §4.1) @discardableResult func addCategory(_ name: String, colorHex: String) -> TaskCategory? { @@ -199,15 +199,15 @@ final class TaskStore { save() } - /// Borra la categoría; sus tareas quedan sin categoría (nullify). + /// Deletes the category; its tasks are left uncategorized (nullify). func deleteCategory(_ category: TaskCategory) { if filterID == category.id { filterID = nil } context.delete(category) save() } - /// Completado bidireccional (SPEC §4.2): el padre arrastra a sus hijas; - /// la última hija completa (o reabre) al padre. + /// Bidirectional completion (SPEC §4.2): the parent drags its children; + /// the last child completes (or reopens) the parent. func toggle(_ task: TaskItem) { let newState = !task.isDone setDone(task, newState) @@ -222,13 +222,13 @@ final class TaskStore { @discardableResult func addSubtask(_ text: String, to parent: TaskItem) -> TaskItem? { let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) - guard !trimmed.isEmpty, parent.parent == nil else { return nil } // un solo nivel + guard !trimmed.isEmpty, parent.parent == nil else { return nil } // one level only let nextOrder = ((parent.subtasks ?? []).map(\.sortOrder).max() ?? -1) + 1 let subtask = TaskItem(text: trimmed, assignedDay: parent.assignedDay, sortOrder: nextOrder) subtask.parent = parent context.insert(subtask) - reconcile(parent) // un paso nuevo pendiente reabre a un padre hecho + reconcile(parent) // a new pending step reopens a completed parent save() return subtask } @@ -239,10 +239,10 @@ final class TaskStore { task.updatedAt = Date() } - /// Restaura el invariante "nunca padre hecho con hijas pendientes" y su - /// recíproco tras cualquier cambio en las hijas. `excluding` permite - /// ignorar una subtarea recién borrada: la relación aún la contiene - /// hasta que el contexto guarda. + /// Restores the "never a done parent with pending children" invariant and + /// its converse after any change to the children. `excluding` allows + /// ignoring a just-deleted subtask: the relationship still contains it + /// until the context saves. private func reconcile(_ parent: TaskItem, excluding excludedID: UUID? = nil) { let subtasks = (parent.subtasks ?? []).filter { $0.id != excludedID } guard !subtasks.isEmpty else { return } @@ -258,8 +258,8 @@ final class TaskStore { save() } - /// Borra con undo disponible mientras el panel esté abierto (SPEC §4). - /// Borrar un padre borra sus subtareas (cascade); ⌘Z restaura todo (SPEC §4.2). + /// Deletes with undo available while the panel is open (SPEC §4). + /// Deleting a parent deletes its subtasks (cascade); ⌘Z restores it all (SPEC §4.2). func delete(_ task: TaskItem) { let snapshot = (task.text, task.assignedDay, task.isDone, task.completedAt, task.sortOrder, task.rolledOver) @@ -300,22 +300,22 @@ final class TaskStore { if let reminderID = task.reminderID, !isApplyingRemoteChanges { onDidDeleteSyncedTask?(reminderID) } - // Cascada manual: el deleteRule .cascade de SwiftData no cascadea en - // macOS 14 (lo cazó la matriz de CI) y las subtareas quedarían - // huérfanas como tareas de nivel superior. Inofensivo donde sí funciona. + // Manual cascade: SwiftData's .cascade deleteRule does not cascade on + // macOS 14 (caught by the CI matrix) and subtasks would be left orphaned + // as top-level tasks. Harmless where the rule does work. for subtask in task.subtasks ?? [] { context.delete(subtask) } context.delete(task) - // Quitar la última subtarea pendiente puede dejar al padre "todo hecho". + // Removing the last pending subtask can leave the parent "all done". if let parent { reconcile(parent, excluding: deletedID) } save() } - /// Reordena pendientes dentro de un día (para .onMove de SwiftUI). + /// Reorders pending tasks within a day (for SwiftUI's .onMove). func movePending(in day: Date, from source: IndexSet, to destination: Int) { var pending = tasks(for: day).filter { !$0.isDone } - // Los índices llegan del ForEach completo (pendientes + hechas al - // final): soltar debajo de las hechas trae un destino fuera del rango - // de pendientes — sin acotar, move(fromOffsets:) crashea. + // The indices come from the full ForEach (pending + done at the end): + // dropping below the done ones yields a destination outside the pending + // range — without clamping, move(fromOffsets:) crashes. let clampedSource = IndexSet(source.filter { $0 < pending.count }) let clampedDestination = min(destination, pending.count) guard !clampedSource.isEmpty else { return } @@ -324,23 +324,23 @@ final class TaskStore { save() } - // MARK: - Soporte de sincronización (SPEC §8) + // MARK: - Sync support (SPEC §8) - /// Notifica un guardado local (la capa Sistema lo usa para empujar el - /// sync). Silenciado mientras se aplican cambios remotos (anti-eco). + /// Signals a local save (the System layer uses it to push the sync). + /// Silenced while remote changes are being applied (anti-echo). @ObservationIgnored var onDidSave: (() -> Void)? - /// true mientras el adaptador de sync aplica cambios remotos. + /// true while the sync adapter is applying remote changes. @ObservationIgnored var isApplyingRemoteChanges = false - /// Borrado local de una tarea vinculada: avisa para eliminar su - /// recordatorio (SPEC §8). Silenciado durante cambios remotos. + /// Local deletion of a linked task: signals to remove its reminder + /// (SPEC §8). Silenced during remote changes. @ObservationIgnored var onDidDeleteSyncedTask: ((String) -> Void)? - /// Vista neutral de las tareas sincronizables (nivel superior, ventana actual). + /// Neutral view of the syncable tasks (top-level, current window). func syncSnapshot() -> [LocalTaskView] { tasks.filter { $0.parent == nil }.map { LocalTaskView(id: $0.id, reminderID: $0.reminderID, title: $0.text, @@ -350,7 +350,7 @@ final class TaskStore { } } - /// Categoría cuya lista espejo es `listID`; nil = lista general (SPEC §8 v2.1). + /// Category whose mirror list is `listID`; nil = general list (SPEC §8 v2.1). func category(forReminderList listID: String) -> TaskCategory? { categories.first { $0.reminderListID == listID } } @@ -369,9 +369,9 @@ final class TaskStore { save() } - /// Aplica una versión remota más nueva (SPEC §8). El `updatedAt` local - /// toma la fecha remota para no re-ganar el conflicto; el completado - /// arrastra a las subtareas (regla bidireccional de §4.2). + /// Applies a newer remote version (SPEC §8). The local `updatedAt` takes + /// the remote date so it does not win the conflict again; completion + /// drags the subtasks along (bidirectional rule from §4.2). func applyRemote(_ remote: RemoteReminder, to task: TaskItem) { task.text = remote.title let weekStart = clock.currentWeek().first ?? clock.today @@ -384,17 +384,17 @@ final class TaskStore { setDone(task, remote.isDone) for subtask in task.subtasks ?? [] { setDone(subtask, remote.isDone) } } - // La lista remota manda la categoría (SPEC §8 v2.1): mover un - // recordatorio a "Corner — X" desde el iPhone asigna esa categoría. + // The remote list dictates the category (SPEC §8 v2.1): moving a reminder + // to "Corner — X" from the iPhone assigns that category. task.category = category(forReminderList: remote.listID) - // La hora del recordatorio también es bidireccional (SPEC §4.1.6). + // The reminder's time is bidirectional too (SPEC §4.1.6). task.remindMinutes = remote.remindMinutes task.updatedAt = remote.modifiedAt save() } - /// Alta remota (iPhone/Siri): su fecha, o Hoy si no tiene o quedó fuera - /// de la ventana (SPEC §8). + /// Remote addition (iPhone/Siri): its own date, or Today if it has none or + /// fell outside the window (SPEC §8). @discardableResult func createFromRemote(_ remote: RemoteReminder) -> TaskItem? { let weekStart = clock.currentWeek().first ?? clock.today @@ -411,13 +411,13 @@ final class TaskStore { return task } - // MARK: - Persistencia + // MARK: - Persistence private func save() { do { try context.save() } catch { - log.error("save falló: \(error, privacy: .public)") + log.error("save failed: \(error, privacy: .public)") onPersistenceError?(error) } refresh() diff --git a/Corner/Resources/InfoPlist.xcstrings b/Corner/Resources/InfoPlist.xcstrings new file mode 100644 index 0000000..d8cbe5f --- /dev/null +++ b/Corner/Resources/InfoPlist.xcstrings @@ -0,0 +1,24 @@ +{ + "sourceLanguage": "es", + "strings": { + "NSRemindersFullAccessUsageDescription": { + "comment": "Shown by macOS when the user enables Reminders sync.", + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Corner only uses Reminders to sync your tasks with its own “Corner” lists, and only if you turn sync on from the menu." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Corner solo usa Recordatorios para sincronizar tus tareas con la lista 'Corner', y únicamente si activas la sincronización en el menú." + } + } + } + } + }, + "version": "1.0" +} \ No newline at end of file diff --git a/Corner/System/FloatingPanel.swift b/Corner/System/FloatingPanel.swift index 9ca592e..8cde629 100644 --- a/Corner/System/FloatingPanel.swift +++ b/Corner/System/FloatingPanel.swift @@ -1,8 +1,8 @@ import AppKit -/// Panel flotante base de Corner. Las ventanas .borderless devuelven -/// canBecomeKey == false y nunca reciben teclado; sin este override es -/// imposible escribir en los campos de texto. +/// Corner's base floating panel. `.borderless` windows return +/// canBecomeKey == false and never receive keyboard input; without this +/// override it is impossible to type in the text fields. final class FloatingPanel: NSPanel { override var canBecomeKey: Bool { true } override var canBecomeMain: Bool { false } diff --git a/Corner/System/HotCornerMonitor.swift b/Corner/System/HotCornerMonitor.swift index 42cd0c4..70be0ef 100644 --- a/Corner/System/HotCornerMonitor.swift +++ b/Corner/System/HotCornerMonitor.swift @@ -1,16 +1,16 @@ import AppKit -/// Detecta la permanencia del cursor en la esquina inferior izquierda (SPEC §2). -/// No sabe qué es un panel: solo emite onTrigger(screen) (ARCHITECTURE §3.4). +/// Detects the cursor dwelling in the bottom-left corner (SPEC §2). +/// It does not know what a panel is: it only emits onTrigger(screen) (ARCHITECTURE §3.4). /// -/// Implementado con polling de NSEvent.mouseLocation (10 Hz): no requiere -/// permisos de accesibilidad y funciona igual con nuestra app activa o no. +/// Implemented by polling NSEvent.mouseLocation (10 Hz): it needs no +/// accessibility permissions and works whether our app is active or not. @MainActor final class HotCornerMonitor { var onTrigger: ((NSScreen) -> Void)? - /// Toda la decisión de "cuándo disparar" vive en HotCornerLogic - /// (dominio puro, testeado); aquí solo queda el timer y AppKit. + /// The whole "when to fire" decision lives in HotCornerLogic + /// (pure domain, tested); only the timer and AppKit remain here. private var logic = HotCornerLogic() private var pollTimer: Timer? @@ -29,15 +29,15 @@ final class HotCornerMonitor { pollTimer = nil } - /// El panel está visible: no re-disparar. + /// The panel is visible: do not fire again. func suspend() { logic.suspend() } - /// El panel se cerró: reanudar con cooldown. + /// The panel closed: resume with a cooldown. func resumeAfterCooldown() { logic.resumeAfterCooldown(at: Date()) } private func poll() { let location = NSEvent.mouseLocation - // La esquina activa es la del monitor donde está el cursor (SPEC §6.1). + // The active corner belongs to the screen where the cursor is (SPEC §6.1). let screen = NSScreen.screens.first { NSMouseInRect(location, $0.frame, false) } if logic.poll(location: location, screenFrame: screen?.frame, at: Date()) == .trigger, let screen { @@ -46,8 +46,8 @@ final class HotCornerMonitor { } } -/// Referencia débil para que el closure del Timer (no aislado) reentre al MainActor -/// sin capturar self de forma que impida la desinicialización. +/// Weak reference so the Timer closure (non-isolated) re-enters the MainActor +/// without capturing self in a way that would prevent deinitialization. @MainActor private enum HotCornerAccess { static weak var shared: HotCornerMonitor? diff --git a/Corner/System/HotKeyCenter.swift b/Corner/System/HotKeyCenter.swift index 0b7b72c..b44345d 100644 --- a/Corner/System/HotKeyCenter.swift +++ b/Corner/System/HotKeyCenter.swift @@ -1,12 +1,12 @@ import AppKit import Carbon.HIToolbox -/// Atajos de teclado globales (SPEC §2). Usa Carbon RegisterEventHotKey: -/// funciona sin permisos de accesibilidad, a diferencia de los monitores -/// globales de keyDown de NSEvent. +/// Global keyboard shortcuts (SPEC §2). Uses Carbon RegisterEventHotKey: +/// it works without accessibility permissions, unlike NSEvent's global +/// keyDown monitors. @MainActor final class HotKeyCenter { - /// Recibe el id del atajo registrado. + /// Receives the id of the registered shortcut. var onHotKey: ((UInt32) -> Void)? private var hotKeyRefs: [EventHotKeyRef?] = [] @@ -17,8 +17,8 @@ final class HotKeyCenter { guard handlerRef == nil else { return } var eventType = EventTypeSpec(eventClass: OSType(kEventClassKeyboard), eventKind: UInt32(kEventHotKeyPressed)) - // Callback C: no puede capturar; reentra al MainActor vía HotKeyAccess. - // Los eventos Carbon del dispatcher llegan en el hilo principal. + // C callback: it cannot capture; it re-enters the MainActor via HotKeyAccess. + // Carbon dispatcher events arrive on the main thread. InstallEventHandler(GetApplicationEventTarget(), { _, event, _ in var hotKeyID = EventHotKeyID() GetEventParameter(event, EventParamName(kEventParamDirectObject), @@ -31,7 +31,7 @@ final class HotKeyCenter { HotKeyAccess.shared = self } - /// keyCode de Carbon (kVK_*) y modificadores Carbon (optionKey, shiftKey…). + /// Carbon keyCode (kVK_*) and Carbon modifiers (optionKey, shiftKey…). func register(id: UInt32, keyCode: UInt32, modifiers: UInt32) { var ref: EventHotKeyRef? let hotKeyID = EventHotKeyID(signature: Self.signature, id: id) @@ -41,7 +41,7 @@ final class HotKeyCenter { } } -/// Referencia débil para que el callback C (no aislado) reentre al MainActor. +/// Weak reference so the C callback (non-isolated) re-enters the MainActor. @MainActor private enum HotKeyAccess { static weak var shared: HotKeyCenter? diff --git a/Corner/System/MenuBarController.swift b/Corner/System/MenuBarController.swift index 7f7424c..f2874b7 100644 --- a/Corner/System/MenuBarController.swift +++ b/Corner/System/MenuBarController.swift @@ -2,8 +2,8 @@ import AppKit import ServiceManagement import Observation -/// Ícono y menú de la barra de menú (SPEC §5). Muestra la siguiente tarea -/// pendiente de hoy junto al ícono (SPEC §5.1). +/// Menu bar icon and menu (SPEC §5). Shows today's next pending task +/// next to the icon (SPEC §5.1). @MainActor final class MenuBarController: NSObject, NSMenuDelegate { private var statusItem: NSStatusItem? @@ -11,10 +11,10 @@ final class MenuBarController: NSObject, NSMenuDelegate { private let onQuickCapture: () -> Void private let store: TaskStore - /// Ítem dinámico "Completar: X" (SPEC §5); se refresca al abrir el menú. + /// Dynamic "Complete: X" item (SPEC §5); refreshed when the menu opens. private var completeItem: NSMenuItem? - /// Máximo de caracteres de la tarea en la barra (SPEC §5.1). + /// Maximum number of characters of the task shown in the bar (SPEC §5.1). private let titleLimit = 24 private let onCheckUpdates: () -> Void @@ -96,7 +96,7 @@ final class MenuBarController: NSObject, NSMenuDelegate { observeNextTask() } - /// Refresca el ítem "Completar: X" justo antes de mostrar el menú. + /// Refreshes the "Complete: X" item right before showing the menu. nonisolated func menuNeedsUpdate(_ menu: NSMenu) { MainActor.assumeIsolated { syncItem?.state = isSyncEnabled() ? .on : .off @@ -110,23 +110,23 @@ final class MenuBarController: NSObject, NSMenuDelegate { } } - // MARK: - Ícono de barra (SPEC §5) + // MARK: - Menu bar icon (SPEC §5) - /// La marca de Corner (L de esquina + palomita) como template monocromo, - /// dibujada como vector: nítida en cualquier retina y el sistema la tiñe - /// según modo claro/oscuro. Los íconos de barra deben ser plantillas (HIG). + /// Corner's mark (corner L + checkmark) as a monochrome template, drawn + /// as a vector: crisp on any retina display and tinted by the system for + /// light/dark mode. Menu bar icons must be templates (HIG). private static func makeCornerIcon() -> NSImage { let image = NSImage(size: NSSize(width: 18, height: 18), flipped: false) { _ in NSColor.black.setFill() NSColor.black.setStroke() - // Trazo en L anclado a la esquina inferior izquierda, como el logo. + // L-shaped stroke anchored to the bottom-left corner, like the logo. NSBezierPath(roundedRect: NSRect(x: 3, y: 3, width: 4.5, height: 12), xRadius: 2.25, yRadius: 2.25).fill() NSBezierPath(roundedRect: NSRect(x: 3, y: 3, width: 12.5, height: 4.5), xRadius: 2.25, yRadius: 2.25).fill() - // Palomita flotando en el hueco superior derecho. + // Checkmark floating in the top-right gap. let check = NSBezierPath() check.lineWidth = 2 check.lineCapStyle = .round @@ -142,10 +142,10 @@ final class MenuBarController: NSObject, NSMenuDelegate { return image } - // MARK: - Siguiente tarea (SPEC §5.1) + // MARK: - Next task (SPEC §5.1) - /// Observa el store y refresca el título; withObservationTracking es de un - /// solo disparo, así que se re-arma en cada cambio. + /// Observes the store and refreshes the title; withObservationTracking is + /// one-shot, so it is re-armed on every change. private func observeNextTask() { withObservationTracking { let pending = store.todayTasks().filter { !$0.isDone } @@ -155,7 +155,7 @@ final class MenuBarController: NSObject, NSMenuDelegate { } } - /// Formato "3 · Comprar café…" (SPEC §5.1); sin pendientes, solo el ícono. + /// Format "3 · Buy coffee…" (SPEC §5.1); with nothing pending, just the icon. private func applyTitle(count: Int, next: String?) { guard let button = statusItem?.button else { return } guard count > 0, let next, !next.isEmpty else { @@ -171,7 +171,7 @@ final class MenuBarController: NSObject, NSMenuDelegate { : text } - // MARK: - Acciones del menú + // MARK: - Menu actions @objc private func openPanel() { onOpenPanel() } diff --git a/Corner/System/NotificationScheduler.swift b/Corner/System/NotificationScheduler.swift index 8668fdb..956a13e 100644 --- a/Corner/System/NotificationScheduler.swift +++ b/Corner/System/NotificationScheduler.swift @@ -2,27 +2,27 @@ import AppKit import UserNotifications import os -/// Identificadores compartidos entre el scheduler (MainActor) y el delegado -/// (nonisolated): fuera de ambos para que los dos puedan leerlos. +/// Identifiers shared between the scheduler (MainActor) and the delegate +/// (nonisolated): outside both so each of them can read them. private enum NotificationIDs { static let category = "TASK_REMINDER" static let completeAction = "COMPLETE_TASK" } -/// Entrega local de las alarmas por tarea (SPEC §4.1.6). Solo actúa cuando el -/// sync con Recordatorios está apagado: con el sync activo, la alarma viaja en -/// el recordatorio y la entrega Apple (Mac + iPhone + Watch), y notificar aquí -/// duplicaría el aviso. +/// Local delivery of per-task alarms (SPEC §4.1.6). It only acts when +/// Reminders sync is off: with sync on, the alarm travels inside the +/// reminder and Apple delivers it (Mac + iPhone + Watch), so notifying +/// here would duplicate the alert. /// -/// Todas las llamadas a UNUserNotificationCenter usan las variantes con -/// completion handler `@Sendable`, no las `async`: los tipos de -/// UserNotifications no son Sendable en SDKs anteriores y las variantes async -/// no compilan en Xcode 16 (ver DEVELOPMENT.md, compatibilidad de SDK). +/// Every UNUserNotificationCenter call uses the `@Sendable` completion +/// handler variants, not the `async` ones: UserNotifications types are not +/// Sendable on earlier SDKs and the async variants do not compile on +/// Xcode 16 (see DEVELOPMENT.md, SDK compatibility). @MainActor final class NotificationScheduler { - /// true cuando Recordatorios se encarga de avisar. + /// true when Reminders is the one alerting. var isDeliveryDelegated: () -> Bool = { false } - /// Tocar la notificación abre el panel. + /// Tapping the notification opens the panel. var onOpenPanel: (() -> Void)? private let store: TaskStore @@ -42,8 +42,8 @@ final class NotificationScheduler { intentIdentifiers: [], options: []) ]) - // El delegado vive aparte y es Sendable: el center lo invoca desde - // contexto nonisolated y aquí solo se reentra al MainActor. + // The delegate lives apart and is Sendable: the center invokes it from a + // non-isolated context and here we only re-enter the MainActor. let delegate = NotificationDelegate { [weak self] taskID, isCompleteAction in Task { @MainActor in self?.handleResponse(taskID: taskID, isCompleteAction: isCompleteAction) @@ -53,7 +53,7 @@ final class NotificationScheduler { center.delegate = delegate } - /// Reprograma tras cambios; agrupa ráfagas de guardados. + /// Reschedules after changes; coalesces bursts of saves. func scheduleRefresh() { guard !pendingRefresh else { return } pendingRefresh = true @@ -64,8 +64,8 @@ final class NotificationScheduler { } } - /// Cancela todo y reprograma el conjunto vigente: idempotente y sin - /// avisos zombis de tareas ya completadas, borradas o movidas. + /// Cancels everything and reschedules the current set: idempotent and with + /// no zombie alerts from tasks already completed, deleted or moved. func refresh() async { center.removeAllPendingNotificationRequests() guard !isDeliveryDelegated() else { return } @@ -74,7 +74,7 @@ final class NotificationScheduler { now: Date()) guard !pending.isEmpty else { return } guard await ensureAuthorization() else { - log.info("alarmas no programadas: sin permiso de notificaciones") + log.info("alarms not scheduled: no notification permission") return } @@ -96,14 +96,14 @@ final class NotificationScheduler { trigger: UNCalendarNotificationTrigger(dateMatching: components, repeats: false)) center.add(request) { @Sendable error in if let error { - log.error("no se pudo programar la alarma: \(error, privacy: .public)") + log.error("could not schedule the alarm: \(error, privacy: .public)") } } } - log.info("alarmas programadas: \(pending.count)") + log.info("alarms scheduled: \(pending.count)") } - // MARK: - Permiso (solo cuando hay algo que notificar) + // MARK: - Permission (only when there is something to notify) private func ensureAuthorization() async -> Bool { switch await currentStatus() { @@ -116,8 +116,8 @@ final class NotificationScheduler { } } - /// Se extrae solo el estado (enum Sendable): UNNotificationSettings no - /// puede cruzar la frontera de actor. + /// Only the status is extracted (a Sendable enum): UNNotificationSettings + /// cannot cross the actor boundary. private func currentStatus() async -> UNAuthorizationStatus { await withCheckedContinuation { continuation in center.getNotificationSettings { @Sendable settings in @@ -134,7 +134,7 @@ final class NotificationScheduler { } } - // MARK: - Respuesta del usuario + // MARK: - User response private func handleResponse(taskID: UUID, isCompleteAction: Bool) { if isCompleteAction { @@ -145,8 +145,8 @@ final class NotificationScheduler { } } -/// Delegado nonisolated y Sendable: recibe los callbacks del sistema y -/// entrega solo valores Sendable (el UUID de la tarea y qué acción fue). +/// Non-isolated, Sendable delegate: it receives the system callbacks and +/// hands over only Sendable values (the task UUID and which action it was). private final class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate, @unchecked Sendable { private let onResponse: @Sendable (UUID, Bool) -> Void @@ -167,7 +167,7 @@ private final class NotificationDelegate: NSObject, UNUserNotificationCenterDele completionHandler() } - /// Mostrar el aviso aunque Corner esté al frente. + /// Show the alert even when Corner is frontmost. func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: diff --git a/Corner/System/PanelController.swift b/Corner/System/PanelController.swift index fce39d4..8b16ae2 100644 --- a/Corner/System/PanelController.swift +++ b/Corner/System/PanelController.swift @@ -1,11 +1,11 @@ import AppKit import SwiftUI -/// Dueño del ciclo de vida del panel flotante (SPEC §3). -/// No conoce al HotCornerMonitor; el AppDelegate los conecta (ARCHITECTURE §3.4). +/// Owner of the floating panel's lifecycle (SPEC §3). +/// It does not know HotCornerMonitor; the AppDelegate connects them (ARCHITECTURE §3.4). @MainActor final class PanelController { - /// Notifica el cierre (el AppDelegate lo usa para el cooldown del hot corner). + /// Signals the close (the AppDelegate uses it for the hot corner cooldown). var onHide: (() -> Void)? private let store: TaskStore @@ -14,7 +14,7 @@ final class PanelController { private let panelSize = NSSize(width: 320, height: 460) private let margin: CGFloat = 8 private let slideDuration: TimeInterval = 0.18 - /// El cursor debe estar fuera del panel 800 ms para autocierre (SPEC §2). + /// The cursor must stay outside the panel for 800 ms to auto-close (SPEC §2). private let mouseExitInterval: TimeInterval = 0.8 private var clickOutsideMonitors: [Any] = [] @@ -30,7 +30,7 @@ final class PanelController { self.store = store } - // MARK: - Mostrar / ocultar + // MARK: - Show / hide func show(on screen: NSScreen) { guard !isVisible else { return } @@ -40,7 +40,7 @@ final class PanelController { let finalFrame = NSRect(x: screen.frame.minX + margin, y: screen.frame.minY + margin, width: panelSize.width, height: panelSize.height) - // Desliza desde fuera de pantalla por la izquierda (SPEC §3). + // Slides in from off-screen on the left (SPEC §3). var startFrame = finalFrame startFrame.origin.x = screen.frame.minX - panelSize.width @@ -79,22 +79,22 @@ final class PanelController { isVisible ? hide() : show(on: screen) } - // MARK: - Construcción + // MARK: - Construction private func makePanel() -> NSPanel { let panel = FloatingPanel(contentRect: NSRect(origin: .zero, size: panelSize), styleMask: [.borderless, .nonactivatingPanel], backing: .buffered, defer: false) panel.level = .floating - // Visible en todos los Spaces y sobre apps fullscreen (SPEC §3, §6.2). + // Visible on every Space and over fullscreen apps (SPEC §3, §6.2). panel.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary] panel.isOpaque = false panel.backgroundColor = .clear panel.hasShadow = true panel.hidesOnDeactivate = false panel.isMovable = false - // Regla de foco (SPEC §3): solo toma foco cuando el usuario clickea - // el campo de texto; abrir el panel no desactiva la app frontal. + // Focus rule (SPEC §3): it only takes focus when the user clicks the text + // field; opening the panel does not deactivate the frontmost app. panel.becomesKeyOnlyIfNeeded = true let host = NSHostingView(rootView: PanelView(store: store)) @@ -103,24 +103,24 @@ final class PanelController { return panel } - // MARK: - Cierre automático (SPEC §2) + // MARK: - Automatic dismissal (SPEC §2) private func installDismissMonitors() { - // Clic fuera de nuestra app (otras apps, escritorio): cerrar. + // A click outside our app (other apps, the desktop): close. let global = NSEvent.addGlobalMonitorForEvents(matching: [.leftMouseDown, .rightMouseDown]) { _ in MainActor.assumeIsolated { PanelAccess.shared?.hide() } } - // Clics dentro de nuestra app: NUNCA cierran. Las únicas ventanas - // propias además del panel son UI colgada de él (popovers del editor - // de categorías, menús contextuales) — tratarlas como "fuera" derribaba - // el panel a media edición. Aquí solo se gestiona el foco. + // Clicks inside our app NEVER close it. The only windows of our own + // besides the panel are UI hanging off it (category editor popovers, + // context menus) — treating those as "outside" tore the panel down + // mid-edit. Only focus is handled here. let local = NSEvent.addLocalMonitorForEvents(matching: [.leftMouseDown, .rightMouseDown]) { event in MainActor.assumeIsolated { guard let controller = PanelAccess.shared else { return } if event.window === controller.panel, controller.panel?.isKeyWindow == false { - // SwiftUI dentro de un panel no-activante no siempre pide - // el foco solo: clic dentro del panel = foco de teclado - // (sin activar nuestra app; la app de abajo sigue frontal). + // SwiftUI inside a non-activating panel does not always ask for focus + // on its own: a click inside the panel means keyboard focus + // (without activating our app; the app below stays frontmost). controller.panel?.makeKey() } } @@ -128,10 +128,10 @@ final class PanelController { } clickOutsideMonitors = [global as Any, local as Any].compactMap { $0 } - // Esc: cierra el panel solo si el evento es del panel; si es de un - // popover, AppKit cierra el popover y el panel queda en paz. Con un - // campo de texto activo, Esc es para el campo (cancelar edición / - // limpiar) — la segunda Esc, ya sin foco, cierra el panel (SPEC §2). + // Esc: closes the panel only if the event belongs to the panel; if it + // comes from a popover, AppKit closes the popover and the panel is left + // alone. With a text field active, Esc belongs to the field (cancel edit, + // clear) — the second Esc, with no focus, closes the panel (SPEC §2). escMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in let handled = MainActor.assumeIsolated { () -> Bool in guard let controller = PanelAccess.shared, @@ -144,14 +144,14 @@ final class PanelController { return handled ? nil : event } - // Cursor fuera del panel 800 ms, solo si no se está escribiendo. + // Cursor outside the panel for 800 ms, only when not typing. let timer = Timer(timeInterval: 0.2, repeats: true) { _ in MainActor.assumeIsolated { PanelAccess.shared?.checkMouseExit() } } RunLoop.main.add(timer, forMode: .common) mouseExitTimer = timer - // Cambio de Space (SPEC §6.7). + // Space change (SPEC §6.7). spaceObserver = NSWorkspace.shared.notificationCenter.addObserver( forName: NSWorkspace.activeSpaceDidChangeNotification, object: nil, queue: .main @@ -159,7 +159,7 @@ final class PanelController { MainActor.assumeIsolated { PanelAccess.shared?.hide() } } - // Bloqueo de pantalla (SPEC §2). + // Screen lock (SPEC §2). lockObserver = DistributedNotificationCenter.default().addObserver( forName: Notification.Name("com.apple.screenIsLocked"), object: nil, queue: .main @@ -190,11 +190,11 @@ final class PanelController { private func checkMouseExit() { guard let panel, panel.isVisible else { return } - // Si el usuario está escribiendo (panel es key), no cerrar solo (SPEC §2). + // If the user is typing (the panel is key), do not auto-close (SPEC §2). guard !panel.isKeyWindow else { mouseOutsideSince = nil; return } - // Con un popover o menú del panel abierto (ventana hija nuestra con - // foco, o hijas directas), el cursor "fuera del panel" es interacción - // legítima: no autocerrar. + // With a popover or menu of the panel open (a child window of ours with + // focus, or direct children), the cursor being "outside the panel" is + // legitimate interaction: do not auto-close. if let key = NSApp.keyWindow, key !== panel { mouseOutsideSince = nil; return } if !(panel.childWindows?.isEmpty ?? true) { mouseOutsideSince = nil; return } @@ -208,8 +208,8 @@ final class PanelController { } } -/// Referencia débil para que los closures de monitores/timers (no aislados) -/// reentren al MainActor sin capturar self. +/// Weak reference so the monitor/timer closures (non-isolated) re-enter +/// the MainActor without capturing self. @MainActor private enum PanelAccess { static weak var shared: PanelController? diff --git a/Corner/System/QuickCaptureController.swift b/Corner/System/QuickCaptureController.swift index 2ffa124..c8b9669 100644 --- a/Corner/System/QuickCaptureController.swift +++ b/Corner/System/QuickCaptureController.swift @@ -1,16 +1,16 @@ import AppKit import SwiftUI -/// Captura rápida (SPEC §2): campo flotante para soltar una tarea a Hoy -/// sin abrir el panel. Enter agrega y cierra; Esc o clic fuera descarta. +/// Quick capture (SPEC §2): a floating field to drop a task into Today +/// without opening the panel. Enter adds and closes; Esc or a click outside discards. @MainActor final class QuickCaptureController { private let store: TaskStore private var panel: NSPanel? private var clickMonitors: [Any] = [] - /// Alto con margen para 3 líneas; la tarjeta SwiftUI se ancla arriba y el - /// resto del frame es transparente (el fondo del panel es clear). + /// Height with room for 3 lines; the SwiftUI card is anchored at the top + /// and the rest of the frame is transparent (the panel background is clear). private let size = NSSize(width: 400, height: 130) var isVisible: Bool { panel?.isVisible ?? false } @@ -42,20 +42,20 @@ final class QuickCaptureController { }, onCancel: { [weak self] in self?.hide() } ) - // Tarjeta anclada arriba; el crecimiento (1→3 líneas) ocupa el - // espacio transparente inferior sin mover la ventana. + // Card anchored at the top; growing (1→3 lines) uses the transparent + // space below without moving the window. let anchored = VStack { view; Spacer(minLength: 0) }.frame(width: size.width) let host = NSHostingView(rootView: AnyView(anchored)) host.frame = NSRect(origin: .zero, size: size) panel.contentView = host - // Centrado horizontal, en el tercio superior (SPEC §2). + // Horizontally centered, in the upper third (SPEC §2). let frame = screen.frame panel.setFrameOrigin(NSPoint(x: frame.midX - size.width / 2, y: frame.minY + frame.height * 0.65)) self.panel = panel panel.orderFrontRegardless() - panel.makeKey() // el campo necesita teclado de inmediato + panel.makeKey() // the field needs the keyboard immediately installClickOutsideMonitors() } @@ -84,8 +84,8 @@ final class QuickCaptureController { } } -/// Referencia débil para que los closures de monitores (no aislados) -/// reentren al MainActor sin capturar self. +/// Weak reference so the monitor closures (non-isolated) re-enter the +/// MainActor without capturing self. @MainActor private enum QuickCaptureAccess { static weak var shared: QuickCaptureController? diff --git a/Corner/System/ReminderSync.swift b/Corner/System/ReminderSync.swift index 44dfcbf..5be8835 100644 --- a/Corner/System/ReminderSync.swift +++ b/Corner/System/ReminderSync.swift @@ -2,9 +2,9 @@ import AppKit import EventKit import os -/// Sincronización bidireccional con la lista "Corner" de Recordatorios -/// (SPEC §8). Opt-in; la política de convergencia vive en SyncPlanner -/// (dominio puro); aquí solo se traduce entre EventKit y el store. +/// Two-way sync with the "Corner" list in Reminders (SPEC §8). Opt-in; +/// the convergence policy lives in SyncPlanner (pure domain); here we only +/// translate between EventKit and the store. @MainActor final class ReminderSync { enum ToggleResult { @@ -26,18 +26,18 @@ final class ReminderSync { init(store: TaskStore, defaults: UserDefaults = .standard) { self.store = store self.defaults = defaults - // El fan-out de onDidSave lo hace el AppDelegate (composition root): - // el sync no es el único interesado en los guardados. + // The onDidSave fan-out is done by the AppDelegate (composition root): + // sync is not the only party interested in saves. } - /// Al arrancar con el sync ya activo. + /// When starting up with sync already enabled. func start() { guard isEnabled else { return } observeChanges() scheduleSync() } - /// Alterna el sync desde el menú. Pedir permiso solo al activar. + /// Toggles sync from the menu. Ask for permission only when enabling. func toggle() async -> ToggleResult { if isEnabled { defaults.set(false, forKey: Self.enabledKey) @@ -53,7 +53,7 @@ final class ReminderSync { return .enabled } - // MARK: - Disparadores + // MARK: - Triggers private func observeChanges() { guard changeObserver == nil else { return } @@ -65,7 +65,7 @@ final class ReminderSync { ReminderSyncAccess.shared = self } - /// Debounce de 1 s: agrupa ráfagas de guardados/notificaciones. + /// 1 s debounce: coalesces bursts of saves/notifications. func scheduleSync() { guard isEnabled, !pendingSync else { return } pendingSync = true @@ -78,11 +78,11 @@ final class ReminderSync { // MARK: - Sync - /// Listas gestionadas: la general "Corner" + una por categoría (SPEC §8 v2.1). + /// Managed lists: the general "Corner" one + one per category (SPEC §8 v2.1). private struct ManagedLists { var general: EKCalendar var byCategory: [UUID: EKCalendar] - /// categoría (nil = sin categoría) → calendarIdentifier, para el planner. + /// category (nil = uncategorized) → calendarIdentifier, for the planner. var mapping: [UUID?: String] var all: [EKCalendar] } @@ -90,17 +90,17 @@ final class ReminderSync { func syncNow() async { guard isEnabled else { return } guard await ensureAccess() else { - log.error("sync omitido: sin permiso de Recordatorios (estado \(EKEventStore.authorizationStatus(for: .reminder).rawValue))") + log.error("sync skipped: no Reminders permission (status \(EKEventStore.authorizationStatus(for: .reminder).rawValue))") return } - // Todo el ciclo con el candado anti-eco: ensureLists también guarda - // (ids de lista en categorías) y no debe re-disparar el sync. + // The whole cycle runs under the anti-echo lock: ensureLists also saves + // (list ids on categories) and must not re-trigger the sync. store.isApplyingRemoteChanges = true defer { store.isApplyingRemoteChanges = false } do { let lists = try ensureLists() - // Huérfanas incluidas en el fetch: sus recordatorios migran a la - // general (no están en el mapping) y la lista vacía se limpia. + // Orphans included in the fetch: their reminders migrate to the general + // list (they are not in the mapping) and the empty list is cleaned up. let orphans = orphanLists(excluding: lists) let remote = await fetchSnapshots(in: lists.all + orphans) let actions = SyncPlanner.plan(local: store.syncSnapshot(), @@ -111,9 +111,9 @@ final class ReminderSync { } if !actions.isEmpty { try eventStore.commit() } try cleanUpEmptyOrphans(orphans, snapshots: remote) - if !actions.isEmpty { log.info("sync: \(actions.count) acciones aplicadas") } + if !actions.isEmpty { log.info("sync: \(actions.count) actions applied") } } catch { - log.error("sync falló: \(error, privacy: .public)") + log.error("sync failed: \(error, privacy: .public)") } } @@ -146,7 +146,7 @@ final class ReminderSync { } } - /// Borra el recordatorio vinculado al borrar la tarea en Corner (SPEC §8). + /// Deletes the linked reminder when the task is deleted in Corner (SPEC §8). func deleteRemote(reminderID: String) { guard isEnabled, let reminder = eventStore.calendarItem(withIdentifier: reminderID) as? EKReminder @@ -154,20 +154,20 @@ final class ReminderSync { try? eventStore.remove(reminder, commit: true) } - // MARK: - Traducción EventKit ↔ dominio + // MARK: - EventKit ↔ domain translation private func write(_ task: TaskItem, into reminder: EKReminder, lists: ManagedLists) { reminder.title = task.text let calendar = Calendar.current var due = calendar.dateComponents([.year, .month, .day], from: task.assignedDay) - // La hora del aviso va en la fecha de vencimiento + una alarma, que es - // como la propia app Recordatorios modela "avísame a las X" (SPEC §4.1.6). + // The alert time goes in the due date + an alarm, which is how the + // Reminders app itself models "remind me at X" (SPEC §4.1.6). if let minutes = task.remindMinutes { due.hour = minutes / 60 due.minute = minutes % 60 } reminder.dueDateComponents = due - // Reemplazo total: quitar la hora en Corner también la quita en el iPhone. + // Full replacement: clearing the time in Corner also clears it on the iPhone. for alarm in reminder.alarms ?? [] { reminder.removeAlarm(alarm) } if let minutes = task.remindMinutes { let fire = ReminderSchedule.fireDate(day: task.assignedDay, @@ -176,13 +176,13 @@ final class ReminderSync { } reminder.isCompleted = task.isDone if task.isDone { reminder.completionDate = task.completedAt ?? Date() } - // Lista según la categoría; reasignar el calendar mueve el recordatorio. + // List according to the category; reassigning the calendar moves the reminder. reminder.calendar = task.category.flatMap { lists.byCategory[$0.id] } ?? lists.general } - /// Con firma ad-hoc, cada build es una identidad nueva para TCC: el - /// permiso puede volver a "no determinado" tras recompilar. Se re-pide - /// cuando haga falta en vez de fallar en silencio. + /// With ad-hoc signing every build is a new identity for TCC: the + /// permission can go back to "not determined" after recompiling. It is + /// re-requested when needed instead of failing silently. private func ensureAccess() async -> Bool { switch EKEventStore.authorizationStatus(for: .reminder) { case .fullAccess: return true @@ -191,16 +191,16 @@ final class ReminderSync { } } - /// API de permiso vía callback + continuation: la variante async "envía" - /// el EKEventStore no-Sendable entre actores (error de compilación en - /// Swift 6 estricto y trap en runtime). + /// Permission API via callback + continuation: the async variant "sends" + /// the non-Sendable EKEventStore across actors (a compile error under + /// strict Swift 6 and a trap at runtime). private func requestAccess() async -> Bool { await withCheckedContinuation { continuation in - // @Sendable explícito: el completion llega en cola de fondo; sin - // la anotación, compiladores como el de Xcode 16.2 emiten la - // verificación de MainActor y crashea (SIGTRAP) — mismo patrón - // que fetchSnapshots. El binario local (Xcode 26) no lo emitía: - // por eso solo crasheaba la build de CI. + // Explicit @Sendable: the completion arrives on a background queue; + // without the annotation, compilers such as Xcode 16.2's emit the + // MainActor check and it crashes (SIGTRAP) — same pattern as + // fetchSnapshots. The local binary (Xcode 26) did not emit it: + // that is why only the CI build crashed. eventStore.requestFullAccessToReminders { @Sendable granted, _ in continuation.resume(returning: granted) } @@ -210,11 +210,11 @@ final class ReminderSync { private func fetchSnapshots(in calendars: [EKCalendar]) async -> [RemoteReminder] { let predicate = eventStore.predicateForReminders(in: calendars) return await withCheckedContinuation { continuation in - // @Sendable explícito: EventKit invoca este closure en una cola de - // fondo; sin la anotación se infiere aislado al MainActor y la - // verificación dinámica de aislamiento crashea (SIGTRAP). + // Explicit @Sendable: EventKit invokes this closure on a background + // queue; without the annotation it is inferred as MainActor-isolated and + // the dynamic isolation check crashes (SIGTRAP). eventStore.fetchReminders(matching: predicate) { @Sendable reminders in - // Convertir a structs Sendable aquí mismo: EKReminder no cruza actores. + // Convert to Sendable structs right here: EKReminder does not cross actors. let snapshots = (reminders ?? []).map { reminder in RemoteReminder( id: reminder.calendarItemIdentifier, @@ -226,7 +226,7 @@ final class ReminderSync { modifiedAt: reminder.lastModifiedDate ?? reminder.creationDate ?? .distantPast, listID: reminder.calendar?.calendarIdentifier ?? "", - // Hora presente en el vencimiento = alarma (SPEC §4.1.6). + // A time present in the due date = an alarm (SPEC §4.1.6). remindMinutes: reminder.dueDateComponents.flatMap { comps in guard let hour = comps.hour, let minute = comps.minute else { return nil } @@ -239,15 +239,15 @@ final class ReminderSync { } } - // MARK: - Gestión de listas (SPEC §8 v2.1) + // MARK: - List management (SPEC §8 v2.1) private static let generalTitle = "Corner" private static let categoryPrefix = "Corner — " - /// Garantiza la lista general + una por categoría; renombra si la - /// categoría cambió de nombre; registra los ids en las categorías. + /// Guarantees the general list + one per category; renames when the + /// category was renamed; records the ids on the categories. private func ensureLists() throws -> ManagedLists { - // Un EKEventStore recién creado puede tener las fuentes sin cargar. + // A freshly created EKEventStore may still have its sources unloaded. eventStore.refreshSourcesIfNecessary() let source = try resolveSource() @@ -263,7 +263,7 @@ final class ReminderSync { let list = try ensureList(titled: title, knownID: category.reminderListID, source: source) - if list.title != title { // la categoría fue renombrada en Corner + if list.title != title { // the category was renamed in Corner list.title = title try eventStore.saveCalendar(list, commit: true) } @@ -294,9 +294,9 @@ final class ReminderSync { return calendar } - /// Fuente válida o nada: la lista debe pertenecer a una cuenta real - /// (iCloud/CalDAV primero, local después). sources.first a secas puede - /// ser una fuente sin cuenta ("El calendario no está asignado…"). + /// A valid source or nothing: the list must belong to a real account + /// (iCloud/CalDAV first, local afterwards). A bare sources.first can be + /// an account-less source ("The calendar is not assigned to an account…"). private func resolveSource() throws -> EKSource { if let source = eventStore.defaultCalendarForNewReminders()?.source ?? eventStore.sources.first(where: { $0.sourceType == .calDAV }) @@ -307,13 +307,13 @@ final class ReminderSync { let sources = eventStore.sources .map { "\($0.title)(\($0.sourceType.rawValue))" } .joined(separator: ", ") - log.error("sin fuente: auth=\(status.rawValue) fuentes=[\(sources, privacy: .public)]") + log.error("no source: auth=\(status.rawValue) sources=[\(sources, privacy: .public)]") throw NSError(domain: "com.andreetorres.corner", code: 1, userInfo: [ NSLocalizedDescriptionKey: "Sin fuente de Recordatorios disponible (¿hay una cuenta de iCloud o local activa?)" ]) } - /// Listas "Corner — X" de categorías que ya no existen. + /// "Corner — X" lists of categories that no longer exist. private func orphanLists(excluding lists: ManagedLists) -> [EKCalendar] { let managed = Set(lists.all.map(\.calendarIdentifier)) return eventStore.calendars(for: .reminder).filter { @@ -321,20 +321,20 @@ final class ReminderSync { } } - /// Borra listas huérfanas ya vacías (sus recordatorios migraron a la - /// general en syncs anteriores al no estar en el mapping). + /// Deletes orphan lists that are already empty (their reminders migrated to + /// the general list in earlier syncs by not being in the mapping). private func cleanUpEmptyOrphans(_ orphans: [EKCalendar], snapshots: [RemoteReminder]) throws { for orphan in orphans where !snapshots.contains(where: { $0.listID == orphan.calendarIdentifier }) { try eventStore.removeCalendar(orphan, commit: true) - log.info("lista huérfana eliminada: \(orphan.title, privacy: .public)") + log.info("orphan list deleted: \(orphan.title, privacy: .public)") } } } -/// Referencia débil para que el closure de notificación (no aislado) -/// reentre al MainActor sin capturar self. +/// Weak reference so the notification closure (non-isolated) re-enters +/// the MainActor without capturing self. @MainActor private enum ReminderSyncAccess { static weak var shared: ReminderSync? diff --git a/Corner/System/UpdateChecker.swift b/Corner/System/UpdateChecker.swift index c4b6e44..4052bc3 100644 --- a/Corner/System/UpdateChecker.swift +++ b/Corner/System/UpdateChecker.swift @@ -1,8 +1,8 @@ import AppKit -/// "Buscar actualizaciones…" (SPEC §5): consulta manual al último release de -/// GitHub. Solo toca la red cuando el usuario lo pide — sin checks -/// automáticos ni telemetría (README: privacidad). +/// "Check for updates…" (SPEC §5): a manual query for GitHub's latest +/// release. It only touches the network when the user asks — no automatic +/// checks and no telemetry (README: privacy). @MainActor final class UpdateChecker { private static let releasesAPI = diff --git a/Corner/UI/CategoryChips.swift b/Corner/UI/CategoryChips.swift index ab0baff..f24cd2a 100644 --- a/Corner/UI/CategoryChips.swift +++ b/Corner/UI/CategoryChips.swift @@ -1,14 +1,14 @@ import SwiftUI -/// Fila de chips de filtro por categoría (SPEC §4.1): "Todas", una chip por -/// categoría y "+" para crear. Clic derecho en una chip: editar o eliminar. +/// Row of category filter chips (SPEC §4.1): "All", one chip per category +/// and "+" to create one. Right-click a chip to edit or delete it. struct CategoryChips: View { @Bindable var store: TaskStore - /// nil = "Todas". + /// nil = "All". @Binding var selectedID: UUID? @State private var showingCreate = false - /// Categoría en edición; su popover se ancla a la chip que lo abrió (SPEC §4.1). + /// Category being edited; its popover anchors to the chip that opened it (SPEC §4.1). @State private var editingCategory: TaskCategory? @State private var draftName = "" @State private var draftColor = CategoryColor.palette[4] @@ -27,8 +27,8 @@ struct CategoryChips: View { selected: selectedID == category.id) { selectedID = category.id } - // Doble clic también abre el editor (SPEC §4.1); el primer - // clic selecciona la chip, lo cual es inofensivo. + // A double click also opens the editor (SPEC §4.1); the first click + // selects the chip, which is harmless. .simultaneousGesture(TapGesture(count: 2).onEnded { beginEdit(category) }) @@ -60,8 +60,8 @@ struct CategoryChips: View { // MARK: - Chip - /// La chip seleccionada se tiñe del color de SU categoría ("Todas" usa - /// el acento de marca). + /// The selected chip is tinted with ITS category color ("All" uses the + /// brand accent). private func chip(name: String, colorHex: String?, selected: Bool, action: @escaping () -> Void) -> some View { let tint = colorHex.map { Color(hex: $0) } ?? .cornerAccent @@ -86,7 +86,7 @@ struct CategoryChips: View { .buttonStyle(.plain) } - // MARK: - Formulario crear/editar + // MARK: - Create/edit form private func beginCreate() { editingCategory = nil @@ -101,8 +101,8 @@ struct CategoryChips: View { editingCategory = category } - /// Binding no-nil solo para la chip cuya categoría está en edición, - /// de modo que el popover se ancle a ESA chip. + /// Non-nil binding only for the chip whose category is being edited, so + /// that the popover anchors to THAT chip. private func editBinding(for category: TaskCategory) -> Binding { Binding( get: { editingCategory?.id == category.id ? editingCategory : nil }, diff --git a/Corner/UI/CategoryColor.swift b/Corner/UI/CategoryColor.swift index 0136c71..f4fbeab 100644 --- a/Corner/UI/CategoryColor.swift +++ b/Corner/UI/CategoryColor.swift @@ -1,7 +1,7 @@ import SwiftUI -/// Paleta fija de colores para categorías y conversión hex → Color. -/// El dominio guarda solo el string hex; los tipos de UI viven aquí. +/// Fixed color palette for categories and hex → Color conversion. +/// The domain stores only the hex string; UI types live here. enum CategoryColor { static let palette = [ "#FF3B30", "#FF9500", "#FFCC00", "#34C759", @@ -10,12 +10,12 @@ enum CategoryColor { } extension Color { - /// Acento de marca de Corner (ámbar del ícono): chip "Todas", día actual, - /// indicador de arrastrada. NO se usa para "completado". + /// Corner brand accent (the icon amber): "All" chip, current day, + /// rolled-over indicator. NOT used for "done". static let cornerAccent = Color(hex: "#FF9500") - /// Verde semántico de "hecho" (checkbox y progreso): el significado - /// universal de completado (SPEC §3). + /// Semantic green for "done" (checkbox and progress): the universal + /// meaning of completion (SPEC §3). static let cornerDone = Color(hex: "#34C759") init(hex: String) { diff --git a/Corner/UI/NewTaskField.swift b/Corner/UI/NewTaskField.swift index 33ad498..01fdca6 100644 --- a/Corner/UI/NewTaskField.swift +++ b/Corner/UI/NewTaskField.swift @@ -1,14 +1,14 @@ import SwiftUI -/// Campo "Agregar tarea…". El borrador se descarta si el panel se cierra -/// sin confirmar (SPEC §6.9): el estado vive aquí y muere con la vista. +/// "Add task…" field. The draft is discarded if the panel closes without +/// confirming (SPEC §6.9): the state lives here and dies with the view. struct NewTaskField: View { - /// LocalizedStringKey: un String variable pasaría verbatim sin traducirse. + /// LocalizedStringKey: a String variable would pass through verbatim, untranslated. var placeholder: LocalizedStringKey = "Agregar tarea…" - /// Tomar el foco al aparecer (campo de subtareas: se expande para escribir). + /// Take focus on appear (subtask field: it expands ready to type). var autofocus: Bool = false - /// Esc: además de limpiar y soltar el foco, avisa a quien lo muestre - /// (para que un grupo de subtareas vacío pueda cerrarse). + /// Esc: besides clearing and releasing focus, it notifies whoever shows it + /// (so an empty subtask group can close itself). var onCancel: (() -> Void)? = nil let onSubmit: (String) -> Void @@ -19,8 +19,8 @@ struct NewTaskField: View { HStack(spacing: 6) { Image(systemName: "plus.circle.fill") .foregroundStyle(.secondary) - // axis .vertical: el texto largo envuelve (hasta 3 líneas visibles) - // en vez de desplazarse fuera de vista mientras se escribe. + // axis .vertical: long text wraps (up to 3 visible lines) instead of + // scrolling out of sight while typing. TextField(placeholder, text: $text, axis: .vertical) .lineLimit(1...3) .textFieldStyle(.plain) @@ -30,15 +30,15 @@ struct NewTaskField: View { text = "" } .onExitCommand { - // Esc limpia y suelta el foco; la segunda Esc cierra el panel. + // Esc clears and releases focus; the second Esc closes the panel. text = "" focused = false onCancel?() } .onChange(of: focused) { wasFocused, isFocused in - // Perder el foco con el campo vacío = el usuario se - // arrepintió: avisar para que quien lo muestre lo retire - // (un campo vacío colgando no debe quedarse, SPEC §4.2). + // Losing focus with an empty field means the user changed their mind: + // notify so whoever shows it can take it away (an empty field left + // hanging must not stay, SPEC §4.2). if wasFocused, !isFocused, text.isEmpty { onCancel?() } } .onAppear { diff --git a/Corner/UI/PanelView.swift b/Corner/UI/PanelView.swift index 1b7ceae..61e6de4 100644 --- a/Corner/UI/PanelView.swift +++ b/Corner/UI/PanelView.swift @@ -1,13 +1,13 @@ import SwiftUI -/// Contenedor del panel (SPEC §3): toggle Hoy/Semana, campo nueva tarea, -/// vista activa y pie con contador. No sabe que vive en un NSPanel. +/// Panel container (SPEC §3): Today/Week toggle, new task field, the active +/// view and a footer with the counter. It does not know it lives in an NSPanel. struct PanelView: View { enum Tab: CaseIterable, Identifiable { case today, week var id: Self { self } - /// LocalizedStringKey para que el picker se localice (un rawValue - /// String pasaría verbatim, sin traducción). + /// LocalizedStringKey so the picker gets localized (a String rawValue + /// would pass through verbatim, untranslated). var label: LocalizedStringKey { switch self { case .today: "Hoy" @@ -19,8 +19,8 @@ struct PanelView: View { @Bindable var store: TaskStore @State private var tab: Tab = .today - /// El filtro vive en el store (persiste entre aperturas del panel y - /// entre sesiones); la vista solo lo refleja (SPEC §4.1). + /// The filter lives in the store (it persists across panel openings and + /// across sessions); the view only reflects it (SPEC §4.1). private var filterCategory: TaskCategory? { store.categories.first { $0.id == store.filterID } } @@ -45,7 +45,7 @@ struct PanelView: View { CategoryChips(store: store, selectedID: $store.filterID) NewTaskField { text in - // La tarea nueva hereda el filtro activo. + // A new task inherits the active filter. store.add(text, to: store.today, category: filterCategory) } @@ -69,7 +69,7 @@ struct PanelView: View { ) } - /// Tip de primera ejecución (SPEC §2): persiste hasta descartarse. + /// First-run tip (SPEC §2): stays until dismissed. private var welcomeTip: some View { HStack(spacing: 8) { Image(systemName: "inset.filled.bottomleft.rectangle") @@ -97,8 +97,8 @@ struct PanelView: View { let done = todays.filter(\.isDone).count return VStack(spacing: 5) { if !todays.isEmpty { - // Barra propia: la nativa solo se tiñe con la ventana activa, - // y este panel es no-activante por diseño (siempre saldría gris). + // Custom bar: the native one is only tinted while the window is active, + // and this panel is non-activating by design (it would always look gray). GeometryReader { geo in ZStack(alignment: .leading) { Capsule().fill(.quaternary) @@ -125,7 +125,7 @@ struct PanelView: View { }() private static func todayLabel(_ day: Date) -> String { - // Solo la primera letra: "Miércoles, 15 de julio" (no "15 De Julio"). + // Only the first letter: "Miércoles, 15 de julio" (not "15 De Julio"). let raw = todayFormatter.string(from: day) return raw.prefix(1).localizedUppercase + raw.dropFirst() } diff --git a/Corner/UI/QuickCaptureView.swift b/Corner/UI/QuickCaptureView.swift index 61e05e7..9312465 100644 --- a/Corner/UI/QuickCaptureView.swift +++ b/Corner/UI/QuickCaptureView.swift @@ -1,6 +1,6 @@ import SwiftUI -/// Campo de captura rápida (SPEC §2): una línea, Enter agrega, Esc descarta. +/// Quick capture field (SPEC §2): one line, Enter adds, Esc discards. struct QuickCaptureView: View { let onSubmit: (String) -> Void let onCancel: () -> Void @@ -13,8 +13,8 @@ struct QuickCaptureView: View { Image(systemName: "plus.circle.fill") .font(.title3) .foregroundStyle(Color.cornerAccent) - // axis .vertical: el texto largo envuelve (hasta 3 líneas) en vez - // de desplazarse fuera de vista (SPEC §6.8). + // axis .vertical: long text wraps (up to 3 lines) instead of scrolling + // out of sight (SPEC §6.8). TextField("Nueva tarea para hoy…", text: $text, axis: .vertical) .lineLimit(1...3) .textFieldStyle(.plain) diff --git a/Corner/UI/TaskGroupRows.swift b/Corner/UI/TaskGroupRows.swift index 9e80176..5aaa66d 100644 --- a/Corner/UI/TaskGroupRows.swift +++ b/Corner/UI/TaskGroupRows.swift @@ -1,8 +1,8 @@ import SwiftUI -/// Fila de tarea de nivel superior + sus subtareas expandidas (SPEC §4.2). -/// Compartido por TodayView y WeekView; el estado expandido vive en la vista -/// dueña y es efímero (se colapsa al reabrir el panel). +/// A top-level task row + its expanded subtasks (SPEC §4.2). +/// Shared by TodayView and WeekView; the expanded state lives in the owning +/// view and is ephemeral (it collapses when the panel reopens). struct TaskGroupRows: View { @Bindable var store: TaskStore let task: TaskItem @@ -25,13 +25,13 @@ struct TaskGroupRows: View { ? nil : (subtasks.filter(\.isDone).count, subtasks.count), isExpanded: isExpanded, - // El chevron también aparece en un grupo expandido pero aún vacío: - // si no, tocar "+" y no escribir nada dejaba el campo abierto sin - // manera de cerrarlo (SPEC §4.2). + // The chevron also shows in a group that is expanded but still empty: + // otherwise tapping "+" and typing nothing left the field open with no + // way to close it (SPEC §4.2). onToggleExpand: (subtasks.isEmpty && !isExpanded) ? nil : { toggleExpanded() }, onAddSubtask: { withAnimation(.snappy) { - // Segundo toque en un grupo abierto y vacío = cerrarlo. + // A second tap on an open, empty group closes it. if isExpanded, subtasks.isEmpty { expanded.remove(task.id) } else { @@ -63,8 +63,8 @@ struct TaskGroupRows: View { .moveDisabled(true) } NewTaskField(placeholder: "Agregar paso…", autofocus: true, onCancel: { - // Esc en un grupo que sigue vacío lo colapsa; con subtareas - // ya creadas, Esc solo suelta el campo (SPEC §4.2). + // Esc on a group that is still empty collapses it; with subtasks already + // created, Esc only releases the field (SPEC §4.2). if store.subtasks(of: task).isEmpty { withAnimation(.snappy) { expanded.remove(task.id) } } @@ -87,9 +87,9 @@ struct TaskGroupRows: View { } } - // MARK: - Opciones de "Recordarme" (SPEC §4.1.6) + // MARK: - "Remind me" options (SPEC §4.1.6) - /// Relativas (solo si la tarea es de hoy) + horas fijas que aún no pasaron. + /// Relative ones (only if the task is today) + fixed times not yet passed. private static func reminderOptions(for day: Date, now: Date = Date()) -> [(label: String, minutes: Int)] { var options: [(label: String, minutes: Int)] = [] @@ -114,7 +114,7 @@ struct TaskGroupRows: View { } } - // MARK: - Etiquetas de "Mover a…" (SPEC §4.1.5) + // MARK: - "Move to…" labels (SPEC §4.1.5) private static let destinationFormatter: DateFormatter = { let formatter = DateFormatter() @@ -123,8 +123,8 @@ struct TaskGroupRows: View { return formatter }() - /// El destino más próximo siempre es mañana → "Mañana"; el resto por - /// nombre ("Viernes 18"). Se excluye el día donde la tarea ya vive. + /// The closest destination is always tomorrow → "Mañana"; the rest by name + /// ("Viernes 18"). The day the task already lives on is excluded. private static func labeledDestinations(_ days: [Date], excluding current: Date) -> [(label: String, day: Date)] { days.enumerated().map { index, day in diff --git a/Corner/UI/TaskRow.swift b/Corner/UI/TaskRow.swift index 3228995..6178943 100644 --- a/Corner/UI/TaskRow.swift +++ b/Corner/UI/TaskRow.swift @@ -1,8 +1,8 @@ import SwiftUI -/// Una fila de tarea (SPEC §4): checkbox, texto (editable con doble clic), -/// reloj ámbar si fue arrastrada, ✕ al hacer hover. Componente puro: -/// recibe datos y closures, sin lógica de fechas ni persistencia. +/// A task row (SPEC §4): checkbox, text (editable with a double click), +/// amber clock if it rolled over, ✕ on hover. Pure component: it receives +/// data and closures, with no date logic or persistence of its own. struct TaskRow: View { let task: TaskItem let showsRolloverDot: Bool @@ -11,16 +11,16 @@ struct TaskRow: View { let onRename: (String) -> Void let onDelete: () -> Void let onSetCategory: (TaskCategory?) -> Void - /// (hechas, total) de subtareas; nil si no tiene (SPEC §4.2). + /// (done, total) subtasks; nil when there are none (SPEC §4.2). var subtaskProgress: (done: Int, total: Int)? = nil var isExpanded: Bool = false var onToggleExpand: (() -> Void)? = nil - /// Presente solo en tareas de nivel superior: habilita "Agregar subtarea". + /// Present only on top-level tasks: enables "Add subtask". var onAddSubtask: (() -> Void)? = nil - /// Destinos de "Mover a…" con su etiqueta; vacío = sin menú (SPEC §4.1.5). + /// "Move to…" destinations with their label; empty = no menu (SPEC §4.1.5). var moveDestinations: [(label: String, day: Date)] = [] var onMoveToDay: ((Date) -> Void)? = nil - /// Opciones del submenú "Recordarme"; vacío = sin menú (SPEC §4.1.6). + /// "Remind me" submenu options; empty = no menu (SPEC §4.1.6). var reminderOptions: [(label: String, minutes: Int)] = [] var onSetReminder: ((Int?) -> Void)? = nil @@ -53,7 +53,7 @@ struct TaskRow: View { .accessibilityValue(task.text) if showsRolloverDot { - // Ícono en vez de punto: no compite con los puntos de categoría. + // An icon instead of a dot: it does not compete with the category dots. Image(systemName: "clock.arrow.circlepath") .font(.caption2) .foregroundStyle(Color.cornerAccent) @@ -76,8 +76,8 @@ struct TaskRow: View { .focused($editFocused) .onSubmit { commitEdit() } .onExitCommand { - // Esc cancela la edición descartando el borrador; - // isEditing=false primero anula el commit por pérdida de foco. + // Esc cancels the edit discarding the draft; setting isEditing=false + // first cancels the commit that focus loss would trigger. isEditing = false editFocused = false } @@ -90,7 +90,7 @@ struct TaskRow: View { .truncationMode(.tail) .strikethrough(task.isDone, color: .secondary) .foregroundStyle(task.isDone ? .secondary : .primary) - .help(task.text) // texto completo como tooltip al hacer hover + .help(task.text) // full text as a tooltip on hover .onTapGesture(count: 2) { draft = task.text isEditing = true @@ -191,7 +191,7 @@ struct TaskRow: View { @ViewBuilder private func markableLabel(_ name: String, isCurrent: Bool) -> some View { - // Los menús de macOS no renderizan vistas arbitrarias; el check va como símbolo. + // macOS menus do not render arbitrary views; the check goes as a symbol. if isCurrent { Label(name, systemImage: "checkmark") } else { diff --git a/Corner/UI/TodayView.swift b/Corner/UI/TodayView.swift index fd915fd..79aacbc 100644 --- a/Corner/UI/TodayView.swift +++ b/Corner/UI/TodayView.swift @@ -1,13 +1,13 @@ import SwiftUI -/// Lista de tareas de hoy (SPEC §4): pendientes con orden manual arriba, -/// hechas tachadas al final. ⌘Z deshace el último borrado. +/// Today's task list (SPEC §4): pending in manual order at the top, done +/// struck through at the bottom. ⌘Z undoes the last deletion. struct TodayView: View { @Bindable var store: TaskStore - /// Filtro de categoría activo; nil = todas (SPEC §4.1). + /// Active category filter; nil = all (SPEC §4.1). let filter: TaskCategory? - /// Tareas con subtareas expandidas; efímero por diseño (SPEC §4.2). + /// Tasks with expanded subtasks; ephemeral by design (SPEC §4.2). @State private var expanded: Set = [] var body: some View { @@ -37,7 +37,7 @@ struct TodayView: View { .moveDisabled(task.isDone || filter != nil) } .onMove { source, destination in - // Reordenar solo sin filtro: los índices filtrados no mapean al orden real. + // Reordering only without a filter: filtered indices do not map to the real order. guard filter == nil else { return } store.movePending(in: store.today, from: source, to: destination) } diff --git a/Corner/UI/WeekView.swift b/Corner/UI/WeekView.swift index 9f0b774..33440ca 100644 --- a/Corner/UI/WeekView.swift +++ b/Corner/UI/WeekView.swift @@ -1,14 +1,14 @@ import SwiftUI -/// Semana actual, lunes a domingo, agrupada por día (SPEC §4). -/// Días pasados solo muestran hechas (las pendientes ya migraron). -/// Se puede agregar tarea a hoy y a días futuros. +/// The current week, Monday to Sunday, grouped by day (SPEC §4). +/// Past days only show completed tasks (pending ones already migrated). +/// Tasks can be added to today and to future days. struct WeekView: View { @Bindable var store: TaskStore - /// Filtro de categoría activo; nil = todas (SPEC §4.1). + /// Active category filter; nil = all (SPEC §4.1). let filter: TaskCategory? - /// Tareas con subtareas expandidas; efímero por diseño (SPEC §4.2). + /// Tasks with expanded subtasks; ephemeral by design (SPEC §4.2). @State private var expanded: Set = [] var body: some View { diff --git a/CornerTests/DayClockTests.swift b/CornerTests/DayClockTests.swift index d8e2c7f..cd61d5b 100644 --- a/CornerTests/DayClockTests.swift +++ b/CornerTests/DayClockTests.swift @@ -3,7 +3,7 @@ import Foundation @testable import Corner struct DayClockTests { - // Miércoles 15 de enero de 2025, 14:30. + // Wednesday 15 January 2025, 14:30. private var wednesday: FixedDayClock { var components = DateComponents() components.year = 2025; components.month = 1; components.day = 15 @@ -39,7 +39,7 @@ struct DayClockTests { } } - // MARK: - Destinos de "Mover a…" (SPEC §4.1.5) + // MARK: - "Move to…" destinations (SPEC §4.1.5) private func clock(day: Int) -> FixedDayClock { let cal = Calendar(identifier: .gregorian) @@ -48,21 +48,21 @@ struct DayClockTests { } @Test func midweekDestinationsAreRestOfWeek() { - // Miércoles 15 → jueves a domingo. + // Wednesday 15 → Thursday to Sunday. let destinations = clock(day: 15).moveDestinations() let days = destinations.map { Calendar(identifier: .gregorian).component(.day, from: $0) } #expect(days == [16, 17, 18, 19]) } @Test func saturdayIncludesNextMonday() { - // Sábado 18 → domingo 19 y lunes 20. + // Saturday 18 → Sunday 19 and Monday 20. let days = clock(day: 18).moveDestinations() .map { Calendar(identifier: .gregorian).component(.day, from: $0) } #expect(days == [19, 20]) } @Test func sundayOffersOnlyNextMonday() { - // Domingo 19 → lunes 20 (mañana y lunes próximo coinciden, sin duplicar). + // Sunday 19 → Monday 20 (tomorrow and next Monday coincide, no duplicates). let days = clock(day: 19).moveDestinations() .map { Calendar(identifier: .gregorian).component(.day, from: $0) } #expect(days == [20]) diff --git a/CornerTests/HotCornerLogicTests.swift b/CornerTests/HotCornerLogicTests.swift index 60b4f5b..6e65056 100644 --- a/CornerTests/HotCornerLogicTests.swift +++ b/CornerTests/HotCornerLogicTests.swift @@ -2,8 +2,8 @@ import Testing import Foundation @testable import Corner -/// La máquina de estados del hot corner (SPEC §2): permanencia de 250 ms, -/// cooldown de 1 s, suspensión y multi-monitor. +/// The hot corner state machine (SPEC §2): 250 ms dwell, 1 s cooldown, +/// suspension and multi-monitor. struct HotCornerLogicTests { private let screen = CGRect(x: 0, y: 0, width: 1440, height: 900) private let corner = CGPoint(x: 5, y: 5) @@ -22,8 +22,8 @@ struct HotCornerLogicTests { @Test func leavingZoneResetsDwell() { var logic = HotCornerLogic() _ = logic.poll(location: corner, screenFrame: screen, at: at(0)) - _ = logic.poll(location: center, screenFrame: screen, at: at(0.2)) // salió - // Vuelve a la esquina: la permanencia empieza de cero. + _ = logic.poll(location: center, screenFrame: screen, at: at(0.2)) // left the zone + // Back to the corner: the dwell starts from zero. #expect(logic.poll(location: corner, screenFrame: screen, at: at(0.3)) == .none) #expect(logic.poll(location: corner, screenFrame: screen, at: at(0.4)) == .none) #expect(logic.poll(location: corner, screenFrame: screen, at: at(0.6)) == .trigger) @@ -31,11 +31,11 @@ struct HotCornerLogicTests { @Test func cooldownBlocksRetrigger() { var logic = HotCornerLogic() - logic.resumeAfterCooldown(at: at(0)) // panel recién cerrado - // Dentro del cooldown (1 s): ni acumula permanencia. + logic.resumeAfterCooldown(at: at(0)) // panel just closed + // Within the cooldown (1 s): it does not even accumulate dwell. #expect(logic.poll(location: corner, screenFrame: screen, at: at(0.5)) == .none) #expect(logic.poll(location: corner, screenFrame: screen, at: at(0.9)) == .none) - // Pasado el cooldown, la permanencia arranca de nuevo. + // Past the cooldown, the dwell starts again. #expect(logic.poll(location: corner, screenFrame: screen, at: at(1.1)) == .none) #expect(logic.poll(location: corner, screenFrame: screen, at: at(1.4)) == .trigger) } @@ -48,8 +48,8 @@ struct HotCornerLogicTests { } @Test func secondaryScreenCornerCounts() { - // Monitor secundario a la izquierda: su esquina inferior izquierda - // es la del frame de ESA pantalla (SPEC §6.1). + // Secondary monitor on the left: its bottom-left corner is the one of + // THAT screen's frame (SPEC §6.1). var logic = HotCornerLogic() let secondary = CGRect(x: -1920, y: 0, width: 1920, height: 1080) let itsCorner = CGPoint(x: -1915, y: 4) diff --git a/CornerTests/ReminderScheduleTests.swift b/CornerTests/ReminderScheduleTests.swift index 95e3ea8..61316f4 100644 --- a/CornerTests/ReminderScheduleTests.swift +++ b/CornerTests/ReminderScheduleTests.swift @@ -2,7 +2,7 @@ import Testing import Foundation @testable import Corner -/// Política de alarmas por tarea (SPEC §4.1.6). +/// Per-task alarm policy (SPEC §4.1.6). struct ReminderScheduleTests { private let calendar = Calendar(identifier: .gregorian) @@ -33,10 +33,10 @@ struct ReminderScheduleTests { let now = moment(15, 10) let candidates = [ candidate(minutes: 15 * 60, title: "Futura"), // ✓ - candidate(minutes: 9 * 60, title: "Ya pasó"), // ✗ pasada - candidate(minutes: nil, title: "Sin hora"), // ✗ sin alarma - candidate(minutes: 16 * 60, isDone: true, title: "Hecha"), // ✗ completada - candidate(minutes: 17 * 60, isTopLevel: false, title: "Subtarea"), // ✗ subtarea + candidate(minutes: 9 * 60, title: "Ya pasó"), // ✗ already passed + candidate(minutes: nil, title: "Sin hora"), // ✗ no alarm + candidate(minutes: 16 * 60, isDone: true, title: "Hecha"), // ✗ completed + candidate(minutes: 17 * 60, isTopLevel: false, title: "Subtarea"), // ✗ subtask ] let pending = ReminderSchedule.pending(from: candidates, now: now, calendar: calendar) #expect(pending.map(\.title) == ["Futura"]) @@ -55,7 +55,7 @@ struct ReminderScheduleTests { } @Test func presetsForTodayDropPastHours() { - // 13:00 → solo quedan 15:00, 18:00 y 21:00. + // 13:00 → only 15:00, 18:00 and 21:00 remain. let presets = ReminderSchedule.availablePresets(for: day(15), now: moment(15, 13), calendar: calendar) #expect(presets == [15 * 60, 18 * 60, 21 * 60]) @@ -68,10 +68,10 @@ struct ReminderScheduleTests { } @Test func relativeOffsetStaysWithinTheDay() { - // 22:00 + 1 h = 23:00, válido. + // 22:00 + 1 h = 23:00, valid. #expect(ReminderSchedule.minutesFromNow(60, now: moment(15, 22), calendar: calendar) == 23 * 60) - // 23:40 + 30 min cruzaría a mañana → sin opción. + // 23:40 + 30 min would cross into tomorrow → no option. #expect(ReminderSchedule.minutesFromNow(30, now: moment(15, 23, 40), calendar: calendar) == nil) } diff --git a/CornerTests/RolloverServiceTests.swift b/CornerTests/RolloverServiceTests.swift index 1b058db..9ff038a 100644 --- a/CornerTests/RolloverServiceTests.swift +++ b/CornerTests/RolloverServiceTests.swift @@ -3,9 +3,9 @@ import Foundation import SwiftData @testable import Corner -/// El contenedor vive como propiedad del struct (una instancia por @Test): -/// si solo vive dentro de una función auxiliar, SwiftData lo libera y el -/// contexto crashea (signal trap) al insertar. +/// The container lives as a property of the struct (one instance per @Test): +/// if it only lives inside a helper function, SwiftData releases it and the +/// context crashes (signal trap) on insert. @MainActor struct RolloverServiceTests { private let calendar = Calendar(identifier: .gregorian) @@ -52,7 +52,7 @@ struct RolloverServiceTests { @Test func rolledTasksGoFirstPreservingRelativeOrder() { let today = day(2025, 1, 15) - // Dos viejas de días distintos y una ya existente en hoy. + // Two old ones from different days and one already on today. context.insert(TaskItem(text: "Lunes", assignedDay: day(2025, 1, 13), sortOrder: 0)) context.insert(TaskItem(text: "Martes", assignedDay: day(2025, 1, 14), sortOrder: 0)) context.insert(TaskItem(text: "DeHoy", assignedDay: today, sortOrder: 0)) diff --git a/CornerTests/SyncPlannerTests.swift b/CornerTests/SyncPlannerTests.swift index c9ebdc4..943eba8 100644 --- a/CornerTests/SyncPlannerTests.swift +++ b/CornerTests/SyncPlannerTests.swift @@ -2,7 +2,7 @@ import Testing import Foundation @testable import Corner -/// Política de convergencia del sync (SPEC §8): última escritura gana. +/// Sync convergence policy (SPEC §8): last write wins. struct SyncPlannerTests { private let day = Calendar(identifier: .gregorian) .startOfDay(for: Date(timeIntervalSince1970: 1_700_000_000)) @@ -64,11 +64,11 @@ struct SyncPlannerTests { #expect(SyncPlanner.plan(local: [task], remote: []) == [.deleteLocal(taskID: task.id)]) } - // MARK: - Listas por categoría (SPEC §8 v2.1) + // MARK: - Per-category lists (SPEC §8 v2.1) @Test func wrongListMeansCategoryChangedLocally() { - // La tarea tiene categoría (lista esperada L-trabajo) pero el - // recordatorio vive en la general → mover (gana lo local, más nuevo). + // The task has a category (expected list L-trabajo) but the reminder + // lives in the general one → push (local is newer and wins). let categoryID = UUID() var task = local(reminderID: "r1", updatedAt: newer) task.categoryID = categoryID @@ -81,7 +81,7 @@ struct SyncPlannerTests { } @Test func remoteMovedToCategoryListWinsWhenNewer() { - // En el iPhone movieron el recordatorio a "Corner — Trabajo" → pull. + // On the iPhone the reminder was moved to "Corner — Trabajo" → pull. let categoryID = UUID() let task = local(reminderID: "r1", updatedAt: older) var reminder = remote("r1", modifiedAt: newer) @@ -92,9 +92,9 @@ struct SyncPlannerTests { == [.pullUpdate(taskID: task.id, remote: reminder)]) } - /// Invariante de convergencia: aplicar el plan una vez deja ambos lados - /// iguales — re-planear no produce acciones. Protege contra bucles de - /// sync (la falla más peligrosa de un sistema bidireccional). + /// Convergence invariant: applying the plan once leaves both sides equal — + /// re-planning produces no actions. This guards against sync loops (the + /// most dangerous failure of a two-way system). @Test func planConvergesAfterOneApplication() { let categoryID = UUID() let mapping: [UUID?: String] = [nil: "L-general", categoryID: "L-trabajo"] @@ -111,7 +111,7 @@ struct SyncPlannerTests { { var r = remote("r-nueva", title: "Alta desde Siri", modifiedAt: newer); r.listID = "L-trabajo"; return r }(), ] - // Simulación pura de aplicar cada acción a ambos lados. + // Pure simulation of applying each action to both sides. let actions = SyncPlanner.plan(local: localSide, remote: remoteSide, listForCategory: mapping) for action in actions { switch action { @@ -145,7 +145,7 @@ struct SyncPlannerTests { } } - // Convergencia: el segundo plan debe estar vacío. + // Convergence: the second plan must be empty. #expect(SyncPlanner.plan(local: localSide, remote: remoteSide, listForCategory: mapping).isEmpty) } diff --git a/CornerTests/TaskStoreTests.swift b/CornerTests/TaskStoreTests.swift index 86914e4..d1ed8e0 100644 --- a/CornerTests/TaskStoreTests.swift +++ b/CornerTests/TaskStoreTests.swift @@ -3,10 +3,10 @@ import Foundation import SwiftData @testable import Corner -/// Swift Testing crea una instancia nueva del struct por cada @Test, así que -/// cada test recibe un contenedor en memoria limpio. El contenedor vive como -/// propiedad: si solo vive dentro de una función auxiliar, SwiftData lo -/// libera y el contexto crashea (signal trap) al insertar. +/// Swift Testing creates a new instance of the struct for each @Test, so +/// every test gets a clean in-memory container. The container lives as a +/// property: if it only lives inside a helper function, SwiftData releases +/// it and the context crashes (signal trap) on insert. @MainActor struct TaskStoreTests { private let container: ModelContainer @@ -25,7 +25,7 @@ struct TaskStoreTests { } @Test func addNormalizesDayAndTrimsText() { - let task = store.add(" Comprar café ", to: clock.now) // now trae hora 10:00 + let task = store.add(" Comprar café ", to: clock.now) // now carries the 10:00 time #expect(task?.text == "Comprar café") #expect(task?.assignedDay == clock.today) } @@ -74,14 +74,14 @@ struct TaskStoreTests { #expect(store.todayTasks().map(\.text) == ["C", "A", "B"]) } - /// Los índices del drag vienen de la lista completa (pendientes + hechas): - /// soltar debajo de las hechas no debe crashear (SPEC §6, regresión). + /// The drag indices come from the full list (pending + done): dropping + /// below the done ones must not crash (SPEC §6, regression). @Test func movePendingBelowDoneTasksClampsInsteadOfCrashing() { store.add("A", to: clock.today) store.add("B", to: clock.today) let done = store.add("Hecha", to: clock.today)! store.toggle(done) - // Lista visible: [A, B, Hecha]; arrastrar A (índice 0) al final (3). + // Visible list: [A, B, Hecha]; drag A (index 0) to the end (3). store.movePending(in: clock.today, from: IndexSet(integer: 0), to: 3) #expect(store.todayTasks().map(\.text) == ["B", "A", "Hecha"]) } @@ -92,7 +92,7 @@ struct TaskStoreTests { #expect(week.map(\.day).contains(clock.today)) } - // MARK: - Categorías (SPEC §4.1) + // MARK: - Categories (SPEC §4.1) @Test func addCategoryAndAssignToTask() { let category = store.addCategory("Trabajo", colorHex: "#007AFF")! @@ -132,7 +132,7 @@ struct TaskStoreTests { #expect(store.todayTasks().first?.category?.id == category.id) } - // MARK: - Subtareas (SPEC §4.2) + // MARK: - Subtasks (SPEC §4.2) @Test func addSubtaskInheritsDayAndOrder() { let parent = store.add("Proyecto", to: clock.today)! @@ -213,7 +213,7 @@ struct TaskStoreTests { #expect(parent.isDone) } - // MARK: - Mover a otro día (SPEC §4.1.5) + // MARK: - Move to another day (SPEC §4.1.5) @Test func moveSendsTaskToEndOfTargetDayWithSubtasks() { let tomorrow = clock.calendar.date(byAdding: .day, value: 1, to: clock.today)! @@ -255,7 +255,7 @@ struct TaskStoreTests { #expect(parent.sortOrder == order) } - // MARK: - Alarmas por tarea (SPEC §4.1.6) + // MARK: - Per-task alarms (SPEC §4.1.6) @Test func setReminderStoresAndClearsTime() { let task = store.add("Con hora", to: clock.today)! @@ -273,8 +273,8 @@ struct TaskStoreTests { } @Test func reminderTimeSurvivesMovingToAnotherDay() { - // La hora se guarda como minutos del día, no como fecha absoluta: - // mover la tarea la conserva (SPEC §4.1.6). + // The time is stored as minutes of the day, not as an absolute date: + // moving the task preserves it (SPEC §4.1.6). let task = store.add("Reunión", to: clock.today)! store.setReminder(task, minutes: 9 * 60) let tomorrow = clock.calendar.date(byAdding: .day, value: 1, to: clock.today)! @@ -295,7 +295,7 @@ struct TaskStoreTests { #expect(task.remindMinutes == 18 * 60) } - // MARK: - Soporte de sync (SPEC §8) + // MARK: - Sync support (SPEC §8) @Test func mutationsTouchUpdatedAt() { let task = store.add("Tarea", to: clock.today)! @@ -331,13 +331,13 @@ struct TaskStoreTests { let work = store.addCategory("Trabajo", colorHex: "#007AFF")! store.setReminderListID("L-trabajo", for: work) - // Alta remota en la lista de Trabajo → nace con esa categoría. + // Remote addition in the Work list → it is born with that category. let created = store.createFromRemote(RemoteReminder( id: "r-cat", title: "Desde iPhone", day: clock.today, isDone: false, modifiedAt: Date(), listID: "L-trabajo")) #expect(created?.category?.id == work.id) - // Movida remotamente a la general → pierde la categoría. + // Moved remotely to the general list → it loses the category. store.isApplyingRemoteChanges = true defer { store.isApplyingRemoteChanges = false } store.applyRemote(RemoteReminder(id: "r-cat", title: "Desde iPhone", @@ -356,7 +356,7 @@ struct TaskStoreTests { #expect(task?.reminderID == "r2") } - // MARK: - Ventana de memoria (ARCHITECTURE §4) + // MARK: - Memory window (ARCHITECTURE §4) @Test func snapshotExcludesPastWeeksButKeepsThemOnDisk() throws { let twoWeeksAgo = clock.calendar.date(byAdding: .day, value: -14, to: clock.today)! @@ -368,14 +368,14 @@ struct TaskStoreTests { try container.mainContext.save() store.refresh() - // Fuera del snapshot en memoria… + // Outside the in-memory snapshot… #expect(!store.tasks.contains { $0.text == "Hecha hace dos semanas" }) - // …pero intacta en disco. + // …but intact on disk. let all = try container.mainContext.fetch(FetchDescriptor()) #expect(all.contains { $0.text == "Hecha hace dos semanas" }) } - // MARK: - Persistencia del filtro (SPEC §4.1) + // MARK: - Filter persistence (SPEC §4.1) @Test func filterPersistsAcrossStoreInstances() throws { let suite = "test-filter-\(UUID().uuidString)" @@ -389,7 +389,7 @@ struct TaskStoreTests { let category = first.addCategory("Trabajo", colorHex: "#007AFF")! first.filterID = category.id - // "Reinicio": nueva instancia de store sobre el mismo contexto y defaults. + // "Restart": a new store instance over the same context and defaults. let second = TaskStore(context: container.mainContext, clock: clock, defaults: defaults) #expect(second.filterID == category.id) } @@ -405,7 +405,7 @@ struct TaskStoreTests { let suite = "test-filter-\(UUID().uuidString)" let defaults = UserDefaults(suiteName: suite)! defer { defaults.removePersistentDomain(forName: suite) } - // UUID guardado de una categoría que ya no existe. + // Saved UUID of a category that no longer exists. defaults.set(UUID().uuidString, forKey: "selectedCategoryFilter") let config = ModelConfiguration(isStoredInMemoryOnly: true) diff --git a/Scripts/generate-icon.sh b/Scripts/generate-icon.sh index 3924712..d16a367 100755 --- a/Scripts/generate-icon.sh +++ b/Scripts/generate-icon.sh @@ -1,5 +1,5 @@ #!/bin/zsh -# Regenera el AppIcon.appiconset desde el vector en código. +# Regenerates AppIcon.appiconset from the vector drawn in code. set -e cd "$(dirname "$0")/.." TMP=$(mktemp -d) diff --git a/Scripts/generate-icon.swift b/Scripts/generate-icon.swift index a7ed79c..4b033d6 100644 --- a/Scripts/generate-icon.swift +++ b/Scripts/generate-icon.swift @@ -1,10 +1,10 @@ import AppKit -// Genera el ícono de la app como vector dibujado en código — arte 100% propio, -// sin dependencias de herramientas de terceros. Misma geometría que la marca -// de la barra de menú (MenuBarController.makeCornerIcon), a color. +// Generates the app icon as a vector drawn in code — artwork that is 100% ours, +// with no third-party tooling. Same geometry as the menu bar mark +// (MenuBarController.makeCornerIcon), in color. // -// Uso: ./Scripts/generate-icon.sh (regenera el AppIcon.appiconset) +// Usage: ./Scripts/generate-icon.sh (regenerates AppIcon.appiconset) let sizes = [16, 32, 64, 128, 256, 512, 1024] let outDir = CommandLine.arguments.count > 1 @@ -15,11 +15,11 @@ func drawIcon(size: CGFloat) { let s = size / 18.0 let rect = NSRect(x: 0, y: 0, width: size, height: size) - // Fondo blanco con esquinas suaves (macOS moderno enmascara en squircle). + // White background with soft corners (modern macOS masks it into a squircle). NSColor.white.setFill() NSBezierPath(roundedRect: rect, xRadius: size * 0.18, yRadius: size * 0.18).fill() - // Trazo en L (esquina inferior izquierda) con gradiente ámbar de marca. + // L-shaped stroke (bottom-left corner) with the brand amber gradient. let bracket = NSBezierPath(roundedRect: NSRect(x: 3.4 * s, y: 3.4 * s, width: 4.4 * s, height: 11.6 * s), xRadius: 2.2 * s, yRadius: 2.2 * s) @@ -31,7 +31,7 @@ func drawIcon(size: CGFloat) { ending: NSColor(calibratedRed: 1.00, green: 0.55, blue: 0.10, alpha: 1))! gradient.draw(in: bracket, angle: -70) - // Palomita flotando en el hueco superior derecho. + // Checkmark floating in the top-right gap. let check = NSBezierPath() check.lineWidth = 1.9 * s check.lineCapStyle = .round diff --git a/Scripts/make-demo-gif.sh b/Scripts/make-demo-gif.sh index 77846f2..5a182f5 100755 --- a/Scripts/make-demo-gif.sh +++ b/Scripts/make-demo-gif.sh @@ -1,16 +1,16 @@ #!/bin/zsh -# Convierte una grabación de pantalla (.mov de ⇧⌘5) en el GIF del README. +# Turns a screen recording (.mov from ⇧⌘5) into the README GIF. # -# Uso: -# ./Scripts/make-demo-gif.sh grabacion.mov # todo el video -# ./Scripts/make-demo-gif.sh grabacion.mov 2 14 # desde s2, 14s de duración -# ANCHO=900 FPS=18 ./Scripts/make-demo-gif.sh grabacion.mov +# Usage: +# ./Scripts/make-demo-gif.sh recording.mov # the whole video +# ./Scripts/make-demo-gif.sh recording.mov 2 14 # from 2s, 14s long +# ANCHO=900 FPS=18 ./Scripts/make-demo-gif.sh recording.mov # -# Salida: docs/img/corner-demo.gif (objetivo: < 8 MB para que GitHub lo cargue rápido) +# Output: docs/img/corner-demo.gif (target: < 8 MB so GitHub loads it fast) set -e cd "$(dirname "$0")/.." -SRC="${1:?falta el archivo .mov de entrada}" +SRC="${1:?missing input .mov file}" INICIO="${2:-0}" DURACION="${3:-}" ANCHO="${ANCHO:-800}" @@ -23,8 +23,8 @@ RECORTE="-ss $INICIO" TMP=$(mktemp -d) FILTROS="fps=$FPS,scale=$ANCHO:-1:flags=lanczos" -# Dos pasadas: paleta propia = colores fieles y archivo más chico que el GIF -# directo (que usaría una paleta genérica de 256 colores). +# Two passes: a custom palette means faithful colors and a smaller file than a +# direct GIF (which would use a generic 256-color palette). ffmpeg -loglevel error ${=RECORTE} -i "$SRC" \ -vf "$FILTROS,palettegen=stats_mode=diff" -y "$TMP/palette.png" ffmpeg -loglevel error ${=RECORTE} -i "$SRC" -i "$TMP/palette.png" \ @@ -32,4 +32,4 @@ ffmpeg -loglevel error ${=RECORTE} -i "$SRC" -i "$TMP/palette.png" \ TAMANO=$(du -h "$OUT" | cut -f1) echo "OK: $OUT ($TAMANO, ${ANCHO}px, ${FPS}fps)" -echo "Si pesa más de 8 MB: baja ANCHO (700) o FPS (12), o recorta con INICIO/DURACION." +echo "If it is over 8 MB: lower ANCHO (700) or FPS (12), or trim with INICIO/DURACION." diff --git a/Scripts/render-preview.sh b/Scripts/render-preview.sh index 7d043c7..1feb3c2 100755 --- a/Scripts/render-preview.sh +++ b/Scripts/render-preview.sh @@ -1,21 +1,21 @@ #!/bin/zsh -# Compila y ejecuta el renderizador de verificación visual. -# Uso: ./Scripts/render-preview.sh [directorio-salida] [idioma] -# ./Scripts/render-preview.sh # docs/img, idioma del sistema -# ./Scripts/render-preview.sh /tmp/out en # inglés (usa el catálogo de la app compilada) +# Builds and runs the visual verification renderer. +# Usage: ./Scripts/render-preview.sh [output-directory] [language] +# ./Scripts/render-preview.sh # docs/img, system language +# ./Scripts/render-preview.sh /tmp/out en # English (uses the built app's catalog) set -e cd "$(dirname "$0")/.." OUT="${1:-docs/img}" LANG_CODE="${2:-}" TMP=$(mktemp -d) -# swiftc solo permite código top-level en un archivo llamado main.swift +# swiftc only allows top-level code in a file named main.swift cp Scripts/render-preview.swift "$TMP/main.swift" xcrun swiftc -o "$TMP/render" "$TMP/main.swift" Corner/Domain/*.swift Corner/UI/*.swift if [[ -n "$LANG_CODE" ]]; then - # El binario suelto no lleva el catálogo compilado: copiar los .lproj de la - # app ya compilada junto al ejecutable para que Foundation los encuentre. + # The standalone binary has no compiled catalog: copy the .lproj folders from + # the already-built app next to the executable so Foundation finds them. APP=$(ls -d ~/Library/Developer/Xcode/DerivedData/Corner-*/Build/Products/Release/Corner.app 2>/dev/null | head -1) - [[ -z "$APP" ]] && { echo "Compila la app Release primero (xcodebuild -scheme Corner -configuration Release build)"; exit 1 } + [[ -z "$APP" ]] && { echo "Build the Release app first (xcodebuild -scheme Corner -configuration Release build)"; exit 1 } cp -R "$APP/Contents/Resources/"*.lproj "$TMP/" "$TMP/render" "$OUT" -AppleLanguages "($LANG_CODE)" else diff --git a/Scripts/render-preview.swift b/Scripts/render-preview.swift index 976f6f4..5ff9117 100644 --- a/Scripts/render-preview.swift +++ b/Scripts/render-preview.swift @@ -2,10 +2,10 @@ import AppKit import SwiftUI import SwiftData -// Herramienta de verificación visual: renderiza PanelView con datos de -// muestra en modo claro y oscuro y guarda PNGs (docs/img o el dir dado). +// Visual verification tool: renders PanelView with sample data in light and +// dark mode and writes PNGs (docs/img, or the given directory). // -// Uso: ./Scripts/render-preview.sh [directorio-salida] +// Usage: ./Scripts/render-preview.sh [output-directory] @MainActor func run() throws { @@ -20,17 +20,17 @@ func run() throws { let store = TaskStore(context: container.mainContext, clock: clock, defaults: suite) store.dismissWelcomeTip() - let work = store.addCategory("Trabajo", colorHex: "#007AFF")! + let work = store.addCategory("Work", colorHex: "#007AFF")! store.addCategory("Personal", colorHex: "#34C759") - let t1 = store.add("Implementación de tolerancia", to: clock.today, category: work)! - store.addSubtask("Analizar requerimientos", to: t1) - let s2 = store.addSubtask("Escribir pruebas", to: t1)! + let t1 = store.add("Prepare release notes", to: clock.today, category: work)! + store.addSubtask("Draft changelog", to: t1) + let s2 = store.addSubtask("Tag version", to: t1)! store.toggle(s2) - let t2 = store.add("Verificar operación EUR/USD", to: clock.today, + let t2 = store.add("Buy coffee", to: clock.today, category: store.categories.last)! store.toggle(t2) - store.add("Comprar café", to: clock.today) - let rolled = store.add("Informe semanal", to: clock.today, category: work)! + store.add("Call the bank", to: clock.today) + let rolled = store.add("Water the plants", to: clock.today, category: work)! rolled.rolledOver = true let outDir = CommandLine.arguments.count > 1 ? CommandLine.arguments[1] : "docs/img" diff --git a/docs/img/corner-dark.png b/docs/img/corner-dark.png index 78a1c52894a65f0fc035ade40a28502ba3562ada..37cdb05c879182f6a3730990efb2ef608f89407b 100644 GIT binary patch literal 59008 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 literal 65767 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 S`aTT&Q&-i#m4D+w!2bh!p9*&X literal 65265 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 a$e7hFeNz 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
vAYjr zV`ELhb4)1KyG6}r^j7hS{#|x0Ev?F)?fI52(0$wA;Cj0MS-FiC=ioUCb%RsReSO3@ z&0~%v%j)BFdwcs>@CTZk8-D8}0?QcSr)&yZ+^_O&2AkjVjrQ={8`SDT_vh)S6Oq!d zAj&v)9zA)20(RqxXV{a{!D{p&_8 zKWRxsKL?$E%em55hty0%yK(C^uETRUqtuwX>u8~IkSWV~n%C-w5__((-1pgt;R|Gv zGtg9u029vb{OttrntiA2nfgCfoqIgf`ya=*wNo3XTq2cA+A-JIaf!paaDLlypH^8# zDEGM&lUqg{xrK<344IbD#Vr{fCsENdn`#Ongps*SF8O`*>*)Nxe}BK9$NT&Kyg%>n z^Zj^y->D9Uq3n%#QoL}&-@B(ixdgm_4pKEpDbx6<$ngx_MDbE7OA8Agx5_h*UHUT(`h4b%%^sJLi zt#-P+8gypqwEIDWaM2hAG>ubc)uP-N{BrxHzWp|4YT!pdq2F|MZ+P)DjNMC(0qhaD zb=P6!PUJnD%UopZG2Yd&B!fiVQm<7;U@6HhNnbr_)F5$RZoMi>?U{_V6ls`)gtZLZQzX#vPslpM>obD0$7L8tpGDz<6 z$aI#ZUBWi`AXI1nt?cxSo!#C-JqkuXbBtu+uy0S;aK5Yo>NE(k4JX85&h^-Jlws$(Xg+I$WT=+S4kDZ-6cw>Uq zLC}FskVD_0iK^`Pwu2pEaKJpR+KQU8`Nh8TLt71=5*Q?Zxx%Ls77(weRqzsnKEkH} zJVttdBpAHHp30C> zSBBZY*9c^|ov1$l07qw6NQN$ch2f3S&ZBSKPOrE~t@0Nq zUNwbw_Ksg)D%uZ04_EsYp;C={mXc=ZGYPxb%5GJ_>rj>97n388>~Vj2eb@giZbzEU znlIxgF>R@o)9pT6r=G5J*vYl3D`jYETxK3HEi<2bfAhkY4|KWZ(j#R~_rQ6E!~m5K z9lCIo?vk{7vo`UUf#aLm)3)NscYAR*}T*cde29Hvl?eH9}Vhi}Mx;J()f1tGkiiV(7I|Y9c zd^AmjP!iDwfCay=o1(aGrwq}bZ%6%z$K%n7q$@0h|CrK-RaD~yxYAcIZ*L(F|3w9F z%hnR9Hxb?Byn(V1*as!W3J?51c-SbM7L_)t&SXihr`_*W20{f&K8W44cv$cf`B)xH z@#&60Yj0pUBql&Iy(e=dGt}>A8bw`0!=N`5mO~d1%&)fnvjT8|&PD2z!l*5uvj+zU zca7gmhIq9RkQa)IicB7@@6C78Hok-~8#12=)2hKk_=#q=wp;ElPXl!Yj z?7r3mz8RGId1d7^9*Sy2baGmgDc=^N@NdhZP%@T$U?ORIbkMUs(BL+T_2Yx_@$u-C zpQN^d zHwy6RF~RIC^PJB{NCEdysScmt%7Id0v_5c%&YQX+vwBR}i-)kjNNIozFfgu0{qcsQ zzBv>X9TF14We3%^@t+hnn(crFD^%Lo`L*9P&r}x`5!o!ZTd%!f=tq1~ji;3Yv;?8W zH8mj}amejgwD?!{!NwZ%u%Uhh>UWd3NFpZ-ShQZ zHJ0{yS07j`XxB$~OrA0MYr`UA%wF2tCblQrD_`F??-rylzMpMJoxYk%t(26Q+@*0Ck1Q+*Zob=fI$hCx@QW6_ea zjrv*&Y9PJ+m%(h`N6nh=)lj;leJO~5=gWWCVY6 z7R5a;b+gu8*yl9;{ijh9J5&EC*vaWx#-Sui(k{F4gdNS(1umi+MW#+JbxrzFUy}p5 z)w+^$od z{(ynUGYhGxl8OOY-vT*u>j&{i@?NcuF{^WRgps%24=KHEe#>vpNklk||9bc9mxkwB z8z&DDYusUxM=B>flZL8Krgl5mdGKqW-7xY!Jio9Ms391itbOW;b