Calm 2.0 Fase 4: TipKit para descubrimiento + aha post-onboarding (build 55)
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
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
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)] }
|
||||
}
|
||||
Reference in New Issue
Block a user