feat(themes): custom CSS themes per user (upload, paste, live)
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 1m21s
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 1m21s
- Theme manager in settings: upload a .css file or paste CSS, template
download/copy/insert, edit and delete; custom themes show up in the
gallery and the quick switchers
- Themes are injected live as <style id="mindsift-custom-theme">; the
active one is cached so it applies on boot without flashing
- Backend: user_themes table and GET/POST /themes, DELETE /themes/{id}
(per user, max 200 KB)
- Docs: theming, REST, database
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
84395f3322
commit
bf0d68e7e1
15 files changed
+653
-51
No files matched your search
@@ -18,6 +18,7 @@ import {
|
||||
SpaceShare,
|
||||
SystemSettings,
|
||||
SharingMode,
|
||||
UserTheme,
|
||||
Team,
|
||||
TaskList,
|
||||
TaskListShare,
|
||||
@@ -1009,6 +1010,23 @@ export const api = {
|
||||
});
|
||||
},
|
||||
|
||||
// --- CUSTOM THEMES ---
|
||||
async getThemes(): Promise<UserTheme[]> {
|
||||
return ensureArray(await request<UserTheme[]>('/api/v1/themes'));
|
||||
},
|
||||
|
||||
// Creates a theme, or updates it when `id` is given
|
||||
async saveTheme(theme: { id?: string; name: string; css: string }): Promise<UserTheme> {
|
||||
return request<UserTheme>('/api/v1/themes', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(theme),
|
||||
});
|
||||
},
|
||||
|
||||
async deleteTheme(id: string): Promise<void> {
|
||||
await request(`/api/v1/themes/${id}`, { method: 'DELETE' });
|
||||
},
|
||||
|
||||
// --- API KEYS, WEBHOOKS & EXPORT ---
|
||||
async getAPIKeys(): Promise<APIKey[]> {
|
||||
const res = await request<APIKey[]>('/api/v1/keys');
|
||||
|
||||
Reference in new issue
Block a user