13 Commits
Author SHA1 Message Date
vgearen 059aef3609 fix(chart): fix top whitespace and KRW number wrap in intraday view
Two bugs in StockChartView triggered by opening a Korean stock's chart:

1. Top whitespace: DropdownView used ZStack to overlay stockListView
   (opacity 0 when chart shown) and StockChartView. ZStack sized to
   max(list, chart) — list at ~720 tall pushed the ~500-tall chart to
   vertical-center, leaving ~200 of blank above the chart. Replace
   ZStack with plain if-let so list and chart are mutually exclusive
   in the layout tree.

2. Stat-row line wrap: fmt used %.3f always, producing 'KRW 284000.000'
   which overflowed the narrow stat columns and wrapped to two lines
   ('284000.0' / '00'). Scale precision by magnitude: ≥1000 → integer,
   ≥10 → 2 decimals, else 3 decimals.
2026-05-14 11:53:11 +08:00
vgearen d8904f4acb fix(ui): match settings height to list mode + CI uses latest Xcode
UI fix (SDK-agnostic):
- SettingsView height 480 → 620 so the settings mode panel size matches
  list mode at maximum. Avoids MenuBarExtra's NSPanel not shrinking when
  switching between list and settings views.
- Drop the .id(showSettings) hack — it forced view rebuild but the panel
  is managed by AppKit and does not respond to SwiftUI view recreation.

CI hardening:
- Use maxim-lobanov/setup-xcode@v1 with latest-stable so the runner Xcode
  is as close to local (Xcode 26.5) as available, minimizing SwiftUI SDK
  behavior drift.
- Run xcodebuild test before building the DMG; release will fail-fast on
  test regressions instead of shipping broken binaries.

Root cause analysis of v1.3.4 regression:
Local Xcode 26.5 produced a 5.2MB binary linking to macOS 26 SwiftUI
symbols; GH macos-latest with default Xcode 16 produced a 5.0MB binary
linking to macOS 15 SwiftUI. The .id() hack happened to look correct in
the SDK 26 build but not in SDK 15 — same source, different runtime
behavior. The height:620 approach works in both.
2026-05-14 11:30:52 +08:00
vgearen bb00d4379f fix(ui): force panel relayout when switching between list/settings
MenuBarExtra(.window) caches the NSPanel size from list mode (~720 with
many stocks) and does not auto-shrink when switching to the 480-tall
settings view, leaving a large blank gap. Adding .id(showSettings) tells
SwiftUI to rebuild the view subtree on mode change, prompting the panel
to recompute its size from the new content.

release: 1.3.3 → 1.3.4
2026-05-14 11:12:45 +08:00
vgearen 8c424dbe59 fix(ui): use fixedSize so dropdown panel shrinks to content
The opaque background added in v1.3.2 exposed extra empty space below
the toolbar — the panel was sized larger than the VStack content.
Adding .fixedSize(horizontal: false, vertical: true) before the
background makes the panel size to its actual content.

release: 1.3.2 → 1.3.3
2026-05-14 11:00:24 +08:00
vgearen c9b6bf467c fix(ui): give dropdown an opaque background
MenuBarExtra(.window) on the new SDK defaults to a vibrant translucent
material, letting whatever is behind bleed through. Apply
Color(.windowBackgroundColor) to the root VStack so the panel reads as
a normal opaque window in both light and dark mode.

release: 1.3.1 → 1.3.2
2026-05-14 10:52:55 +08:00
vgearen 87a67f9ba9 feat(korea): show KR group in dropdown + Yahoo search for Korean stocks
DropdownView: extend market iteration arrays to include .krStock so Korean
stocks appear as a 4th group after A股/港股/美股.

SettingsView search overhaul:
- looksKorean(): heuristic to route KR-like keywords (.ks/.kq suffix, kr_
  prefix, Hangul characters) directly to Yahoo
- yahooKoreanSearch(): /v1/finance/search filtered to symbols ending in
  .KS or .KQ, returns SearchResult with market=.krStock
- directResult(): explicit kr_<code>.ks and bare 005930.ks/kq forms supported
- Placeholder text updated to suggest Korean inputs

Tencent/Sina searches unchanged for A股/港股/美股.
2026-05-14 10:08:24 +08:00
vgearenandClaude Opus 4.6 592ad90f61 v1.2.5: Add watchlist (观察仓) feature with virtual portfolio support
- New Watchlist model: named virtual portfolios with per-stock cost/shares
- Watchlists persisted to watchlists.json, active ID in settings
- AppState: effective cost/shares/PnL methods that respect active watchlist
- Settings: create/delete/switch watchlists, edit writes to active watchlist
- ProfitSummaryView shows active watchlist name
- UI alignment fixes for toggle and text field padding

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:31:59 +08:00
vgearenandClaude Opus 4.6 ac87a4417d v1.2.4: Fix scroll position: preserve on chart return, reset on panel reopen
- Use ZStack overlay for chart instead of if/else branch swap
- ScrollView stays mounted while chart is shown (opacity toggle)
- Scroll position preserved when returning from chart view
- Panel reopen naturally starts from top

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:08:50 +08:00
vgearenandClaude Opus 4.6 7e502232d3 v1.2.3: Add holdings group option to pin held stocks at top
- New setting: "持仓股单独分组置顶" toggle
- When enabled, stocks with holdings are grouped into a "持仓" section at top
- Remaining non-held stocks still grouped by A/HK/US market as usual
- StockGroupView supports custom title for holdings group

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 09:58:30 +08:00
vgearenandClaude Opus 4.6 80c12aba58 v1.2.2: Preserve scroll position when returning from chart view
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 20:17:35 +08:00
vgearenandClaude Opus 4.6 c7b19e4f49 v1.2.1: Add sort settings (change% asc/desc, US session/regular price mode)
- Add SortRule enum (涨跌幅升序/降序) and USPriceMode enum (时段价格/盘中价)
- Settings page: sort rule segmented picker + US price mode picker
- Toolbar sort button applies configured rule; off = default order
- US stocks: session price mode uses extendedPrice for change% calculation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 15:30:41 +08:00
vgearenandClaude Sonnet 4.6 41665a6308 Add US session zones, check-for-updates, UI polish
- StockChartView: mark 盘前/盘中/盘后 with colored background zones and text labels for US stocks
- UpdateChecker: check latest release via GitHub API, prompt user to download if newer version found; semantic version comparison to avoid false positives
- SettingsView: add 关于 section with version and 检查更新 button; hide scrollbar (.never)
- DropdownView: hide scrollbar (.never)
- ProfitSummaryView: replace opaque white background with subtle transparent tint
- project.pbxproj: normalize MARKETING_VERSION to 1.0.0 (three-part semver)
- README/README_CN: add main screenshot

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 11:43:27 +08:00
vgearenandClaude Sonnet 4.6 6b1f565d7d Initial release: macOS menu bar stock monitor
- A-shares, HK, and US stock real-time quotes (Sina / Tencent)
- Intraday minute charts (Tencent / Yahoo Finance)
- US extended-hours session indicator with price and change%
- Portfolio P&L tracking (cost price × shares)
- Sort by change%, color themes, launch at login
- File-based persistence with 10-snapshot rolling backup
- Universal binary (Apple Silicon + Intel)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 17:41:52 +08:00