sillytavern 1.13.4 → 1.13.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CONTRIBUTING.md +14 -3
  2. package/Dockerfile +1 -1
  3. package/config.yaml +20 -8
  4. package/default/config.yaml +20 -8
  5. package/default/content/presets/openai/Default.json +6 -3
  6. package/default/content/settings.json +1 -1
  7. package/package.json +1 -1
  8. package/public/css/backgrounds.css +142 -69
  9. package/public/css/mobile-styles.css +31 -44
  10. package/public/css/world-info.css +4 -0
  11. package/public/img/apple-icon-192x192.png +0 -0
  12. package/public/img/apple-icon-512x512.png +0 -0
  13. package/public/index.html +149 -180
  14. package/public/lib/pagination.js +69 -3
  15. package/public/locales/ar-sa.json +1 -1
  16. package/public/locales/de-de.json +1 -1
  17. package/public/locales/es-es.json +1 -1
  18. package/public/locales/fr-fr.json +2 -2
  19. package/public/locales/is-is.json +1 -1
  20. package/public/locales/it-it.json +1 -1
  21. package/public/locales/ja-jp.json +1 -1
  22. package/public/locales/ko-kr.json +1 -1
  23. package/public/locales/nl-nl.json +1 -1
  24. package/public/locales/pt-pt.json +1 -1
  25. package/public/locales/ru-ru.json +121 -29
  26. package/public/locales/uk-ua.json +1 -1
  27. package/public/locales/vi-vn.json +1 -1
  28. package/public/locales/zh-cn.json +19 -7
  29. package/public/locales/zh-tw.json +2 -2
  30. package/public/manifest.json +10 -0
  31. package/public/script.js +389 -276
  32. package/public/scripts/RossAscends-mods.js +38 -35
  33. package/public/scripts/backgrounds.js +237 -167
  34. package/public/scripts/chats.js +2 -3
  35. package/public/scripts/constants.js +1 -0
  36. package/public/scripts/custom-request.js +3 -1
  37. package/public/scripts/dom-handlers.js +66 -0
  38. package/public/scripts/events.js +4 -0
  39. package/public/scripts/extensions/assets/index.js +37 -3
  40. package/public/scripts/extensions/assets/style.css +27 -2
  41. package/public/scripts/extensions/caption/index.js +9 -1
  42. package/public/scripts/extensions/caption/settings.html +24 -45
  43. package/public/scripts/extensions/connection-manager/index.js +22 -2
  44. package/public/scripts/extensions/memory/index.js +1 -1
  45. package/public/scripts/extensions/regex/debugger.html +5 -1
  46. package/public/scripts/extensions/regex/dropdown.html +35 -3
  47. package/public/scripts/extensions/regex/engine.js +227 -27
  48. package/public/scripts/extensions/regex/importTarget.html +6 -0
  49. package/public/scripts/extensions/regex/index.js +526 -168
  50. package/public/scripts/extensions/regex/presetEmbeddedScripts.html +5 -0
  51. package/public/scripts/extensions/regex/scriptTemplate.html +20 -11
  52. package/public/scripts/extensions/regex/style.css +35 -26
  53. package/public/scripts/extensions/shared.js +1 -0
  54. package/public/scripts/extensions/stable-diffusion/dropdown.html +1 -1
  55. package/public/scripts/extensions/stable-diffusion/index.js +1 -1
  56. package/public/scripts/extensions/stable-diffusion/settings.html +6 -6
  57. package/public/scripts/extensions/tts/css/minimax-tts.css +5 -0
  58. package/public/scripts/extensions/tts/electronhub.js +455 -0
  59. package/public/scripts/extensions/tts/gpt-sovits-v2.js +4 -5
  60. package/public/scripts/extensions/tts/index.js +2 -0
  61. package/public/scripts/extensions/tts/minimax.js +44 -16
  62. package/public/scripts/extensions/tts/settings.html +2 -2
  63. package/public/scripts/extensions/tts/system.js +5 -4
  64. package/public/scripts/extensions/vectors/index.js +1 -1
  65. package/public/scripts/extensions/vectors/settings.html +1 -0
  66. package/public/scripts/extensions.js +3 -0
  67. package/public/scripts/group-chats.js +56 -39
  68. package/public/scripts/loader.js +1 -1
  69. package/public/scripts/macros.js +31 -1
  70. package/public/scripts/openai.js +223 -126
  71. package/public/scripts/personas.js +39 -22
  72. package/public/scripts/popup.js +18 -4
  73. package/public/scripts/power-user.js +10 -1
  74. package/public/scripts/preset-manager.js +14 -10
  75. package/public/scripts/reasoning.js +9 -1
  76. package/public/scripts/secrets.js +26 -8
  77. package/public/scripts/slash-commands.js +8 -0
  78. package/public/scripts/st-context.js +2 -0
  79. package/public/scripts/tags.js +5 -0
  80. package/public/scripts/templates/macros.html +2 -0
  81. package/public/scripts/tokenizers.js +51 -0
  82. package/public/scripts/tool-calling.js +3 -2
  83. package/public/scripts/util/stream-fadein.js +69 -0
  84. package/public/scripts/utils.js +132 -4
  85. package/public/scripts/world-info.js +324 -64
  86. package/public/style.css +27 -3
  87. package/src/config-init.js +10 -0
  88. package/src/endpoints/backends/chat-completions.js +73 -26
  89. package/src/endpoints/characters.js +2 -0
  90. package/src/endpoints/chats.js +5 -2
  91. package/src/endpoints/openai.js +98 -0
  92. package/src/endpoints/secrets.js +3 -2
  93. package/src/endpoints/vectors.js +1 -1
  94. package/src/middleware/webpack-serve.js +2 -1
  95. package/src/users.js +30 -3
  96. package/tests/package-lock.json +3 -3
package/CONTRIBUTING.md CHANGED
@@ -9,7 +9,7 @@
9
9
  ## Getting the code ready
10
10
 
11
11
  1. Register a GitHub account.
12
- 2. Fork this repository under your account.
12
+ 2. Fork this repository under your account.
13
13
  3. Clone the fork onto your machine.
14
14
  4. Open the cloned repository in the code editor.
15
15
  5. Create a git branch (recommended).
@@ -29,11 +29,22 @@
29
29
  - Updating GitHub Actions.
30
30
  - Hotfixing a critical bug.
31
31
  4. Project maintainers will test and can change your code before merging.
32
- 5. Write at least somewhat meaningful PR descriptions. There's no "right" way to do it, but the following may help with outlining a general structure:
32
+ 5. To make sure that your contribution remains testable and reviewable, try not to exceed a soft limit of **200 lines of code** (both additions and deletions) per pull request. If you have more to contribute, split it into multiple pull requests. We can also consider creating a separate feature branch for more substantial changes, but please discuss it with the maintainers first.
33
+ 6. Write at least somewhat meaningful PR descriptions and commit messages. There's no "right" way to do it, but the following may help with outlining a general structure:
33
34
  - What is the reason for a change?
34
35
  - What did you do to achieve this?
35
36
  - How would a reviewer test the change?
36
- 6. Mind the license. Your contributions will be licensed under the GNU Affero General Public License. If you don't know what that implies, consult your lawyer.
37
+ 7. English is the primary language of communication in this project. Please use only English when writing commit messages, PR descriptions, comments and other text. This does not apply to contributions to localization files.
38
+ 8. Mind the license. Your contributions will be licensed under the GNU Affero General Public License. If you don't know what that implies, consult your lawyer.
39
+
40
+ ## Use of AI coding assistance tools ("Vibe Coding")
41
+
42
+ We do not prohibit nor encourage the use of AI tools for coding assistance to help you write code, documentation, etc. This includes specialized IDEs, plugins and add-ons, chat interfaces, etc. However, please keep in mind the following:
43
+
44
+ - No matter who (or what) wrote the code, you are responsible for it. Make sure to carefully review and test everything before committing, and be ready to discuss and fix any issues that may arise during the review.
45
+ - Maintainers can reject reviewing and accepting PRs of very low quality, i.e. if the time to fix the issues exceeds the time to write the code from scratch.
46
+ - Avoid common mistakes attributed to AI tools, such as: adding/removing unrelated comments, excessive logging, unawareness of the project context and conventions, etc.
47
+ - You are allowed, but not required, to trigger AI tools that are added to the project by maintainers (Gemini, Copilot, Codex). Keep in mind that any feedback (comments, suggestions) that these tools generate is not a call to action; make sure to properly assess it before applying.
37
48
 
38
49
  ## Further reading
39
50
 
package/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM node:lts-alpine3.21
1
+ FROM node:lts-alpine3.22
2
2
 
3
3
  # Arguments
4
4
  ARG APP_HOME=/home/node/app
package/config.yaml CHANGED
@@ -82,18 +82,30 @@ requestProxy:
82
82
  enableUserAccounts: false
83
83
  # Enable discreet login mode: hides user list on the login screen
84
84
  enableDiscreetLogin: false
85
- # Enable's authlia based auto login. Only enable this if you
86
- # have setup and installed Authelia as a middle-ware on your
87
- # reverse proxy
88
- # https://www.authelia.com/
89
- # This will use auto login to an account with the same username
90
- # as that used for authlia. (Ensure the username in authlia
91
- # is an exact match in lowercase with that in sillytavern)
92
- autheliaAuth: false
93
85
  # If `basicAuthMode` and this are enabled then
94
86
  # the username and passwords for basic auth are the same as those
95
87
  # for the individual accounts
96
88
  perUserBasicAuth: false
89
+
90
+ # -- SSO LOGIN CONFIGURATION --
91
+ sso:
92
+ # Enable's authlia based auto login. Only enable this if you
93
+ # have setup and installed Authelia as a middle-ware on your
94
+ # reverse proxy
95
+ # https://www.authelia.com/
96
+ # This will use auto login to an account with the same username
97
+ # as that used for authlia. (Ensure the username in authlia
98
+ # is an exact match in lowercase with that in sillytavern)
99
+ autheliaAuth: false
100
+ # Enable's authentik based auto login. Only enable this if you
101
+ # have setup and installed Authentik as a middle-ware on your
102
+ # reverse proxy.
103
+ # https://goauthentik.io/
104
+ # This will use auto login to an account with the same username
105
+ # as that used for authentik. (Ensure the username in authentik
106
+ # is an exact match in lowercase with that in sillytavern).
107
+ authentikAuth: false
108
+
97
109
  # Host whitelist configuration. Recommended if you're using a listen mode
98
110
  hostWhitelist:
99
111
  # Enable or disable host whitelisting
@@ -82,18 +82,30 @@ requestProxy:
82
82
  enableUserAccounts: false
83
83
  # Enable discreet login mode: hides user list on the login screen
84
84
  enableDiscreetLogin: false
85
- # Enable's authlia based auto login. Only enable this if you
86
- # have setup and installed Authelia as a middle-ware on your
87
- # reverse proxy
88
- # https://www.authelia.com/
89
- # This will use auto login to an account with the same username
90
- # as that used for authlia. (Ensure the username in authlia
91
- # is an exact match in lowercase with that in sillytavern)
92
- autheliaAuth: false
93
85
  # If `basicAuthMode` and this are enabled then
94
86
  # the username and passwords for basic auth are the same as those
95
87
  # for the individual accounts
96
88
  perUserBasicAuth: false
89
+
90
+ # -- SSO LOGIN CONFIGURATION --
91
+ sso:
92
+ # Enable's authlia based auto login. Only enable this if you
93
+ # have setup and installed Authelia as a middle-ware on your
94
+ # reverse proxy
95
+ # https://www.authelia.com/
96
+ # This will use auto login to an account with the same username
97
+ # as that used for authlia. (Ensure the username in authlia
98
+ # is an exact match in lowercase with that in sillytavern)
99
+ autheliaAuth: false
100
+ # Enable's authentik based auto login. Only enable this if you
101
+ # have setup and installed Authentik as a middle-ware on your
102
+ # reverse proxy.
103
+ # https://goauthentik.io/
104
+ # This will use auto login to an account with the same username
105
+ # as that used for authentik. (Ensure the username in authentik
106
+ # is an exact match in lowercase with that in sillytavern).
107
+ authentikAuth: false
108
+
97
109
  # Host whitelist configuration. Recommended if you're using a listen mode
98
110
  hostWhitelist:
99
111
  # Enable or disable host whitelisting
@@ -1,20 +1,23 @@
1
1
  {
2
2
  "chat_completion_source": "openai",
3
3
  "openai_model": "gpt-4-turbo",
4
- "claude_model": "claude-3-5-sonnet-20240620",
4
+ "claude_model": "claude-sonnet-4-5",
5
5
  "openrouter_model": "OR_Website",
6
6
  "openrouter_use_fallback": false,
7
7
  "openrouter_group_models": false,
8
8
  "openrouter_sort_models": "alphabetically",
9
9
  "ai21_model": "jamba-large",
10
10
  "mistralai_model": "mistral-large-latest",
11
+ "electronhub_model": "gpt-4o-mini",
12
+ "electronhub_sort_models": "alphabetically",
13
+ "electronhub_group_models": false,
11
14
  "custom_model": "",
12
15
  "custom_url": "",
13
16
  "custom_include_body": "",
14
17
  "custom_exclude_body": "",
15
18
  "custom_include_headers": "",
16
- "google_model": "gemini-pro",
17
- "vertexai_model": "gemini-2.0-flash-001",
19
+ "google_model": "gemini-2.5-pro",
20
+ "vertexai_model": "gemini-2.5-pro",
18
21
  "temperature": 1,
19
22
  "frequency_penalty": 0,
20
23
  "presence_penalty": 0,
@@ -620,7 +620,7 @@
620
620
  },
621
621
  "wi_format": "{0}",
622
622
  "openai_model": "gpt-4-turbo",
623
- "claude_model": "claude-3-5-sonnet-20240620",
623
+ "claude_model": "claude-sonnet-4-5",
624
624
  "ai21_model": "jamba-large",
625
625
  "openrouter_model": "OR_Website",
626
626
  "reverse_proxy": "",
package/package.json CHANGED
@@ -113,7 +113,7 @@
113
113
  "type": "git",
114
114
  "url": "https://github.com/SillyTavern/SillyTavern.git"
115
115
  },
116
- "version": "1.13.4",
116
+ "version": "1.13.5",
117
117
  "scripts": {
118
118
  "start": "node server.js",
119
119
  "debug": "node --inspect server.js",
@@ -1,6 +1,5 @@
1
1
  /* Main Page Backgrounds */
2
- #bg1,
3
- #bg_custom {
2
+ #bg1 {
4
3
  background-repeat: no-repeat;
5
4
  background-attachment: fixed;
6
5
  background-size: cover;
@@ -8,72 +7,46 @@
8
7
  width: 100%;
9
8
  height: 100%;
10
9
  transition: background-image var(--animation-duration-3x) ease-in-out;
10
+ z-index: -1;
11
11
  }
12
12
 
13
13
  /* Fitting options */
14
14
  #background_fitting {
15
- max-width: 6em;
15
+ max-width: 8em;
16
16
  }
17
17
 
18
18
  /* Fill/Cover - scales to fill width while maintaining aspect ratio */
19
- #bg1.cover,
20
- #bg_custom.cover {
19
+ #bg1.cover {
21
20
  background-size: cover;
22
21
  background-position: center;
23
22
  }
24
23
 
25
24
  /* Fit/Contain - shows entire image maintaining aspect ratio */
26
- #bg1.contain,
27
- #bg_custom.contain {
25
+ #bg1.contain {
28
26
  background-size: contain;
29
27
  background-position: center;
30
28
  background-repeat: no-repeat;
31
29
  }
32
30
 
33
31
  /* Stretch - stretches to fill entire space */
34
- #bg1.stretch,
35
- #bg_custom.stretch {
32
+ #bg1.stretch {
36
33
  background-size: 100% 100%;
37
34
  }
38
35
 
39
36
  /* Center - centers without scaling */
40
- #bg1.center,
41
- #bg_custom.center {
37
+ #bg1.center {
42
38
  background-size: auto;
43
39
  background-position: center;
44
40
  background-repeat: no-repeat;
45
41
  }
46
42
 
47
- body.reduced-motion #bg1,
48
- body.reduced-motion #bg_custom {
49
- transition: none;
50
- }
51
-
52
- #bg1 {
53
- background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=');
54
- z-index: -3;
55
- }
56
-
57
- #bg_custom {
58
- background-image: none;
59
- z-index: -2;
60
- }
61
-
62
- .bg_example.flex-container.locked:not(:focus-visible) {
63
- outline-color: var(--golden);
64
- }
65
-
66
43
  /* This is the main flex container for the entire drawer */
67
- #Backgrounds.drawer-content.openDrawer.bg-drawer-layout {
44
+ .drawer-content.openDrawer.bg-drawer-layout {
68
45
  display: flex;
46
+ }
47
+
48
+ .bg-drawer-layout {
69
49
  flex-direction: column;
70
- height: calc(100vh - var(--topBarBlockSize));
71
- max-height: calc(100vh - var(--topBarBlockSize));
72
- height: calc(100dvh - var(--topBarBlockSize));
73
- max-height: calc(100dvh - var(--topBarBlockSize));
74
- overflow: hidden;
75
- width: var(--sheldWidth);
76
- max-width: var(--sheldWidth);
77
50
  padding: 0;
78
51
  }
79
52
 
@@ -82,11 +55,31 @@ body.reduced-motion #bg_custom {
82
55
  padding: 5px;
83
56
  background-color: var(--SmartThemeBlurTintColor);
84
57
  border-bottom: 1px solid var(--SmartThemeBorderColor);
58
+ width: 100%;
85
59
  }
86
60
 
87
- #bg-header-fixed>.flex-container {
61
+ .bg-header-row-1,
62
+ .bg-header-row-2 {
63
+ display: flex;
64
+ gap: 5px;
65
+ width: 100%;
66
+ }
67
+
68
+ /* Control buttons in header */
69
+ .heading-container-with-controls {
70
+ position: relative;
71
+ }
72
+
73
+ .heading-container-with-controls .heading-text {
74
+ margin: 10px 0;
75
+ }
76
+
77
+ .heading-container-with-controls .heading-controls {
78
+ position: absolute;
79
+ right: 5px;
80
+ top: 50%;
81
+ transform: translateY(-50%);
88
82
  display: flex;
89
- align-items: center;
90
83
  gap: 5px;
91
84
  }
92
85
 
@@ -94,49 +87,92 @@ body.reduced-motion #bg_custom {
94
87
  flex-grow: 1;
95
88
  overflow-y: auto;
96
89
  overflow-x: hidden;
97
- padding: 0 5px 5px;
90
+ padding: 0 5px 15px;
91
+ position: relative;
92
+ }
93
+
94
+ #bg_menu_content,
95
+ #bg_custom_content {
96
+ display: grid;
97
+ gap: 5px;
98
+ width: 100%;
99
+ grid-template-columns: repeat(var(--bg-thumb-columns, 5), 1fr);
98
100
  }
99
101
 
100
102
  #bg-filter {
101
103
  font-size: calc(var(--mainFontSize) * 0.95);
102
104
  }
103
105
 
104
- /* Thumbnail Menu & Buttons */
106
+ /* Thumbnails */
107
+ .bg_example:hover .BGSampleTitle {
108
+ opacity: 1;
109
+ }
110
+
105
111
  .bg_example .mobile-only-menu-toggle {
106
112
  display: none;
107
113
  }
108
114
 
109
- .bg_example.flex-container {
110
- width: 30%;
111
- max-width: 200px;
112
- margin: 5px;
113
- aspect-ratio: 16/9;
115
+ .bg_example {
114
116
  cursor: pointer;
115
117
  box-shadow: 0 0 7px var(--black50a);
116
-
117
118
  position: relative;
118
119
  overflow: hidden;
119
120
  border-radius: 8px;
120
121
  border: 0px solid transparent;
121
122
  outline: 2px solid var(--SmartThemeBorderColor);
122
123
  outline-offset: -1px;
124
+
125
+ height: auto;
126
+ aspect-ratio: 16 / 9;
123
127
  }
124
128
 
125
- .bg_example.flex-container:focus-visible {
129
+ .bg_example:focus-visible {
126
130
  outline-offset: inherit;
131
+ outline-color: var(--interactable-outline-color);
132
+ }
133
+
134
+ .bg_example.locked-background {
135
+ outline: 2px solid var(--golden);
136
+ outline-offset: 0;
127
137
  }
128
138
 
129
- .bg_example_img {
139
+ .bg_example.locked-background::after {
140
+ content: '\f023';
141
+ font-family: 'Font Awesome 6 Free';
142
+ font-weight: 900;
143
+
130
144
  position: absolute;
131
- top: -2px;
132
- left: -2px;
133
- right: -2px;
134
- bottom: -2px;
145
+ bottom: 5px;
146
+ right: 5px;
147
+ z-index: 4;
148
+ color: var(--golden);
149
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.8));
150
+ font-size: calc(var(--mainFontSize) * 0.8);
151
+ pointer-events: none;
152
+ }
135
153
 
136
- background-image: inherit;
154
+ .bg_example:not(.locked-background) .jg-unlock,
155
+ .bg_example.locked-background .jg-lock {
156
+ display: none;
157
+ }
137
158
 
138
- background-size: cover;
139
- background-position: center;
159
+ .bg_example.selected-background {
160
+ outline: 2px solid white;
161
+ outline-offset: 0;
162
+ }
163
+
164
+ .bg_example.selected-background::before {
165
+ content: '\f00c';
166
+ font-family: 'Font Awesome 6 Free';
167
+ font-weight: 900;
168
+ position: absolute;
169
+ top: 5px;
170
+ left: 5px;
171
+ z-index: 4;
172
+ color: var(--white100);
173
+ filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.8));
174
+ font-size: calc(var(--mainFontSize) * 0.9);
175
+ pointer-events: none;
140
176
  }
141
177
 
142
178
  .bg_example .jg-menu {
@@ -145,9 +181,8 @@ body.reduced-motion #bg_custom {
145
181
  top: 2px;
146
182
  right: 2px;
147
183
  background-color: rgba(0, 0, 0, 0.5);
148
- border-radius: 8px;
149
- gap: 3px;
150
- padding: 3px 5px;
184
+ border-radius: 5px;
185
+ padding: 3px 3px;
151
186
  z-index: 3;
152
187
  backdrop-filter: blur(4px);
153
188
  border: 1px solid var(--SmartThemeBorderColor);
@@ -170,14 +205,14 @@ body.reduced-motion #bg_custom {
170
205
 
171
206
  .bg_example .jg-button {
172
207
  display: flex;
173
- width: 30px;
174
- height: 30px;
208
+ width: 24px;
209
+ height: 24px;
175
210
  align-items: center;
176
211
  justify-content: center;
177
212
  color: white;
178
213
  padding: 5px;
179
214
  font-size: 1.1em;
180
- border-radius: 6px;
215
+ border-radius: 5px;
181
216
  transition: background-color var(--animation-duration) ease;
182
217
  }
183
218
 
@@ -185,16 +220,54 @@ body.reduced-motion #bg_custom {
185
220
  background-color: rgba(255, 255, 255, 0.2);
186
221
  }
187
222
 
188
- .bg_example .jg-unlock {
189
- display: none;
223
+ /* Scroll-to-Top Button */
224
+ #bg-scroll-top {
225
+ position: absolute;
226
+ bottom: 20px;
227
+ right: 20px;
228
+ width: 42px;
229
+ height: 42px;
230
+ background: var(--SmartThemeBlurTintColor);
231
+ color: var(--SmartThemeBodyColor);
232
+ border: 1px solid var(--SmartThemeBorderColor);
233
+ border-radius: 50%;
234
+ cursor: pointer;
235
+ z-index: 10;
236
+ font-size: 18px;
237
+ display: inline-flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ opacity: 0;
241
+ transition: opacity var(--animation-duration) ease;
242
+ pointer-events: none;
190
243
  }
191
244
 
192
- .bg_example.locked .jg-lock {
193
- display: none;
245
+ #bg-scroll-top.visible {
246
+ opacity: 1;
247
+ pointer-events: auto;
194
248
  }
195
249
 
196
- .bg_example.locked .jg-unlock {
197
- display: flex;
250
+ #bg-scroll-top:hover {
251
+ filter: brightness(150%);
252
+ outline: 1px solid var(--interactable-outline-color);
253
+ }
254
+
255
+ #bg-scroll-top .fa-solid {
256
+ margin: 0;
257
+ padding: 0;
258
+ line-height: 1;
259
+ }
260
+
261
+ .thumbnail-clipper {
262
+ position: absolute;
263
+ top: -2px;
264
+ left: -2px;
265
+ right: -2px;
266
+ bottom: -2px;
267
+ overflow: hidden;
268
+ border-radius: inherit;
269
+ background-size: cover;
270
+ background-position: center;
198
271
  }
199
272
 
200
273
  .bg_example:not([custom="true"]) .jg-copy,
@@ -10,6 +10,18 @@
10
10
  flex-basis: 100%;
11
11
  }
12
12
 
13
+ #rm_button_panel_pin_div,
14
+ #lm_button_panel_pin_div {
15
+ display: none;
16
+ }
17
+
18
+ #rm_button_characters {
19
+ font-size: var(--topBarIconSize);
20
+ }
21
+
22
+ #CharListButtonAndHotSwaps {
23
+ align-items: center;
24
+ }
13
25
 
14
26
  #send_form.compact #leftSendForm,
15
27
  #send_form.compact #rightSendForm {
@@ -21,6 +33,15 @@
21
33
  display: none;
22
34
  }
23
35
 
36
+ #bg_menu_content,
37
+ #bg_custom_content {
38
+ grid-template-columns: repeat(var(--bg-thumb-columns, 3), 1fr);
39
+ }
40
+
41
+ .bg_list {
42
+ width: unset;
43
+ }
44
+
24
45
  .bg_button {
25
46
  font-size: 15px;
26
47
  }
@@ -40,6 +61,11 @@
40
61
  z-index: 4;
41
62
  }
42
63
 
64
+ .bg_example.mobile-menu-open .mobile-only-menu-toggle {
65
+ opacity: 0;
66
+ pointer-events: none;
67
+ }
68
+
43
69
  .bg_example .mobile-only-menu-toggle {
44
70
  display: flex;
45
71
  align-items: center;
@@ -57,48 +83,13 @@
57
83
  backdrop-filter: blur(2px);
58
84
  }
59
85
 
60
- #bg-header-controls {
61
- flex-wrap: wrap;
62
- row-gap: 10px;
63
- }
64
-
65
- #bg-header-fixed>.flex-container {
66
- flex-wrap: wrap;
67
- row-gap: 0px;
68
- }
69
-
70
- #Backgrounds:not(.selection-mode-active) #bg-header-fixed>.flex-container::after {
71
- content: '';
72
- order: 1;
73
- flex-basis: 100%;
74
- height: 0;
75
- }
76
-
77
- /* --- Row 1 Item --- */
78
- #bg-header-fixed #bg-header-title {
79
- order: 1;
80
- flex-grow: 1;
81
- }
82
-
83
- #bg-header-fixed #background_fitting,
84
- #bg-header-fixed #auto_background {
85
- order: 1;
86
- }
87
-
88
- /* --- Row 2 Item --- */
89
- #bg-header-fixed #bg-filter {
90
- order: 2;
91
- flex-grow: 1;
92
- min-width: 0;
86
+ .bg_example .jg-button {
87
+ width: 30px;
88
+ height: 30px;
93
89
  }
94
90
 
95
- /* --- Row 3 Item --- */
96
- #bg-header-fixed #add_background_button_top {
97
- order: 3;
98
- width: 100%;
99
- text-align: center;
100
- padding-top: 0.5em;
101
- padding-bottom: 0.5em;
91
+ #background_fitting {
92
+ max-width: 6em;
102
93
  }
103
94
 
104
95
  #Backgrounds.drawer-content.openDrawer.bg-drawer-layout {
@@ -429,10 +420,6 @@
429
420
  .horde_multiple_hint {
430
421
  display: none;
431
422
  }
432
-
433
- .bg_list {
434
- width: unset;
435
- }
436
423
  }
437
424
 
438
425
  /*landscape mode phones and ipads*/
@@ -301,6 +301,10 @@ select.keyselect+span.select2-container .select2-selection--multiple {
301
301
  display: none;
302
302
  }
303
303
 
304
+ .world_entry:not(:has(select[name="position"] option[value="7"]:checked)) .world_entry_form_control:has(input[name="outletName"]) {
305
+ display: none;
306
+ }
307
+
304
308
  .world_entry label[for="__invisible"] {
305
309
  visibility: hidden;
306
310
  pointer-events: none;