+
@@ -27,7 +28,12 @@
\ No newline at end of file
diff --git a/client/store/index.js b/client/store/index.js
index b9feec8db..f7c78d5a8 100644
--- a/client/store/index.js
+++ b/client/store/index.js
@@ -36,6 +36,10 @@ export const getters = {
if (!state.serverSettings) return null
return state.serverSettings[key]
},
+ getServerStyling: (state) => {
+ if (!state.serverSettings?.styling) return null
+ return state.serverSettings.styling
+ },
getLibraryItemIdStreaming: (state) => {
return state.streamLibraryItem?.id || null
},
diff --git a/client/strings/en-us.json b/client/strings/en-us.json
index 85eda5ee0..6574aeac6 100644
--- a/client/strings/en-us.json
+++ b/client/strings/en-us.json
@@ -1119,5 +1119,15 @@
"LabelRating": "Rating",
"LabelStarRating": "{0} stars",
"LabelNoRating": "No rating",
- "LabelAverageRating": "Average rating: {0}"
+ "LabelAverageRating": "Average rating: {0}",
+ "HeaderStyling": "Styling",
+ "HeaderStylingColors": "Colors",
+ "HeaderStylingPreview": "Preview",
+ "LabelBackgroundColor": "Background Color",
+ "LabelErrorColor": "Error Color",
+ "LabelInfoColor": "Info Color",
+ "LabelPrimaryColor": "Primary Color",
+ "LabelPrimaryDarkColor": "Primary Dark Color",
+ "LabelSuccessColor": "Success Color",
+ "LabelWarningColor": "Warning Color"
}
diff --git a/client/strings/en.json b/client/strings/en.json
index 13e3c213e..c8e51a5bb 100644
--- a/client/strings/en.json
+++ b/client/strings/en.json
@@ -1,4 +1,25 @@
{
+ "HeaderServerStyling": "Server Styling",
+ "DescriptionServerStyling": "Customize server appearance",
+ "HeaderSettings": "Settings",
+ "HeaderLibraries": "Libraries",
+ "HeaderUsers": "Users",
+ "HeaderListeningSessions": "Listening Sessions",
+ "HeaderBackups": "Backups",
+ "HeaderLogs": "Logs",
+ "HeaderNotifications": "Notifications",
+ "HeaderEmail": "Email",
+ "HeaderItemMetadataUtils": "Item Metadata Utils",
+ "HeaderRSSFeeds": "RSS Feeds",
+ "HeaderAuthentication": "Authentication",
+ "HeaderLibraryStats": "Library Stats",
+ "HeaderYourStats": "Your Stats",
+ "DescriptionAuthentication": "Configure authentication methods and settings",
+ "DescriptionLibraries": "Manage your libraries",
+ "DescriptionBackups": "Configure server backups",
+ "DescriptionEmail": "Configure email settings",
+ "DescriptionNotifications": "Configure notification settings",
+ "DescriptionServerLogs": "View server logs",
"LabelSelectAll": "Select All",
"LabelComments": "Comments",
"PlaceholderAddComment": "Add a comment... (Ctrl+Enter to post)",
diff --git a/readme.md b/readme.md
index 3eb4cef7a..d2fc6b0c5 100644
--- a/readme.md
+++ b/readme.md
@@ -450,3 +450,28 @@ If you are using VSCode, this project includes a couple of pre-defined targets t
# How to Support
[See the incomplete "How to Support" page](https://www.audiobookshelf.org/support)
+
+# Development
+
+### Killing Running Processes
+When developing locally, you might need to kill running instances of the client or server. Here are some helpful commands:
+
+```bash
+# Kill process on port 3000 (client)
+sudo kill $(lsof -t -i:3000)
+
+# Kill process on port 3333 (server)
+sudo kill $(lsof -t -i:3333)
+```
+
+You can also find and kill processes manually:
+```bash
+# List all Node.js processes
+ps aux | grep node
+
+# Kill processes by PID
+kill
+
+# Force kill if process won't exit
+kill -9
+```
diff --git a/server/objects/settings/ServerSettings.js b/server/objects/settings/ServerSettings.js
index 29913e449..a8d2ce177 100644
--- a/server/objects/settings/ServerSettings.js
+++ b/server/objects/settings/ServerSettings.js
@@ -9,6 +9,17 @@ class ServerSettings {
this.id = 'server-settings'
this.tokenSecret = null
+ // Styling
+ this.styling = {
+ primary: '#1e293b',
+ primaryDark: '#0f172a',
+ success: '#22c55e',
+ warning: '#f59e0b',
+ error: '#ef4444',
+ info: '#3b82f6',
+ background: '#111827'
+ }
+
// Scanner
this.scannerParseSubtitle = false
this.scannerFindCovers = false
@@ -88,6 +99,15 @@ class ServerSettings {
construct(settings) {
this.tokenSecret = settings.tokenSecret
+
+ // Styling
+ if (settings.styling) {
+ this.styling = {
+ ...this.styling,
+ ...settings.styling
+ }
+ }
+
this.scannerFindCovers = !!settings.scannerFindCovers
this.scannerCoverProvider = settings.scannerCoverProvider || 'google'
this.scannerParseSubtitle = settings.scannerParseSubtitle
@@ -204,6 +224,7 @@ class ServerSettings {
return {
id: this.id,
tokenSecret: this.tokenSecret, // Do not return to client
+ styling: { ...this.styling },
scannerFindCovers: this.scannerFindCovers,
scannerCoverProvider: this.scannerCoverProvider,
scannerParseSubtitle: this.scannerParseSubtitle,