summaryrefslogtreecommitdiff
path: root/makima/ios/Sources/Makima/Design/Components/JapaneseLongPressText.swift
diff options
context:
space:
mode:
authorsoryu-co <bot@soryu.co>2026-04-24 13:15:29 +0000
committersoryu-co <bot@soryu.co>2026-04-24 13:21:12 +0000
commitdb092c79a175e3283f479ee0b234b24bde3c736e (patch)
tree16ae5ba1f2f2f6089ad9f625953fa02d19463ab0 /makima/ios/Sources/Makima/Design/Components/JapaneseLongPressText.swift
parent3679ceb3325033faa2f889ef3dfee5668ef7aeea (diff)
downloadsoryu-makima-ios-scaffold.tar.gz
soryu-makima-ios-scaffold.zip
Add Makima iOS app scaffold (M0 + M1 design system)makima-ios-scaffold
Pure-native SwiftUI client for makima.jp under makima/ios/. M0 (scaffold) - XcodeGen project (iOS 18+, Swift 5.10, bundle co.soryu.makima) - Makefile targets: bootstrap, xcgen, ios-sim-fast, ios-device-fast, test, lint - GitHub Actions workflow ios-ci.yml — builds + runs XCTest on macos-14 - MIT repo root license already in place M1 (design system, web-aesthetic port) - Palette: #0c1729 background, #9bc3ff accent, #3f6fb3 border (ported from Tailwind) - Typography: SF Mono for chrome, uppercase tracked nav labels - Components: DashedBorder, GridOverlay, MastheadBar + WebSocketStatus pill, NavStripPlaceholder (NAV// prefix), JapaneseLongPressText (mobile analogue of JapaneseHoverText), Logo (reuses frontend/public/logo/makima-logo.svg with Canvas concentric-ring fallback), Badge - RootView demo screen: masthead, nav strip, logo, CONTROL SYSTEM badge, SYSTEM// status card, GLOSSARY// card with 命令/契約/聴取/史料 long-press terms Auth (v1 plan, not wired here): x-makima-api-key header — verified against src/server/auth.rs. Authorization: Bearer reserved for v1.1 Supabase OAuth. v1 plan doc: makima/ios/docs/ios-v1-plan.md Not in this PR: networking, WebSocket client, stores, feature surfaces (Home/Contracts/Tasks/Directives/Daemons/Listen), notifications. Those land across M2-M8 per the plan.
Diffstat (limited to 'makima/ios/Sources/Makima/Design/Components/JapaneseLongPressText.swift')
-rw-r--r--makima/ios/Sources/Makima/Design/Components/JapaneseLongPressText.swift37
1 files changed, 37 insertions, 0 deletions
diff --git a/makima/ios/Sources/Makima/Design/Components/JapaneseLongPressText.swift b/makima/ios/Sources/Makima/Design/Components/JapaneseLongPressText.swift
new file mode 100644
index 0000000..fb57154
--- /dev/null
+++ b/makima/ios/Sources/Makima/Design/Components/JapaneseLongPressText.swift
@@ -0,0 +1,37 @@
+import SwiftUI
+
+/// Mobile-native equivalent of the web's `JapaneseHoverText`.
+/// Shows the Japanese term; long-press (or tap) reveals the English gloss
+/// via a brief animated flip.
+struct JapaneseLongPressText: View {
+ let japanese: String
+ let english: String
+
+ @State private var revealed = false
+
+ var body: some View {
+ HStack(spacing: 6) {
+ Text(japanese)
+ .font(Typography.japanese)
+ .foregroundStyle(Palette.foreground)
+ .padding(.vertical, 3)
+ .padding(.horizontal, 6)
+ .background(Palette.panel)
+ .overlay(
+ Rectangle().strokeBorder(Palette.borderMuted, lineWidth: 1)
+ )
+ .contentShape(Rectangle())
+ .onTapGesture { withAnimation(.easeInOut(duration: 0.2)) { revealed.toggle() } }
+ .onLongPressGesture(minimumDuration: 0.15, pressing: { pressing in
+ withAnimation(.easeInOut(duration: 0.15)) { revealed = pressing }
+ }, perform: {})
+
+ Text(english)
+ .font(Typography.navLabel)
+ .foregroundStyle(revealed ? Palette.accent : Palette.foregroundMuted.opacity(0.4))
+ .animation(.easeInOut(duration: 0.2), value: revealed)
+ }
+ .accessibilityElement(children: .combine)
+ .accessibilityLabel("\(japanese), \(english)")
+ }
+}