diff --git a/README.md b/README.md
index d150964..a6ad81a 100644
--- a/README.md
+++ b/README.md
@@ -28,7 +28,7 @@ If deploying the backend is too difficult, you can temporarily use my public bac
- [x] **Professional charting engine** — Full indicator and drawing tool support
- [x] **Custom indicators** — Net Volume (NV-C) and Cumulative Volume Delta (CVD-C)
- [x] **Multi-chart layouts** — Single, vertical split, horizontal split, and 1L+2R layouts with draggable dividers
-- [x] **Canvas persistence** — Named drawing canvases per symbol, with auto-save every 5 minutes
+- [x] **Chart save/load** — Built-in save/load via `save_load_adapter` (metadata in localStorage, chart content in backend API), with auto-save
- [x] **Dark & Light themes** — Full theme toggle synced across widget and UI
### Watchlist & Interaction
diff --git a/README_CN.md b/README_CN.md
index d5bacee..a67f941 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -26,7 +26,7 @@
- [x] **专业图表引擎** — 完整的指标和画图工具支持
- [x] **自定义指标** — 净成交量(NV-C)和累积成交量差(CVD-C)
- [x] **多图表布局** — 单图、垂直分割、水平分割、1 左 + 2 右布局,分隔线可拖动
-- [x] **画布持久化** — 按品种保存命名画布,每 5 分钟自动保存
+- [x] **图表保存/加载** — 通过内置 `save_load_adapter` 实现保存/加载(元数据存 localStorage,图表内容存后端 API),支持自动保存
- [x] **深色/浅色主题** — 主题切换同步到图表组件和 UI
### 自选列表与交互
diff --git a/frontend/auth-config.js b/frontend/auth-config.js
index 9b496c7..aa15524 100644
--- a/frontend/auth-config.js
+++ b/frontend/auth-config.js
@@ -1,4 +1,4 @@
-window.API_CONFIG = { baseUrl: 'https://xxx.xxx.com' };
+window.API_CONFIG = { baseUrl: 'https://api-view.cathiefish.org' };
/**
* Google OAuth Configuration
@@ -9,7 +9,7 @@ window.API_CONFIG = { baseUrl: 'https://xxx.xxx.com' };
const AUTH_CONFIG = {
// Client ID obtained from GCP Console
// Replace with your actual Client ID
- clientId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
+ clientId: '136939086552-bt28icv34nucmjna8hfndr6bopr5qcp4.apps.googleusercontent.com',
// Authentication success callback
onSuccess: (user) => {
diff --git a/frontend/index.html b/frontend/index.html
index 1aa21c1..12cb60d 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -693,109 +693,6 @@
flex-shrink: 0;
}
- /* Canvas Selector Popup */
- .canvas-selector-popup {
- display: none;
- position: fixed;
- background: var(--tv-color-pane-background);
- border: 1px solid var(--tv-color-border);
- border-radius: 8px;
- padding: 12px 16px;
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
- z-index: 1000;
- min-width: 200px;
- }
-
- .canvas-selector-popup.is-open {
- display: block;
- }
-
- .canvas-selector-title {
- font-size: 11px;
- font-weight: 600;
- color: var(--tv-color-text-secondary);
- text-transform: uppercase;
- letter-spacing: 0.5px;
- margin-bottom: 10px;
- }
-
- .canvas-list {
- max-height: 200px;
- overflow-y: auto;
- margin-bottom: 10px;
- }
-
- .canvas-item {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 8px 10px;
- border-radius: 4px;
- cursor: pointer;
- color: var(--tv-color-text);
- }
-
- .canvas-item:hover {
- background: var(--tv-color-toolbar-button-background-hover);
- }
-
- .canvas-item.is-active {
- background: rgba(41, 98, 255, 0.15);
- color: var(--tv-color-blue);
- }
-
- .canvas-item-name {
- flex: 1;
- }
-
- .canvas-item-delete {
- opacity: 0;
- color: var(--tv-color-text-secondary);
- padding: 2px 6px;
- border-radius: 3px;
- }
-
- .canvas-item:hover .canvas-item-delete {
- opacity: 1;
- }
-
- .canvas-item-delete:hover {
- background: rgba(255, 0, 0, 0.2);
- color: #ff5252;
- }
-
- .canvas-actions {
- display: flex;
- gap: 8px;
- border-top: 1px solid var(--tv-color-border);
- padding-top: 10px;
- }
-
- .canvas-btn {
- flex: 1;
- padding: 6px 12px;
- border: 1px solid var(--tv-color-border);
- border-radius: 4px;
- background: transparent;
- color: var(--tv-color-text);
- cursor: pointer;
- font-size: 12px;
- }
-
- .canvas-btn:hover {
- background: var(--tv-color-toolbar-button-background-hover);
- }
-
- .canvas-btn.primary {
- background: var(--tv-color-blue);
- border-color: var(--tv-color-blue);
- color: #fff;
- }
-
- .canvas-btn.primary:hover {
- background: #1e53e4;
- }
-
/* Charts Layout Container */
.charts-layout {
display: flex;
@@ -1106,21 +1003,6 @@
-