neon_sakura 0.1.4

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 (251) hide show
  1. checksums.yaml +7 -0
  2. data/.ai-reviewer/README.md +182 -0
  3. data/.ai-reviewer/ai-reviewer.sh +56 -0
  4. data/.ai-reviewer/build-system-prompt.sh +136 -0
  5. data/.ai-reviewer/extract-claude-sections.sh +32 -0
  6. data/.ai-reviewer/test-ai-reviewer.sh +40 -0
  7. data/.ai-reviewer-config.yml +190 -0
  8. data/.github/dependabot.yml +12 -0
  9. data/.github/settings.yml +70 -0
  10. data/.github/workflows/ai-pr-review-on-comment.yml +384 -0
  11. data/.github/workflows/ai-pr-review.yml +328 -0
  12. data/.github/workflows/license-check.yml +78 -0
  13. data/.github/workflows/lint.yml +79 -0
  14. data/.github/workflows/security.yml +131 -0
  15. data/.github/workflows/semgrep.yml +26 -0
  16. data/.github/workflows/test.yml +44 -0
  17. data/.gitignore +75 -0
  18. data/.rubocop.yml +33 -0
  19. data/.ruby-version +1 -0
  20. data/.simplecov +14 -0
  21. data/.stylelintignore +10 -0
  22. data/.stylelintrc.json +37 -0
  23. data/AGENTS.md +51 -0
  24. data/CHANGELOG.md +568 -0
  25. data/CLAUDE.md +632 -0
  26. data/Gemfile +8 -0
  27. data/Gemfile.lock +327 -0
  28. data/LICENSE +21 -0
  29. data/README.md +1209 -0
  30. data/Rakefile +25 -0
  31. data/app/assets/images/cherry_blossom.svg +1525 -0
  32. data/app/assets/images/cherry_blossom_tree.png +0 -0
  33. data/app/assets/images/prysm-icon.png +0 -0
  34. data/app/assets/stylesheets/base.css +29 -0
  35. data/app/assets/stylesheets/components.css +1652 -0
  36. data/app/assets/stylesheets/forms.css +152 -0
  37. data/app/assets/stylesheets/loading.css +145 -0
  38. data/app/assets/stylesheets/neon_sakura.css +40 -0
  39. data/app/assets/stylesheets/pagy-tailwind.css +120 -0
  40. data/app/assets/stylesheets/theme-default.css +40 -0
  41. data/app/assets/stylesheets/theme-green.css +84 -0
  42. data/app/assets/stylesheets/theme-purple.css +94 -0
  43. data/app/assets/stylesheets/theme-red.css +84 -0
  44. data/app/assets/stylesheets/utility-borders.css +29 -0
  45. data/app/assets/stylesheets/utility-colors.css +185 -0
  46. data/app/assets/stylesheets/utility-effects.css +123 -0
  47. data/app/assets/stylesheets/utility-gradients.css +158 -0
  48. data/app/assets/stylesheets/utility-layout.css +132 -0
  49. data/app/assets/stylesheets/utility-reset.css +13 -0
  50. data/app/assets/stylesheets/utility-responsive.css +145 -0
  51. data/app/assets/stylesheets/utility-sizing.css +99 -0
  52. data/app/assets/stylesheets/utility-spacing.css +174 -0
  53. data/app/assets/stylesheets/utility-typography.css +97 -0
  54. data/app/controllers/errors_controller.rb +120 -0
  55. data/app/controllers/style_guide_controller.rb +117 -0
  56. data/app/helpers/errors_helper.rb +12 -0
  57. data/app/helpers/neon_sakura/navbar_helper.rb +43 -0
  58. data/app/helpers/style_guide_helper.rb +36 -0
  59. data/app/javascript/neon_sakura/dropdown.js +22 -0
  60. data/app/javascript/neon_sakura/navbar.js +71 -0
  61. data/app/javascript/neon_sakura/theme_switcher.js +187 -0
  62. data/app/views/errors/show.html.erb +105 -0
  63. data/app/views/layouts/error.html.erb +19 -0
  64. data/app/views/layouts/mission_control/jobs/_application_selection.html.erb +14 -0
  65. data/app/views/layouts/mission_control/jobs/_navigation.html.erb +21 -0
  66. data/app/views/layouts/mission_control/jobs/application.html.erb +453 -0
  67. data/app/views/layouts/style_guide.html.erb +416 -0
  68. data/app/views/shared/_file_upload.html.erb +184 -0
  69. data/app/views/shared/_footer.html.erb +23 -0
  70. data/app/views/shared/_header.html.erb +42 -0
  71. data/app/views/shared/_navbar.html.erb +306 -0
  72. data/app/views/shared/_profile_image_selector.html.erb +165 -0
  73. data/app/views/shared/_theme_switcher.html.erb +64 -0
  74. data/app/views/shared/icons/_adjustments.html.erb +10 -0
  75. data/app/views/shared/icons/_alert_circle.html.erb +3 -0
  76. data/app/views/shared/icons/_alert_triangle.html.erb +3 -0
  77. data/app/views/shared/icons/_archive.html.erb +3 -0
  78. data/app/views/shared/icons/_arrow_down.html.erb +3 -0
  79. data/app/views/shared/icons/_arrow_left.html.erb +3 -0
  80. data/app/views/shared/icons/_arrow_up.html.erb +3 -0
  81. data/app/views/shared/icons/_arrows_pointing_in.html.erb +10 -0
  82. data/app/views/shared/icons/_arrows_pointing_out.html.erb +10 -0
  83. data/app/views/shared/icons/_artemis_logo.html.erb +26 -0
  84. data/app/views/shared/icons/_auth_banner.html.erb +1 -0
  85. data/app/views/shared/icons/_bars.html.erb +10 -0
  86. data/app/views/shared/icons/_bell.html.erb +3 -0
  87. data/app/views/shared/icons/_book.html.erb +3 -0
  88. data/app/views/shared/icons/_bookmark.html.erb +3 -0
  89. data/app/views/shared/icons/_box.html.erb +3 -0
  90. data/app/views/shared/icons/_brain.html.erb +3 -0
  91. data/app/views/shared/icons/_briefcase.html.erb +3 -0
  92. data/app/views/shared/icons/_calendar.html.erb +3 -0
  93. data/app/views/shared/icons/_camera.html.erb +4 -0
  94. data/app/views/shared/icons/_chart_bar.html.erb +3 -0
  95. data/app/views/shared/icons/_chart_line.html.erb +10 -0
  96. data/app/views/shared/icons/_chart_pie.html.erb +11 -0
  97. data/app/views/shared/icons/_chat.html.erb +3 -0
  98. data/app/views/shared/icons/_check.html.erb +3 -0
  99. data/app/views/shared/icons/_check_circle.html.erb +3 -0
  100. data/app/views/shared/icons/_cherry_blossom.html.erb +1516 -0
  101. data/app/views/shared/icons/_cherry_blossom_silhouette.html.erb +1016 -0
  102. data/app/views/shared/icons/_cherry_blossom_single_flower.html.erb +1125 -0
  103. data/app/views/shared/icons/_cherry_blossom_tree.html.erb +159 -0
  104. data/app/views/shared/icons/_chevron_down.html.erb +3 -0
  105. data/app/views/shared/icons/_chevron_right.html.erb +9 -0
  106. data/app/views/shared/icons/_clipboard.html.erb +3 -0
  107. data/app/views/shared/icons/_clock.html.erb +3 -0
  108. data/app/views/shared/icons/_close.html.erb +3 -0
  109. data/app/views/shared/icons/_cog.html.erb +4 -0
  110. data/app/views/shared/icons/_crop.html.erb +10 -0
  111. data/app/views/shared/icons/_crown.html.erb +3 -0
  112. data/app/views/shared/icons/_disc.html.erb +3 -0
  113. data/app/views/shared/icons/_download.html.erb +3 -0
  114. data/app/views/shared/icons/_dragonfly.html.erb +58 -0
  115. data/app/views/shared/icons/_duplicate.html.erb +4 -0
  116. data/app/views/shared/icons/_edit.html.erb +3 -0
  117. data/app/views/shared/icons/_envelope.html.erb +3 -0
  118. data/app/views/shared/icons/_eraser.html.erb +10 -0
  119. data/app/views/shared/icons/_external_link.html.erb +3 -0
  120. data/app/views/shared/icons/_eye.html.erb +4 -0
  121. data/app/views/shared/icons/_file_csv.html.erb +10 -0
  122. data/app/views/shared/icons/_file_export.html.erb +10 -0
  123. data/app/views/shared/icons/_file_image.html.erb +10 -0
  124. data/app/views/shared/icons/_file_import.html.erb +10 -0
  125. data/app/views/shared/icons/_file_question.html.erb +6 -0
  126. data/app/views/shared/icons/_film.html.erb +3 -0
  127. data/app/views/shared/icons/_filter.html.erb +3 -0
  128. data/app/views/shared/icons/_folder.html.erb +3 -0
  129. data/app/views/shared/icons/_folder_open.html.erb +3 -0
  130. data/app/views/shared/icons/_folder_plus.html.erb +3 -0
  131. data/app/views/shared/icons/_globe.html.erb +3 -0
  132. data/app/views/shared/icons/_google.html.erb +11 -0
  133. data/app/views/shared/icons/_heart.html.erb +3 -0
  134. data/app/views/shared/icons/_heart_broken.html.erb +11 -0
  135. data/app/views/shared/icons/_heart_pulse.html.erb +4 -0
  136. data/app/views/shared/icons/_history.html.erb +11 -0
  137. data/app/views/shared/icons/_home.html.erb +10 -0
  138. data/app/views/shared/icons/_image.html.erb +3 -0
  139. data/app/views/shared/icons/_inbox.html.erb +3 -0
  140. data/app/views/shared/icons/_info_circle.html.erb +10 -0
  141. data/app/views/shared/icons/_key.html.erb +3 -0
  142. data/app/views/shared/icons/_layers.html.erb +10 -0
  143. data/app/views/shared/icons/_lightbulb.html.erb +10 -0
  144. data/app/views/shared/icons/_lightning.html.erb +3 -0
  145. data/app/views/shared/icons/_list.html.erb +3 -0
  146. data/app/views/shared/icons/_lock.html.erb +3 -0
  147. data/app/views/shared/icons/_logout.html.erb +3 -0
  148. data/app/views/shared/icons/_magazine.html.erb +3 -0
  149. data/app/views/shared/icons/_magic.html.erb +3 -0
  150. data/app/views/shared/icons/_minus.html.erb +10 -0
  151. data/app/views/shared/icons/_mobile.html.erb +10 -0
  152. data/app/views/shared/icons/_moon.html.erb +3 -0
  153. data/app/views/shared/icons/_network.html.erb +10 -0
  154. data/app/views/shared/icons/_new_item_banner.html.erb +1 -0
  155. data/app/views/shared/icons/_ouroboros.html.erb +24 -0
  156. data/app/views/shared/icons/_package.html.erb +3 -0
  157. data/app/views/shared/icons/_palette.html.erb +3 -0
  158. data/app/views/shared/icons/_paper_plane.html.erb +10 -0
  159. data/app/views/shared/icons/_photo.html.erb +10 -0
  160. data/app/views/shared/icons/_play.html.erb +4 -0
  161. data/app/views/shared/icons/_plus.html.erb +3 -0
  162. data/app/views/shared/icons/_pocket.html.erb +11 -0
  163. data/app/views/shared/icons/_prysm-icon.html.erb +34 -0
  164. data/app/views/shared/icons/_prysm.html.erb +13 -0
  165. data/app/views/shared/icons/_pushbullet-1.html.erb +29 -0
  166. data/app/views/shared/icons/_pushbullet-2.html.erb +2 -0
  167. data/app/views/shared/icons/_puzzle.html.erb +10 -0
  168. data/app/views/shared/icons/_qrcode.html.erb +3 -0
  169. data/app/views/shared/icons/_question.html.erb +3 -0
  170. data/app/views/shared/icons/_receipt.html.erb +10 -0
  171. data/app/views/shared/icons/_redo.html.erb +3 -0
  172. data/app/views/shared/icons/_refresh.html.erb +3 -0
  173. data/app/views/shared/icons/_rocket.html.erb +10 -0
  174. data/app/views/shared/icons/_rss.html.erb +3 -0
  175. data/app/views/shared/icons/_save.html.erb +3 -0
  176. data/app/views/shared/icons/_search.html.erb +3 -0
  177. data/app/views/shared/icons/_search_minus.html.erb +10 -0
  178. data/app/views/shared/icons/_search_plus.html.erb +10 -0
  179. data/app/views/shared/icons/_server_error.html.erb +6 -0
  180. data/app/views/shared/icons/_share.html.erb +3 -0
  181. data/app/views/shared/icons/_shield_check.html.erb +3 -0
  182. data/app/views/shared/icons/_sign_in.html.erb +3 -0
  183. data/app/views/shared/icons/_spinner.html.erb +4 -0
  184. data/app/views/shared/icons/_star.html.erb +3 -0
  185. data/app/views/shared/icons/_store.html.erb +10 -0
  186. data/app/views/shared/icons/_sun.html.erb +3 -0
  187. data/app/views/shared/icons/_sync.html.erb +3 -0
  188. data/app/views/shared/icons/_table.html.erb +3 -0
  189. data/app/views/shared/icons/_tag.html.erb +3 -0
  190. data/app/views/shared/icons/_tags.html.erb +11 -0
  191. data/app/views/shared/icons/_tools.html.erb +4 -0
  192. data/app/views/shared/icons/_trash.html.erb +3 -0
  193. data/app/views/shared/icons/_undo.html.erb +3 -0
  194. data/app/views/shared/icons/_unlock.html.erb +3 -0
  195. data/app/views/shared/icons/_upload.html.erb +3 -0
  196. data/app/views/shared/icons/_user.html.erb +3 -0
  197. data/app/views/shared/icons/_user_circle.html.erb +10 -0
  198. data/app/views/shared/icons/_user_plus.html.erb +10 -0
  199. data/app/views/shared/icons/_video.html.erb +3 -0
  200. data/app/views/shared/icons/_wrench.html.erb +11 -0
  201. data/app/views/style_guide/index.html.erb +77 -0
  202. data/app/views/style_guide/sections/_alerts.html.erb +114 -0
  203. data/app/views/style_guide/sections/_badges.html.erb +78 -0
  204. data/app/views/style_guide/sections/_buttons.html.erb +130 -0
  205. data/app/views/style_guide/sections/_cards.html.erb +84 -0
  206. data/app/views/style_guide/sections/_colors.html.erb +106 -0
  207. data/app/views/style_guide/sections/_file_upload.html.erb +135 -0
  208. data/app/views/style_guide/sections/_forms.html.erb +129 -0
  209. data/app/views/style_guide/sections/_gradients.html.erb +253 -0
  210. data/app/views/style_guide/sections/_header.html.erb +12 -0
  211. data/app/views/style_guide/sections/_icons.html.erb +55 -0
  212. data/app/views/style_guide/sections/_images.html.erb +40 -0
  213. data/app/views/style_guide/sections/_loading.html.erb +242 -0
  214. data/app/views/style_guide/sections/_pagination.html.erb +212 -0
  215. data/app/views/style_guide/sections/_profile_components.html.erb +203 -0
  216. data/app/views/style_guide/sections/_theme_switcher.html.erb +72 -0
  217. data/app/views/style_guide/sections/_typography.html.erb +65 -0
  218. data/bin/ai-optimize-claude-md +540 -0
  219. data/bin/ai-review-local +345 -0
  220. data/bin/ai-security-review +585 -0
  221. data/bin/brakeman +9 -0
  222. data/bin/install-hooks +57 -0
  223. data/bin/rake +7 -0
  224. data/bin/rubocop +10 -0
  225. data/bin/verify_setup.rb +31 -0
  226. data/config/brakeman.ignore +28 -0
  227. data/config/initializers/neon_sakura.rb +15 -0
  228. data/config/license_overrides.yml +13 -0
  229. data/config/routes.rb +21 -0
  230. data/config/theme_mappings.yml +61 -0
  231. data/docs/PRYSM_ASSETS.md +210 -0
  232. data/docs/plans/extract_ai_reviewer_plan.md +151 -0
  233. data/docs/plans/neon_sakura_gem_plan.md +138 -0
  234. data/lib/neon_sakura/configuration.rb +94 -0
  235. data/lib/neon_sakura/engine.rb +48 -0
  236. data/lib/neon_sakura/icon_helper.rb +54 -0
  237. data/lib/neon_sakura/profile_helper.rb +24 -0
  238. data/lib/neon_sakura/stylesheet_helper.rb +40 -0
  239. data/lib/neon_sakura/theme_helper.rb +63 -0
  240. data/lib/neon_sakura/theme_importer.rb +112 -0
  241. data/lib/neon_sakura/version.rb +5 -0
  242. data/lib/neon_sakura.rb +13 -0
  243. data/neon_sakura.gemspec +50 -0
  244. data/package.json +18 -0
  245. data/scripts/git-hooks/post-merge +132 -0
  246. data/scripts/git-hooks/pre-commit +123 -0
  247. data/scripts/git-hooks/pre-push +127 -0
  248. data/scripts/license-check.rb +587 -0
  249. data/settings.local.json +12 -0
  250. data/yarn.lock +778 -0
  251. metadata +503 -0
@@ -0,0 +1,1652 @@
1
+ /*
2
+ * Component styles
3
+ * This file contains styling for reusable UI components like navigation, cards, badges, etc.
4
+ */
5
+
6
+ /* SVG Icon Sizing - Ensure icons respect width/height classes */
7
+ svg {
8
+ display: inline-block;
9
+ flex-shrink: 0;
10
+ }
11
+
12
+ /* Default link styling - theme-aware */
13
+ a {
14
+ color: var(--color-accent);
15
+ text-decoration: none;
16
+ transition: color 150ms ease;
17
+ }
18
+
19
+ a:hover {
20
+ color: var(--color-notification);
21
+ text-decoration: underline;
22
+ }
23
+
24
+ a:visited {
25
+ color: color-mix(in srgb, var(--color-accent) 80%, var(--color-text-muted) 20%);
26
+ }
27
+
28
+ a:active {
29
+ color: var(--color-accent);
30
+ }
31
+
32
+ /* Button-styled links maintain their text color in all states */
33
+ a.bg-accent,
34
+ a[style*="background"],
35
+ a[class*="bg-"] {
36
+ color: var(--color-white);
37
+ }
38
+
39
+ a.bg-accent:hover,
40
+ a[style*="background"]:hover,
41
+ a[class*="bg-"]:hover {
42
+ color: var(--color-white);
43
+ text-decoration: none;
44
+ }
45
+
46
+ a.bg-accent:active,
47
+ a[style*="background"]:active,
48
+ a[class*="bg-"]:active {
49
+ color: var(--color-white);
50
+ opacity: 0.9;
51
+ }
52
+
53
+ a.bg-accent:visited,
54
+ a[style*="background"]:visited,
55
+ a[class*="bg-"]:visited {
56
+ color: var(--color-white);
57
+ }
58
+
59
+ /* Navigation bar */
60
+ nav {
61
+ /* Base navigation styles are handled by utility classes */
62
+ }
63
+
64
+ /* Navigation links - theme-aware colors (dark for light mode, light for dark mode) */
65
+ nav a {
66
+ color: var(--navbar-link-color);
67
+ }
68
+
69
+ nav a:visited {
70
+ color: var(--navbar-link-color);
71
+ }
72
+
73
+ nav a:hover {
74
+ color: var(--navbar-link-hover);
75
+ text-decoration: none;
76
+ }
77
+
78
+ nav a:active {
79
+ color: var(--navbar-link-color);
80
+ }
81
+
82
+ /* Navigation buttons (logout) - same styling as links */
83
+ nav button {
84
+ color: var(--navbar-link-color);
85
+ }
86
+
87
+ nav button:hover {
88
+ color: var(--navbar-link-hover);
89
+ }
90
+
91
+ /* Navigation links with icons */
92
+ nav a,
93
+ nav button {
94
+ display: inline-flex;
95
+ align-items: center;
96
+ gap: 0.5rem;
97
+ }
98
+
99
+ /* Dropdown menu */
100
+ .nav-dropdown {
101
+ position: relative;
102
+ display: inline-block;
103
+ }
104
+
105
+ .nav-dropdown-toggle {
106
+ display: inline-flex;
107
+ align-items: center;
108
+ gap: 0.5rem;
109
+ color: var(--navbar-link-color);
110
+ transition: color 150ms;
111
+ font-size: 0.875rem;
112
+ text-decoration: none;
113
+ background: none;
114
+ border: none;
115
+ cursor: pointer;
116
+ padding: 0;
117
+ font-family: inherit;
118
+ white-space: nowrap;
119
+ }
120
+
121
+ .nav-dropdown-toggle svg {
122
+ flex-shrink: 0;
123
+ }
124
+
125
+ .nav-dropdown-toggle:hover {
126
+ color: var(--navbar-link-hover);
127
+ }
128
+
129
+ .nav-dropdown-menu {
130
+ display: none;
131
+ position: absolute;
132
+ top: 100%;
133
+ left: 0;
134
+ margin-top: 0.5rem;
135
+ background-color: var(--color-surface);
136
+ border: 1px solid var(--color-border);
137
+ border-radius: 0.5rem;
138
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3);
139
+ min-width: 10rem;
140
+ z-index: 50;
141
+ }
142
+
143
+ .nav-dropdown.open .nav-dropdown-menu {
144
+ display: block;
145
+ }
146
+
147
+ .nav-dropdown-menu a {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: 0.5rem;
151
+ padding: 0.75rem 1rem;
152
+ color: var(--color-text-primary);
153
+ text-decoration: none;
154
+ font-size: 0.875rem;
155
+ transition: all 150ms;
156
+ }
157
+
158
+ .nav-dropdown-menu a:hover {
159
+ background-color: var(--color-border);
160
+ color: var(--color-accent);
161
+ }
162
+
163
+ .nav-dropdown-menu a:first-child {
164
+ border-top-left-radius: 0.5rem;
165
+ border-top-right-radius: 0.5rem;
166
+ }
167
+
168
+ .nav-dropdown-menu a:last-child {
169
+ border-bottom-left-radius: 0.5rem;
170
+ border-bottom-right-radius: 0.5rem;
171
+ }
172
+
173
+ /* Dropdown divider */
174
+ .nav-dropdown-divider {
175
+ height: 1px;
176
+ background-color: var(--color-border);
177
+ margin: 0.5rem 0;
178
+ }
179
+
180
+ /* Nested submenu */
181
+ .nav-dropdown-submenu {
182
+ position: relative;
183
+ }
184
+
185
+ .nav-dropdown-submenu-toggle {
186
+ display: flex;
187
+ align-items: center;
188
+ gap: 0.5rem;
189
+ padding: 0.75rem 1rem;
190
+ color: var(--color-text-primary);
191
+ text-decoration: none;
192
+ font-size: 0.875rem;
193
+ transition: all 150ms;
194
+ cursor: pointer;
195
+ width: 100%;
196
+ }
197
+
198
+ .nav-dropdown-submenu-toggle:hover {
199
+ background-color: var(--color-border);
200
+ color: var(--color-accent);
201
+ }
202
+
203
+ .nav-dropdown-submenu-items {
204
+ display: none;
205
+ position: absolute;
206
+ left: 100%;
207
+ top: 0;
208
+ margin-left: 0.25rem;
209
+ background-color: var(--color-surface);
210
+ border: 1px solid var(--color-border);
211
+ border-radius: 0.5rem;
212
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3);
213
+ min-width: 10rem;
214
+ z-index: 51;
215
+ }
216
+
217
+ .nav-dropdown-submenu:hover .nav-dropdown-submenu-items {
218
+ display: block;
219
+ }
220
+
221
+ .nav-dropdown-submenu-items a {
222
+ display: flex;
223
+ align-items: center;
224
+ gap: 0.5rem;
225
+ padding: 0.75rem 1rem;
226
+ color: var(--color-text-primary);
227
+ text-decoration: none;
228
+ font-size: 0.875rem;
229
+ transition: all 150ms;
230
+ white-space: nowrap;
231
+ }
232
+
233
+ .nav-dropdown-submenu-items a:hover {
234
+ background-color: var(--color-border);
235
+ color: var(--color-accent);
236
+ }
237
+
238
+ .nav-dropdown-submenu-items a:first-child {
239
+ border-top-left-radius: 0.5rem;
240
+ border-top-right-radius: 0.5rem;
241
+ }
242
+
243
+ .nav-dropdown-submenu-items a:last-child {
244
+ border-bottom-left-radius: 0.5rem;
245
+ border-bottom-right-radius: 0.5rem;
246
+ }
247
+
248
+ /* Active navigation link */
249
+ nav a.nav-active {
250
+ color: var(--navbar-link-color) !important;
251
+ font-weight: 600;
252
+ border-bottom: 2px solid var(--navbar-link-color);
253
+ padding-bottom: 0.25rem;
254
+ text-decoration: none;
255
+ }
256
+
257
+ nav a.nav-active:hover {
258
+ color: var(--navbar-link-hover) !important;
259
+ text-decoration: none;
260
+ }
261
+
262
+ /* Navbar buttons - match navbar link colors instead of button defaults */
263
+ .navbar-button,
264
+ button.navbar-button,
265
+ .navbar-button[type="submit"] {
266
+ color: var(--navbar-link-color);
267
+ background: none !important;
268
+ background-image: none !important;
269
+ border: none !important;
270
+ padding: 0 !important;
271
+ cursor: pointer;
272
+ transform: none !important;
273
+ box-shadow: none !important;
274
+ display: inline-flex;
275
+ align-items: center;
276
+ gap: 0.5rem;
277
+ text-decoration: none;
278
+ transition: color 150ms;
279
+ }
280
+
281
+ .navbar-button:hover,
282
+ button.navbar-button:hover,
283
+ .navbar-button[type="submit"]:hover {
284
+ color: var(--navbar-link-hover);
285
+ background: none !important;
286
+ background-image: none !important;
287
+ transform: none !important;
288
+ box-shadow: none !important;
289
+ text-decoration: none;
290
+ }
291
+
292
+ .navbar-button:focus,
293
+ button.navbar-button:focus,
294
+ .navbar-button[type="submit"]:focus {
295
+ background: none !important;
296
+ background-image: none !important;
297
+ box-shadow: none !important;
298
+ outline: none;
299
+ }
300
+
301
+ /* Legacy class alias for backwards compatibility */
302
+ .nav-logout-button,
303
+ .nav-logout-button[type="submit"] {
304
+ color: var(--navbar-link-color);
305
+ background: none !important;
306
+ background-image: none !important;
307
+ border: none !important;
308
+ padding: 0 !important;
309
+ cursor: pointer;
310
+ transform: none !important;
311
+ box-shadow: none !important;
312
+ }
313
+
314
+ .nav-logout-button:hover,
315
+ .nav-logout-button[type="submit"]:hover {
316
+ color: var(--navbar-link-hover);
317
+ background: none !important;
318
+ background-image: none !important;
319
+ transform: none !important;
320
+ box-shadow: none !important;
321
+ }
322
+
323
+ .nav-logout-button:focus,
324
+ .nav-logout-button[type="submit"]:focus {
325
+ background: none !important;
326
+ background-image: none !important;
327
+ box-shadow: none !important;
328
+ outline: none;
329
+ }
330
+
331
+ /* Feature cards */
332
+ .feature-card {
333
+ background-color: var(--color-surface);
334
+ border: 1px solid var(--color-border);
335
+ border-radius: 0.5rem;
336
+ padding: 1rem;
337
+ text-align: center;
338
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
339
+ }
340
+
341
+ .feature-card:hover {
342
+ border-color: color-mix(in srgb, var(--color-border) 80%, var(--color-text-muted) 20%);
343
+ transform: translateY(-2px);
344
+ }
345
+
346
+ /* Result cards */
347
+ .result-card {
348
+ background-color: var(--color-surface);
349
+ border: 1px solid var(--color-border);
350
+ border-radius: 0.5rem;
351
+ padding: 1.5rem;
352
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
353
+ }
354
+
355
+ .result-card:hover {
356
+ border-color: color-mix(in srgb, var(--color-border) 80%, var(--color-text-muted) 20%);
357
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.2);
358
+ }
359
+
360
+ /* Filter badges */
361
+ .filter-badge {
362
+ display: inline-flex;
363
+ align-items: center;
364
+ padding: 0.5rem 1rem;
365
+ border-radius: 0.375rem;
366
+ font-size: 0.875rem;
367
+ font-weight: 500;
368
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
369
+ cursor: pointer;
370
+ }
371
+
372
+ .filter-badge-active {
373
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
374
+ }
375
+
376
+ .filter-badge-inactive {
377
+ background-color: var(--color-border);
378
+ color: var(--color-text-primary);
379
+ border: 1px solid color-mix(in srgb, var(--color-border) 80%, var(--color-text-muted) 20%);
380
+ }
381
+
382
+ .filter-badge-inactive:hover {
383
+ background-color: color-mix(in srgb, var(--color-border) 80%, var(--color-text-muted) 20%);
384
+ }
385
+
386
+ /* Download button */
387
+ .download-button {
388
+ display: inline-flex;
389
+ align-items: center;
390
+ gap: 0.5rem;
391
+ margin-top: 0.5rem;
392
+ padding: 0.5rem 1rem;
393
+ background: linear-gradient(to right, var(--gradient-from), var(--gradient-to));
394
+ color: var(--color-text-primary);
395
+ border-radius: 0.375rem;
396
+ font-size: 0.875rem;
397
+ font-weight: 500;
398
+ text-decoration: none;
399
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
400
+ }
401
+
402
+ .download-button:hover {
403
+ background: linear-gradient(to right, var(--gradient-from-hover), var(--gradient-to-hover));
404
+ color: var(--color-text-primary);
405
+ transform: scale(1.05);
406
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.2);
407
+ }
408
+
409
+ .download-button:focus {
410
+ outline: none;
411
+ box-shadow: 0 0 0 2px var(--color-background), 0 0 0 5px color-mix(in srgb, var(--color-accent) 50%, transparent);
412
+ }
413
+
414
+ /* Download link item (for multiple downloads in accordion) */
415
+ .download-link-item {
416
+ display: flex;
417
+ align-items: center;
418
+ gap: 0.5rem;
419
+ padding: 0.5rem 0.75rem;
420
+ background-color: var(--color-border);
421
+ color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
422
+ border-radius: 0.375rem;
423
+ font-size: 0.875rem;
424
+ font-weight: 500;
425
+ text-decoration: none;
426
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
427
+ border: 1px solid color-mix(in srgb, var(--color-border) 80%, var(--color-text-muted) 20%);
428
+ }
429
+
430
+ .download-link-item:hover {
431
+ background-color: color-mix(in srgb, var(--color-border) 80%, var(--color-text-muted) 20%);
432
+ color: color-mix(in srgb, var(--color-accent) 70%, var(--color-text-primary) 30%);
433
+ transform: translateX(4px);
434
+ border-color: var(--color-accent);
435
+ }
436
+
437
+ .download-link-item:focus {
438
+ outline: none;
439
+ box-shadow: 0 0 0 2px var(--color-border), 0 0 0 4px color-mix(in srgb, var(--color-accent) 50%, transparent);
440
+ }
441
+
442
+ /* VirusTotal scan button */
443
+ .virus-total-button {
444
+ display: inline-flex;
445
+ align-items: center;
446
+ gap: 0.5rem;
447
+ margin-top: 0.5rem;
448
+ padding: 0.5rem 1rem;
449
+ background: linear-gradient(to right, var(--color-notification), color-mix(in srgb, var(--color-notification) 85%, var(--color-background) 15%));
450
+ color: color-mix(in srgb, var(--color-notification) 30%, var(--color-text-primary) 70%);
451
+ border-radius: 0.375rem;
452
+ font-size: 0.875rem;
453
+ font-weight: 500;
454
+ text-decoration: none;
455
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
456
+ }
457
+
458
+ .virus-total-button:hover {
459
+ background: linear-gradient(to right, color-mix(in srgb, var(--color-notification) 85%, var(--color-background) 15%), color-mix(in srgb, var(--color-notification) 70%, var(--color-background) 30%));
460
+ color: color-mix(in srgb, var(--color-notification) 10%, var(--color-text-primary) 90%);
461
+ transform: scale(1.05);
462
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.2);
463
+ }
464
+
465
+ .virus-total-button:focus {
466
+ outline: none;
467
+ box-shadow: 0 0 0 2px var(--color-background), 0 0 0 5px color-mix(in srgb, var(--color-notification) 50%, transparent);
468
+ }
469
+
470
+ /* VirusTotal link item (for multiple scans in accordion) */
471
+ .virus-total-link-item {
472
+ display: flex;
473
+ align-items: center;
474
+ gap: 0.5rem;
475
+ padding: 0.5rem 0.75rem;
476
+ background: linear-gradient(to right, var(--color-notification), color-mix(in srgb, var(--color-notification) 85%, var(--color-background) 15%));
477
+ color: color-mix(in srgb, var(--color-notification) 30%, var(--color-text-primary) 70%);
478
+ border-radius: 0.375rem;
479
+ font-size: 0.875rem;
480
+ font-weight: 500;
481
+ text-decoration: none;
482
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
483
+ border: 1px solid color-mix(in srgb, var(--color-notification) 85%, var(--color-background) 15%);
484
+ }
485
+
486
+ .virus-total-link-item:hover {
487
+ background: linear-gradient(to right, color-mix(in srgb, var(--color-notification) 85%, var(--color-background) 15%), color-mix(in srgb, var(--color-notification) 70%, var(--color-background) 30%));
488
+ color: color-mix(in srgb, var(--color-notification) 10%, var(--color-text-primary) 90%);
489
+ transform: translateX(4px);
490
+ border-color: color-mix(in srgb, var(--color-notification) 70%, var(--color-background) 30%);
491
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
492
+ }
493
+
494
+ .virus-total-link-item:focus {
495
+ outline: none;
496
+ box-shadow: 0 0 0 2px var(--color-border), 0 0 0 4px color-mix(in srgb, var(--color-notification) 50%, transparent);
497
+ }
498
+
499
+ /* Info badge */
500
+ .info-badge {
501
+ display: inline-flex;
502
+ align-items: center;
503
+ padding: 0.25rem 0.75rem;
504
+ background-color: color-mix(in srgb, var(--color-surface) 50%, transparent);
505
+ border: 1px solid var(--color-border);
506
+ border-radius: 9999px;
507
+ font-size: 0.75rem;
508
+ color: var(--color-text-muted);
509
+ }
510
+
511
+ /* Stat card */
512
+ .stat-card {
513
+ display: flex;
514
+ flex-direction: column;
515
+ gap: 0.5rem;
516
+ background-color: color-mix(in srgb, var(--color-surface) 30%, transparent);
517
+ border: 1px solid var(--color-border);
518
+ border-radius: 0.375rem;
519
+ padding: 0.75rem 1rem;
520
+ }
521
+
522
+ .stat-card-label {
523
+ font-size: 0.75rem;
524
+ color: var(--color-text-muted);
525
+ }
526
+
527
+ .stat-card-value {
528
+ font-size: 1.125rem;
529
+ font-weight: 600;
530
+ color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
531
+ }
532
+
533
+ /* Alert/notification styles */
534
+ .alert {
535
+ padding: 1rem 1.5rem;
536
+ border-radius: 0.5rem;
537
+ margin-bottom: 1rem;
538
+ }
539
+
540
+ .alert-info {
541
+ background-color: color-mix(in srgb, var(--color-accent) 10%, transparent);
542
+ border: 1px solid var(--color-accent);
543
+ color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
544
+ }
545
+
546
+ .alert-success {
547
+ background-color: color-mix(in srgb, var(--color-notification) 10%, transparent);
548
+ border: 1px solid var(--color-notification);
549
+ color: color-mix(in srgb, var(--color-notification) 50%, var(--color-text-primary) 50%);
550
+ }
551
+
552
+ .alert-warning {
553
+ background-color: color-mix(in srgb, var(--color-warning) 10%, transparent);
554
+ border: 1px solid var(--color-warning);
555
+ color: color-mix(in srgb, var(--color-warning) 90%, var(--color-text-primary) 10%);
556
+ }
557
+
558
+ .alert-error {
559
+ background-color: color-mix(in srgb, var(--color-alert) 10%, transparent);
560
+ border: 1px solid var(--color-alert);
561
+ color: color-mix(in srgb, var(--color-alert) 70%, var(--color-text-primary) 30%);
562
+ }
563
+
564
+ /* Loading spinner */
565
+ .spinner {
566
+ display: inline-block;
567
+ width: 1rem;
568
+ height: 1rem;
569
+ border: 2px solid color-mix(in srgb, var(--color-accent) 20%, transparent);
570
+ border-top-color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
571
+ border-radius: 50%;
572
+ animation: spin 0.6s linear infinite;
573
+ }
574
+
575
+ @keyframes spin {
576
+ to {
577
+ transform: rotate(360deg);
578
+ }
579
+ }
580
+
581
+ /* Table styles */
582
+ table {
583
+ width: 100%;
584
+ border-collapse: collapse;
585
+ }
586
+
587
+ table thead {
588
+ background-color: var(--color-surface);
589
+ border-bottom: 2px solid var(--color-border);
590
+ }
591
+
592
+ table th {
593
+ padding: 0.75rem 1rem;
594
+ text-align: left;
595
+ font-weight: 600;
596
+ font-size: 0.875rem;
597
+ color: var(--color-text-muted);
598
+ text-transform: uppercase;
599
+ letter-spacing: 0.05em;
600
+ }
601
+
602
+ table td {
603
+ padding: 1rem;
604
+ border-bottom: 1px solid var(--color-border);
605
+ }
606
+
607
+ table tbody tr {
608
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1);
609
+ }
610
+
611
+ table tbody tr:hover {
612
+ background-color: color-mix(in srgb, var(--color-surface) 50%, transparent);
613
+ }
614
+
615
+ /* Mobile-responsive table improvements */
616
+ @media (width <= 768px) {
617
+ table th,
618
+ table td {
619
+ padding: 0.5rem;
620
+ font-size: 0.75rem;
621
+ }
622
+
623
+ table th {
624
+ font-size: 0.625rem;
625
+ padding: 0.5rem;
626
+ }
627
+
628
+ /* Make table scrollable horizontally on small screens */
629
+ .overflow-x-auto {
630
+ -webkit-overflow-scrolling: touch;
631
+ }
632
+
633
+ /* Compact table layout on mobile */
634
+ table {
635
+ display: block;
636
+ overflow-x: auto;
637
+ white-space: nowrap;
638
+ }
639
+ }
640
+
641
+ /* Code block styling */
642
+ code {
643
+ background-color: var(--color-surface);
644
+ padding: 0.125rem 0.375rem;
645
+ border-radius: 0.25rem;
646
+ font-family: 'Courier New', monospace;
647
+ font-size: 0.875em;
648
+ color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
649
+ }
650
+
651
+ pre {
652
+ background-color: var(--color-surface);
653
+ padding: 1rem;
654
+ border-radius: 0.5rem;
655
+ overflow-x: auto;
656
+ border: 1px solid var(--color-border);
657
+ }
658
+
659
+ pre code {
660
+ background-color: transparent;
661
+ padding: 0;
662
+ }
663
+
664
+ /* Divider */
665
+ .divider {
666
+ height: 1px;
667
+ background-color: var(--color-border);
668
+ margin: 1.5rem 0;
669
+ }
670
+
671
+ /* Pagination with gradient buttons */
672
+ .pagy-nav {
673
+ display: flex;
674
+ gap: 0.5rem;
675
+ align-items: center;
676
+ padding: 1.0rem;
677
+ }
678
+
679
+ .pagy-nav .page {
680
+ display: inline-flex;
681
+ align-items: center;
682
+ justify-content: center;
683
+ min-width: 2.5rem;
684
+ padding: 0.5rem 1rem;
685
+ border-radius: 0.375rem;
686
+ font-size: 0.875rem;
687
+ font-weight: 500;
688
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
689
+ text-decoration: none;
690
+ }
691
+
692
+ .pagy-nav .page:not(.disabled) {
693
+ background: linear-gradient(to right, var(--gradient-from), var(--gradient-to));
694
+ color: var(--color-text-primary);
695
+ border: none;
696
+ }
697
+
698
+ .pagy-nav .page:not(.disabled):hover {
699
+ background: linear-gradient(to right, var(--gradient-from-hover), var(--gradient-to-hover));
700
+ transform: translateY(-1px);
701
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.2);
702
+ }
703
+
704
+ .pagy-nav .page.active {
705
+ background: linear-gradient(to right, var(--color-accent), color-mix(in srgb, var(--color-accent) 90%, var(--color-text-primary) 10%)) !important;
706
+ color: var(--color-text-primary) !important;
707
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent) 30%, transparent);
708
+ font-weight: 700;
709
+ transform: scale(1.1);
710
+ }
711
+
712
+ .pagy-nav .page.disabled {
713
+ background: var(--color-border);
714
+ color: color-mix(in srgb, var(--color-text-muted) 70%, var(--color-border) 30%);
715
+ cursor: not-allowed;
716
+ opacity: 0.5;
717
+ }
718
+
719
+ /* Legacy pagy class support */
720
+ .pagy {
721
+ display: flex;
722
+ gap: 0.5rem;
723
+ align-items: center;
724
+ }
725
+
726
+ .pagy a:not([role="separator"]) {
727
+ display: inline-flex;
728
+ align-items: center;
729
+ justify-content: center;
730
+ min-width: 2.5rem;
731
+ padding: 0.5rem 1rem;
732
+ background: linear-gradient(to right, var(--gradient-from), var(--gradient-to)) !important;
733
+ color: var(--color-text-primary) !important;
734
+ border: none !important;
735
+ border-radius: 0.375rem;
736
+ font-size: 0.875rem;
737
+ font-weight: 500;
738
+ text-decoration: none;
739
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
740
+ }
741
+
742
+ .pagy a[href]:hover {
743
+ background: linear-gradient(to right, var(--gradient-from-hover), var(--gradient-to-hover)) !important;
744
+ color: var(--color-text-primary) !important;
745
+ transform: translateY(-1px);
746
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.2);
747
+ }
748
+
749
+ .pagy a[aria-current] {
750
+ background: linear-gradient(to right, var(--color-accent), color-mix(in srgb, var(--color-accent) 90%, var(--color-text-primary) 10%)) !important;
751
+ color: var(--color-text-primary) !important;
752
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent) 30%, transparent) !important;
753
+ font-weight: 700;
754
+ transform: scale(1.1);
755
+ }
756
+
757
+ .pagy a[role="link"]:not([aria-current]) {
758
+ opacity: 0.85;
759
+ }
760
+
761
+ /* Empty state */
762
+ .empty-state {
763
+ text-align: center;
764
+ padding: 3rem 1.5rem;
765
+ color: var(--color-text-muted);
766
+ }
767
+
768
+ .empty-state-icon {
769
+ font-size: 3rem;
770
+ margin-bottom: 1rem;
771
+ opacity: 0.5;
772
+ }
773
+
774
+ .empty-state-title {
775
+ font-size: 1.25rem;
776
+ font-weight: 600;
777
+ color: var(--color-text-secondary);
778
+ margin-bottom: 0.5rem;
779
+ }
780
+
781
+ .empty-state-description {
782
+ font-size: 0.875rem;
783
+ }
784
+
785
+ .text-box {
786
+ padding: 1.0rem;
787
+ }
788
+
789
+ .box-no-top {
790
+ padding-top: 0.25rem;
791
+ padding-left: 1.0rem;
792
+ padding-right: 1.0rem;
793
+ padding-bottom: 1.0rem;
794
+ }
795
+
796
+ .button-spacing {
797
+ margin-top: 1.5rem;
798
+ }
799
+
800
+ /* Login form responsive margins */
801
+ .login-form {
802
+ margin-left: 0;
803
+ margin-right: 0;
804
+ }
805
+
806
+ @media (width >= 768px) {
807
+ .login-form {
808
+ margin-left: 4rem;
809
+ margin-right: 4rem;
810
+ }
811
+ }
812
+
813
+ @media (width >= 1024px) {
814
+ .login-form {
815
+ margin-left: 8rem;
816
+ margin-right: 8rem;
817
+ }
818
+ }
819
+
820
+ @media (width >= 1280px) {
821
+ .login-form {
822
+ margin-left: 12rem;
823
+ margin-right: 12rem;
824
+ }
825
+ }
826
+
827
+ .login-inner-form {
828
+ padding: 2rem;
829
+ }
830
+
831
+ /* Image accordion for search results */
832
+ .image-accordion-summary {
833
+ cursor: pointer;
834
+ user-select: none;
835
+ }
836
+
837
+ .image-accordion-summary .chevron {
838
+ display: inline-block;
839
+ transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1);
840
+ }
841
+
842
+ details[open] .image-accordion-summary .chevron {
843
+ transform: rotate(180deg);
844
+ }
845
+
846
+ /* Grid layout for additional images */
847
+ .additional-images-grid {
848
+ display: grid;
849
+ grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
850
+ gap: 0.5rem;
851
+ margin-top: 0.5rem;
852
+ }
853
+
854
+ @media (width <= 640px) {
855
+ .additional-images-grid {
856
+ grid-template-columns: repeat(2, 1fr);
857
+ }
858
+ }
859
+
860
+ /* Meta-Database Search Modal */
861
+ .meta-database-modal {
862
+ display: none;
863
+ position: fixed;
864
+ top: 0;
865
+ left: 0;
866
+ width: 100%;
867
+ height: 100%;
868
+ z-index: 1000;
869
+ }
870
+
871
+ .meta-database-modal.active {
872
+ display: flex;
873
+ align-items: center;
874
+ justify-content: center;
875
+ }
876
+
877
+ .meta-database-modal-overlay {
878
+ position: absolute;
879
+ top: 0;
880
+ left: 0;
881
+ width: 100%;
882
+ height: 100%;
883
+ background-color: rgba(0, 0, 0, 0.75);
884
+ cursor: pointer;
885
+ }
886
+
887
+ .meta-database-modal-content {
888
+ position: relative;
889
+ width: 90%;
890
+ max-width: 60rem;
891
+ max-height: 90vh;
892
+ background-color: var(--color-surface);
893
+ border: 1px solid var(--color-border);
894
+ border-radius: 0.75rem;
895
+ padding: 2rem;
896
+ overflow-y: auto;
897
+ z-index: 1001;
898
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
899
+ }
900
+
901
+ .meta-database-modal-header {
902
+ display: flex;
903
+ align-items: center;
904
+ justify-content: space-between;
905
+ margin-bottom: 1.5rem;
906
+ padding-bottom: 1rem;
907
+ border-bottom: 1px solid var(--color-border);
908
+ }
909
+
910
+ .meta-database-modal-close {
911
+ display: inline-flex;
912
+ align-items: center;
913
+ justify-content: center;
914
+ width: 2.5rem;
915
+ height: 2.5rem;
916
+ background-color: transparent;
917
+ color: var(--color-text-muted);
918
+ border: none;
919
+ border-radius: 0.375rem;
920
+ cursor: pointer;
921
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
922
+ }
923
+
924
+ .meta-database-modal-close:hover {
925
+ background-color: var(--color-border);
926
+ color: var(--color-text-primary);
927
+ }
928
+
929
+ .meta-database-modal-close:focus {
930
+ outline: none;
931
+ box-shadow: 0 0 0 2px var(--color-background), 0 0 0 4px color-mix(in srgb, var(--color-accent) 50%, transparent);
932
+ }
933
+
934
+ .meta-database-modal-footer {
935
+ margin-top: 1.5rem;
936
+ padding-top: 1.5rem;
937
+ border-top: 1px solid var(--color-border);
938
+ }
939
+
940
+ /* Meta-database search states */
941
+ .meta-search-loading,
942
+ .meta-search-error,
943
+ .meta-search-results {
944
+ display: none;
945
+ }
946
+
947
+ .meta-search-loading.active,
948
+ .meta-search-error.active,
949
+ .meta-search-results.active {
950
+ display: block;
951
+ }
952
+
953
+ /* Database result sections */
954
+ .meta-database-section {
955
+ margin-bottom: 1.5rem;
956
+ padding: 1rem;
957
+ background-color: color-mix(in srgb, var(--color-surface) 30%, transparent);
958
+ border: 1px solid var(--color-border);
959
+ border-radius: 0.5rem;
960
+ }
961
+
962
+ .meta-database-header {
963
+ display: flex;
964
+ align-items: center;
965
+ justify-content: space-between;
966
+ margin-bottom: 1rem;
967
+ padding-bottom: 0.75rem;
968
+ border-bottom: 1px solid var(--color-border);
969
+ }
970
+
971
+ .meta-database-title {
972
+ font-size: 1.125rem;
973
+ font-weight: 600;
974
+ color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
975
+ }
976
+
977
+ .meta-database-count {
978
+ font-size: 0.875rem;
979
+ color: var(--color-text-muted);
980
+ }
981
+
982
+ /* Result items with checkboxes */
983
+ .meta-result-item {
984
+ display: flex;
985
+ align-items: center;
986
+ gap: 0.75rem;
987
+ padding: 0.75rem;
988
+ background-color: var(--color-border);
989
+ border: 1px solid color-mix(in srgb, var(--color-border) 80%, var(--color-text-muted) 20%);
990
+ border-radius: 0.375rem;
991
+ margin-bottom: 0.5rem;
992
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
993
+ cursor: pointer;
994
+ }
995
+
996
+ .meta-result-item:hover {
997
+ background-color: color-mix(in srgb, var(--color-border) 80%, var(--color-text-muted) 20%);
998
+ border-color: var(--color-accent);
999
+ }
1000
+
1001
+ .meta-result-item:last-child {
1002
+ margin-bottom: 0;
1003
+ }
1004
+
1005
+ .meta-result-checkbox {
1006
+ flex-shrink: 0;
1007
+ width: 1.125rem;
1008
+ height: 1.125rem;
1009
+ background-color: var(--color-surface);
1010
+ border: 2px solid color-mix(in srgb, var(--color-border) 80%, var(--color-text-muted) 20%);
1011
+ border-radius: 0.25rem;
1012
+ cursor: pointer;
1013
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
1014
+ }
1015
+
1016
+ .meta-result-checkbox:checked {
1017
+ background-color: var(--color-accent);
1018
+ border-color: var(--color-accent);
1019
+ }
1020
+
1021
+ .meta-result-checkbox:focus {
1022
+ outline: none;
1023
+ box-shadow: 0 0 0 2px var(--color-surface), 0 0 0 4px color-mix(in srgb, var(--color-accent) 50%, transparent);
1024
+ }
1025
+
1026
+ .meta-result-info {
1027
+ flex: 1;
1028
+ }
1029
+
1030
+ .meta-result-title {
1031
+ font-size: 0.9375rem;
1032
+ font-weight: 500;
1033
+ color: var(--color-text-primary);
1034
+ margin-bottom: 0.25rem;
1035
+ }
1036
+
1037
+ .meta-result-meta {
1038
+ display: flex;
1039
+ gap: 0.75rem;
1040
+ font-size: 0.75rem;
1041
+ color: var(--color-text-muted);
1042
+ }
1043
+
1044
+ .meta-result-badge {
1045
+ display: inline-flex;
1046
+ padding: 0.125rem 0.5rem;
1047
+ background-color: color-mix(in srgb, var(--color-accent) 15%, transparent);
1048
+ border: 1px solid var(--color-accent);
1049
+ border-radius: 9999px;
1050
+ font-size: 0.625rem;
1051
+ font-weight: 600;
1052
+ color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
1053
+ text-transform: uppercase;
1054
+ letter-spacing: 0.05em;
1055
+ }
1056
+
1057
+ .meta-result-episodes {
1058
+ margin-top: 0.5rem;
1059
+ padding-top: 0.5rem;
1060
+ border-top: 1px solid var(--color-border);
1061
+ font-size: 0.75rem;
1062
+ }
1063
+
1064
+ /* Footer */
1065
+ .footer-container {
1066
+ margin-top: auto;
1067
+ padding: 1.5rem 0;
1068
+ border-top: 1px solid var(--color-border);
1069
+ background-color: var(--color-background);
1070
+ }
1071
+
1072
+ .footer-content {
1073
+ max-width: 80rem;
1074
+ margin: 0 auto;
1075
+ padding: 0 1rem;
1076
+ text-align: center;
1077
+ }
1078
+
1079
+ .footer-text {
1080
+ color: var(--color-text-muted);
1081
+ font-size: 0.875rem;
1082
+ }
1083
+
1084
+ .footer-version {
1085
+ color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
1086
+ font-weight: 500;
1087
+ }
1088
+
1089
+ /* API Documentation Modal */
1090
+ .api-doc-modal {
1091
+ display: none;
1092
+ position: fixed;
1093
+ top: 0;
1094
+ left: 0;
1095
+ width: 100%;
1096
+ height: 100%;
1097
+ z-index: 1000;
1098
+ }
1099
+
1100
+ .api-doc-modal.active {
1101
+ display: flex;
1102
+ align-items: center;
1103
+ justify-content: center;
1104
+ }
1105
+
1106
+ .api-doc-modal-overlay {
1107
+ position: absolute;
1108
+ top: 0;
1109
+ left: 0;
1110
+ width: 100%;
1111
+ height: 100%;
1112
+ background-color: rgba(0, 0, 0, 0.75);
1113
+ cursor: pointer;
1114
+ }
1115
+
1116
+ .api-doc-modal-content {
1117
+ position: relative;
1118
+ width: 90%;
1119
+ max-width: 60rem;
1120
+ max-height: 90vh;
1121
+ background-color: var(--color-surface);
1122
+ border: 1px solid var(--color-border);
1123
+ border-radius: 0.75rem;
1124
+ padding: 2rem;
1125
+ overflow-y: auto;
1126
+ z-index: 1001;
1127
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
1128
+ }
1129
+
1130
+ .api-doc-modal-header {
1131
+ display: flex;
1132
+ align-items: center;
1133
+ justify-content: space-between;
1134
+ margin-bottom: 1.5rem;
1135
+ padding-bottom: 1rem;
1136
+ border-bottom: 1px solid var(--color-border);
1137
+ }
1138
+
1139
+ .api-doc-modal-close {
1140
+ display: inline-flex;
1141
+ align-items: center;
1142
+ justify-content: center;
1143
+ width: 2.5rem;
1144
+ height: 2.5rem;
1145
+ background-color: transparent;
1146
+ color: var(--color-text-muted);
1147
+ border: none;
1148
+ border-radius: 0.375rem;
1149
+ cursor: pointer;
1150
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
1151
+ }
1152
+
1153
+ .api-doc-modal-close:hover {
1154
+ background-color: var(--color-border);
1155
+ color: var(--color-text-primary);
1156
+ }
1157
+
1158
+ .api-doc-modal-close:focus {
1159
+ outline: none;
1160
+ box-shadow: 0 0 0 2px var(--color-background), 0 0 0 4px color-mix(in srgb, var(--color-accent) 50%, transparent);
1161
+ }
1162
+
1163
+ /* API endpoint documentation sections */
1164
+ .api-doc-section {
1165
+ margin-bottom: 1.5rem;
1166
+ }
1167
+
1168
+ .api-doc-section h4 {
1169
+ font-size: 1rem;
1170
+ font-weight: 600;
1171
+ color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
1172
+ margin-bottom: 0.75rem;
1173
+ }
1174
+
1175
+ .api-doc-section h5 {
1176
+ font-size: 0.875rem;
1177
+ font-weight: 600;
1178
+ color: var(--color-text-muted);
1179
+ margin-bottom: 0.5rem;
1180
+ margin-top: 1rem;
1181
+ }
1182
+
1183
+ .api-doc-section ul {
1184
+ list-style-type: disc;
1185
+ list-style-position: inside;
1186
+ color: var(--color-text-secondary);
1187
+ font-size: 0.875rem;
1188
+ margin-bottom: 0.5rem;
1189
+ }
1190
+
1191
+ .api-doc-section li {
1192
+ margin-bottom: 0.25rem;
1193
+ padding-left: 0.5rem;
1194
+ }
1195
+
1196
+ /* Code examples tabs */
1197
+ .api-doc-tabs {
1198
+ display: flex;
1199
+ gap: 0.5rem;
1200
+ margin-bottom: 1rem;
1201
+ border-bottom: 1px solid var(--color-border);
1202
+ }
1203
+
1204
+ .api-doc-tab {
1205
+ padding: 0.5rem 1rem;
1206
+ background-color: transparent;
1207
+ color: var(--color-text-muted);
1208
+ border: none;
1209
+ border-bottom: 2px solid transparent;
1210
+ cursor: pointer;
1211
+ font-size: 0.875rem;
1212
+ font-weight: 500;
1213
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
1214
+ }
1215
+
1216
+ .api-doc-tab:hover {
1217
+ color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
1218
+ }
1219
+
1220
+ .api-doc-tab.active {
1221
+ color: color-mix(in srgb, var(--color-accent) 85%, var(--color-text-primary) 15%);
1222
+ border-bottom-color: var(--color-accent);
1223
+ }
1224
+
1225
+ .api-doc-tab-content {
1226
+ display: none;
1227
+ }
1228
+
1229
+ .api-doc-tab-content.active {
1230
+ display: block;
1231
+ }
1232
+
1233
+ /* Endpoint clickable items */
1234
+ .api-endpoint-item {
1235
+ display: flex;
1236
+ align-items: center;
1237
+ justify-content: space-between;
1238
+ padding: 0.75rem 1rem;
1239
+ background-color: color-mix(in srgb, var(--color-surface) 30%, transparent);
1240
+ border: 1px solid var(--color-border);
1241
+ border-radius: 0.375rem;
1242
+ margin-bottom: 0.5rem;
1243
+ cursor: pointer;
1244
+ transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
1245
+ }
1246
+
1247
+ .api-endpoint-item:hover {
1248
+ background-color: var(--color-border);
1249
+ border-color: var(--color-accent);
1250
+ }
1251
+
1252
+ .api-endpoint-code {
1253
+ font-family: 'Courier New', monospace;
1254
+ font-size: 0.875rem;
1255
+ }
1256
+
1257
+ .api-endpoint-description {
1258
+ color: var(--color-text-muted);
1259
+ font-size: 0.875rem;
1260
+ margin-left: 1rem;
1261
+ }
1262
+
1263
+ /* HTTP method badges */
1264
+ .http-method-badge {
1265
+ display: inline-flex;
1266
+ padding: 0.25rem 0.5rem;
1267
+ border-radius: 0.25rem;
1268
+ font-size: 0.75rem;
1269
+ font-weight: 600;
1270
+ text-transform: uppercase;
1271
+ margin-right: 0.5rem;
1272
+ }
1273
+
1274
+ .http-method-badge.get {
1275
+ background-color: color-mix(in srgb, var(--color-notification) 15%, transparent);
1276
+ color: var(--color-notification);
1277
+ border: 1px solid var(--color-notification);
1278
+ }
1279
+
1280
+ .http-method-badge.post {
1281
+ background-color: color-mix(in srgb, var(--gradient-from) 15%, transparent);
1282
+ color: var(--gradient-from);
1283
+ border: 1px solid var(--gradient-from);
1284
+ }
1285
+
1286
+ .http-method-badge.delete {
1287
+ background-color: color-mix(in srgb, var(--color-alert) 15%, transparent);
1288
+ color: var(--color-alert);
1289
+ border: 1px solid var(--color-alert);
1290
+ }
1291
+
1292
+ /* Progress Bar Component */
1293
+ .progress-bar-container {
1294
+ width: 100%;
1295
+ background-color: var(--color-border);
1296
+ border-radius: 9999px;
1297
+ height: 0.5rem;
1298
+ margin-bottom: 0.5rem;
1299
+ }
1300
+
1301
+ .progress-bar {
1302
+ background: linear-gradient(to right, var(--gradient-from), var(--gradient-to));
1303
+ height: 0.5rem;
1304
+ border-radius: 9999px;
1305
+ transition-property: all;
1306
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1307
+ transition-duration: 300ms;
1308
+ width: var(--progress-width, 0%);
1309
+ }
1310
+
1311
+ /* Modal Component */
1312
+ .modal-overlay {
1313
+ position: fixed;
1314
+ inset: 0;
1315
+ z-index: 9999;
1316
+ display: none;
1317
+ align-items: center;
1318
+ justify-content: center;
1319
+ opacity: 0;
1320
+ transition: opacity 0.2s ease-in-out;
1321
+ pointer-events: none;
1322
+ }
1323
+
1324
+ .modal-overlay.modal-open {
1325
+ display: flex;
1326
+ opacity: 1;
1327
+ pointer-events: auto;
1328
+ }
1329
+
1330
+ .modal-backdrop {
1331
+ position: absolute;
1332
+ inset: 0;
1333
+ background-color: var(--color-background);
1334
+ opacity: 0.95;
1335
+ }
1336
+
1337
+ .modal-container {
1338
+ position: relative;
1339
+ z-index: 10;
1340
+ max-width: 90vw;
1341
+ max-height: 90vh;
1342
+ padding: 2rem;
1343
+ overflow-y: auto;
1344
+ }
1345
+
1346
+ .modal-content {
1347
+ display: flex;
1348
+ flex-direction: column;
1349
+ align-items: center;
1350
+ gap: 1rem;
1351
+ }
1352
+
1353
+ .modal-close-button {
1354
+ position: absolute;
1355
+ top: 1rem;
1356
+ right: 1rem;
1357
+ width: 2.5rem;
1358
+ height: 2.5rem;
1359
+ display: flex;
1360
+ align-items: center;
1361
+ justify-content: center;
1362
+ border-radius: 9999px;
1363
+ background-color: var(--color-surface);
1364
+ border: 2px solid var(--color-border);
1365
+ color: var(--color-text-primary);
1366
+ transition: border-color 0.15s ease;
1367
+ cursor: pointer;
1368
+ z-index: 20;
1369
+ }
1370
+
1371
+ .modal-close-button:hover {
1372
+ border-color: var(--color-accent);
1373
+ }
1374
+
1375
+ .modal-close-button:focus {
1376
+ outline: 2px solid var(--color-accent);
1377
+ outline-offset: 2px;
1378
+ }
1379
+
1380
+ /* Zoom Controls */
1381
+ .zoom-controls {
1382
+ position: absolute;
1383
+ top: 1rem;
1384
+ left: 1rem;
1385
+ z-index: 20;
1386
+ display: flex;
1387
+ align-items: center;
1388
+ gap: 0.5rem;
1389
+ padding: 0.5rem;
1390
+ background-color: var(--color-surface);
1391
+ border: 1px solid var(--color-border);
1392
+ border-radius: 0.5rem;
1393
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
1394
+ }
1395
+
1396
+ .zoom-control-button {
1397
+ display: flex;
1398
+ align-items: center;
1399
+ justify-content: center;
1400
+ width: 2rem;
1401
+ height: 2rem;
1402
+ background-color: transparent;
1403
+ color: var(--navbar-link-color);
1404
+ border: 1px solid var(--color-border);
1405
+ border-radius: 0.375rem;
1406
+ cursor: pointer;
1407
+ transition: all 150ms;
1408
+ }
1409
+
1410
+ .zoom-control-button:hover {
1411
+ background-color: var(--color-border);
1412
+ color: var(--navbar-link-hover);
1413
+ border-color: var(--navbar-link-color);
1414
+ }
1415
+
1416
+ .zoom-control-button:focus {
1417
+ outline: 2px solid var(--color-accent);
1418
+ outline-offset: 2px;
1419
+ }
1420
+
1421
+ .zoom-control-button:disabled {
1422
+ opacity: 0.5;
1423
+ cursor: not-allowed;
1424
+ }
1425
+
1426
+ .zoom-level-text {
1427
+ min-width: 3rem;
1428
+ text-align: center;
1429
+ font-size: 0.875rem;
1430
+ font-weight: 600;
1431
+ color: var(--color-text-primary);
1432
+ }
1433
+
1434
+ /* Zoomable content wrapper */
1435
+ .zoomable-wrapper {
1436
+ position: relative;
1437
+ overflow: hidden;
1438
+ cursor: grab;
1439
+ user-select: none;
1440
+ min-height: 400px;
1441
+ max-height: 70vh;
1442
+ width: 100%;
1443
+ display: flex;
1444
+ align-items: center;
1445
+ justify-content: center;
1446
+ }
1447
+
1448
+ .zoomable-wrapper.dragging {
1449
+ cursor: grabbing;
1450
+ }
1451
+
1452
+ .zoomable-content {
1453
+ transition: transform 0.2s ease-out;
1454
+ transform-origin: center center;
1455
+ max-width: 100%;
1456
+ max-height: 100%;
1457
+ }
1458
+
1459
+ /* File Upload Component */
1460
+ .file-upload-container {
1461
+ width: 100%;
1462
+ }
1463
+
1464
+ .file-upload-zone {
1465
+ border: 2px dashed var(--color-border);
1466
+ background: var(--color-surface);
1467
+ padding: 2rem;
1468
+ text-align: center;
1469
+ border-radius: 0.5rem;
1470
+ transition: all 0.2s ease;
1471
+ cursor: pointer;
1472
+ }
1473
+
1474
+ .file-upload-zone:hover {
1475
+ border-color: var(--color-accent);
1476
+ background: color-mix(in srgb, var(--color-accent) 10%, var(--color-surface));
1477
+ }
1478
+
1479
+ .file-upload-zone.drag-over {
1480
+ border-color: var(--color-accent);
1481
+ background: color-mix(in srgb, var(--color-accent) 15%, var(--color-surface));
1482
+ transform: scale(1.02);
1483
+ }
1484
+
1485
+ .file-upload-input {
1486
+ display: none;
1487
+ }
1488
+
1489
+ .file-upload-prompt {
1490
+ display: flex;
1491
+ flex-direction: column;
1492
+ align-items: center;
1493
+ justify-content: center;
1494
+ gap: 0.5rem;
1495
+ }
1496
+
1497
+ .file-upload-prompt p {
1498
+ margin: 0;
1499
+ }
1500
+
1501
+ .file-upload-preview-container {
1502
+ display: flex;
1503
+ flex-direction: column;
1504
+ align-items: center;
1505
+ gap: 1rem;
1506
+ }
1507
+
1508
+ .file-upload-preview-container.hidden {
1509
+ display: none;
1510
+ }
1511
+
1512
+ .file-upload-preview {
1513
+ max-width: 200px;
1514
+ max-height: 200px;
1515
+ border-radius: 0.5rem;
1516
+ border: 1px solid var(--color-border);
1517
+ object-fit: cover;
1518
+ }
1519
+
1520
+ .file-upload-status {
1521
+ display: flex;
1522
+ flex-direction: column;
1523
+ align-items: center;
1524
+ gap: 0.5rem;
1525
+ }
1526
+
1527
+ .file-upload-status.hidden {
1528
+ display: none;
1529
+ }
1530
+
1531
+ .file-upload-error {
1532
+ margin-top: 0.5rem;
1533
+ padding: 0.5rem 1rem;
1534
+ background-color: color-mix(in srgb, var(--color-alert) 10%, transparent);
1535
+ border: 1px solid var(--color-alert);
1536
+ border-radius: 0.375rem;
1537
+ font-size: 0.875rem;
1538
+ }
1539
+
1540
+ .file-upload-error.hidden {
1541
+ display: none;
1542
+ }
1543
+
1544
+ /* Profile Image Selector Component */
1545
+ .profile-image-selector {
1546
+ width: 100%;
1547
+ }
1548
+
1549
+ .profile-image-options {
1550
+ display: grid;
1551
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1552
+ gap: 1rem;
1553
+ margin-top: 0.75rem;
1554
+ }
1555
+
1556
+ .profile-image-option {
1557
+ cursor: pointer;
1558
+ display: block;
1559
+ margin: 0;
1560
+ }
1561
+
1562
+ .profile-image-option.disabled {
1563
+ cursor: not-allowed;
1564
+ opacity: 0.6;
1565
+ }
1566
+
1567
+ .profile-image-radio {
1568
+ position: absolute !important;
1569
+ width: 1px !important;
1570
+ height: 1px !important;
1571
+ padding: 0 !important;
1572
+ margin: -1px !important;
1573
+ overflow: hidden !important;
1574
+ clip: rect(0, 0, 0, 0) !important;
1575
+ white-space: nowrap !important;
1576
+ border: 0 !important;
1577
+ }
1578
+
1579
+ .profile-image-card {
1580
+ transition: all 0.2s ease;
1581
+ position: relative;
1582
+ border: 2px solid var(--color-border);
1583
+ background-color: var(--color-surface);
1584
+ border-radius: 0.5rem;
1585
+ height: 100%;
1586
+ }
1587
+
1588
+ .profile-image-card:hover:not(.disabled) {
1589
+ border-color: var(--color-accent);
1590
+ transform: translateY(-2px);
1591
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.2);
1592
+ }
1593
+
1594
+ .profile-image-card.selected {
1595
+ border-color: var(--color-accent) !important;
1596
+ border-width: 2px !important;
1597
+ background-color: color-mix(in srgb, var(--color-accent) 5%, var(--color-surface));
1598
+ }
1599
+
1600
+ .profile-image-card.disabled {
1601
+ border-color: var(--color-border);
1602
+ background-color: var(--color-surface);
1603
+ }
1604
+
1605
+ .profile-image-card-body {
1606
+ display: flex;
1607
+ flex-direction: column;
1608
+ align-items: center;
1609
+ padding: 1.5rem 1rem;
1610
+ text-align: center;
1611
+ }
1612
+
1613
+ .profile-image-preview {
1614
+ width: 60px;
1615
+ height: 60px;
1616
+ border-radius: 50%;
1617
+ margin-bottom: 0.75rem;
1618
+ object-fit: cover;
1619
+ }
1620
+
1621
+ .profile-image-card-title {
1622
+ font-size: 0.9375rem;
1623
+ font-weight: 600;
1624
+ color: var(--color-text-primary);
1625
+ margin-bottom: 0.25rem;
1626
+ }
1627
+
1628
+ .profile-image-card-text {
1629
+ font-size: 0.8125rem;
1630
+ color: var(--color-text-muted);
1631
+ margin: 0;
1632
+ }
1633
+
1634
+ .profile-image-selection-indicator {
1635
+ position: absolute;
1636
+ top: 10px;
1637
+ right: 10px;
1638
+ opacity: 0;
1639
+ transition: opacity 0.2s ease;
1640
+ }
1641
+
1642
+ .profile-image-card.selected .profile-image-selection-indicator {
1643
+ opacity: 1;
1644
+ }
1645
+
1646
+ .profile-image-card.disabled .profile-image-selection-indicator {
1647
+ opacity: 0.3;
1648
+ }
1649
+
1650
+ .profile-picture-upload {
1651
+ margin-top: 1rem;
1652
+ }