├── .github
└── dracula-pro.png
├── .gitignore
├── CONTRIBUTORS.md
├── INSTALL.md
├── LICENSE
├── README.md
├── THEMES.md
├── django_admin_dracula
├── __init__.py
├── static
│ └── admin
│ │ ├── css
│ │ ├── base.css
│ │ ├── changelists.css
│ │ ├── dark_mode.css
│ │ ├── forms.css
│ │ ├── login.css
│ │ ├── nav_sidebar.css
│ │ └── widgets.css
│ │ └── img
│ │ ├── calendar-icons.svg
│ │ ├── icon-addlink.svg
│ │ ├── icon-calendar.svg
│ │ ├── icon-changelink.svg
│ │ ├── icon-clock.svg
│ │ ├── icon-hidelink.svg
│ │ ├── icon-no.svg
│ │ ├── icon-unknown.svg
│ │ ├── icon-viewlink.svg
│ │ ├── icon-yes.svg
│ │ ├── search.svg
│ │ └── selector-icons.svg
└── templates
│ └── admin
│ ├── base.html
│ ├── base_site.html
│ ├── change_form.html
│ ├── change_list.html
│ └── color_theme_toggle.html
├── justfile
├── manage.py
├── pyproject.toml
├── screenshot.png
├── screenshots
├── dark-homepage.png
├── dark-userspage.png
├── light-homepage.png
└── light-userspage.png
├── tests
├── __init__.py
├── example
│ ├── __init__.py
│ ├── apps.py
│ ├── settings.py
│ └── urls.py
└── test_admin_theme.py
└── uv.lock
/.github/dracula-pro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sjbitcode/django-admin-dracula/7f0ee71316cf3012c2b2cf2e7b446a7a0d8d19e2/.github/dracula-pro.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | share/python-wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 | MANIFEST
28 |
29 | # PyInstaller
30 | # Usually these files are written by a python script from a template
31 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
32 | *.manifest
33 | *.spec
34 |
35 | # Installer logs
36 | pip-log.txt
37 | pip-delete-this-directory.txt
38 |
39 | # Unit test / coverage reports
40 | htmlcov/
41 | .tox/
42 | .nox/
43 | .coverage
44 | .coverage.*
45 | .cache
46 | nosetests.xml
47 | coverage.xml
48 | *.cover
49 | *.py,cover
50 | .hypothesis/
51 | .pytest_cache/
52 | cover/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | .pybuilder/
76 | target/
77 |
78 | # Jupyter Notebook
79 | .ipynb_checkpoints
80 |
81 | # IPython
82 | profile_default/
83 | ipython_config.py
84 |
85 | # pyenv
86 | # For a library or package, you might want to ignore these files since the code is
87 | # intended to run in multiple environments; otherwise, check them in:
88 | # .python-version
89 |
90 | # pipenv
91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
94 | # install all needed dependencies.
95 | #Pipfile.lock
96 |
97 | # poetry
98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99 | # This is especially recommended for binary packages to ensure reproducibility, and is more
100 | # commonly ignored for libraries.
101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102 | #poetry.lock
103 |
104 | # pdm
105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106 | #pdm.lock
107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108 | # in version control.
109 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
110 | .pdm.toml
111 | .pdm-python
112 | .pdm-build/
113 |
114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
115 | __pypackages__/
116 |
117 | # Celery stuff
118 | celerybeat-schedule
119 | celerybeat.pid
120 |
121 | # SageMath parsed files
122 | *.sage.py
123 |
124 | # Environments
125 | .env
126 | .venv
127 | env/
128 | venv/
129 | ENV/
130 | env.bak/
131 | venv.bak/
132 |
133 | # Spyder project settings
134 | .spyderproject
135 | .spyproject
136 |
137 | # Rope project settings
138 | .ropeproject
139 |
140 | # mkdocs documentation
141 | /site
142 |
143 | # mypy
144 | .mypy_cache/
145 | .dmypy.json
146 | dmypy.json
147 |
148 | # Pyre type checker
149 | .pyre/
150 |
151 | # pytype static type analyzer
152 | .pytype/
153 |
154 | # Cython debug symbols
155 | cython_debug/
156 |
157 | # PyCharm
158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
160 | # and can be added to the global gitignore or merged into this file. For a more nuclear
161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder.
162 | #.idea/
163 |
164 | # Miscellaneous
165 | misc/
166 | .vscode
167 | .ruff_cache/
168 | .python-version
169 |
--------------------------------------------------------------------------------
/CONTRIBUTORS.md:
--------------------------------------------------------------------------------
1 | # 🤝🏻 Contributors
2 |
3 | > "We learn big things from small experiences" - **Bram Stoker**
4 |
5 | Dracula Theme is an open-source project driven by and for the community. Most apps that support the theme are contributions from our community.
6 |
7 | As much as the team is responsible for the core theme and wants to support all available applications, we can only do some of it ourselves.
8 |
9 | That's why the community is essential for this project to keep evolving. Below are some tips for you, contributor.
10 |
11 | ## 🎃 Recommendations
12 |
13 | ⚡ This template-repo is organized for easy use:
14 |
15 | - [`README.md`](README.md): Introduction and guide for GitHub users;
16 | - [`screenshot.png`](screenshot.png): Displays your Dracula-themed theme on the website 😅;
17 | - [`INSTALL.md`](INSTALL.md): Installation instructions to display on the website;
18 | - [`sample`](/sample/): Code samples in various languages to aid theme creation. (_Consider removing this folder before submission._)
19 |
20 | Previously, default formatting settings were included. Now, we recommend preparing your theme with this command:
21 |
22 | ```bash
23 | npx prettier . --write
24 | ```
25 |
26 | > What is that `npx` thing? `npx` ships with `npm` and lets you run locally installed tools.
27 |
28 | ## 🦉 The Dracula Theme Team
29 |
30 | The creators behind the scenes are just me, [Lucas de França](https://github.com/luxonauta), and [Zeno Rocha](https://github.com/zenorocha). 😅
31 |
32 | Reach out via [email](mailto:support@draculatheme.com) or follow us on Twitter/X: [Zeno Rocha](https://twitter.com/zenorocha) & [Luxonauta (Lucas)](https://twitter.com/luxonauta).
33 |
--------------------------------------------------------------------------------
/INSTALL.md:
--------------------------------------------------------------------------------
1 | ### [Django Admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/)
2 |
3 | ### Install the dracula theme
4 | ```bash
5 | pip install django-admin-dracula
6 | ```
7 |
8 | ### Add to Django project
9 | Add `django_admin_dracula` to your `INSTALLED_APPS` **before** `django.contrib.admin`:
10 |
11 | ```python
12 | INSTALLED_APPS = [
13 | ...
14 | "django_admin_dracula",
15 | ...
16 | "django.contrib.admin",
17 | ...
18 | ]
19 | ```
20 |
21 | ### Celebrate ✨
22 | Put on your favorite dracula cape and dump all your remaining garlic! 🧄
23 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Dracula Theme
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | > [!IMPORTANT]
2 | > This project has been moved to the official Dracula theme Github organization over at https://github.com/dracula/django-admin.
3 |
4 | # Dracula for [Django Admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/)
5 |
6 | > A dark (and light 🕯️) theme for the [Django Admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/).
7 |
8 | 
9 |
10 | 
11 | 
12 | 
13 | 
14 |
15 | ## Install
16 |
17 | ### Install the dracula theme
18 | ```bash
19 | pip install django-admin-dracula
20 | ```
21 |
22 | ### Add to Django project
23 | Add `django_admin_dracula` to your `INSTALLED_APPS` **before** `django.contrib.admin`:
24 |
25 | ```python
26 | INSTALLED_APPS = [
27 | ...
28 | "django_admin_dracula",
29 | ...
30 | "django.contrib.admin",
31 | ...
32 | ]
33 | ```
34 |
35 | ### Celebrate ✨
36 | Put on your favorite dracula cape and dump all your remaining garlic! 🧄
37 |
38 | ## Themes
39 |
40 | Check out some more screenshots of the light and dark themes [here](https://github.com/sjbitcode/django-admin-dracula/blob/main/THEMES.md)!
41 |
42 | ## Team
43 |
44 | This theme is maintained by the following person(s) and a bunch of [awesome contributors](https://github.com/dracula/foobar/graphs/contributors).
45 |
46 | | [](https://github.com/sjbitcode) |
47 | | ---------------------------------------------------------------------------------------- |
48 | | [Sangeeta Jadoonanan](https://github.com/sjbitcode) |
49 |
50 | ## Community
51 |
52 | - [Twitter](https://twitter.com/draculatheme) - Best for getting updates about themes and new stuff.
53 | - [GitHub](https://github.com/dracula/dracula-theme/discussions) - Best for asking questions and discussing issues.
54 | - [Discord](https://draculatheme.com/discord-invite) - Best for hanging out with the community.
55 |
56 | ## Dracula PRO
57 |
58 | [](https://draculatheme.com/pro)
59 |
60 | ## License
61 |
62 | [MIT License](./LICENSE)
63 |
--------------------------------------------------------------------------------
/THEMES.md:
--------------------------------------------------------------------------------
1 | # Dracula for [Django Admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/)
2 |
3 | > A dark (and light 🕯️) theme for the [Django Admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/).
4 |
5 | 
6 |
7 |
8 | ## 🦇 Dark Theme
9 |
10 | 
11 |
12 | 
13 |
14 |
15 | ## 🕯️ Light Theme
16 |
17 | 
18 |
19 | 
20 |
--------------------------------------------------------------------------------
/django_admin_dracula/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sjbitcode/django-admin-dracula/7f0ee71316cf3012c2b2cf2e7b446a7a0d8d19e2/django_admin_dracula/__init__.py
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/css/base.css:
--------------------------------------------------------------------------------
1 | /*
2 | DJANGO Admin styles
3 | */
4 |
5 | /* VARIABLE DEFINITIONS */
6 | html[data-theme="light"],
7 | :root {
8 | --dracula-background: #282a36;
9 | --dracula-background-light: #353748; /* custom */
10 | --dracula-background-dark: #1d1e27; /* custom */
11 | --dracula-current-line: #44475a;
12 | --dracula-selection: #44475a;
13 | --dracula-foreground: #f8f8f2;
14 | --dracula-comment: #6272a4;
15 | --dracula-comment-dark: #4d5a83; /* custom */
16 | --dracula-comment-darker: #445075; /* custom */
17 | --dracula-cyan: #8be9fd;
18 | --dracula-cyan-light: #d5f7ff; /* custom */
19 | --dracula-green-light: #eaffef; /* custom */
20 | --dracula-green: #50fa7b;
21 | --dracula-green-tame: #45de6b; /* custom */
22 | --dracula-orange: #ffb86c;
23 | --dracula-pink: #ff79c6;
24 | --dracula-pink-dark: #e36cb0; /* custom */
25 | --dracula-pink-light: #ffb0dd; /* custom */
26 | --dracula-purple-light: #fbf9ff; /* custom */
27 | --dracula-purple: #bd93f9;
28 | --dracula-purple-darker: #a47fdc; /* custom */
29 | --dracula-red: #ff5555;
30 | --dracula-red-darker: #e84c4b; /* custom */
31 | --dracula-yellow: #f1fa8c;
32 | --dracula-yellow-light: #fbffcf; /* custom */
33 |
34 | --primary: var(--dracula-cyan);
35 | --secondary: var(--dracula-comment);
36 | --accent: var(--dracula-yellow);
37 | --primary-fg: #fff;
38 |
39 | --body-fg: var(--dracula-current-line);
40 | --body-bg: #fff;
41 | --body-quiet-color: var(--dracula-selection);
42 | --body-medium-color: #444;
43 | --body-loud-color: #000;
44 |
45 | --header-color: #ffc;
46 | --header-branding-color: var(--accent);
47 | --header-bg: var(--secondary);
48 | --header-link-color: var(--primary-fg);
49 |
50 | --breadcrumbs-fg: var(--dracula-cyan);
51 | --breadcrumbs-link-fg: var(--body-bg);
52 | --breadcrumbs-bg: var(--dracula-comment-dark);
53 |
54 | --link-fg: var(--dracula-comment);
55 | --link-hover-color: var(--dracula-comment-dark);
56 | --link-selected-fg: var(--secondary);
57 |
58 | --hairline-color: #e8e8e8;
59 | --hairline-color: var(--dracula-cyan-light);
60 | --border-color: #ccc;
61 |
62 | --error-fg: var(--dracula-red);
63 |
64 | --message-success-bg: #dfd;
65 | --message-warning-bg: var(--dracula-yellow-light);
66 | --message-error-bg: #ffefef;
67 |
68 | --darkened-bg: var(--dracula-purple-light); /* A bit darker than --body-bg */
69 | --selected-bg: var(--dracula-green-light); /* E.g. selected table cells */
70 | --selected-row: var(--dracula-yellow-light);
71 |
72 | --button-fg: #fff;
73 | --button-bg: var(--secondary);
74 | --button-hover-bg: var(--dracula-comment-dark);
75 | --default-button-bg: var(--dracula-purple);
76 | --default-button-hover-bg: var(--dracula-purple-darker);
77 | --close-button-bg: var(--dracula-purple);
78 | --close-button-hover-bg: var(--dracula-purple-darker);
79 | --delete-button-bg: var(--dracula-red);
80 | --delete-button-hover-bg: var(--dracula-red-darker);
81 |
82 | --object-tools-fg: var(--button-fg);
83 | --object-tools-bg: var(--close-button-bg);
84 | --object-tools-hover-bg: var(--close-button-hover-bg);
85 |
86 | --font-family-primary:
87 | "Segoe UI",
88 | system-ui,
89 | Roboto,
90 | "Helvetica Neue",
91 | Arial,
92 | sans-serif,
93 | "Apple Color Emoji",
94 | "Segoe UI Emoji",
95 | "Segoe UI Symbol",
96 | "Noto Color Emoji";
97 | --font-family-monospace:
98 | ui-monospace,
99 | Menlo,
100 | Monaco,
101 | "Cascadia Mono",
102 | "Segoe UI Mono",
103 | "Roboto Mono",
104 | "Oxygen Mono",
105 | "Ubuntu Monospace",
106 | "Source Code Pro",
107 | "Fira Mono",
108 | "Droid Sans Mono",
109 | "Courier New",
110 | monospace,
111 | "Apple Color Emoji",
112 | "Segoe UI Emoji",
113 | "Segoe UI Symbol",
114 | "Noto Color Emoji";
115 |
116 | color-scheme: light;
117 | }
118 |
119 | html, body {
120 | height: 100%;
121 | }
122 |
123 | body {
124 | margin: 0;
125 | padding: 0;
126 | font-size: 0.875rem;
127 | font-family: var(--font-family-primary);
128 | color: var(--body-fg);
129 | background: var(--body-bg);
130 |
131 | /* dracula theme */
132 | ::selection {
133 | background: var(--dracula-cyan-light);
134 | }
135 | }
136 |
137 | /* LINKS */
138 |
139 | a:link, a:visited {
140 | color: var(--link-fg);
141 | text-decoration: none;
142 | transition: color 0.15s, background 0.15s;
143 | }
144 |
145 | a:focus, a:hover {
146 | color: var(--link-hover-color);
147 | }
148 |
149 | a:focus {
150 | text-decoration: underline;
151 | }
152 |
153 | a img {
154 | border: none;
155 | }
156 |
157 | a.section:link, a.section:visited {
158 | color: var(--header-link-color);
159 | text-decoration: none;
160 | }
161 |
162 | a.section:focus, a.section:hover {
163 | text-decoration: underline;
164 | }
165 |
166 | /* GLOBAL DEFAULTS */
167 |
168 | p, ol, ul, dl {
169 | margin: .2em 0 .8em 0;
170 | }
171 |
172 | p {
173 | padding: 0;
174 | line-height: 140%;
175 | }
176 |
177 | h1,h2,h3,h4,h5 {
178 | font-weight: bold;
179 | }
180 |
181 | h1 {
182 | margin: 0 0 20px;
183 | font-weight: 300;
184 | font-size: 1.25rem;
185 | color: var(--body-quiet-color);
186 | }
187 |
188 | h2 {
189 | font-size: 1rem;
190 | margin: 1em 0 .5em 0;
191 | }
192 |
193 | h2.subhead {
194 | font-weight: normal;
195 | margin-top: 0;
196 | }
197 |
198 | h3 {
199 | font-size: 0.875rem;
200 | margin: .8em 0 .3em 0;
201 | color: var(--body-medium-color);
202 | font-weight: bold;
203 | }
204 |
205 | h4 {
206 | font-size: 0.75rem;
207 | margin: 1em 0 .8em 0;
208 | padding-bottom: 3px;
209 | color: var(--body-medium-color);
210 | }
211 |
212 | h5 {
213 | font-size: 0.625rem;
214 | margin: 1.5em 0 .5em 0;
215 | color: var(--body-quiet-color);
216 | text-transform: uppercase;
217 | letter-spacing: 1px;
218 | }
219 |
220 | ul > li {
221 | list-style-type: square;
222 | padding: 1px 0;
223 | }
224 |
225 | li ul {
226 | margin-bottom: 0;
227 | }
228 |
229 | li, dt, dd {
230 | font-size: 0.8125rem;
231 | line-height: 1.25rem;
232 | }
233 |
234 | dt {
235 | font-weight: bold;
236 | margin-top: 4px;
237 | }
238 |
239 | dd {
240 | margin-left: 0;
241 | }
242 |
243 | form {
244 | margin: 0;
245 | padding: 0;
246 | }
247 |
248 | fieldset {
249 | margin: 0;
250 | min-width: 0;
251 | padding: 0;
252 | border: none;
253 | border-top: 1px solid var(--hairline-color);
254 | }
255 |
256 | details summary {
257 | cursor: pointer;
258 | }
259 |
260 | blockquote {
261 | font-size: 0.6875rem;
262 | color: #777;
263 | margin-left: 2px;
264 | padding-left: 10px;
265 | border-left: 5px solid #ddd;
266 | }
267 |
268 | code, pre {
269 | font-family: var(--font-family-monospace);
270 | color: var(--body-quiet-color);
271 | font-size: 0.75rem;
272 | overflow-x: auto;
273 | }
274 |
275 | pre.literal-block {
276 | margin: 10px;
277 | background: var(--darkened-bg);
278 | padding: 6px 8px;
279 | }
280 |
281 | code strong {
282 | color: var(--dracula-red); /* dracula theme */
283 | }
284 |
285 | hr {
286 | clear: both;
287 | color: var(--hairline-color);
288 | background-color: var(--hairline-color);
289 | height: 1px;
290 | border: none;
291 | margin: 0;
292 | padding: 0;
293 | line-height: 1px;
294 | }
295 |
296 | /* TEXT STYLES & MODIFIERS */
297 |
298 | .small {
299 | font-size: 0.6875rem;
300 | }
301 |
302 | .mini {
303 | font-size: 0.625rem;
304 | }
305 |
306 | .help, p.help, form p.help, div.help, form div.help, div.help li {
307 | font-size: 0.6875rem;
308 | color: var(--body-quiet-color);
309 | }
310 |
311 | div.help ul {
312 | margin-bottom: 0;
313 | }
314 |
315 | .help-tooltip {
316 | cursor: help;
317 | }
318 |
319 | p img, h1 img, h2 img, h3 img, h4 img, td img {
320 | vertical-align: middle;
321 | }
322 |
323 | .quiet, a.quiet:link, a.quiet:visited {
324 | color: var(--body-quiet-color);
325 | font-weight: normal;
326 | }
327 |
328 | .clear {
329 | clear: both;
330 | }
331 |
332 | .nowrap {
333 | white-space: nowrap;
334 | }
335 |
336 | .hidden {
337 | display: none !important;
338 | }
339 |
340 | /* TABLES */
341 |
342 | table {
343 | border-collapse: collapse;
344 | border-color: var(--border-color);
345 | }
346 |
347 | td, th {
348 | font-size: 0.8125rem;
349 | line-height: 1rem;
350 | border-bottom: 1px solid var(--hairline-color);
351 | vertical-align: top;
352 | padding: 8px;
353 | }
354 |
355 | th {
356 | font-weight: 500;
357 | text-align: left;
358 | }
359 |
360 | thead th,
361 | tfoot td {
362 | color: var(--body-quiet-color);
363 | padding: 5px 10px;
364 | font-size: 0.6875rem;
365 | background: var(--body-bg);
366 | border: none;
367 | border-top: 1px solid var(--hairline-color);
368 | border-bottom: 1px solid var(--hairline-color);
369 | }
370 |
371 | tfoot td {
372 | border-bottom: none;
373 | border-top: 1px solid var(--hairline-color);
374 | }
375 |
376 | thead th.required {
377 | font-weight: bold;
378 | }
379 |
380 | tr.alt {
381 | background: var(--darkened-bg);
382 | }
383 |
384 | tr:nth-child(odd), .row-form-errors {
385 | background: var(--body-bg);
386 | }
387 |
388 | tr:nth-child(even),
389 | tr:nth-child(even) .errorlist,
390 | tr:nth-child(odd) + .row-form-errors,
391 | tr:nth-child(odd) + .row-form-errors .errorlist {
392 | background: var(--darkened-bg);
393 | }
394 |
395 | /* SORTABLE TABLES */
396 |
397 | thead th {
398 | padding: 5px 10px;
399 | line-height: normal;
400 | text-transform: uppercase;
401 | background: var(--darkened-bg);
402 | }
403 |
404 | thead th a:link, thead th a:visited {
405 | color: var(--body-quiet-color);
406 | }
407 |
408 | thead th.sorted {
409 | background: var(--selected-bg);
410 | }
411 |
412 | thead th.sorted .text {
413 | padding-right: 42px;
414 | }
415 |
416 | table thead th .text span {
417 | padding: 8px 10px;
418 | display: block;
419 | }
420 |
421 | table thead th .text a {
422 | display: block;
423 | cursor: pointer;
424 | padding: 8px 10px;
425 | }
426 |
427 | table thead th .text a:focus, table thead th .text a:hover {
428 | background: var(--selected-bg);
429 | }
430 |
431 | thead th.sorted a.sortremove {
432 | visibility: hidden;
433 | }
434 |
435 | table thead th.sorted:hover a.sortremove {
436 | visibility: visible;
437 | }
438 |
439 | table thead th.sorted .sortoptions {
440 | display: block;
441 | padding: 9px 5px 0 5px;
442 | float: right;
443 | text-align: right;
444 | }
445 |
446 | table thead th.sorted .sortpriority {
447 | font-size: .8em;
448 | min-width: 12px;
449 | text-align: center;
450 | vertical-align: 3px;
451 | margin-left: 2px;
452 | margin-right: 2px;
453 | }
454 |
455 | table thead th.sorted .sortoptions a {
456 | position: relative;
457 | width: 14px;
458 | height: 14px;
459 | display: inline-block;
460 | background: url(../img/sorting-icons.svg) 0 0 no-repeat;
461 | background-size: 14px auto;
462 | }
463 |
464 | table thead th.sorted .sortoptions a.sortremove {
465 | background-position: 0 0;
466 | }
467 |
468 | table thead th.sorted .sortoptions a.sortremove:after {
469 | content: '\\';
470 | position: absolute;
471 | top: -6px;
472 | left: 3px;
473 | font-weight: 200;
474 | font-size: 1.125rem;
475 | color: var(--body-quiet-color);
476 | }
477 |
478 | table thead th.sorted .sortoptions a.sortremove:focus:after,
479 | table thead th.sorted .sortoptions a.sortremove:hover:after {
480 | color: var(--link-fg);
481 | }
482 |
483 | table thead th.sorted .sortoptions a.sortremove:focus,
484 | table thead th.sorted .sortoptions a.sortremove:hover {
485 | background-position: 0 -14px;
486 | }
487 |
488 | table thead th.sorted .sortoptions a.ascending {
489 | background-position: 0 -28px;
490 | }
491 |
492 | table thead th.sorted .sortoptions a.ascending:focus,
493 | table thead th.sorted .sortoptions a.ascending:hover {
494 | background-position: 0 -42px;
495 | }
496 |
497 | table thead th.sorted .sortoptions a.descending {
498 | top: 1px;
499 | background-position: 0 -56px;
500 | }
501 |
502 | table thead th.sorted .sortoptions a.descending:focus,
503 | table thead th.sorted .sortoptions a.descending:hover {
504 | background-position: 0 -70px;
505 | }
506 |
507 | /* FORM DEFAULTS */
508 |
509 | input, textarea, select, .form-row p, form .button {
510 | margin: 2px 0;
511 | padding: 2px 3px;
512 | vertical-align: middle;
513 | font-family: var(--font-family-primary);
514 | font-weight: normal;
515 | font-size: 0.8125rem;
516 | }
517 | .form-row div.help {
518 | padding: 2px 3px;
519 | }
520 |
521 | textarea {
522 | vertical-align: top;
523 | }
524 |
525 | /*
526 | Minifiers remove the default (text) "type" attribute from "input" HTML tags.
527 | Add input:not([type]) to make the CSS stylesheet work the same.
528 | */
529 | input:not([type]), input[type=text], input[type=password], input[type=email],
530 | input[type=url], input[type=number], input[type=tel], textarea, select,
531 | .vTextField {
532 | border: 1px solid var(--border-color);
533 | border-radius: 4px;
534 | padding: 5px 6px;
535 | margin-top: 0;
536 | color: var(--body-fg);
537 | background-color: var(--body-bg);
538 | }
539 |
540 | /*
541 | Minifiers remove the default (text) "type" attribute from "input" HTML tags.
542 | Add input:not([type]) to make the CSS stylesheet work the same.
543 | */
544 | input:not([type]):focus, input[type=text]:focus, input[type=password]:focus,
545 | input[type=email]:focus, input[type=url]:focus, input[type=number]:focus,
546 | input[type=tel]:focus, textarea:focus, select:focus, .vTextField:focus {
547 | border-color: var(--dracula-green-tame);
548 | outline: none; /* dracula theme */
549 | }
550 |
551 | /* dracula theme */
552 | input:not([type]):focus-visible, input[type=text]:focus-visible, input[type=password]:focus-visible,
553 | input[type=email]:focus-visible, input[type=url]:focus-visible, input[type=number]:focus-visible,
554 | input[type=tel]:focus-visible, input[type=search]:focus-visible, textarea:focus-visible, select:focus-visible, .vTextField:focus-visible {
555 | outline: 1px solid var(--dracula-green-tame);
556 | }
557 |
558 | /* dracula theme */
559 | input[type=checkbox]:checked {
560 | accent-color: var(--dracula-orange);
561 | }
562 |
563 | select {
564 | height: 1.875rem;
565 | }
566 |
567 | select[multiple] {
568 | /* Allow HTML size attribute to override the height in the rule above. */
569 | height: auto;
570 | min-height: 150px;
571 | }
572 |
573 | /* FORM BUTTONS */
574 |
575 | .button, input[type=submit], input[type=button], .submit-row input, a.button {
576 | background: var(--button-bg);
577 | padding: 10px 15px;
578 | border: none;
579 | border-radius: 4px;
580 | color: var(--button-fg);
581 | cursor: pointer;
582 | transition: background 0.15s;
583 | }
584 |
585 | a.button {
586 | padding: 4px 5px;
587 | }
588 |
589 | .button:active, input[type=submit]:active, input[type=button]:active,
590 | .button:focus, input[type=submit]:focus, input[type=button]:focus,
591 | .button:hover, input[type=submit]:hover, input[type=button]:hover {
592 | background: var(--button-hover-bg);
593 | }
594 |
595 | .button[disabled], input[type=submit][disabled], input[type=button][disabled] {
596 | opacity: 0.4;
597 | }
598 |
599 | .button.default, input[type=submit].default, .submit-row input.default {
600 | border: none;
601 | font-weight: 400;
602 | background: var(--default-button-bg);
603 | }
604 |
605 | .button.default:active, input[type=submit].default:active,
606 | .button.default:focus, input[type=submit].default:focus,
607 | .button.default:hover, input[type=submit].default:hover {
608 | background: var(--default-button-hover-bg);
609 | }
610 |
611 | .button[disabled].default,
612 | input[type=submit][disabled].default,
613 | input[type=button][disabled].default {
614 | opacity: 0.4;
615 | }
616 |
617 |
618 | /* MODULES */
619 |
620 | .module {
621 | border: none;
622 | margin-bottom: 30px;
623 | background: var(--body-bg);
624 | }
625 |
626 | .module p, .module ul, .module h3, .module h4, .module dl, .module pre {
627 | padding-left: 10px;
628 | padding-right: 10px;
629 | }
630 |
631 | .module blockquote {
632 | margin-left: 12px;
633 | }
634 |
635 | .module ul, .module ol {
636 | margin-left: 1.5em;
637 | }
638 |
639 | .module h3 {
640 | margin-top: .6em;
641 | }
642 |
643 | .module h2, .module caption, .inline-group h2 {
644 | margin: 0;
645 | padding: 8px;
646 | font-weight: 400;
647 | font-size: 0.8125rem;
648 | text-align: left;
649 | background: var(--header-bg);
650 | color: var(--header-link-color);
651 | }
652 |
653 | .module caption,
654 | .inline-group h2 {
655 | font-size: 0.75rem;
656 | letter-spacing: 0.5px;
657 | text-transform: uppercase;
658 | }
659 |
660 | .module table {
661 | border-collapse: collapse;
662 | }
663 |
664 | /* MESSAGES & ERRORS */
665 |
666 | ul.messagelist {
667 | padding: 0;
668 | margin: 0;
669 | }
670 |
671 | ul.messagelist li {
672 | display: block;
673 | font-weight: 400;
674 | font-size: 0.8125rem;
675 | padding: 10px 10px 10px 65px;
676 | margin: 0 0 10px 0;
677 | background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat;
678 | background-size: 16px auto;
679 | color: var(--body-fg);
680 | word-break: break-word;
681 | }
682 |
683 | ul.messagelist li.warning {
684 | background: var(--message-warning-bg) url(../img/icon-alert.svg) 40px 14px no-repeat;
685 | background-size: 14px auto;
686 | }
687 |
688 | ul.messagelist li.error {
689 | background: var(--message-error-bg) url(../img/icon-no.svg) 40px 12px no-repeat;
690 | background-size: 16px auto;
691 | }
692 |
693 | .errornote {
694 | font-size: 0.875rem;
695 | font-weight: 700;
696 | display: block;
697 | padding: 10px 12px;
698 | margin: 0 0 10px 0;
699 | color: var(--error-fg);
700 | border: 1px solid var(--error-fg);
701 | border-radius: 4px;
702 | background-color: var(--body-bg);
703 | background-position: 5px 12px;
704 | overflow-wrap: break-word;
705 | }
706 |
707 | ul.errorlist {
708 | margin: 0 0 4px;
709 | padding: 0;
710 | color: var(--error-fg);
711 | background: var(--body-bg);
712 | }
713 |
714 | ul.errorlist li {
715 | font-size: 0.8125rem;
716 | display: block;
717 | margin-bottom: 4px;
718 | overflow-wrap: break-word;
719 | }
720 |
721 | ul.errorlist li:first-child {
722 | margin-top: 0;
723 | }
724 |
725 | ul.errorlist li a {
726 | color: inherit;
727 | text-decoration: underline;
728 | }
729 |
730 | td ul.errorlist {
731 | margin: 0;
732 | padding: 0;
733 | }
734 |
735 | td ul.errorlist li {
736 | margin: 0;
737 | }
738 |
739 | .form-row.errors {
740 | margin: 0;
741 | border: none;
742 | border-bottom: 1px solid var(--hairline-color);
743 | background: none;
744 | }
745 |
746 | .form-row.errors ul.errorlist li {
747 | padding-left: 0;
748 | }
749 |
750 | .errors input, .errors select, .errors textarea,
751 | td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea {
752 | border: 1px solid var(--error-fg);
753 | }
754 |
755 | .description {
756 | font-size: 0.75rem;
757 | padding: 5px 0 0 12px;
758 | }
759 |
760 | /* BREADCRUMBS */
761 |
762 | div.breadcrumbs {
763 | background: var(--breadcrumbs-bg);
764 | padding: 10px 40px;
765 | border: none;
766 | color: var(--breadcrumbs-fg);
767 | text-align: left;
768 | }
769 |
770 | div.breadcrumbs a {
771 | color: var(--breadcrumbs-link-fg);
772 | }
773 |
774 | div.breadcrumbs a:focus, div.breadcrumbs a:hover {
775 | color: var(--breadcrumbs-fg);
776 | }
777 |
778 | /* ACTION ICONS */
779 |
780 | .viewlink, .inlineviewlink {
781 | padding-left: 16px;
782 | background: url(../img/icon-viewlink.svg) 0 1px no-repeat;
783 | }
784 |
785 | .hidelink {
786 | padding-left: 16px;
787 | background: url(../img/icon-hidelink.svg) 0 1px no-repeat;
788 | }
789 |
790 | .addlink {
791 | padding-left: 16px;
792 | background: url(../img/icon-addlink.svg) 0 1px no-repeat;
793 | }
794 |
795 | .changelink, .inlinechangelink {
796 | padding-left: 16px;
797 | background: url(../img/icon-changelink.svg) 0 1px no-repeat;
798 | }
799 |
800 | .deletelink {
801 | padding-left: 16px;
802 | background: url(../img/icon-deletelink.svg) 0 1px no-repeat;
803 | }
804 |
805 | a.deletelink:link, a.deletelink:visited {
806 | color: var(--dracula-red); /* XXX Probably unused? */ /* dracula theme */
807 | }
808 |
809 | a.deletelink:focus, a.deletelink:hover {
810 | color: var(--dracula-red-darker); /* XXX Probably unused? */ /* dracula theme */
811 | text-decoration: none;
812 | }
813 |
814 | /* OBJECT TOOLS */
815 |
816 | .object-tools {
817 | font-size: 0.625rem;
818 | font-weight: bold;
819 | padding-left: 0;
820 | float: right;
821 | position: relative;
822 | margin-top: -48px;
823 | }
824 |
825 | .object-tools li {
826 | display: block;
827 | float: left;
828 | margin-left: 5px;
829 | height: 1rem;
830 | }
831 |
832 | .object-tools a {
833 | border-radius: 15px;
834 | }
835 |
836 | .object-tools a:link, .object-tools a:visited {
837 | display: block;
838 | float: left;
839 | padding: 3px 12px;
840 | background: var(--object-tools-bg);
841 | color: var(--object-tools-fg);
842 | font-weight: 400;
843 | font-size: 0.6875rem;
844 | text-transform: uppercase;
845 | letter-spacing: 0.5px;
846 | }
847 |
848 | .object-tools a:focus, .object-tools a:hover {
849 | background-color: var(--object-tools-hover-bg);
850 | }
851 |
852 | .object-tools a:focus{
853 | text-decoration: none;
854 | }
855 |
856 | .object-tools a.viewsitelink, .object-tools a.addlink {
857 | background-repeat: no-repeat;
858 | background-position: right 7px center;
859 | padding-right: 26px;
860 | }
861 |
862 | .object-tools a.viewsitelink {
863 | background-image: url(../img/tooltag-arrowright.svg);
864 | }
865 |
866 | .object-tools a.addlink {
867 | background-image: url(../img/tooltag-add.svg);
868 | }
869 |
870 | /* OBJECT HISTORY */
871 |
872 | #change-history table {
873 | width: 100%;
874 | }
875 |
876 | #change-history table tbody th {
877 | width: 16em;
878 | }
879 |
880 | #change-history .paginator {
881 | color: var(--body-quiet-color);
882 | border-bottom: 1px solid var(--hairline-color);
883 | background: var(--body-bg);
884 | overflow: hidden;
885 | }
886 |
887 | /* PAGE STRUCTURE */
888 |
889 | #container {
890 | position: relative;
891 | width: 100%;
892 | min-width: 980px;
893 | padding: 0;
894 | display: flex;
895 | flex-direction: column;
896 | height: 100%;
897 | }
898 |
899 | #container > .main {
900 | display: flex;
901 | flex: 1 0 auto;
902 | }
903 |
904 | .main > .content {
905 | flex: 1 0;
906 | max-width: 100%;
907 | }
908 |
909 | .skip-to-content-link {
910 | position: absolute;
911 | top: -999px;
912 | margin: 5px;
913 | padding: 5px;
914 | background: var(--body-bg);
915 | z-index: 1;
916 | }
917 |
918 | .skip-to-content-link:focus {
919 | left: 0px;
920 | top: 0px;
921 | }
922 |
923 | #content {
924 | padding: 20px 40px;
925 | }
926 |
927 | .dashboard #content {
928 | width: 600px;
929 | }
930 |
931 | #content-main {
932 | float: left;
933 | width: 100%;
934 | }
935 |
936 | #content-related {
937 | float: right;
938 | width: 260px;
939 | position: relative;
940 | margin-right: -300px;
941 | }
942 |
943 | @media (forced-colors: active) {
944 | #content-related {
945 | border: 1px solid;
946 | }
947 | }
948 |
949 | /* COLUMN TYPES */
950 |
951 | .colMS {
952 | margin-right: 300px;
953 | }
954 |
955 | .colSM {
956 | margin-left: 300px;
957 | }
958 |
959 | .colSM #content-related {
960 | float: left;
961 | margin-right: 0;
962 | margin-left: -300px;
963 | }
964 |
965 | .colSM #content-main {
966 | float: right;
967 | }
968 |
969 | .popup .colM {
970 | width: auto;
971 | }
972 |
973 | /* HEADER */
974 |
975 | #header {
976 | width: auto;
977 | height: auto;
978 | display: flex;
979 | justify-content: space-between;
980 | align-items: center;
981 | padding: 10px 40px;
982 | background: var(--header-bg);
983 | color: var(--header-color);
984 | }
985 |
986 | #header a:link, #header a:visited, #logout-form button {
987 | color: var(--header-link-color);
988 | }
989 |
990 | #header a:focus , #header a:hover {
991 | text-decoration: underline;
992 | }
993 |
994 | @media (forced-colors: active) {
995 | #header {
996 | border-bottom: 1px solid;
997 | }
998 | }
999 |
1000 | #branding {
1001 | display: flex;
1002 | }
1003 |
1004 | #site-name {
1005 | padding: 0;
1006 | margin: 0;
1007 | margin-inline-end: 20px;
1008 | font-weight: 300;
1009 | font-size: 1.5rem;
1010 | color: var(--header-branding-color);
1011 | }
1012 |
1013 | #site-name a:link, #site-name a:visited {
1014 | color: var(--accent);
1015 | }
1016 |
1017 | #branding h2 {
1018 | padding: 0 10px;
1019 | font-size: 0.875rem;
1020 | margin: -8px 0 8px 0;
1021 | font-weight: normal;
1022 | color: var(--header-color);
1023 | }
1024 |
1025 | #branding a:hover {
1026 | text-decoration: none;
1027 | }
1028 |
1029 | #logout-form {
1030 | display: inline;
1031 | }
1032 |
1033 | #logout-form button {
1034 | background: none;
1035 | border: 0;
1036 | cursor: pointer;
1037 | font-family: var(--font-family-primary);
1038 | }
1039 |
1040 | #user-tools {
1041 | float: right;
1042 | margin: 0 0 0 20px;
1043 | text-align: right;
1044 | }
1045 |
1046 | #user-tools, #logout-form button{
1047 | padding: 0;
1048 | font-weight: 300;
1049 | font-size: 0.6875rem;
1050 | letter-spacing: 0.5px;
1051 | text-transform: uppercase;
1052 | }
1053 |
1054 | #user-tools a, #logout-form button {
1055 | border-bottom: 1px solid rgba(255, 255, 255, 0.25);
1056 | }
1057 |
1058 | #user-tools a:focus, #user-tools a:hover,
1059 | #logout-form button:active, #logout-form button:hover {
1060 | text-decoration: none;
1061 | border-bottom: 0;
1062 | }
1063 |
1064 | #logout-form button:active, #logout-form button:hover {
1065 | margin-bottom: 1px;
1066 | }
1067 |
1068 | /* SIDEBAR */
1069 |
1070 | #content-related {
1071 | background: var(--darkened-bg);
1072 | }
1073 |
1074 | #content-related .module {
1075 | background: none;
1076 | }
1077 |
1078 | #content-related h3 {
1079 | color: var(--body-quiet-color);
1080 | padding: 0 16px;
1081 | margin: 0 0 16px;
1082 | }
1083 |
1084 | #content-related h4 {
1085 | font-size: 0.8125rem;
1086 | }
1087 |
1088 | #content-related p {
1089 | padding-left: 16px;
1090 | padding-right: 16px;
1091 | }
1092 |
1093 | #content-related .actionlist {
1094 | padding: 0;
1095 | margin: 16px;
1096 | }
1097 |
1098 | #content-related .actionlist li {
1099 | line-height: 1.2;
1100 | margin-bottom: 10px;
1101 | padding-left: 18px;
1102 | }
1103 |
1104 | #content-related .module h2 {
1105 | background: none;
1106 | padding: 16px;
1107 | margin-bottom: 16px;
1108 | border-bottom: 1px solid var(--hairline-color);
1109 | font-size: 1.125rem;
1110 | color: var(--body-fg);
1111 | }
1112 |
1113 | .delete-confirmation form input[type="submit"] {
1114 | background: var(--delete-button-bg);
1115 | border-radius: 4px;
1116 | padding: 10px 15px;
1117 | color: var(--button-fg);
1118 | }
1119 |
1120 | .delete-confirmation form input[type="submit"]:active,
1121 | .delete-confirmation form input[type="submit"]:focus,
1122 | .delete-confirmation form input[type="submit"]:hover {
1123 | background: var(--delete-button-hover-bg);
1124 | }
1125 |
1126 | .delete-confirmation form .cancel-link {
1127 | display: inline-block;
1128 | vertical-align: middle;
1129 | height: 0.9375rem;
1130 | line-height: 0.9375rem;
1131 | border-radius: 4px;
1132 | padding: 10px 15px;
1133 | color: var(--button-fg);
1134 | background: var(--close-button-bg);
1135 | margin: 0 0 0 10px;
1136 | }
1137 |
1138 | .delete-confirmation form .cancel-link:active,
1139 | .delete-confirmation form .cancel-link:focus,
1140 | .delete-confirmation form .cancel-link:hover {
1141 | background: var(--close-button-hover-bg);
1142 | }
1143 |
1144 | /* POPUP */
1145 | .popup #content {
1146 | padding: 20px;
1147 | }
1148 |
1149 | .popup #container {
1150 | min-width: 0;
1151 | }
1152 |
1153 | .popup #header {
1154 | padding: 10px 20px;
1155 | }
1156 |
1157 | /* PAGINATOR */
1158 |
1159 | .paginator {
1160 | display: flex;
1161 | align-items: center;
1162 | gap: 4px;
1163 | font-size: 0.8125rem;
1164 | padding-top: 10px;
1165 | padding-bottom: 10px;
1166 | line-height: 22px;
1167 | margin: 0;
1168 | border-top: 1px solid var(--hairline-color);
1169 | width: 100%;
1170 | }
1171 |
1172 | .paginator a:link, .paginator a:visited {
1173 | padding: 2px 6px;
1174 | background: var(--button-bg);
1175 | text-decoration: none;
1176 | color: var(--button-fg);
1177 | }
1178 |
1179 | .paginator a.showall {
1180 | border: none;
1181 | background: none;
1182 | color: var(--link-fg);
1183 | }
1184 |
1185 | .paginator a.showall:focus, .paginator a.showall:hover {
1186 | background: none;
1187 | color: var(--link-hover-color);
1188 | }
1189 |
1190 | .paginator .end {
1191 | margin-right: 6px;
1192 | }
1193 |
1194 | .paginator .this-page {
1195 | padding: 2px 6px;
1196 | font-weight: bold;
1197 | font-size: 0.8125rem;
1198 | vertical-align: top;
1199 | }
1200 |
1201 | .paginator a:focus, .paginator a:hover {
1202 | color: white;
1203 | background: var(--link-hover-color);
1204 | }
1205 |
1206 | .paginator input {
1207 | margin-left: auto;
1208 | }
1209 |
1210 | .base-svgs {
1211 | display: none;
1212 | }
1213 |
1214 | .visually-hidden {
1215 | position: absolute;
1216 | width: 1px;
1217 | height: 1px;
1218 | padding: 0;
1219 | overflow: hidden;
1220 | clip: rect(0,0,0,0);
1221 | white-space: nowrap;
1222 | border: 0;
1223 | color: var(--body-fg);
1224 | background-color: var(--body-bg);
1225 | }
1226 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/css/changelists.css:
--------------------------------------------------------------------------------
1 | /* CHANGELISTS */
2 |
3 | #changelist {
4 | display: flex;
5 | align-items: flex-start;
6 | justify-content: space-between;
7 | }
8 |
9 | #changelist .changelist-form-container {
10 | flex: 1 1 auto;
11 | min-width: 0;
12 | }
13 |
14 | #changelist table {
15 | width: 100%;
16 | }
17 |
18 | .change-list .hiddenfields { display:none; }
19 |
20 | .change-list .filtered table {
21 | border-right: none;
22 | }
23 |
24 | .change-list .filtered {
25 | min-height: 400px;
26 | }
27 |
28 | .change-list .filtered .results, .change-list .filtered .paginator,
29 | .filtered #toolbar, .filtered div.xfull {
30 | width: auto;
31 | }
32 |
33 | .change-list .filtered table tbody th {
34 | padding-right: 1em;
35 | }
36 |
37 | #changelist-form .results {
38 | overflow-x: auto;
39 | width: 100%;
40 | }
41 |
42 | #changelist .toplinks {
43 | border-bottom: 1px solid var(--hairline-color);
44 | }
45 |
46 | #changelist .paginator {
47 | color: var(--body-quiet-color);
48 | border-bottom: 1px solid var(--hairline-color);
49 | background: var(--body-bg);
50 | overflow: hidden;
51 | }
52 |
53 | /* CHANGELIST TABLES */
54 |
55 | #changelist table thead th {
56 | padding: 0;
57 | white-space: nowrap;
58 | vertical-align: middle;
59 | }
60 |
61 | #changelist table thead th.action-checkbox-column {
62 | width: 1.5em;
63 | text-align: center;
64 | }
65 |
66 | #changelist table tbody td.action-checkbox {
67 | text-align: center;
68 | }
69 |
70 | #changelist table tfoot {
71 | color: var(--body-quiet-color);
72 | }
73 |
74 | /* TOOLBAR */
75 |
76 | #toolbar {
77 | padding: 8px 10px;
78 | margin-bottom: 15px;
79 | border-top: 1px solid var(--hairline-color);
80 | border-bottom: 1px solid var(--hairline-color);
81 | background: var(--darkened-bg);
82 | color: var(--body-quiet-color);
83 | }
84 |
85 | #toolbar form input {
86 | border-radius: 4px;
87 | font-size: 0.875rem;
88 | padding: 5px;
89 | color: var(--body-fg);
90 | }
91 |
92 | #toolbar #searchbar {
93 | height: 1.1875rem;
94 | border: 1px solid var(--border-color);
95 | padding: 2px 5px;
96 | margin: 0;
97 | vertical-align: top;
98 | font-size: 0.8125rem;
99 | max-width: 100%;
100 | }
101 |
102 | #toolbar #searchbar:focus {
103 | border-color: var(--dracula-green); /* dracula theme */
104 | outline: none; /* dracula theme */
105 | }
106 |
107 | /* dracula theme */
108 | #toolbar #searchbar:focus-visible {
109 | outline: 1px solid var(--dracula-green);
110 | }
111 |
112 | #toolbar form input[type="submit"] {
113 | border: 1px solid var(--border-color);
114 | font-size: 0.8125rem;
115 | padding: 4px 8px;
116 | margin: 0;
117 | vertical-align: middle;
118 | background: var(--body-bg);
119 | box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
120 | cursor: pointer;
121 | color: var(--body-fg);
122 | }
123 |
124 | #toolbar form input[type="submit"]:focus,
125 | #toolbar form input[type="submit"]:hover {
126 | border-color: var(--body-quiet-color);
127 | }
128 |
129 | #changelist-search img {
130 | vertical-align: middle;
131 | margin-right: 4px;
132 | }
133 |
134 | #changelist-search .help {
135 | word-break: break-word;
136 | }
137 |
138 | /* FILTER COLUMN */
139 |
140 | #changelist-filter {
141 | flex: 0 0 240px;
142 | order: 1;
143 | background: var(--darkened-bg);
144 | border-left: none;
145 | margin: 0 0 0 30px;
146 | }
147 |
148 | @media (forced-colors: active) {
149 | #changelist-filter {
150 | border: 1px solid;
151 | }
152 | }
153 |
154 | #changelist-filter h2 {
155 | font-size: 0.875rem;
156 | text-transform: uppercase;
157 | letter-spacing: 0.5px;
158 | padding: 5px 15px;
159 | margin-bottom: 12px;
160 | border-bottom: none;
161 | }
162 |
163 | #changelist-filter h3,
164 | #changelist-filter details summary {
165 | font-weight: 400;
166 | padding: 0 15px;
167 | margin-bottom: 10px;
168 | }
169 |
170 | #changelist-filter details summary > * {
171 | display: inline;
172 | }
173 |
174 | #changelist-filter details > summary {
175 | list-style-type: none;
176 | }
177 |
178 | #changelist-filter details > summary::-webkit-details-marker {
179 | display: none;
180 | }
181 |
182 | #changelist-filter details > summary::before {
183 | content: '→';
184 | font-weight: bold;
185 | color: var(--link-hover-color);
186 | }
187 |
188 | #changelist-filter details[open] > summary::before {
189 | content: '↓';
190 | }
191 |
192 | #changelist-filter ul {
193 | margin: 5px 0;
194 | padding: 0 15px 15px;
195 | border-bottom: 1px solid var(--hairline-color);
196 | }
197 |
198 | #changelist-filter ul:last-child {
199 | border-bottom: none;
200 | }
201 |
202 | #changelist-filter li {
203 | list-style-type: none;
204 | margin-left: 0;
205 | padding-left: 0;
206 | }
207 |
208 | #changelist-filter a {
209 | display: block;
210 | color: var(--body-quiet-color);
211 | word-break: break-word;
212 | }
213 |
214 | #changelist-filter li.selected {
215 | border-left: 5px solid var(--hairline-color);
216 | padding-left: 10px;
217 | margin-left: -15px;
218 | }
219 |
220 | #changelist-filter li.selected a {
221 | color: var(--link-selected-fg);
222 | }
223 |
224 | #changelist-filter a:focus, #changelist-filter a:hover,
225 | #changelist-filter li.selected a:focus,
226 | #changelist-filter li.selected a:hover {
227 | color: var(--link-hover-color);
228 | }
229 |
230 | #changelist-filter #changelist-filter-extra-actions {
231 | font-size: 0.8125rem;
232 | margin-bottom: 10px;
233 | border-bottom: 1px solid var(--hairline-color);
234 | }
235 |
236 | /* DATE DRILLDOWN */
237 |
238 | .change-list .toplinks {
239 | display: flex;
240 | padding-bottom: 5px;
241 | flex-wrap: wrap;
242 | gap: 3px 17px;
243 | font-weight: bold;
244 | }
245 |
246 | .change-list .toplinks a {
247 | font-size: 0.8125rem;
248 | }
249 |
250 | .change-list .toplinks .date-back {
251 | color: var(--body-quiet-color);
252 | }
253 |
254 | .change-list .toplinks .date-back:focus,
255 | .change-list .toplinks .date-back:hover {
256 | color: var(--link-hover-color);
257 | }
258 |
259 | /* ACTIONS */
260 |
261 | .filtered .actions {
262 | border-right: none;
263 | }
264 |
265 | #changelist table input {
266 | margin: 0;
267 | vertical-align: baseline;
268 | }
269 |
270 | /* Once the :has() pseudo-class is supported by all browsers, the tr.selected
271 | selector and the JS adding the class can be removed. */
272 | #changelist tbody tr.selected {
273 | background-color: var(--selected-row);
274 | }
275 |
276 | #changelist tbody tr:has(.action-select:checked) {
277 | background-color: var(--selected-row);
278 | }
279 |
280 | @media (forced-colors: active) {
281 | #changelist tbody tr.selected {
282 | background-color: SelectedItem;
283 | }
284 | #changelist tbody tr:has(.action-select:checked) {
285 | background-color: SelectedItem;
286 | }
287 | }
288 |
289 | #changelist .actions {
290 | padding: 10px;
291 | background: var(--body-bg);
292 | border-top: none;
293 | border-bottom: none;
294 | line-height: 1.5rem;
295 | color: var(--body-quiet-color);
296 | width: 100%;
297 | }
298 |
299 | #changelist .actions span.all,
300 | #changelist .actions span.action-counter,
301 | #changelist .actions span.clear,
302 | #changelist .actions span.question {
303 | font-size: 0.8125rem;
304 | margin: 0 0.5em;
305 | }
306 |
307 | #changelist .actions:last-child {
308 | border-bottom: none;
309 | }
310 |
311 | #changelist .actions select {
312 | vertical-align: top;
313 | height: 1.5rem;
314 | color: var(--body-fg);
315 | border: 1px solid var(--border-color);
316 | border-radius: 4px;
317 | font-size: 0.875rem;
318 | padding: 0 0 0 4px;
319 | margin: 0;
320 | margin-left: 10px;
321 | }
322 |
323 | #changelist .actions select:focus {
324 | border-color: var(--dracula-green-tame); /* dracula theme */
325 | outline: none; /* dracula theme */
326 | }
327 |
328 | #changelist .actions label {
329 | display: inline-block;
330 | vertical-align: middle;
331 | font-size: 0.8125rem;
332 | }
333 |
334 | #changelist .actions .button {
335 | font-size: 0.8125rem;
336 | border: 1px solid var(--border-color);
337 | border-radius: 4px;
338 | background: var(--body-bg);
339 | box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;
340 | cursor: pointer;
341 | height: 1.5rem;
342 | line-height: 1;
343 | padding: 4px 8px;
344 | margin: 0;
345 | color: var(--body-fg);
346 | }
347 |
348 | #changelist .actions .button:focus, #changelist .actions .button:hover {
349 | border-color: var(--body-quiet-color);
350 | }
351 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/css/dark_mode.css:
--------------------------------------------------------------------------------
1 | @media (prefers-color-scheme: dark) {
2 | :root {
3 | --primary: var(--dracula-comment-darker);
4 | --primary-fg: #f7f7f7;
5 |
6 | --body-fg: var(--dracula-foreground);
7 | --body-bg: var(--dracula-background);
8 | --body-quiet-color: #d0d0d0;
9 | --body-medium-color: #e0e0e0;
10 | --body-loud-color: #ffffff;
11 |
12 | --breadcrumbs-link-fg: #e0e0e0;
13 | --breadcrumbs-fg: var(--dracula-green);
14 |
15 | --link-fg: var(--dracula-cyan);
16 | --link-hover-color: #4ac1f7;
17 | --link-selected-fg: #6f94c6;
18 |
19 | --hairline-color: #272727;
20 | --border-color: #353535;
21 |
22 | --message-success-bg: var(--dracula-background-dark);
23 | --message-warning-bg: var(--dracula-background-dark);
24 | --message-error-bg: var(--dracula-background-dark);
25 |
26 | --darkened-bg: var(--dracula-background-light);
27 | --selected-bg: var(--dracula-comment-dark);
28 | --selected-row: var(--dracula-comment-dark);
29 |
30 | color-scheme: dark;
31 | }
32 | }
33 |
34 |
35 | html[data-theme="dark"] {
36 | --primary: var(--dracula-comment-darker);
37 | --primary-fg: #f7f7f7;
38 | --secondary: var(--dracula-comment);
39 |
40 | --body-fg: var(--dracula-foreground);
41 | --body-bg: var(--dracula-background);
42 | --body-quiet-color: #d0d0d0;
43 | --body-medium-color: #e0e0e0;
44 | --body-loud-color: #ffffff;
45 |
46 | --breadcrumbs-link-fg: #e0e0e0;
47 | --breadcrumbs-fg: var(--dracula-green);
48 |
49 | --link-fg: var(--dracula-cyan);
50 | --link-hover-color: #4ac1f7;
51 | --link-selected-fg: #6f94c6;
52 |
53 | --hairline-color: var(--dracula-current-line);
54 | --border-color: var(--dracula-selection);
55 |
56 | --message-success-bg: var(--dracula-background-dark);
57 | --message-warning-bg: var(--dracula-background-dark);
58 | --message-error-bg: var(--dracula-background-dark);
59 |
60 | --darkened-bg: var(--dracula-background-light);
61 | --selected-bg: var(--dracula-comment-dark);
62 | --selected-row: var(--dracula-comment-dark);
63 |
64 | color-scheme: dark;
65 | }
66 |
67 | /* dracula theme */
68 | html[data-theme="dark"] body {
69 | ::selection {
70 | background: var(--dracula-purple);
71 | }
72 | }
73 |
74 | /* THEME SWITCH */
75 | .theme-toggle {
76 | cursor: pointer;
77 | border: none;
78 | padding: 0;
79 | background: transparent;
80 | vertical-align: middle;
81 | margin-inline-start: 5px;
82 | margin-top: -1px;
83 | }
84 |
85 | .theme-toggle svg {
86 | vertical-align: middle;
87 | height: 1rem;
88 | width: 1rem;
89 | display: none;
90 | }
91 |
92 | /*
93 | Fully hide screen reader text so we only show the one matching the current
94 | theme.
95 | */
96 | .theme-toggle .visually-hidden {
97 | display: none;
98 | }
99 |
100 | html[data-theme="auto"] .theme-toggle .theme-label-when-auto {
101 | display: block;
102 | }
103 |
104 | html[data-theme="dark"] .theme-toggle .theme-label-when-dark {
105 | display: block;
106 | }
107 |
108 | html[data-theme="light"] .theme-toggle .theme-label-when-light {
109 | display: block;
110 | }
111 |
112 | /* ICONS */
113 | .theme-toggle svg.theme-icon-when-auto,
114 | .theme-toggle svg.theme-icon-when-dark,
115 | .theme-toggle svg.theme-icon-when-light {
116 | fill: var(--header-link-color);
117 | color: var(--header-bg);
118 | }
119 |
120 | html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto {
121 | display: block;
122 | }
123 |
124 | html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark {
125 | display: block;
126 | }
127 |
128 | html[data-theme="light"] .theme-toggle svg.theme-icon-when-light {
129 | display: block;
130 | }
131 |
132 | /* dracula theme */
133 | html[data-theme="dark"] #nav-filter:focus {
134 | border-color: var(--dracula-green);
135 | }
136 |
137 | /* dracula theme */
138 | html[data-theme="dark"] #nav-filter:focus-visible {
139 | outline: 1px solid var(--dracula-green);
140 | }
141 |
142 | /* dracula theme */
143 | html[data-theme="dark"] #changelist .actions select:focus {
144 | border-color: var(--dracula-green);
145 | }
146 |
147 | /* dracula theme */
148 | html[data-theme="dark"] input:not([type]):focus, html[data-theme="dark"] input[type=text]:focus,
149 | html[data-theme="dark"] input[type=password]:focus,
150 | html[data-theme="dark"] input[type=email]:focus, html[data-theme="dark"] input[type=url]:focus,
151 | html[data-theme="dark"] input[type=number]:focus,
152 | html[data-theme="dark"] input[type=tel]:focus, html[data-theme="dark"] textarea:focus,
153 | html[data-theme="dark"] select:focus, html[data-theme="dark"] .vTextField:focus {
154 | border-color: var(--dracula-green);
155 | outline: none;
156 | }
157 |
158 | /* dracula theme */
159 | html[data-theme="dark"] input:not([type]):focus-visible, html[data-theme="dark"] input[type=text]:focus-visible,
160 | html[data-theme="dark"] input[type=password]:focus-visible,
161 | html[data-theme="dark"] input[type=email]:focus-visible, html[data-theme="dark"] input[type=url]:focus-visible,
162 | html[data-theme="dark"] input[type=number]:focus-visible,
163 | html[data-theme="dark"] input[type=tel]:focus-visible, html[data-theme="dark"] input[type=search]:focus-visible,
164 | html[data-theme="dark"] textarea:focus-visible, html[data-theme="dark"] select:focus-visible,
165 | html[data-theme="dark"] .vTextField:focus-visible {
166 | outline: 1px solid var(--dracula-green);
167 | }
168 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/css/forms.css:
--------------------------------------------------------------------------------
1 | @import url('widgets.css');
2 |
3 | /* FORM ROWS */
4 |
5 | .form-row {
6 | overflow: hidden;
7 | padding: 10px;
8 | font-size: 0.8125rem;
9 | border-bottom: 1px solid var(--hairline-color);
10 | }
11 |
12 | .form-row img, .form-row input {
13 | vertical-align: middle;
14 | }
15 |
16 | .form-row label input[type="checkbox"] {
17 | margin-top: 0;
18 | vertical-align: 0;
19 | }
20 |
21 | form .form-row p {
22 | padding-left: 0;
23 | }
24 |
25 | .flex-container {
26 | display: flex;
27 | }
28 |
29 | .form-multiline {
30 | flex-wrap: wrap;
31 | }
32 |
33 | .form-multiline > div {
34 | padding-bottom: 10px;
35 | }
36 |
37 | /* FORM LABELS */
38 |
39 | label {
40 | font-weight: normal;
41 | color: var(--body-quiet-color);
42 | font-size: 0.8125rem;
43 | }
44 |
45 | .required label, label.required {
46 | font-weight: bold;
47 | }
48 |
49 | /* RADIO BUTTONS */
50 |
51 | form div.radiolist div {
52 | padding-right: 7px;
53 | }
54 |
55 | form div.radiolist.inline div {
56 | display: inline-block;
57 | }
58 |
59 | form div.radiolist label {
60 | width: auto;
61 | }
62 |
63 | form div.radiolist input[type="radio"] {
64 | margin: -2px 4px 0 0;
65 | padding: 0;
66 | }
67 |
68 | form ul.inline {
69 | margin-left: 0;
70 | padding: 0;
71 | }
72 |
73 | form ul.inline li {
74 | float: left;
75 | padding-right: 7px;
76 | }
77 |
78 | /* FIELDSETS */
79 |
80 | fieldset .fieldset-heading,
81 | fieldset .inline-heading,
82 | :not(.inline-related) .collapse summary {
83 | border: 1px solid var(--header-bg);
84 | margin: 0;
85 | padding: 8px;
86 | font-weight: 400;
87 | font-size: 0.8125rem;
88 | background: var(--header-bg);
89 | color: var(--header-link-color);
90 | }
91 |
92 | /* ALIGNED FIELDSETS */
93 |
94 | .aligned label {
95 | display: block;
96 | padding: 4px 10px 0 0;
97 | min-width: 160px;
98 | width: 160px;
99 | word-wrap: break-word;
100 | }
101 |
102 | .aligned label:not(.vCheckboxLabel):after {
103 | content: '';
104 | display: inline-block;
105 | vertical-align: middle;
106 | }
107 |
108 | .aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly {
109 | padding: 6px 0;
110 | margin-top: 0;
111 | margin-bottom: 0;
112 | margin-left: 0;
113 | overflow-wrap: break-word;
114 | }
115 |
116 | .aligned ul label {
117 | display: inline;
118 | float: none;
119 | width: auto;
120 | }
121 |
122 | .aligned .form-row input {
123 | margin-bottom: 0;
124 | }
125 |
126 | .colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField {
127 | width: 350px;
128 | }
129 |
130 | form .aligned ul {
131 | margin-left: 160px;
132 | padding-left: 10px;
133 | }
134 |
135 | form .aligned div.radiolist {
136 | display: inline-block;
137 | margin: 0;
138 | padding: 0;
139 | }
140 |
141 | form .aligned p.help,
142 | form .aligned div.help {
143 | margin-top: 0;
144 | margin-left: 160px;
145 | padding-left: 10px;
146 | }
147 |
148 | form .aligned p.date div.help.timezonewarning,
149 | form .aligned p.datetime div.help.timezonewarning,
150 | form .aligned p.time div.help.timezonewarning {
151 | margin-left: 0;
152 | padding-left: 0;
153 | font-weight: normal;
154 | }
155 |
156 | form .aligned p.help:last-child,
157 | form .aligned div.help:last-child {
158 | margin-bottom: 0;
159 | padding-bottom: 0;
160 | }
161 |
162 | form .aligned input + p.help,
163 | form .aligned textarea + p.help,
164 | form .aligned select + p.help,
165 | form .aligned input + div.help,
166 | form .aligned textarea + div.help,
167 | form .aligned select + div.help {
168 | margin-left: 160px;
169 | padding-left: 10px;
170 | }
171 |
172 | form .aligned ul li {
173 | list-style: none;
174 | }
175 |
176 | form .aligned table p {
177 | margin-left: 0;
178 | padding-left: 0;
179 | }
180 |
181 | .aligned .vCheckboxLabel {
182 | padding: 1px 0 0 5px;
183 | }
184 |
185 | .aligned .vCheckboxLabel + p.help,
186 | .aligned .vCheckboxLabel + div.help {
187 | margin-top: -4px;
188 | }
189 |
190 | .colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField {
191 | width: 610px;
192 | }
193 |
194 | fieldset .fieldBox {
195 | margin-right: 20px;
196 | }
197 |
198 | /* WIDE FIELDSETS */
199 |
200 | .wide label {
201 | width: 200px;
202 | }
203 |
204 | form .wide p.help,
205 | form .wide ul.errorlist,
206 | form .wide div.help {
207 | padding-left: 50px;
208 | }
209 |
210 | form div.help ul {
211 | padding-left: 0;
212 | margin-left: 0;
213 | }
214 |
215 | .colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField {
216 | width: 450px;
217 | }
218 |
219 | /* COLLAPSIBLE FIELDSETS */
220 |
221 | .collapse summary .fieldset-heading,
222 | .collapse summary .inline-heading {
223 | background: transparent;
224 | border: none;
225 | color: currentColor;
226 | display: inline;
227 | margin: 0;
228 | padding: 0;
229 | }
230 |
231 | /* MONOSPACE TEXTAREAS */
232 |
233 | fieldset.monospace textarea {
234 | font-family: var(--font-family-monospace);
235 | }
236 |
237 | /* SUBMIT ROW */
238 |
239 | .submit-row {
240 | padding: 12px 14px 12px;
241 | margin: 0 0 20px;
242 | background: var(--darkened-bg);
243 | border: 1px solid var(--hairline-color);
244 | border-radius: 4px;
245 | overflow: hidden;
246 | display: flex;
247 | gap: 10px;
248 | flex-wrap: wrap;
249 | }
250 |
251 | body.popup .submit-row {
252 | overflow: auto;
253 | }
254 |
255 | .submit-row input {
256 | height: 2.1875rem;
257 | line-height: 0.9375rem;
258 | }
259 |
260 | .submit-row input, .submit-row a {
261 | margin: 0;
262 | }
263 |
264 | .submit-row input.default {
265 | text-transform: uppercase;
266 | }
267 |
268 | .submit-row a.deletelink {
269 | margin-left: auto;
270 | }
271 |
272 | .submit-row a.deletelink {
273 | display: block;
274 | background: var(--delete-button-bg);
275 | border-radius: 4px;
276 | padding: 0.625rem 0.9375rem;
277 | height: 0.9375rem;
278 | line-height: 0.9375rem;
279 | color: var(--button-fg);
280 | }
281 |
282 | .submit-row a.closelink {
283 | display: inline-block;
284 | background: var(--close-button-bg);
285 | border-radius: 4px;
286 | padding: 10px 15px;
287 | height: 0.9375rem;
288 | line-height: 0.9375rem;
289 | color: var(--button-fg);
290 | }
291 |
292 | .submit-row a.deletelink:focus,
293 | .submit-row a.deletelink:hover,
294 | .submit-row a.deletelink:active {
295 | background: var(--delete-button-hover-bg);
296 | text-decoration: none;
297 | }
298 |
299 | .submit-row a.closelink:focus,
300 | .submit-row a.closelink:hover,
301 | .submit-row a.closelink:active {
302 | background: var(--close-button-hover-bg);
303 | text-decoration: none;
304 | }
305 |
306 | /* CUSTOM FORM FIELDS */
307 |
308 | .vSelectMultipleField {
309 | vertical-align: top;
310 | }
311 |
312 | .vCheckboxField {
313 | border: none;
314 | }
315 |
316 | .vDateField, .vTimeField {
317 | margin-right: 2px;
318 | margin-bottom: 4px;
319 | }
320 |
321 | .vDateField {
322 | min-width: 6.85em;
323 | }
324 |
325 | .vTimeField {
326 | min-width: 4.7em;
327 | }
328 |
329 | .vURLField {
330 | width: 30em;
331 | }
332 |
333 | .vLargeTextField, .vXMLLargeTextField {
334 | width: 48em;
335 | }
336 |
337 | .flatpages-flatpage #id_content {
338 | height: 40.2em;
339 | }
340 |
341 | .module table .vPositiveSmallIntegerField {
342 | width: 2.2em;
343 | }
344 |
345 | .vIntegerField {
346 | width: 5em;
347 | }
348 |
349 | .vBigIntegerField {
350 | width: 10em;
351 | }
352 |
353 | .vForeignKeyRawIdAdminField {
354 | width: 5em;
355 | }
356 |
357 | .vTextField, .vUUIDField {
358 | width: 20em;
359 | }
360 |
361 | /* INLINES */
362 |
363 | .inline-group {
364 | padding: 0;
365 | margin: 0 0 30px;
366 | }
367 |
368 | .inline-group thead th {
369 | padding: 8px 10px;
370 | }
371 |
372 | .inline-group .aligned label {
373 | width: 160px;
374 | }
375 |
376 | .inline-related {
377 | position: relative;
378 | }
379 |
380 | .inline-related h4,
381 | .inline-related:not(.tabular) .collapse summary {
382 | margin: 0;
383 | color: var(--body-medium-color);
384 | padding: 5px;
385 | font-size: 0.8125rem;
386 | background: var(--darkened-bg);
387 | border: 1px solid var(--hairline-color);
388 | border-left-color: var(--darkened-bg);
389 | border-right-color: var(--darkened-bg);
390 | }
391 |
392 | .inline-related h3 span.delete {
393 | float: right;
394 | }
395 |
396 | .inline-related h3 span.delete label {
397 | margin-left: 2px;
398 | font-size: 0.6875rem;
399 | }
400 |
401 | .inline-related fieldset {
402 | margin: 0;
403 | background: var(--body-bg);
404 | border: none;
405 | width: 100%;
406 | }
407 |
408 | .inline-group .tabular fieldset.module {
409 | border: none;
410 | }
411 |
412 | .inline-related.tabular fieldset.module table {
413 | width: 100%;
414 | overflow-x: scroll;
415 | }
416 |
417 | .last-related fieldset {
418 | border: none;
419 | }
420 |
421 | .inline-group .tabular tr.has_original td {
422 | padding-top: 2em;
423 | }
424 |
425 | .inline-group .tabular tr td.original {
426 | padding: 2px 0 0 0;
427 | width: 0;
428 | _position: relative;
429 | }
430 |
431 | .inline-group .tabular th.original {
432 | width: 0px;
433 | padding: 0;
434 | }
435 |
436 | .inline-group .tabular td.original p {
437 | position: absolute;
438 | left: 0;
439 | height: 1.1em;
440 | padding: 2px 9px;
441 | overflow: hidden;
442 | font-size: 0.5625rem;
443 | font-weight: bold;
444 | color: var(--body-quiet-color);
445 | _width: 700px;
446 | }
447 |
448 | .inline-group ul.tools {
449 | padding: 0;
450 | margin: 0;
451 | list-style: none;
452 | }
453 |
454 | .inline-group ul.tools li {
455 | display: inline;
456 | padding: 0 5px;
457 | }
458 |
459 | .inline-group div.add-row,
460 | .inline-group .tabular tr.add-row td {
461 | color: var(--body-quiet-color);
462 | background: var(--darkened-bg);
463 | padding: 8px 10px;
464 | border-bottom: 1px solid var(--hairline-color);
465 | }
466 |
467 | .inline-group .tabular tr.add-row td {
468 | padding: 8px 10px;
469 | border-bottom: 1px solid var(--hairline-color);
470 | }
471 |
472 | .inline-group ul.tools a.add,
473 | .inline-group div.add-row a,
474 | .inline-group .tabular tr.add-row td a {
475 | background: url(../img/icon-addlink.svg) 0 1px no-repeat;
476 | padding-left: 16px;
477 | font-size: 0.75rem;
478 | }
479 |
480 | .empty-form {
481 | display: none;
482 | }
483 |
484 | /* RELATED FIELD ADD ONE / LOOKUP */
485 |
486 | .related-lookup {
487 | margin-left: 5px;
488 | display: inline-block;
489 | vertical-align: middle;
490 | background-repeat: no-repeat;
491 | background-size: 14px;
492 | }
493 |
494 | .related-lookup {
495 | width: 1rem;
496 | height: 1rem;
497 | background-image: url(../img/search.svg);
498 | }
499 |
500 | form .related-widget-wrapper ul {
501 | display: inline-block;
502 | margin-left: 0;
503 | padding-left: 0;
504 | }
505 |
506 | .clearable-file-input input {
507 | margin-top: 0;
508 | }
509 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/css/login.css:
--------------------------------------------------------------------------------
1 | /* LOGIN FORM */
2 |
3 | .login {
4 | background: var(--darkened-bg);
5 | height: auto;
6 | }
7 |
8 | .login #header {
9 | height: auto;
10 | padding: 15px 16px;
11 | justify-content: center;
12 | }
13 |
14 | .login #header h1 {
15 | font-size: 1.125rem;
16 | margin: 0;
17 | }
18 |
19 | .login #header h1 a {
20 | color: var(--header-link-color);
21 | }
22 |
23 | .login #content {
24 | padding: 20px;
25 | }
26 |
27 | .login #container {
28 | background: var(--body-bg);
29 | border: 1px solid var(--hairline-color);
30 | border-radius: 4px;
31 | overflow: hidden;
32 | width: 28em;
33 | min-width: 300px;
34 | margin: 100px auto;
35 | height: auto;
36 | }
37 |
38 | .login .form-row {
39 | padding: 4px 0;
40 | }
41 |
42 | .login .form-row label {
43 | display: block;
44 | line-height: 2em;
45 | }
46 |
47 | .login .form-row #id_username, .login .form-row #id_password {
48 | padding: 8px;
49 | width: 100%;
50 | box-sizing: border-box;
51 | }
52 |
53 | .login .submit-row {
54 | padding: 1em 0 0 0;
55 | margin: 0;
56 | text-align: center;
57 | }
58 |
59 | .login .password-reset-link {
60 | text-align: center;
61 | }
62 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/css/nav_sidebar.css:
--------------------------------------------------------------------------------
1 | .sticky {
2 | position: sticky;
3 | top: 0;
4 | max-height: 100vh;
5 | }
6 |
7 | .toggle-nav-sidebar {
8 | z-index: 20;
9 | left: 0;
10 | display: flex;
11 | align-items: center;
12 | justify-content: center;
13 | flex: 0 0 23px;
14 | width: 23px;
15 | border: 0;
16 | border-right: 1px solid var(--hairline-color);
17 | background-color: var(--body-bg);
18 | cursor: pointer;
19 | font-size: 1.25rem;
20 | color: var(--link-fg);
21 | padding: 0;
22 | }
23 |
24 | [dir="rtl"] .toggle-nav-sidebar {
25 | border-left: 1px solid var(--hairline-color);
26 | border-right: 0;
27 | }
28 |
29 | .toggle-nav-sidebar:hover,
30 | .toggle-nav-sidebar:focus {
31 | background-color: var(--darkened-bg);
32 | }
33 |
34 | #nav-sidebar {
35 | z-index: 15;
36 | flex: 0 0 275px;
37 | left: -276px;
38 | margin-left: -276px;
39 | border-top: 1px solid transparent;
40 | border-right: 1px solid var(--hairline-color);
41 | background-color: var(--body-bg);
42 | overflow: auto;
43 | }
44 |
45 | [dir="rtl"] #nav-sidebar {
46 | border-left: 1px solid var(--hairline-color);
47 | border-right: 0;
48 | left: 0;
49 | margin-left: 0;
50 | right: -276px;
51 | margin-right: -276px;
52 | }
53 |
54 | .toggle-nav-sidebar::before {
55 | content: '\00BB';
56 | }
57 |
58 | .main.shifted .toggle-nav-sidebar::before {
59 | content: '\00AB';
60 | }
61 |
62 | .main > #nav-sidebar {
63 | visibility: hidden;
64 | }
65 |
66 | .main.shifted > #nav-sidebar {
67 | margin-left: 0;
68 | visibility: visible;
69 | }
70 |
71 | [dir="rtl"] .main.shifted > #nav-sidebar {
72 | margin-right: 0;
73 | }
74 |
75 | #nav-sidebar .module th {
76 | width: 100%;
77 | overflow-wrap: anywhere;
78 | }
79 |
80 | #nav-sidebar .module th,
81 | #nav-sidebar .module caption {
82 | padding-left: 16px;
83 | }
84 |
85 | #nav-sidebar .module td {
86 | white-space: nowrap;
87 | }
88 |
89 | [dir="rtl"] #nav-sidebar .module th,
90 | [dir="rtl"] #nav-sidebar .module caption {
91 | padding-left: 8px;
92 | padding-right: 16px;
93 | }
94 |
95 | #nav-sidebar .current-app .section:link,
96 | #nav-sidebar .current-app .section:visited {
97 | color: var(--header-color);
98 | font-weight: bold;
99 | }
100 |
101 | #nav-sidebar .current-model {
102 | background: var(--selected-row);
103 | }
104 |
105 | @media (forced-colors: active) {
106 | #nav-sidebar .current-model {
107 | background-color: SelectedItem;
108 | }
109 | }
110 |
111 | .main > #nav-sidebar + .content {
112 | max-width: calc(100% - 23px);
113 | }
114 |
115 | .main.shifted > #nav-sidebar + .content {
116 | max-width: calc(100% - 299px);
117 | }
118 |
119 | @media (max-width: 767px) {
120 | #nav-sidebar, #toggle-nav-sidebar {
121 | display: none;
122 | }
123 |
124 | .main > #nav-sidebar + .content,
125 | .main.shifted > #nav-sidebar + .content {
126 | max-width: 100%;
127 | }
128 | }
129 |
130 | #nav-filter {
131 | width: 100%;
132 | box-sizing: border-box;
133 | padding: 2px 5px;
134 | margin: 5px 0;
135 | border: 1px solid var(--border-color);
136 | background-color: var(--darkened-bg);
137 | color: var(--body-fg);
138 | }
139 |
140 | #nav-filter:focus {
141 | border-color: var(--dracula-green-tame); /* dracula theme */
142 | outline: none; /* dracula theme */
143 | }
144 |
145 | /* dracula theme */
146 | #nav-filter:focus-visible {
147 | outline: 1px solid var(--dracula-green-tame);
148 | }
149 |
150 | #nav-filter.no-results {
151 | background: var(--message-error-bg);
152 | }
153 |
154 | #nav-sidebar table {
155 | width: 100%;
156 | }
157 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/css/widgets.css:
--------------------------------------------------------------------------------
1 | /* SELECTOR (FILTER INTERFACE) */
2 |
3 | .selector {
4 | display: flex;
5 | flex-grow: 1;
6 | gap: 0 10px;
7 | }
8 |
9 | .selector select {
10 | height: 17.2em;
11 | flex: 1 0 auto;
12 | overflow: scroll;
13 | width: 100%;
14 | }
15 |
16 | .selector-available, .selector-chosen {
17 | text-align: center;
18 | display: flex;
19 | flex-direction: column;
20 | flex: 1 1;
21 | }
22 |
23 | .selector-available h2, .selector-chosen h2 {
24 | border: 1px solid var(--border-color);
25 | border-radius: 4px 4px 0 0;
26 | }
27 |
28 | .selector-chosen .list-footer-display {
29 | border: 1px solid var(--border-color);
30 | border-top: none;
31 | border-radius: 0 0 4px 4px;
32 | margin: 0 0 10px;
33 | padding: 8px;
34 | text-align: center;
35 | background: var(--dracula-comment); /* dracula theme */
36 | color: var(--header-link-color);
37 | cursor: pointer;
38 | }
39 | .selector-chosen .list-footer-display__clear {
40 | color: var(--breadcrumbs-fg);
41 | }
42 |
43 | .selector-chosen h2 {
44 | background: var(--secondary);
45 | color: var(--header-link-color);
46 | }
47 |
48 | .selector .selector-available h2 {
49 | background: var(--darkened-bg);
50 | color: var(--body-quiet-color);
51 | }
52 |
53 | .selector .selector-filter {
54 | border: 1px solid var(--border-color);
55 | border-width: 0 1px;
56 | padding: 8px;
57 | color: var(--body-quiet-color);
58 | font-size: 0.625rem;
59 | margin: 0;
60 | text-align: left;
61 | display: flex;
62 | }
63 |
64 | .selector .selector-filter label,
65 | .inline-group .aligned .selector .selector-filter label {
66 | float: left;
67 | margin: 7px 0 0;
68 | width: 18px;
69 | height: 18px;
70 | padding: 0;
71 | overflow: hidden;
72 | line-height: 1;
73 | min-width: auto;
74 | }
75 |
76 | .selector-filter input {
77 | flex-grow: 1;
78 | }
79 |
80 | .selector .selector-available input,
81 | .selector .selector-chosen input {
82 | margin-left: 8px;
83 | }
84 |
85 | .selector ul.selector-chooser {
86 | align-self: center;
87 | width: 22px;
88 | background-color: var(--selected-bg);
89 | border-radius: 10px;
90 | margin: 0;
91 | padding: 0;
92 | transform: translateY(-17px);
93 | }
94 |
95 | .selector-chooser li {
96 | margin: 0;
97 | padding: 3px;
98 | list-style-type: none;
99 | }
100 |
101 | .selector select {
102 | padding: 0 10px;
103 | margin: 0 0 10px;
104 | border-radius: 0 0 4px 4px;
105 | }
106 | .selector .selector-chosen--with-filtered select {
107 | margin: 0;
108 | border-radius: 0;
109 | height: 14em;
110 | }
111 |
112 | .selector .selector-chosen:not(.selector-chosen--with-filtered) .list-footer-display {
113 | display: none;
114 | }
115 |
116 | .selector-add, .selector-remove {
117 | width: 16px;
118 | height: 16px;
119 | display: block;
120 | text-indent: -3000px;
121 | overflow: hidden;
122 | cursor: default;
123 | opacity: 0.55;
124 | }
125 |
126 | .active.selector-add, .active.selector-remove {
127 | opacity: 1;
128 | }
129 |
130 | .active.selector-add:hover, .active.selector-remove:hover {
131 | cursor: pointer;
132 | }
133 |
134 | .selector-add {
135 | background: url(../img/selector-icons.svg) 0 -96px no-repeat;
136 | }
137 |
138 | .active.selector-add:focus, .active.selector-add:hover {
139 | background-position: 0 -112px;
140 | }
141 |
142 | .selector-remove {
143 | background: url(../img/selector-icons.svg) 0 -64px no-repeat;
144 | }
145 |
146 | .active.selector-remove:focus, .active.selector-remove:hover {
147 | background-position: 0 -80px;
148 | }
149 |
150 | a.selector-chooseall, a.selector-clearall {
151 | display: inline-block;
152 | height: 16px;
153 | text-align: left;
154 | margin: 0 auto;
155 | overflow: hidden;
156 | font-weight: bold;
157 | line-height: 16px;
158 | color: var(--body-quiet-color);
159 | text-decoration: none;
160 | opacity: 0.55;
161 | }
162 |
163 | a.active.selector-chooseall:focus, a.active.selector-clearall:focus,
164 | a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
165 | color: var(--link-fg);
166 | }
167 |
168 | a.active.selector-chooseall, a.active.selector-clearall {
169 | opacity: 1;
170 | }
171 |
172 | a.active.selector-chooseall:hover, a.active.selector-clearall:hover {
173 | cursor: pointer;
174 | }
175 |
176 | a.selector-chooseall {
177 | padding: 0 18px 0 0;
178 | background: url(../img/selector-icons.svg) right -160px no-repeat;
179 | cursor: default;
180 | }
181 |
182 | a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
183 | background-position: 100% -176px;
184 | }
185 |
186 | a.selector-clearall {
187 | padding: 0 0 0 18px;
188 | background: url(../img/selector-icons.svg) 0 -128px no-repeat;
189 | cursor: default;
190 | }
191 |
192 | a.active.selector-clearall:focus, a.active.selector-clearall:hover {
193 | background-position: 0 -144px;
194 | }
195 |
196 | /* STACKED SELECTORS */
197 |
198 | .stacked {
199 | float: left;
200 | width: 490px;
201 | display: block;
202 | }
203 |
204 | .stacked select {
205 | width: 480px;
206 | height: 10.1em;
207 | }
208 |
209 | .stacked .selector-available, .stacked .selector-chosen {
210 | width: 480px;
211 | }
212 |
213 | .stacked .selector-available {
214 | margin-bottom: 0;
215 | }
216 |
217 | .stacked .selector-available input {
218 | width: 422px;
219 | }
220 |
221 | .stacked ul.selector-chooser {
222 | height: 22px;
223 | width: 50px;
224 | margin: 0 0 10px 40%;
225 | background-color: #eee;
226 | border-radius: 10px;
227 | transform: none;
228 | }
229 |
230 | .stacked .selector-chooser li {
231 | float: left;
232 | padding: 3px 3px 3px 5px;
233 | }
234 |
235 | .stacked .selector-chooseall, .stacked .selector-clearall {
236 | display: none;
237 | }
238 |
239 | .stacked .selector-add {
240 | background: url(../img/selector-icons.svg) 0 -32px no-repeat;
241 | cursor: default;
242 | }
243 |
244 | .stacked .active.selector-add {
245 | background-position: 0 -32px;
246 | cursor: pointer;
247 | }
248 |
249 | .stacked .active.selector-add:focus, .stacked .active.selector-add:hover {
250 | background-position: 0 -48px;
251 | cursor: pointer;
252 | }
253 |
254 | .stacked .selector-remove {
255 | background: url(../img/selector-icons.svg) 0 0 no-repeat;
256 | cursor: default;
257 | }
258 |
259 | .stacked .active.selector-remove {
260 | background-position: 0 0px;
261 | cursor: pointer;
262 | }
263 |
264 | .stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover {
265 | background-position: 0 -16px;
266 | cursor: pointer;
267 | }
268 |
269 | .selector .help-icon {
270 | background: url(../img/icon-unknown.svg) 0 0 no-repeat;
271 | display: inline-block;
272 | vertical-align: middle;
273 | margin: -2px 0 0 2px;
274 | width: 13px;
275 | height: 13px;
276 | }
277 |
278 | .selector .selector-chosen .help-icon {
279 | background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat;
280 | }
281 |
282 | .selector .search-label-icon {
283 | background: url(../img/search.svg) 0 0 no-repeat;
284 | display: inline-block;
285 | height: 1.125rem;
286 | width: 1.125rem;
287 | }
288 |
289 | /* DATE AND TIME */
290 |
291 | p.datetime {
292 | line-height: 20px;
293 | margin: 0;
294 | padding: 0;
295 | color: var(--body-quiet-color);
296 | font-weight: bold;
297 | }
298 |
299 | .datetime span {
300 | white-space: nowrap;
301 | font-weight: normal;
302 | font-size: 0.6875rem;
303 | color: var(--body-quiet-color);
304 | }
305 |
306 | .datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField {
307 | margin-left: 5px;
308 | margin-bottom: 4px;
309 | }
310 |
311 | table p.datetime {
312 | font-size: 0.6875rem;
313 | margin-left: 0;
314 | padding-left: 0;
315 | }
316 |
317 | .datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon {
318 | position: relative;
319 | display: inline-block;
320 | vertical-align: middle;
321 | height: 16px;
322 | width: 16px;
323 | overflow: hidden;
324 | }
325 |
326 | .datetimeshortcuts .clock-icon {
327 | background: url(../img/icon-clock.svg) 0 0 no-repeat;
328 | }
329 |
330 | .datetimeshortcuts a:focus .clock-icon,
331 | .datetimeshortcuts a:hover .clock-icon {
332 | background-position: 0 -16px;
333 | }
334 |
335 | .datetimeshortcuts .date-icon {
336 | background: url(../img/icon-calendar.svg) 0 0 no-repeat;
337 | top: -1px;
338 | }
339 |
340 | .datetimeshortcuts a:focus .date-icon,
341 | .datetimeshortcuts a:hover .date-icon {
342 | background-position: 0 -16px;
343 | }
344 |
345 | .timezonewarning {
346 | font-size: 0.6875rem;
347 | color: var(--body-quiet-color);
348 | }
349 |
350 | /* URL */
351 |
352 | p.url {
353 | line-height: 20px;
354 | margin: 0;
355 | padding: 0;
356 | color: var(--body-quiet-color);
357 | font-size: 0.6875rem;
358 | font-weight: bold;
359 | }
360 |
361 | .url a {
362 | font-weight: normal;
363 | }
364 |
365 | /* FILE UPLOADS */
366 |
367 | p.file-upload {
368 | line-height: 20px;
369 | margin: 0;
370 | padding: 0;
371 | color: var(--body-quiet-color);
372 | font-size: 0.6875rem;
373 | font-weight: bold;
374 | }
375 |
376 | .file-upload a {
377 | font-weight: normal;
378 | }
379 |
380 | .file-upload .deletelink {
381 | margin-left: 5px;
382 | }
383 |
384 | span.clearable-file-input label {
385 | color: var(--body-fg);
386 | font-size: 0.6875rem;
387 | display: inline;
388 | float: none;
389 | }
390 |
391 | /* CALENDARS & CLOCKS */
392 |
393 | .calendarbox, .clockbox {
394 | margin: 5px auto;
395 | font-size: 0.75rem;
396 | width: 19em;
397 | text-align: center;
398 | background: var(--body-bg);
399 | color: var(--body-fg);
400 | border: 1px solid var(--hairline-color);
401 | border-radius: 4px;
402 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
403 | overflow: hidden;
404 | position: relative;
405 | }
406 |
407 | .clockbox {
408 | width: auto;
409 | }
410 |
411 | .calendar {
412 | margin: 0;
413 | padding: 0;
414 | }
415 |
416 | .calendar table {
417 | margin: 0;
418 | padding: 0;
419 | border-collapse: collapse;
420 | background: white;
421 | width: 100%;
422 | }
423 |
424 | .calendar caption, .calendarbox h2 {
425 | margin: 0;
426 | text-align: center;
427 | border-top: none;
428 | font-weight: 700;
429 | font-size: 0.75rem;
430 | color: #333;
431 | background: var(--dracula-yellow-light); /* dracula theme */
432 | }
433 |
434 | .calendar th {
435 | padding: 8px 5px;
436 | background: var(--darkened-bg);
437 | border-bottom: 1px solid var(--border-color);
438 | font-weight: 400;
439 | font-size: 0.75rem;
440 | text-align: center;
441 | color: var(--body-quiet-color);
442 | }
443 |
444 | .calendar td {
445 | font-weight: 400;
446 | font-size: 0.75rem;
447 | text-align: center;
448 | padding: 0;
449 | border-top: 1px solid var(--hairline-color);
450 | border-bottom: none;
451 | }
452 |
453 | .calendar td.selected a {
454 | background: var(--secondary);
455 | color: var(--button-fg);
456 | }
457 |
458 | .calendar td.nonday {
459 | background: var(--darkened-bg);
460 | }
461 |
462 | .calendar td.today a {
463 | font-weight: 700;
464 | }
465 |
466 | .calendar td a, .timelist a {
467 | display: block;
468 | font-weight: 400;
469 | padding: 6px;
470 | text-decoration: none;
471 | color: var(--body-quiet-color);
472 | }
473 |
474 | .calendar td a:focus, .timelist a:focus,
475 | .calendar td a:hover, .timelist a:hover {
476 | background: var(--primary);
477 | color: white;
478 | }
479 |
480 | .calendar td a:active, .timelist a:active {
481 | background: var(--header-bg);
482 | color: white;
483 | }
484 |
485 | .calendarnav {
486 | font-size: 0.625rem;
487 | text-align: center;
488 | color: #ccc;
489 | margin: 0;
490 | padding: 1px 3px;
491 | }
492 |
493 | .calendarnav a:link, #calendarnav a:visited,
494 | #calendarnav a:focus, #calendarnav a:hover {
495 | color: var(--body-quiet-color);
496 | }
497 |
498 | .calendar-shortcuts {
499 | background: var(--body-bg);
500 | color: var(--body-quiet-color);
501 | font-size: 0.6875rem;
502 | line-height: 0.6875rem;
503 | border-top: 1px solid var(--hairline-color);
504 | padding: 8px 0;
505 | }
506 |
507 | .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {
508 | display: block;
509 | position: absolute;
510 | top: 8px;
511 | width: 15px;
512 | height: 15px;
513 | text-indent: -9999px;
514 | padding: 0;
515 | }
516 |
517 | .calendarnav-previous {
518 | left: 10px;
519 | background: url(../img/calendar-icons.svg) 0 0 no-repeat;
520 | }
521 |
522 | .calendarnav-next {
523 | right: 10px;
524 | background: url(../img/calendar-icons.svg) 0 -15px no-repeat;
525 | }
526 |
527 | .calendar-cancel {
528 | margin: 0;
529 | padding: 4px 0;
530 | font-size: 0.75rem;
531 | background: var(--close-button-bg);
532 | border-top: 1px solid var(--border-color);
533 | color: var(--button-fg);
534 | }
535 |
536 | .calendar-cancel:focus, .calendar-cancel:hover {
537 | background: var(--close-button-hover-bg);
538 | }
539 |
540 | .calendar-cancel a {
541 | color: var(--button-fg);
542 | display: block;
543 | }
544 |
545 | ul.timelist, .timelist li {
546 | list-style-type: none;
547 | margin: 0;
548 | padding: 0;
549 | }
550 |
551 | .timelist a {
552 | padding: 2px;
553 | }
554 |
555 | /* EDIT INLINE */
556 |
557 | .inline-deletelink {
558 | float: right;
559 | text-indent: -9999px;
560 | background: url(../img/inline-delete.svg) 0 0 no-repeat;
561 | width: 16px;
562 | height: 16px;
563 | border: 0px none;
564 | }
565 |
566 | .inline-deletelink:focus, .inline-deletelink:hover {
567 | cursor: pointer;
568 | }
569 |
570 | /* RELATED WIDGET WRAPPER */
571 | .related-widget-wrapper {
572 | display: flex;
573 | gap: 0 10px;
574 | flex-grow: 1;
575 | flex-wrap: wrap;
576 | margin-bottom: 5px;
577 | }
578 |
579 | .related-widget-wrapper-link {
580 | opacity: .6;
581 | filter: grayscale(1);
582 | }
583 |
584 | .related-widget-wrapper-link:link {
585 | opacity: 1;
586 | filter: grayscale(0);
587 | }
588 |
589 | /* GIS MAPS */
590 | .dj_map {
591 | width: 600px;
592 | height: 400px;
593 | }
594 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/calendar-icons.svg:
--------------------------------------------------------------------------------
1 |
2 |
64 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/icon-addlink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/icon-calendar.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/icon-changelink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/icon-clock.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/icon-hidelink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/icon-no.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/icon-unknown.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/icon-viewlink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/icon-yes.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/search.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/django_admin_dracula/static/admin/img/selector-icons.svg:
--------------------------------------------------------------------------------
1 |
35 |
--------------------------------------------------------------------------------
/django_admin_dracula/templates/admin/base.html:
--------------------------------------------------------------------------------
1 | {% load i18n static %}
2 | {% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %}
3 |
4 |
5 | {% block title %}{% endblock %}
6 |
7 | {% block dark-mode-vars %}
8 |
9 |
10 | {% endblock %}
11 | {% if not is_popup and is_nav_sidebar_enabled %}
12 |
13 |
14 | {% endif %}
15 | {% block extrastyle %}{% endblock %}
16 | {% if LANGUAGE_BIDI %}{% endif %}
17 | {% block extrahead %}{% endblock %}
18 | {% block responsive %}
19 |
20 |
21 | {% if LANGUAGE_BIDI %}{% endif %}
22 | {% endblock %}
23 | {% block blockbots %}{% endblock %}
24 |
25 |
26 |
28 | {% translate 'Skip to main content' %}
29 |
30 |
31 |
32 | {% if not is_popup %}
33 |
34 | {% block header %}
35 |
70 | {% endblock %}
71 |
72 | {% block nav-breadcrumbs %}
73 |
81 | {% endblock %}
82 | {% endif %}
83 |
84 |
85 | {% if not is_popup and is_nav_sidebar_enabled %}
86 | {% block nav-sidebar %}
87 | {% include "admin/nav_sidebar.html" %}
88 | {% endblock %}
89 | {% endif %}
90 |
91 | {% block messages %}
92 | {% if messages %}
93 | {% for message in messages %}
94 | - {{ message|capfirst }}
95 | {% endfor %}
96 | {% endif %}
97 | {% endblock messages %}
98 |
99 |
100 | {% block pretitle %}{% endblock %}
101 | {% block content_title %}{% if title %}
{{ title }}
{% endif %}{% endblock %}
102 | {% block content_subtitle %}{% if subtitle %}{{ subtitle }}
{% endif %}{% endblock %}
103 | {% block content %}
104 | {% block object-tools %}{% endblock %}
105 | {{ content }}
106 | {% endblock %}
107 | {% block sidebar %}{% endblock %}
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
123 |
124 |
125 |
126 |
--------------------------------------------------------------------------------
/django_admin_dracula/templates/admin/base_site.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/base.html" %}
2 |
3 | {% block title %}{% if subtitle %}{{ subtitle }} | {% endif %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
4 |
5 | {% block branding %}
6 |
7 | {% if user.is_anonymous %}
8 | {% include "admin/color_theme_toggle.html" %}
9 | {% endif %}
10 | {% endblock %}
11 |
12 | {% block nav-global %}{% endblock %}
13 |
--------------------------------------------------------------------------------
/django_admin_dracula/templates/admin/change_form.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/base_site.html" %}
2 | {% load i18n admin_urls static admin_modify %}
3 |
4 | {% block extrahead %}{{ block.super }}
5 |
6 | {{ media }}
7 | {% endblock %}
8 |
9 | {% block extrastyle %}{{ block.super }}{% endblock %}
10 |
11 | {% block coltype %}colM{% endblock %}
12 |
13 | {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form{% endblock %}
14 |
15 | {% if not is_popup %}
16 | {% block breadcrumbs %}
17 |
23 | {% endblock %}
24 | {% endif %}
25 |
26 | {% block content %}
27 | {% block object-tools %}
28 | {% if change and not is_popup %}
29 |
34 | {% endif %}
35 | {% endblock %}
36 |
81 | {% endblock %}
82 |
--------------------------------------------------------------------------------
/django_admin_dracula/templates/admin/change_list.html:
--------------------------------------------------------------------------------
1 | {% extends "admin/base_site.html" %}
2 | {% load i18n admin_urls static admin_list %}
3 |
4 | {% block extrastyle %}
5 | {{ block.super }}
6 |
7 | {% if cl.formset %}
8 |
9 | {% endif %}
10 | {% if cl.formset or action_form %}
11 |
12 | {% endif %}
13 | {{ media.css }}
14 | {% if not actions_on_top and not actions_on_bottom %}
15 |
18 | {% endif %}
19 | {% endblock %}
20 |
21 | {% block extrahead %}
22 | {{ block.super }}
23 | {{ media.js }}
24 |
25 | {% endblock %}
26 |
27 | {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list{% endblock %}
28 |
29 | {% if not is_popup %}
30 | {% block breadcrumbs %}
31 |
36 | {% endblock %}
37 | {% endif %}
38 |
39 | {% block coltype %}{% endblock %}
40 |
41 | {% block content %}
42 |
43 | {% block object-tools %}
44 |
49 | {% endblock %}
50 | {% if cl.formset and cl.formset.errors %}
51 |
52 | {% blocktranslate count counter=cl.formset.total_error_count %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %}
53 |
54 | {{ cl.formset.non_form_errors }}
55 | {% endif %}
56 |
57 |
74 | {% block filters %}
75 | {% if cl.has_filters %}
76 |
89 | {% endif %}
90 | {% endblock %}
91 |
92 |
93 | {% endblock %}
94 |
--------------------------------------------------------------------------------
/django_admin_dracula/templates/admin/color_theme_toggle.html:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 |
16 |
--------------------------------------------------------------------------------
/justfile:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env just --justfile
2 | set dotenv-load
3 |
4 | test:
5 | uv run python manage.py test --settings=tests.example.settings
6 |
7 | lint:
8 | uvx ruff check
9 |
10 | format:
11 | uvx ruff format
12 |
13 | test_publish:
14 | uv publish --publish-url https://test.pypi.org/legacy/ --token $TEST_PYPI_TOKEN
15 |
16 | publish:
17 | uv publish --token $PYPI_TOKEN
18 |
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | """Django's command-line utility for administrative tasks."""
3 |
4 | import os
5 | import sys
6 |
7 |
8 | def main():
9 | """Run administrative tasks."""
10 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_admin_dracula.settings")
11 | try:
12 | from django.core.management import execute_from_command_line
13 | except ImportError as exc:
14 | raise ImportError(
15 | "Couldn't import Django. Are you sure it's installed and "
16 | "available on your PYTHONPATH environment variable? Did you "
17 | "forget to activate a virtual environment?"
18 | ) from exc
19 | execute_from_command_line(sys.argv)
20 |
21 |
22 | if __name__ == "__main__":
23 | main()
24 |
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [build-system]
2 | requires = ["hatchling"]
3 | build-backend = "hatchling.build"
4 |
5 | [project]
6 | name = "django-admin-dracula"
7 | version = "0.0.3"
8 | description = "Dracula theme for the Django admin"
9 | authors = [
10 | {name="Sangeeta Jadoonanan", email="sjbitcode@gmail.com"}
11 | ]
12 | readme = "README.md"
13 | license = "MIT"
14 | keywords = [
15 | "django",
16 | "django admin",
17 | "dracula",
18 | "dracula theme",
19 | "python"
20 | ]
21 | classifiers = [
22 | "License :: OSI Approved :: MIT License",
23 | "Environment :: Web Environment",
24 | "Intended Audience :: Developers",
25 | "Programming Language :: Python :: 3",
26 | "Programming Language :: Python :: 3.9",
27 | "Programming Language :: Python :: 3.10",
28 | "Programming Language :: Python :: 3.11",
29 | "Programming Language :: Python :: 3.12",
30 | "Programming Language :: Python :: 3.13",
31 | "Framework :: Django",
32 | "Framework :: Django :: 4.2",
33 | "Framework :: Django :: 5.0",
34 | "Framework :: Django :: 5.1",
35 | ]
36 | requires-python = ">=3.9"
37 | dependencies = [
38 | "django>=4.2",
39 | ]
40 |
41 | [project.urls]
42 | Homepage = "https://github.com/sjbitcode/django-admin-dracula"
43 | Repository = "https://github.com/sjbitcode/django-admin-dracula"
44 | Issues = "https://github.com/sjbitcode/django-admin-dracula/issues"
45 |
46 | [tool.uv]
47 | dev-dependencies = [
48 | "coverage>=7.6.4",
49 | ]
50 |
--------------------------------------------------------------------------------
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sjbitcode/django-admin-dracula/7f0ee71316cf3012c2b2cf2e7b446a7a0d8d19e2/screenshot.png
--------------------------------------------------------------------------------
/screenshots/dark-homepage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sjbitcode/django-admin-dracula/7f0ee71316cf3012c2b2cf2e7b446a7a0d8d19e2/screenshots/dark-homepage.png
--------------------------------------------------------------------------------
/screenshots/dark-userspage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sjbitcode/django-admin-dracula/7f0ee71316cf3012c2b2cf2e7b446a7a0d8d19e2/screenshots/dark-userspage.png
--------------------------------------------------------------------------------
/screenshots/light-homepage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sjbitcode/django-admin-dracula/7f0ee71316cf3012c2b2cf2e7b446a7a0d8d19e2/screenshots/light-homepage.png
--------------------------------------------------------------------------------
/screenshots/light-userspage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sjbitcode/django-admin-dracula/7f0ee71316cf3012c2b2cf2e7b446a7a0d8d19e2/screenshots/light-userspage.png
--------------------------------------------------------------------------------
/tests/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sjbitcode/django-admin-dracula/7f0ee71316cf3012c2b2cf2e7b446a7a0d8d19e2/tests/__init__.py
--------------------------------------------------------------------------------
/tests/example/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sjbitcode/django-admin-dracula/7f0ee71316cf3012c2b2cf2e7b446a7a0d8d19e2/tests/example/__init__.py
--------------------------------------------------------------------------------
/tests/example/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class TestAppConfig(AppConfig):
5 | default_auto_field = "django.db.models.BigAutoField"
6 | name = "tests"
7 |
--------------------------------------------------------------------------------
/tests/example/settings.py:
--------------------------------------------------------------------------------
1 | from pathlib import Path
2 |
3 | BASE_DIR = Path(__file__).resolve().parent.parent.parent
4 |
5 | SECRET_KEY = "super-secret-key"
6 |
7 | DEBUG = True
8 |
9 | ALLOWED_HOSTS = []
10 |
11 | INSTALLED_APPS = [
12 | "django_admin_dracula",
13 | "django.contrib.admin",
14 | "django.contrib.auth",
15 | "django.contrib.contenttypes",
16 | "django.contrib.sessions",
17 | "django.contrib.messages",
18 | "django.contrib.staticfiles",
19 | # internal apps
20 | "tests.example.apps.TestAppConfig",
21 | ]
22 |
23 | MIDDLEWARE = [
24 | "django.middleware.security.SecurityMiddleware",
25 | "django.contrib.sessions.middleware.SessionMiddleware",
26 | "django.middleware.common.CommonMiddleware",
27 | "django.middleware.csrf.CsrfViewMiddleware",
28 | "django.contrib.auth.middleware.AuthenticationMiddleware",
29 | "django.contrib.messages.middleware.MessageMiddleware",
30 | "django.middleware.clickjacking.XFrameOptionsMiddleware",
31 | ]
32 |
33 | ROOT_URLCONF = "tests.example.urls"
34 |
35 | TEMPLATES = [
36 | {
37 | "BACKEND": "django.template.backends.django.DjangoTemplates",
38 | "DIRS": [BASE_DIR / "tests" / "templates"],
39 | "APP_DIRS": True,
40 | "OPTIONS": {
41 | "context_processors": [
42 | "django.template.context_processors.debug",
43 | "django.template.context_processors.request",
44 | "django.contrib.auth.context_processors.auth",
45 | "django.contrib.messages.context_processors.messages",
46 | ],
47 | },
48 | },
49 | ]
50 |
51 | WSGI_APPLICATION = "project.wsgi.application"
52 |
53 | DATABASES = {
54 | "default": {
55 | "ENGINE": "django.db.backends.sqlite3",
56 | "NAME": BASE_DIR / "tests" / "db.sqlite3",
57 | }
58 | }
59 |
60 | AUTH_PASSWORD_VALIDATORS = [
61 | {
62 | "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
63 | },
64 | {
65 | "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
66 | },
67 | {
68 | "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
69 | },
70 | {
71 | "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
72 | },
73 | ]
74 |
75 | LANGUAGE_CODE = "en-us"
76 |
77 | TIME_ZONE = "UTC"
78 |
79 | USE_I18N = True
80 |
81 | USE_L10N = True
82 |
83 | USE_TZ = True
84 |
85 | STATIC_URL = "/static/"
86 |
87 | DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
88 |
--------------------------------------------------------------------------------
/tests/example/urls.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from django.urls import path
3 |
4 | urlpatterns = [
5 | path("admin/", admin.site.urls),
6 | ]
7 |
--------------------------------------------------------------------------------
/tests/test_admin_theme.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 |
4 | class TestDraculaAdmin(TestCase):
5 | def test_theme_loaded(self):
6 | """
7 | On the admin login page, check that the rendered
8 | template contains the updated dark theme toggle icon (bat),
9 | and not the old one (moon).
10 |
11 | The bat icon is the only HTML change this package makes to the admin,
12 | everything else comprises of static file changes (CSS and SVG).
13 | """
14 |
15 | # Act
16 | response = self.client.get("/admin", follow=True)
17 |
18 | response_content = response.content.decode("utf-8")
19 |
20 | # Assert
21 | self.assertTrue("icon-bat" in response_content)
22 | self.assertFalse("icon-moon" in response_content)
23 | self.assertEqual(response.status_code, 200)
24 |
--------------------------------------------------------------------------------
/uv.lock:
--------------------------------------------------------------------------------
1 | version = 1
2 | requires-python = ">=3.9"
3 |
4 | [[package]]
5 | name = "asgiref"
6 | version = "3.8.1"
7 | source = { registry = "https://pypi.org/simple" }
8 | dependencies = [
9 | { name = "typing-extensions", marker = "python_full_version < '3.11'" },
10 | ]
11 | sdist = { url = "https://files.pythonhosted.org/packages/29/38/b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42/asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590", size = 35186 }
12 | wheels = [
13 | { url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", size = 23828 },
14 | ]
15 |
16 | [[package]]
17 | name = "coverage"
18 | version = "7.6.4"
19 | source = { registry = "https://pypi.org/simple" }
20 | sdist = { url = "https://files.pythonhosted.org/packages/52/12/3669b6382792783e92046730ad3327f53b2726f0603f4c311c4da4824222/coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", size = 798716 }
21 | wheels = [
22 | { url = "https://files.pythonhosted.org/packages/a5/93/4ad92f71e28ece5c0326e5f4a6630aa4928a8846654a65cfff69b49b95b9/coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", size = 206713 },
23 | { url = "https://files.pythonhosted.org/packages/01/ae/747a580b1eda3f2e431d87de48f0604bd7bc92e52a1a95185a4aa585bc47/coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", size = 207149 },
24 | { url = "https://files.pythonhosted.org/packages/07/1a/1f573f8a6145f6d4c9130bbc120e0024daf1b24cf2a78d7393fa6eb6aba7/coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", size = 235584 },
25 | { url = "https://files.pythonhosted.org/packages/40/42/c8523f2e4db34aa9389caee0d3688b6ada7a84fcc782e943a868a7f302bd/coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", size = 233486 },
26 | { url = "https://files.pythonhosted.org/packages/8d/95/565c310fffa16ede1a042e9ea1ca3962af0d8eb5543bc72df6b91dc0c3d5/coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", size = 234649 },
27 | { url = "https://files.pythonhosted.org/packages/d5/81/3b550674d98968ec29c92e3e8650682be6c8b1fa7581a059e7e12e74c431/coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", size = 233744 },
28 | { url = "https://files.pythonhosted.org/packages/0d/70/d66c7f51b3e33aabc5ea9f9624c1c9d9655472962270eb5e7b0d32707224/coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", size = 232204 },
29 | { url = "https://files.pythonhosted.org/packages/23/2d/2b3a2dbed7a5f40693404c8a09e779d7c1a5fbed089d3e7224c002129ec8/coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", size = 233335 },
30 | { url = "https://files.pythonhosted.org/packages/5a/4f/92d1d2ad720d698a4e71c176eacf531bfb8e0721d5ad560556f2c484a513/coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", size = 209435 },
31 | { url = "https://files.pythonhosted.org/packages/c7/b9/cdf158e7991e2287bcf9082670928badb73d310047facac203ff8dcd5ff3/coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", size = 210243 },
32 | { url = "https://files.pythonhosted.org/packages/87/31/9c0cf84f0dfcbe4215b7eb95c31777cdc0483c13390e69584c8150c85175/coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", size = 206819 },
33 | { url = "https://files.pythonhosted.org/packages/53/ed/a38401079ad320ad6e054a01ec2b61d270511aeb3c201c80e99c841229d5/coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", size = 207263 },
34 | { url = "https://files.pythonhosted.org/packages/20/e7/c3ad33b179ab4213f0d70da25a9c214d52464efa11caeab438592eb1d837/coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", size = 239205 },
35 | { url = "https://files.pythonhosted.org/packages/36/91/fc02e8d8e694f557752120487fd982f654ba1421bbaa5560debf96ddceda/coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", size = 236612 },
36 | { url = "https://files.pythonhosted.org/packages/cc/57/cb08f0eda0389a9a8aaa4fc1f9fec7ac361c3e2d68efd5890d7042c18aa3/coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", size = 238479 },
37 | { url = "https://files.pythonhosted.org/packages/d5/c9/2c7681a9b3ca6e6f43d489c2e6653a53278ed857fd6e7010490c307b0a47/coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", size = 237405 },
38 | { url = "https://files.pythonhosted.org/packages/b5/4e/ebfc6944b96317df8b537ae875d2e57c27b84eb98820bc0a1055f358f056/coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", size = 236038 },
39 | { url = "https://files.pythonhosted.org/packages/13/f2/3a0bf1841a97c0654905e2ef531170f02c89fad2555879db8fe41a097871/coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", size = 236812 },
40 | { url = "https://files.pythonhosted.org/packages/b9/9c/66bf59226b52ce6ed9541b02d33e80a6e816a832558fbdc1111a7bd3abd4/coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", size = 209400 },
41 | { url = "https://files.pythonhosted.org/packages/2a/a0/b0790934c04dfc8d658d4a62acb8f7ca0efdf3818456fcad757b11c6479d/coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", size = 210243 },
42 | { url = "https://files.pythonhosted.org/packages/7d/e7/9291de916d084f41adddfd4b82246e68d61d6a75747f075f7e64628998d2/coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", size = 207013 },
43 | { url = "https://files.pythonhosted.org/packages/27/03/932c2c5717a7fa80cd43c6a07d3177076d97b79f12f40f882f9916db0063/coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", size = 207251 },
44 | { url = "https://files.pythonhosted.org/packages/d5/3f/0af47dcb9327f65a45455fbca846fe96eb57c153af46c4754a3ba678938a/coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", size = 240268 },
45 | { url = "https://files.pythonhosted.org/packages/8a/3c/37a9d81bbd4b23bc7d46ca820e16174c613579c66342faa390a271d2e18b/coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", size = 237298 },
46 | { url = "https://files.pythonhosted.org/packages/c0/70/6b0627e5bd68204ee580126ed3513140b2298995c1233bd67404b4e44d0e/coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", size = 239367 },
47 | { url = "https://files.pythonhosted.org/packages/3c/eb/634d7dfab24ac3b790bebaf9da0f4a5352cbc125ce6a9d5c6cf4c6cae3c7/coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", size = 238853 },
48 | { url = "https://files.pythonhosted.org/packages/d9/0d/8e3ed00f1266ef7472a4e33458f42e39492e01a64281084fb3043553d3f1/coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", size = 237160 },
49 | { url = "https://files.pythonhosted.org/packages/ce/9c/4337f468ef0ab7a2e0887a9c9da0e58e2eada6fc6cbee637a4acd5dfd8a9/coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", size = 238824 },
50 | { url = "https://files.pythonhosted.org/packages/5e/09/3e94912b8dd37251377bb02727a33a67ee96b84bbbe092f132b401ca5dd9/coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", size = 209639 },
51 | { url = "https://files.pythonhosted.org/packages/01/69/d4f3a4101171f32bc5b3caec8ff94c2c60f700107a6aaef7244b2c166793/coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", size = 210428 },
52 | { url = "https://files.pythonhosted.org/packages/c2/4d/2dede4f7cb5a70fb0bb40a57627fddf1dbdc6b9c1db81f7c4dcdcb19e2f4/coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", size = 207039 },
53 | { url = "https://files.pythonhosted.org/packages/3f/f9/d86368ae8c79e28f1fb458ebc76ae9ff3e8bd8069adc24e8f2fed03c58b7/coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", size = 207298 },
54 | { url = "https://files.pythonhosted.org/packages/64/c5/b4cc3c3f64622c58fbfd4d8b9a7a8ce9d355f172f91fcabbba1f026852f6/coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", size = 239813 },
55 | { url = "https://files.pythonhosted.org/packages/8a/86/14c42e60b70a79b26099e4d289ccdfefbc68624d096f4481163085aa614c/coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", size = 236959 },
56 | { url = "https://files.pythonhosted.org/packages/7f/f8/4436a643631a2fbab4b44d54f515028f6099bfb1cd95b13cfbf701e7f2f2/coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", size = 238950 },
57 | { url = "https://files.pythonhosted.org/packages/49/50/1571810ddd01f99a0a8be464a4ac8b147f322cd1e8e296a1528984fc560b/coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", size = 238610 },
58 | { url = "https://files.pythonhosted.org/packages/f3/8c/6312d241fe7cbd1f0cade34a62fea6f333d1a261255d76b9a87074d8703c/coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", size = 236697 },
59 | { url = "https://files.pythonhosted.org/packages/ce/5f/fef33dfd05d87ee9030f614c857deb6df6556b8f6a1c51bbbb41e24ee5ac/coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", size = 238541 },
60 | { url = "https://files.pythonhosted.org/packages/a9/64/6a984b6e92e1ea1353b7ffa08e27f707a5e29b044622445859200f541e8c/coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", size = 209707 },
61 | { url = "https://files.pythonhosted.org/packages/5c/60/ce5a9e942e9543783b3db5d942e0578b391c25cdd5e7f342d854ea83d6b7/coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", size = 210439 },
62 | { url = "https://files.pythonhosted.org/packages/78/53/6719677e92c308207e7f10561a1b16ab8b5c00e9328efc9af7cfd6fb703e/coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", size = 207784 },
63 | { url = "https://files.pythonhosted.org/packages/fa/dd/7054928930671fcb39ae6a83bb71d9ab5f0afb733172543ced4b09a115ca/coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", size = 208058 },
64 | { url = "https://files.pythonhosted.org/packages/b5/7d/fd656ddc2b38301927b9eb3aae3fe827e7aa82e691923ed43721fd9423c9/coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", size = 250772 },
65 | { url = "https://files.pythonhosted.org/packages/90/d0/eb9a3cc2100b83064bb086f18aedde3afffd7de6ead28f69736c00b7f302/coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", size = 246490 },
66 | { url = "https://files.pythonhosted.org/packages/45/44/3f64f38f6faab8a0cfd2c6bc6eb4c6daead246b97cf5f8fc23bf3788f841/coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", size = 248848 },
67 | { url = "https://files.pythonhosted.org/packages/5d/11/4c465a5f98656821e499f4b4619929bd5a34639c466021740ecdca42aa30/coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", size = 248340 },
68 | { url = "https://files.pythonhosted.org/packages/f1/96/ebecda2d016cce9da812f404f720ca5df83c6b29f65dc80d2000d0078741/coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", size = 246229 },
69 | { url = "https://files.pythonhosted.org/packages/16/d9/3d820c00066ae55d69e6d0eae11d6149a5ca7546de469ba9d597f01bf2d7/coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", size = 247510 },
70 | { url = "https://files.pythonhosted.org/packages/8f/c3/4fa1eb412bb288ff6bfcc163c11700ff06e02c5fad8513817186e460ed43/coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", size = 210353 },
71 | { url = "https://files.pythonhosted.org/packages/7e/77/03fc2979d1538884d921c2013075917fc927f41cd8526909852fe4494112/coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", size = 211502 },
72 | { url = "https://files.pythonhosted.org/packages/fb/27/7efede2355bd1417137246246ab0980751b3ba6065102518a2d1eba6a278/coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3", size = 206714 },
73 | { url = "https://files.pythonhosted.org/packages/f3/94/594af55226676d078af72b329372e2d036f9ba1eb6bcf1f81debea2453c7/coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c", size = 207146 },
74 | { url = "https://files.pythonhosted.org/packages/d5/13/19de1c5315b22795dd67dbd9168281632424a344b648d23d146572e42c2b/coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076", size = 235180 },
75 | { url = "https://files.pythonhosted.org/packages/db/26/8fba01ce9f376708c7efed2761cea740f50a1b4138551886213797a4cecd/coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376", size = 233100 },
76 | { url = "https://files.pythonhosted.org/packages/74/66/4db60266551b89e820b457bc3811a3c5eaad3c1324cef7730c468633387a/coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0", size = 234231 },
77 | { url = "https://files.pythonhosted.org/packages/2a/9b/7b33f0892fccce50fc82ad8da76c7af1731aea48ec71279eef63a9522db7/coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858", size = 233383 },
78 | { url = "https://files.pythonhosted.org/packages/91/49/6ff9c4e8a67d9014e1c434566e9169965f970350f4792a0246cd0d839442/coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111", size = 231863 },
79 | { url = "https://files.pythonhosted.org/packages/81/f9/c9d330dec440676b91504fcceebca0814718fa71c8498cf29d4e21e9dbfc/coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901", size = 232854 },
80 | { url = "https://files.pythonhosted.org/packages/ee/d9/605517a023a0ba8eb1f30d958f0a7ff3a21867b07dcb42618f862695ca0e/coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09", size = 209437 },
81 | { url = "https://files.pythonhosted.org/packages/aa/79/2626903efa84e9f5b9c8ee6972de8338673fdb5bb8d8d2797740bf911027/coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f", size = 210209 },
82 | { url = "https://files.pythonhosted.org/packages/cc/56/e1d75e8981a2a92c2a777e67c26efa96c66da59d645423146eb9ff3a851b/coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", size = 198954 },
83 | ]
84 |
85 | [[package]]
86 | name = "django"
87 | version = "4.2.16"
88 | source = { registry = "https://pypi.org/simple" }
89 | dependencies = [
90 | { name = "asgiref" },
91 | { name = "sqlparse" },
92 | { name = "tzdata", marker = "sys_platform == 'win32'" },
93 | ]
94 | sdist = { url = "https://files.pythonhosted.org/packages/65/d8/a607ee443b54a4db4ad28902328b906ae6218aa556fb9b3ac45c0bcb313d/Django-4.2.16.tar.gz", hash = "sha256:6f1616c2786c408ce86ab7e10f792b8f15742f7b7b7460243929cb371e7f1dad", size = 10436023 }
95 | wheels = [
96 | { url = "https://files.pythonhosted.org/packages/94/2c/6b6c7e493d5ea789416918658ebfa16be7a64c77610307497ed09a93c8c4/Django-4.2.16-py3-none-any.whl", hash = "sha256:1ddc333a16fc139fd253035a1606bb24261951bbc3a6ca256717fa06cc41a898", size = 7992936 },
97 | ]
98 |
99 | [[package]]
100 | name = "django-admin-dracula"
101 | version = "0.0.3"
102 | source = { editable = "." }
103 | dependencies = [
104 | { name = "django" },
105 | ]
106 |
107 | [package.dev-dependencies]
108 | dev = [
109 | { name = "coverage" },
110 | ]
111 |
112 | [package.metadata]
113 | requires-dist = [{ name = "django", specifier = ">=4.2" }]
114 |
115 | [package.metadata.requires-dev]
116 | dev = [{ name = "coverage", specifier = ">=7.6.4" }]
117 |
118 | [[package]]
119 | name = "sqlparse"
120 | version = "0.5.1"
121 | source = { registry = "https://pypi.org/simple" }
122 | sdist = { url = "https://files.pythonhosted.org/packages/73/82/dfa23ec2cbed08a801deab02fe7c904bfb00765256b155941d789a338c68/sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e", size = 84502 }
123 | wheels = [
124 | { url = "https://files.pythonhosted.org/packages/5d/a5/b2860373aa8de1e626b2bdfdd6df4355f0565b47e51f7d0c54fe70faf8fe/sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4", size = 44156 },
125 | ]
126 |
127 | [[package]]
128 | name = "typing-extensions"
129 | version = "4.12.2"
130 | source = { registry = "https://pypi.org/simple" }
131 | sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 }
132 | wheels = [
133 | { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 },
134 | ]
135 |
136 | [[package]]
137 | name = "tzdata"
138 | version = "2024.2"
139 | source = { registry = "https://pypi.org/simple" }
140 | sdist = { url = "https://files.pythonhosted.org/packages/e1/34/943888654477a574a86a98e9896bae89c7aa15078ec29f490fef2f1e5384/tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc", size = 193282 }
141 | wheels = [
142 | { url = "https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd", size = 346586 },
143 | ]
144 |
--------------------------------------------------------------------------------