4c0d2af564
TipKit (Tips.configure con frecuencia diaria): - QuickUpdateTip: popover en el '+' del Home — descubre Quick Update - ScreenshotOCRTip: inline en Quick Update — descubre el OCR por captura - SiriTip: en el cierre del check-in guiado — descubre el intent de voz - ChartShareTip: popover en el compartir de Charts - Se invalidan al ejecutar la acción; máx 1-2 impresiones cada uno - Strings ×7 idiomas Onboarding: - Al completar el onboarding sin datos, se abre Add Source directamente (notificación .openAddFirstSource) — el usuario nuevo no aterriza en un dashboard vacío Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WoScpmHdVj1aUf4rAp6hbe
38 lines
1.5 KiB
Swift
38 lines
1.5 KiB
Swift
import SwiftUI
|
|
import TipKit
|
|
|
|
// MARK: - Feature discovery (TipKit, Calm 2.0 Fase 4)
|
|
//
|
|
// The app's most differentiating features (quick update, screenshot OCR, Siri,
|
|
// chart sharing) were invisible unless you stumbled on them. One contextual tip
|
|
// each, shown at most once a day (see Tips.configure in PortfolioJournalApp),
|
|
// auto-invalidated after display or when the action is performed.
|
|
|
|
struct QuickUpdateTip: Tip {
|
|
var title: Text { Text(String(localized: "tip_quick_update_title")) }
|
|
var message: Text? { Text(String(localized: "tip_quick_update_body")) }
|
|
var image: Image? { Image(systemName: "bolt.circle.fill") }
|
|
var options: [any TipOption] { [MaxDisplayCount(2)] }
|
|
}
|
|
|
|
struct ScreenshotOCRTip: Tip {
|
|
var title: Text { Text(String(localized: "tip_ocr_title")) }
|
|
var message: Text? { Text(String(localized: "tip_ocr_body")) }
|
|
var image: Image? { Image(systemName: "text.viewfinder") }
|
|
var options: [any TipOption] { [MaxDisplayCount(2)] }
|
|
}
|
|
|
|
struct SiriTip: Tip {
|
|
var title: Text { Text(String(localized: "tip_siri_title")) }
|
|
var message: Text? { Text(String(localized: "tip_siri_body")) }
|
|
var image: Image? { Image(systemName: "mic.fill") }
|
|
var options: [any TipOption] { [MaxDisplayCount(1)] }
|
|
}
|
|
|
|
struct ChartShareTip: Tip {
|
|
var title: Text { Text(String(localized: "tip_chart_share_title")) }
|
|
var message: Text? { Text(String(localized: "tip_chart_share_body")) }
|
|
var image: Image? { Image(systemName: "square.and.arrow.up") }
|
|
var options: [any TipOption] { [MaxDisplayCount(2)] }
|
|
}
|