diff --git a/web/components/ShareButton.tsx b/web/components/ShareButton.tsx
index c572666..972b10d 100644
--- a/web/components/ShareButton.tsx
+++ b/web/components/ShareButton.tsx
@@ -1,12 +1,13 @@
"use client";
-// 종목 페이지 공유 버튼 — 현재 URL 을 클립보드에 복사.
-// Toss 의 종목 공유 패턴 (개별 모달 없이 즉시 복사 + 짧은 토스트).
+// 종목 페이지 공유 버튼 — 현재 URL 을 공유 / 클립보드에 복사.
+// Toss 의 종목 공유 패턴 (개별 모달 없이 즉시 시도 + 짧은 토스트).
//
-// 폴백 순서:
-// 1) navigator.clipboard.writeText (HTTPS or localhost)
-// 2) document.execCommand("copy") (legacy, http LAN 등 secure context 아닌 경우)
-// 3) 두 경로 모두 실패면 "복사 안됨" 안내
+// 동작 우선순위:
+// 1) navigator.share (모바일 native sheet — 성공 시 OS 시트가 피드백, 토스트 안 띄움)
+// 2) navigator.clipboard.writeText (HTTPS or localhost — 클립보드에 복사 + "링크 복사됨")
+// 3) document.execCommand("copy") (legacy, http LAN 등 secure context 아닌 경우)
+// 4) 모두 실패면 "복사 안됨" 안내
import { useEffect, useState } from "react";
diff --git a/web/components/StockChart.tsx b/web/components/StockChart.tsx
index 122e888..cdd37ab 100644
--- a/web/components/StockChart.tsx
+++ b/web/components/StockChart.tsx
@@ -14,6 +14,7 @@ import {
type UTCTimestamp,
} from "lightweight-charts";
import type { ChartPayload, LatestPredictionResponse } from "../lib/api";
+import { csvFilename, downloadCsv, ohlcvToCsv } from "../lib/csv";
import type { Targets } from "../lib/targets";
type Props = {
@@ -755,67 +756,87 @@ export function StockChart({ chart, prediction, targets }: Props) {
return (