├── .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 | ![Screenshot](https://github.com/sjbitcode/django-admin-dracula/blob/main/screenshot.png?raw=true) 9 | 10 | ![PyPI](https://img.shields.io/pypi/v/django-admin-dracula?&color=%23bd93f9) 11 | ![PyPI downloads](https://img.shields.io/pypi/dm/django-admin-dracula?color=%23ff79c6) 12 | ![Python versions](https://img.shields.io/pypi/pyversions/django-admin-dracula?color=%238be9fd) 13 | ![Django versions](https://img.shields.io/pypi/frameworkversions/django/django-admin-dracula?color=%2345de6b) 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 | | [![Sangeeta Jadoonanan](https://github.com/sjbitcode.png?size=100)](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 | [![Dracula PRO](./.github/dracula-pro.png)](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 | ![Screenshot](https://github.com/sjbitcode/django-admin-dracula/blob/main/screenshot.png?raw=true) 6 | 7 | 8 | ## 🦇 Dark Theme 9 | 10 | ![Dark theme - Admin homepage](https://github.com/sjbitcode/django-admin-dracula/blob/main/screenshots/dark-homepage.png?raw=true) 11 | 12 | ![Dark theme - Users homepage](https://github.com/sjbitcode/django-admin-dracula/blob/main/screenshots/dark-userspage.png?raw=true) 13 | 14 | 15 | ## 🕯️ Light Theme 16 | 17 | ![Light theme - Admin homepage](https://github.com/sjbitcode/django-admin-dracula/blob/main/screenshots/light-homepage.png?raw=true) 18 | 19 | ![Light theme - Users homepage](https://github.com/sjbitcode/django-admin-dracula/blob/main/screenshots/light-userspage.png?raw=true) 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 | 15 | 34 | 36 | 38 | 41 | 42 | 44 | 47 | 48 | 49 | 56 | 63 | 64 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/icon-hidelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/icon-viewlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /django_admin_dracula/static/admin/img/selector-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 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 | 119 | 120 | 121 | 122 | 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 |
{{ site_header|default:_('Django administration') }}
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 |
{% csrf_token %}{% block form_top %}{% endblock %} 37 |
38 | {% if is_popup %}{% endif %} 39 | {% if to_field %}{% endif %} 40 | {% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} 41 | {% if errors %} 42 |

43 | {% blocktranslate count counter=errors|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} 44 |

45 | {{ adminform.form.non_field_errors }} 46 | {% endif %} 47 | 48 | {% block field_sets %} 49 | {% for fieldset in adminform %} 50 | {% include "admin/includes/fieldset.html" with heading_level=2 id_suffix=forloop.counter0 %} 51 | {% endfor %} 52 | {% endblock %} 53 | 54 | {% block after_field_sets %}{% endblock %} 55 | 56 | {% block inline_field_sets %} 57 | {% for inline_admin_formset in inline_admin_formsets %} 58 | {% include inline_admin_formset.opts.template %} 59 | {% endfor %} 60 | {% endblock %} 61 | 62 | {% block after_related_objects %}{% endblock %} 63 | 64 | {% block submit_buttons_bottom %}{% submit_row %}{% endblock %} 65 | 66 | {% block admin_change_form_document_ready %} 67 | 74 | {% endblock %} 75 | 76 | {# JavaScript for prepopulated fields #} 77 | {% prepopulated_fields_js %} 78 | 79 |
80 |
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 |
58 | {% block search %}{% search_form cl %}{% endblock %} 59 | {% block date_hierarchy %}{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}{% endblock %} 60 | 61 |
{% csrf_token %} 62 | {% if cl.formset %} 63 |
{{ cl.formset.management_form }}
64 | {% endif %} 65 | 66 | {% block result_list %} 67 | {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %} 68 | {% result_list cl %} 69 | {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %} 70 | {% endblock %} 71 | {% block pagination %}{% pagination cl %}{% endblock %} 72 |
73 |
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 | --------------------------------------------------------------------------------