diff --git a/public/css/hanzi-graph.css b/public/css/hanzi-graph.css
index 7d30cf71..71acbbb9 100644
--- a/public/css/hanzi-graph.css
+++ b/public/css/hanzi-graph.css
@@ -46,7 +46,7 @@
--legend-height: 30px;
--graph-height: calc(100% - var(--legend-height) - 4px);
--section-container-margin: 0 16px;
- --calendar-day-color: #eee;
+ --calendar-day-color: #3333;
--bar-chart-separator-color: #121212;
--bar-chart-height: 400px;
--bar-chart-width: 600px;
@@ -109,6 +109,8 @@ body {
/* in general, disallow overscroll gestures from causing refresh */
/* the idea is to feel more like a native app */
overscroll-behavior: contain;
+ background-attachment: fixed;
+ background-repeat: no-repeat;
}
body.allow-overscroll {
@@ -1659,6 +1661,42 @@ using settings names for now
padding-bottom: 40px;
}
+.settings-nav {
+ display: flex;
+ gap: 0;
+ margin-bottom: 20px;
+ border-bottom: var(--border);
+}
+
+.settings-tab {
+ padding: 12px 24px;
+ background: none;
+ border: none;
+ border-bottom: 3px solid transparent;
+ font-size: 16px;
+ font-weight: 500;
+ color: var(--secondary-font-color);
+ cursor: pointer;
+ transition: color 0.2s, border-color 0.2s;
+}
+
+.settings-tab:hover {
+ color: var(--primary-font-color);
+}
+
+.settings-tab.active {
+ color: var(--link-color);
+ border-bottom-color: var(--link-color);
+}
+
+.settings-panel {
+ display: none;
+}
+
+.settings-panel.active {
+ display: block;
+}
+
.settings-section {
margin-bottom: 30px;
padding: 20px;
@@ -1808,6 +1846,32 @@ using settings names for now
color: #f0a500;
}
+.settings-actions {
+ display: flex;
+ gap: 10px;
+ margin-top: 20px;
+ flex-wrap: wrap;
+}
+
+.settings-actions button {
+ padding: 12px 24px;
+ font-size: 16px;
+ font-weight: 500;
+ border: none;
+ border-radius: 6px;
+ cursor: pointer;
+ transition: opacity 0.2s;
+}
+
+.settings-actions button:hover {
+ opacity: 0.9;
+}
+
+.settings-actions button:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
/* TODO(refactor): signin form stuff should be cleaned */
main.auth-form {
width: 275px;
diff --git a/public/index.html b/public/index.html
index 358084b2..0881cdfd 100644
--- a/public/index.html
+++ b/public/index.html
@@ -107,6 +107,10 @@
Study Mode
more.
Hide this message
+
+
Anki sync enabled.
+
Your flash cards are synced to Anki, so you may intend to study there.
+
Cards due:
@@ -368,63 +372,147 @@ What is the flow diagram?
-
- Local AI Settings
-
- Connect to a local AI server (like LMStudio)
- to use AI features without signing in. The server must be OpenAI API compatible.
-
+
-
-
-
+
+
+ Local AI Settings
+
+ Connect to a local AI server (like LMStudio)
+ to use AI features without signing in. The server must be OpenAI API compatible.
+
-
-
-
-
The base URL of your local AI server's OpenAI-compatible API.
-
+
+
+
-
-
-
-
+
+
+
+
The base URL of your local AI server's OpenAI-compatible API.
+
-
-
-
-
-
Select the model to use for AI features. Some features (like image
- analysis) require vision-capable models.
-
+
+
+
+
-
-
+
+
+
+
+
Select the model to use for AI features. Some features (like image
+ analysis) require vision-capable models.
+
-
- Instructions
-
- - Download and install LMStudio (or another
- OpenAI-compatible server).
- - Download a model in LMStudio (e.g., Llama, Qwen, or a vision model for image analysis).
- - Start the local server in LMStudio (Developer tab → Start Server).
- - Enter the server endpoint above (default:
http://localhost:1234/v1).
- - Click "Test Connection" to verify and load available models.
- - Select a model and enable Local AI.
-
-
- Note: For best results with Chinese, use a model with good multilingual support.
- For image analysis, you'll need a vision-capable model.
-
-
+
+
+
+
+ Instructions
+
+ - Download and install LMStudio (or another
+ OpenAI-compatible server).
+ - Download a model in LMStudio (e.g., Llama, Qwen, or a vision model for image analysis).
+ - Start the local server in LMStudio (Developer tab → Start Server).
+ - Enter the server endpoint above (default:
http://localhost:1234/v1).
+ - Click "Test Connection" to verify and load available models.
+ - Select a model and enable Local AI.
+
+
+ Note: For best results with Chinese, use a model with good multilingual
+ support.
+ For image analysis, you'll need a vision-capable model.
+
+
+
+
+
+
+ Anki Connect Settings
+
+ Sync your flashcards with Anki using the
+ Anki-Connect plugin.
+
+
+
+
+
+
+
+
+
+
The URL where Anki-Connect is running (default port is 8765).
+
+
+
+
+
+
+
+
+
+
+
+
The Anki deck where cards will be synced. Will be created if it doesn't
+ exist.
+
+
+
+
+
+
Only required if you've configured authentication in Anki-Connect.
+
+
+
+
+
+
+
+
+
+
+
+
+ Instructions
+
+ - Install Anki if you haven't already.
+
+ - Install the Anki-Connect
+ plugin (Tools → Add-ons → Get Add-ons → Enter code: 2055492159).
+ - Restart Anki after installing the plugin.
+ - Keep Anki running in the background.
+ - Click "Test Connection" to verify connectivity.
+ - Enable Anki Sync to automatically sync new cards.
+
+
+ Note: Anki must be running for sync to work. On macOS, you may need to
+ disable
+ App Nap.
+
+
+