├── .gitignore ├── LICENSE ├── MANIFEST.in ├── README.rst ├── flat ├── __init__.py ├── static │ └── admin │ │ ├── css │ │ ├── base.css │ │ ├── changelists.css │ │ ├── fonts.css │ │ ├── forms.css │ │ ├── login.css │ │ ├── rtl.css │ │ └── widgets.css │ │ ├── fonts │ │ ├── LICENSE.txt │ │ ├── README.txt │ │ ├── Roboto-Bold-webfont.woff │ │ ├── Roboto-Light-webfont.woff │ │ └── Roboto-Regular-webfont.woff │ │ ├── img │ │ ├── changelist-bg.gif │ │ ├── changelist-bg_rtl.gif │ │ ├── default-bg-reverse.gif │ │ ├── default-bg.gif │ │ ├── deleted-overlay.gif │ │ ├── gis │ │ │ ├── move_vertex_off.png │ │ │ ├── move_vertex_off.svg │ │ │ ├── move_vertex_on.png │ │ │ └── move_vertex_on.svg │ │ ├── icon-no.gif │ │ ├── icon-unknown.gif │ │ ├── icon-yes.gif │ │ ├── icon_addlink.gif │ │ ├── icon_alert.gif │ │ ├── icon_calendar.gif │ │ ├── icon_changelink.gif │ │ ├── icon_clock.gif │ │ ├── icon_deletelink.gif │ │ ├── icon_error.gif │ │ ├── icon_searchbox.png │ │ ├── icon_success.gif │ │ ├── inline-delete-8bit.png │ │ ├── inline-delete.png │ │ ├── inline-restore-8bit.png │ │ ├── inline-restore.png │ │ ├── inline-splitter-bg.gif │ │ ├── nav-bg-grabber.gif │ │ ├── nav-bg-reverse.gif │ │ ├── nav-bg-selected.gif │ │ ├── nav-bg.gif │ │ ├── selector-icons.gif │ │ ├── selector-search.gif │ │ ├── sorting-icons.gif │ │ ├── svg │ │ │ ├── LICENSE │ │ │ ├── README.txt │ │ │ ├── calendar-icons.svg │ │ │ ├── icon-addlink.svg │ │ │ ├── icon-alert.svg │ │ │ ├── icon-calendar.svg │ │ │ ├── icon-changelink.svg │ │ │ ├── icon-clock.svg │ │ │ ├── icon-deletelink.svg │ │ │ ├── icon-no.svg │ │ │ ├── icon-unknown-alt.svg │ │ │ ├── icon-unknown.svg │ │ │ ├── icon-yes.svg │ │ │ ├── inline-delete.svg │ │ │ ├── search.svg │ │ │ ├── selector-icons.svg │ │ │ ├── sorting-icons.svg │ │ │ ├── tooltag-add.svg │ │ │ └── tooltag-arrowright.svg │ │ ├── tooltag-add.png │ │ └── tooltag-arrowright.png │ │ └── js │ │ ├── SelectFilter2.js │ │ ├── admin │ │ └── DateTimeShortcuts.js │ │ └── core.js └── templates │ ├── admin │ ├── base_site.html │ ├── edit_inline │ │ └── tabular.html │ ├── related_widget_wrapper.html │ └── search_form.html │ └── gis │ ├── admin │ └── openlayers.html │ └── openlayers.html ├── setup.cfg └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.orig 3 | .DS_Store 4 | /env/ 5 | /dist/ 6 | /django_flat_theme.egg-info/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015, Alex Dergunov 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | 10 | 2. Redistributions in binary form must reproduce the above copyright 11 | notice, this list of conditions and the following disclaimer in the 12 | documentation and/or other materials provided with the distribution. 13 | 14 | 3. Neither the name of the author nor the names of other contributors may 15 | be used to endorse or promote products derived from this software without 16 | specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY 19 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 22 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 27 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | recursive-include flat * 2 | recursive-exclude * *.pyc __pycache__ .DS_Store 3 | include README.rst 4 | include LICENSE 5 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | Django Flat Theme 2 | ================= 3 | 4 | **django-flat-theme** is included as `part `_ of Django from `version 1.9 `_! :tada: 5 | 6 | Please use this app if your project is powered by an older Django version. 7 | 8 | Description 9 | ----------- 10 | 11 | **django-flat-theme** brings fresh air to the default Django Admin 12 | interface which hasn't changed in 10 years, since the very first version of 13 | Django framework. This theme makes the UI modern and clean. 14 | 15 | This app overrides the default admin's CSS. All the changes only involve CSS: 16 | colors, margins, sizes and icons; nothing major is changed. 17 | 18 | Installation 19 | ------------ 20 | 21 | Install via pip: 22 | ``pip install django-flat-theme`` 23 | 24 | 1. Put ``flat`` app in your *INSTALLED\_APPS* **before** 25 | ``django.contrib.admin``: 26 | 27 | :: 28 | 29 | INSTALLED_APPS = ( 30 | ... 31 | 'flat', 32 | 'django.contrib.admin', 33 | ... 34 | ) 35 | 36 | 2. Enjoy! 37 | 38 | Compatibility 39 | ~~~~~~~~~~~~~ 40 | 41 | Works properly in Django 1.5+. 42 | 43 | Font 44 | ~~~~ 45 | 46 | This theme uses the `Roboto font `__ 47 | which is under Apache 2.0 licence. 48 | 49 | Testing 50 | ~~~~~~~ 51 | 52 | Tested in: 53 | 54 | - Internet Explorer 7+ (IE8 and less doesn't support SVG so icons are not displayed) 55 | - Firefox 30+ (Windows, Ubuntu, OS X) 56 | - Chrome 35+ (Windows, Ubuntu, OS X) 57 | - Safari 8 (OS X) 58 | 59 | Screenshot Examples 60 | ~~~~~~~~~~~~~~~~~~~ 61 | 62 | **Login page** 63 | 64 | |1| 65 | 66 | ------------ 67 | 68 | **Dashboard** 69 | 70 | |2| 71 | 72 | ------------ 73 | 74 | **List of objects** 75 | 76 | |3| 77 | 78 | ------------ 79 | 80 | **New object** 81 | 82 | |4| 83 | 84 | .. |1| image:: https://cloud.githubusercontent.com/assets/209663/9546175/f4c24520-4da9-11e5-9182-b5d791d4115f.png 85 | .. |2| image:: https://cloud.githubusercontent.com/assets/209663/9546174/f4c1ddba-4da9-11e5-8781-c629a52cae0f.png 86 | .. |3| image:: https://cloud.githubusercontent.com/assets/209663/9546176/f4fd6a24-4da9-11e5-89e8-542b77fdae85.png 87 | .. |4| image:: https://cloud.githubusercontent.com/assets/209663/9546177/f500361e-4da9-11e5-9431-b2f42b90ca2f.png 88 | -------------------------------------------------------------------------------- /flat/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '1.1.3' 2 | -------------------------------------------------------------------------------- /flat/static/admin/css/base.css: -------------------------------------------------------------------------------- 1 | /* 2 | DJANGO Admin styles 3 | */ 4 | 5 | @import url(fonts.css); 6 | 7 | body { 8 | margin: 0; 9 | padding: 0; 10 | font-size: 14px; 11 | font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; 12 | color: #333; 13 | background: #fff; 14 | } 15 | 16 | /* LINKS */ 17 | 18 | a:link, a:visited { 19 | color: #447e9b; 20 | text-decoration: none; 21 | } 22 | 23 | a:hover { 24 | color: #036; 25 | } 26 | 27 | a img { 28 | border: none; 29 | } 30 | 31 | a.section:link, a.section:visited { 32 | color: #fff; 33 | text-decoration: none; 34 | } 35 | 36 | /* GLOBAL DEFAULTS */ 37 | 38 | p, ol, ul, dl { 39 | margin: .2em 0 .8em 0; 40 | } 41 | 42 | p { 43 | padding: 0; 44 | line-height: 140%; 45 | } 46 | 47 | h1,h2,h3,h4,h5 { 48 | font-weight: bold; 49 | } 50 | 51 | h1 { 52 | margin: 0 0 20px; 53 | font-weight: 300; 54 | font-size: 20px; 55 | color: #666; 56 | } 57 | 58 | h2 { 59 | font-size: 16px; 60 | margin: 1em 0 .5em 0; 61 | } 62 | 63 | h2.subhead { 64 | font-weight: normal; 65 | margin-top: 0; 66 | } 67 | 68 | h3 { 69 | font-size: 14px; 70 | margin: .8em 0 .3em 0; 71 | color: #666; 72 | font-weight: bold; 73 | } 74 | 75 | h4 { 76 | font-size: 12px; 77 | margin: 1em 0 .8em 0; 78 | padding-bottom: 3px; 79 | } 80 | 81 | h5 { 82 | font-size: 10px; 83 | margin: 1.5em 0 .5em 0; 84 | color: #666; 85 | text-transform: uppercase; 86 | letter-spacing: 1px; 87 | } 88 | 89 | ul li { 90 | list-style-type: square; 91 | padding: 1px 0; 92 | } 93 | 94 | li ul { 95 | margin-bottom: 0; 96 | } 97 | 98 | li, dt, dd { 99 | font-size: 13px; 100 | line-height: 20px; 101 | } 102 | 103 | dt { 104 | font-weight: bold; 105 | margin-top: 4px; 106 | } 107 | 108 | dd { 109 | margin-left: 0; 110 | } 111 | 112 | form { 113 | margin: 0; 114 | padding: 0; 115 | } 116 | 117 | fieldset { 118 | margin: 0; 119 | padding: 0; 120 | border: none; 121 | border-top: 1px solid #eee; 122 | } 123 | 124 | blockquote { 125 | font-size: 11px; 126 | color: #777; 127 | margin-left: 2px; 128 | padding-left: 10px; 129 | border-left: 5px solid #ddd; 130 | } 131 | 132 | code, pre { 133 | font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; 134 | color: #666; 135 | font-size: 12px; 136 | } 137 | 138 | pre.literal-block { 139 | margin: 10px; 140 | background: #eee; 141 | padding: 6px 8px; 142 | } 143 | 144 | code strong { 145 | color: #930; 146 | } 147 | 148 | hr { 149 | clear: both; 150 | color: #eee; 151 | background-color: #eee; 152 | height: 1px; 153 | border: none; 154 | margin: 0; 155 | padding: 0; 156 | font-size: 1px; 157 | line-height: 1px; 158 | } 159 | 160 | /* TEXT STYLES & MODIFIERS */ 161 | 162 | .small { 163 | font-size: 11px; 164 | } 165 | 166 | .tiny { 167 | font-size: 10px; 168 | } 169 | 170 | p.tiny { 171 | margin-top: -2px; 172 | } 173 | 174 | .mini { 175 | font-size: 10px; 176 | } 177 | 178 | p.mini { 179 | margin-top: -3px; 180 | } 181 | 182 | .help, p.help, form p.help { 183 | font-size: 11px; 184 | color: #999; 185 | } 186 | 187 | .help-tooltip { 188 | cursor: help; 189 | } 190 | 191 | p img, h1 img, h2 img, h3 img, h4 img, td img { 192 | vertical-align: middle; 193 | } 194 | 195 | .quiet, a.quiet:link, a.quiet:visited { 196 | color: #999; 197 | font-weight: normal; 198 | } 199 | 200 | .float-right { 201 | float: right; 202 | } 203 | 204 | .float-left { 205 | float: left; 206 | } 207 | 208 | .clear { 209 | clear: both; 210 | } 211 | 212 | .align-left { 213 | text-align: left; 214 | } 215 | 216 | .align-right { 217 | text-align: right; 218 | } 219 | 220 | .example { 221 | margin: 10px 0; 222 | padding: 5px 10px; 223 | background: #efefef; 224 | } 225 | 226 | .nowrap { 227 | white-space: nowrap; 228 | } 229 | 230 | img[src*="icon-no"], img[src*="icon-yes"], img[src*="icon-unknown"] { 231 | width: 12px; 232 | height: 12px; 233 | vertical-align: -1px; 234 | } 235 | 236 | /* TABLES */ 237 | 238 | table { 239 | border-collapse: collapse; 240 | border-color: #ccc; 241 | } 242 | 243 | td, th { 244 | font-size: 13px; 245 | line-height: 16px; 246 | border-bottom: 1px solid #eee; 247 | vertical-align: top; 248 | padding: 8px; 249 | font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; 250 | } 251 | 252 | th { 253 | font-weight: 600; 254 | text-align: left; 255 | } 256 | 257 | thead th, 258 | tfoot td { 259 | color: #666; 260 | padding: 5px 10px; 261 | font-size: 11px; 262 | background: #fff; 263 | border: none; 264 | border-top: 1px solid #eee; 265 | border-bottom: 1px solid #eee; 266 | } 267 | 268 | tfoot td { 269 | border-bottom: none; 270 | border-top: 1px solid #eee; 271 | } 272 | 273 | tr.alt { 274 | background: #f6f6f6; 275 | } 276 | 277 | .row1 { 278 | background: #fff; 279 | } 280 | 281 | .row2 { 282 | background: #f9f9f9; 283 | } 284 | 285 | /* SORTABLE TABLES */ 286 | 287 | thead th { 288 | padding: 5px 10px; 289 | line-height: normal; 290 | text-transform: uppercase; 291 | background: #f6f6f6; 292 | } 293 | 294 | thead th a:link, thead th a:visited { 295 | color: #666; 296 | } 297 | 298 | thead th.sorted { 299 | background: #eee; 300 | } 301 | 302 | thead th.sorted .text { 303 | padding-right: 42px; 304 | } 305 | 306 | table thead th .text span { 307 | padding: 8px 10px; 308 | display: block; 309 | } 310 | 311 | table thead th .text a { 312 | display: block; 313 | cursor: pointer; 314 | padding: 8px 10px; 315 | } 316 | 317 | table thead th.sortable:hover { 318 | background: #eee; 319 | } 320 | 321 | thead th.sorted a.sortremove { 322 | visibility: hidden; 323 | } 324 | 325 | table thead th.sorted:hover a.sortremove { 326 | visibility: visible; 327 | } 328 | 329 | table thead th.sorted .sortoptions { 330 | display: block; 331 | padding: 9px 5px 0 5px; 332 | float: right; 333 | text-align: right; 334 | } 335 | 336 | table thead th.sorted .sortpriority { 337 | font-size: .8em; 338 | min-width: 12px; 339 | text-align: center; 340 | vertical-align: 3px; 341 | margin-left: 2px; 342 | margin-right: 2px; 343 | } 344 | 345 | table thead th.sorted .sortoptions a { 346 | position: relative; 347 | width: 14px; 348 | height: 14px; 349 | display: inline-block; 350 | background: url(../img/svg/sorting-icons.svg) 0 0 no-repeat; 351 | background-size: 14px auto; 352 | } 353 | 354 | table thead th.sorted .sortoptions a.sortremove { 355 | background-position: 0 0; 356 | } 357 | 358 | table thead th.sorted .sortoptions a.sortremove:after { 359 | content: '\\'; 360 | position: absolute; 361 | top: -6px; 362 | left: 3px; 363 | font-weight: 200; 364 | font-size: 18px; 365 | color: #999; 366 | } 367 | 368 | table thead th.sorted .sortoptions a.sortremove:hover:after { 369 | color: #447e9b; 370 | } 371 | 372 | table thead th.sorted .sortoptions a.sortremove:hover { 373 | background-position: 0 -14px; 374 | } 375 | 376 | table thead th.sorted .sortoptions a.ascending { 377 | background-position: 0 -28px; 378 | } 379 | 380 | table thead th.sorted .sortoptions a.ascending:hover { 381 | background-position: 0 -42px; 382 | } 383 | 384 | table thead th.sorted .sortoptions a.descending { 385 | top: 1px; 386 | background-position: 0 -56px; 387 | } 388 | 389 | table thead th.sorted .sortoptions a.descending:hover { 390 | background-position: 0 -70px; 391 | } 392 | 393 | /* FORM DEFAULTS */ 394 | 395 | input, textarea, select, .form-row p, form .button { 396 | margin: 2px 0; 397 | padding: 2px 3px; 398 | vertical-align: middle; 399 | font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; 400 | font-weight: normal; 401 | font-size: 13px; 402 | } 403 | 404 | textarea { 405 | vertical-align: top; 406 | } 407 | 408 | input[type=text], input[type=password], input[type=email], input[type=url], 409 | input[type=number], textarea, select, .vTextField { 410 | border: 1px solid #ccc; 411 | border-radius: 4px; 412 | padding: 5px 6px; 413 | margin-top: 0; 414 | outline: none; 415 | } 416 | 417 | input[type=text]:focus, input[type=password]:focus, input[type=email]:focus, 418 | input[type=url]:focus, input[type=number]:focus, textarea:focus, select:focus, 419 | .vTextField:focus { 420 | border-color: #999; 421 | } 422 | 423 | select { 424 | height: 30px; 425 | } 426 | 427 | select[multiple] { 428 | min-height: 150px; 429 | } 430 | 431 | /* FORM BUTTONS */ 432 | 433 | .button, input[type=submit], input[type=button], .submit-row input, a.button { 434 | background: #79aec8; 435 | padding: 10px 15px; 436 | border: none; 437 | outline: none; 438 | border-radius: 4px; 439 | color: #fff; 440 | cursor: pointer; 441 | } 442 | 443 | a.button { 444 | padding: 4px 5px; 445 | } 446 | 447 | .button:active, input[type=submit]:active, input[type=button]:active, 448 | .button:hover, input[type=submit]:hover, input[type=button]:hover { 449 | background: #609ab6; 450 | } 451 | 452 | .button[disabled], input[type=submit][disabled], input[type=button][disabled] { 453 | opacity: 0.4; 454 | } 455 | 456 | .button.default, input[type=submit].default, .submit-row input.default { 457 | float: right; 458 | border: none; 459 | font-weight: 400; 460 | background: #417690; 461 | } 462 | 463 | .button.default:active, input[type=submit].default:active, 464 | .button.default:hover, input[type=submit].default:hover { 465 | background: #205067; 466 | } 467 | 468 | .button[disabled].default, 469 | input[type=submit][disabled].default, 470 | input[type=button][disabled].default { 471 | opacity: 0.4; 472 | } 473 | 474 | 475 | /* MODULES */ 476 | 477 | .module { 478 | border: none; 479 | margin-bottom: 30px; 480 | background: #fff; 481 | } 482 | 483 | .module p, .module ul, .module h3, .module h4, .module dl, .module pre { 484 | padding-left: 10px; 485 | padding-right: 10px; 486 | } 487 | 488 | .module blockquote { 489 | margin-left: 12px; 490 | } 491 | 492 | .module ul, .module ol { 493 | margin-left: 1.5em; 494 | } 495 | 496 | .module h3 { 497 | margin-top: .6em; 498 | } 499 | 500 | .module h2, .module caption, .inline-group h2 { 501 | margin: 0; 502 | padding: 8px; 503 | font-weight: 400; 504 | font-size: 13px; 505 | text-align: left; 506 | background: #79aec8; 507 | color: #fff; 508 | } 509 | 510 | .module caption, 511 | .inline-group h2 { 512 | font-size: 12px; 513 | letter-spacing: 0.5px; 514 | text-transform: uppercase; 515 | } 516 | 517 | .module table { 518 | border-collapse: collapse; 519 | } 520 | 521 | /* MESSAGES & ERRORS */ 522 | 523 | ul.messagelist { 524 | padding: 0; 525 | margin: 0; 526 | } 527 | 528 | ul.messagelist li { 529 | display: block; 530 | font-weight: 400; 531 | font-size: 13px; 532 | padding: 10px 10px 10px 65px; 533 | margin: 0 0 10px 0; 534 | background: #dfd url(../img/svg/icon-yes.svg) 40px 12px no-repeat; 535 | background-size: 16px auto; 536 | color: #333; 537 | } 538 | 539 | ul.messagelist li.warning { 540 | background: #ffc url(../img/svg/icon-alert.svg) 40px 14px no-repeat; 541 | background-size: 14px auto; 542 | } 543 | 544 | ul.messagelist li.error { 545 | background: #ffefef url(../img/svg/icon-no.svg) 40px 12px no-repeat; 546 | background-size: 16px auto; 547 | } 548 | 549 | .errornote { 550 | font-size: 14px; 551 | font-weight: 700; 552 | display: block; 553 | padding: 10px 12px; 554 | margin: 0 0 10px 0; 555 | color: #ba2121; 556 | border: 1px solid #ba2121; 557 | border-radius: 4px; 558 | background-color: #fff; 559 | background-position: 5px 12px; 560 | } 561 | 562 | ul.errorlist { 563 | margin: 0 0 4px; 564 | padding: 0; 565 | color: #ba2121; 566 | background: #fff; 567 | } 568 | 569 | ul.errorlist li { 570 | font-size: 13px; 571 | display: block; 572 | margin-bottom: 4px; 573 | } 574 | 575 | ul.errorlist li:first-child { 576 | margin-top: 0; 577 | } 578 | 579 | ul.errorlist li a { 580 | color: inherit; 581 | text-decoration: underline; 582 | } 583 | 584 | td ul.errorlist { 585 | margin: 0; 586 | padding: 0; 587 | } 588 | 589 | td ul.errorlist li { 590 | margin: 0; 591 | } 592 | 593 | .form-row.errors { 594 | margin: 0; 595 | border: none; 596 | border-bottom: 1px solid #eee; 597 | background: none; 598 | } 599 | 600 | .form-row.errors ul.errorlist li { 601 | padding-left: 0; 602 | } 603 | 604 | .errors input, .errors select, .errors textarea { 605 | border: 1px solid #ba2121; 606 | } 607 | 608 | div.system-message { 609 | background: #ffc; 610 | margin: 10px; 611 | padding: 6px 8px; 612 | font-size: .8em; 613 | } 614 | 615 | div.system-message p.system-message-title { 616 | padding: 4px 5px 4px 25px; 617 | margin: 0; 618 | color: #c11; 619 | background: #ffefef url(../img/svg/icon-no.svg) 5px 5px no-repeat; 620 | } 621 | 622 | .description { 623 | font-size: 12px; 624 | padding: 5px 0 0 12px; 625 | } 626 | 627 | /* BREADCRUMBS */ 628 | 629 | div.breadcrumbs { 630 | background: #79aec8; 631 | padding: 10px 40px; 632 | border: none; 633 | font-size: 14px; 634 | color: #c4dce8; 635 | text-align: left; 636 | } 637 | 638 | div.breadcrumbs a { 639 | color: #fff; 640 | } 641 | 642 | div.breadcrumbs a:hover { 643 | color: #c4dce8; 644 | } 645 | 646 | /* ACTION ICONS */ 647 | 648 | .addlink { 649 | padding-left: 16px; 650 | background: url(../img/svg/icon-addlink.svg) 0 1px no-repeat; 651 | } 652 | 653 | .changelink, .inlinechangelink { 654 | padding-left: 16px; 655 | background: url(../img/svg/icon-changelink.svg) 0 1px no-repeat; 656 | } 657 | 658 | .deletelink { 659 | padding-left: 16px; 660 | background: url(../img/svg/icon-deletelink.svg) 0 1px no-repeat; 661 | } 662 | 663 | a.deletelink:link, a.deletelink:visited { 664 | color: #CC3434; 665 | } 666 | 667 | a.deletelink:hover { 668 | color: #993333; 669 | } 670 | 671 | /* OBJECT TOOLS */ 672 | 673 | .object-tools { 674 | font-size: 10px; 675 | font-weight: bold; 676 | padding-left: 0; 677 | float: right; 678 | position: relative; 679 | margin-top: -48px; 680 | } 681 | 682 | .form-row .object-tools { 683 | margin-top: 5px; 684 | margin-bottom: 5px; 685 | float: none; 686 | height: 2em; 687 | padding-left: 3.5em; 688 | } 689 | 690 | .object-tools li { 691 | display: block; 692 | float: left; 693 | margin-left: 5px; 694 | height: 16px; 695 | } 696 | 697 | .object-tools a { 698 | border-radius: 15px; 699 | } 700 | 701 | .object-tools a:link, .object-tools a:visited { 702 | display: block; 703 | float: left; 704 | padding: 3px 12px; 705 | background: #999; 706 | font-weight: 400; 707 | font-size: 11px; 708 | text-transform: uppercase; 709 | letter-spacing: 0.5px; 710 | color: #fff; 711 | } 712 | 713 | .object-tools a:hover, .object-tools li:hover a { 714 | background-color: #417690; 715 | } 716 | 717 | .object-tools a.viewsitelink, .object-tools a.golink { 718 | background: #999 url(../img/svg/tooltag-arrowright.svg) right 8px center no-repeat; 719 | padding-right: 26px; 720 | } 721 | 722 | .object-tools a.addlink { 723 | background: #999 url(../img/svg/tooltag-add.svg) right 8px center no-repeat; 724 | padding-right: 26px; 725 | } 726 | 727 | /* OBJECT HISTORY */ 728 | 729 | table#change-history { 730 | width: 100%; 731 | } 732 | 733 | table#change-history tbody th { 734 | width: 16em; 735 | } 736 | 737 | /* PAGE STRUCTURE */ 738 | 739 | #container { 740 | position: relative; 741 | width: 100%; 742 | min-width: 980px; 743 | padding: 0; 744 | } 745 | 746 | #content { 747 | padding: 20px 40px; 748 | } 749 | 750 | .dashboard #content { 751 | width: 600px; 752 | } 753 | 754 | #content-main { 755 | float: left; 756 | width: 100%; 757 | } 758 | 759 | #content-related { 760 | float: right; 761 | width: 260px; 762 | position: relative; 763 | margin-right: -300px; 764 | } 765 | 766 | #footer { 767 | clear: both; 768 | padding: 10px; 769 | } 770 | 771 | /* COLUMN TYPES */ 772 | 773 | .colMS { 774 | margin-right: 300px; 775 | } 776 | 777 | .colSM { 778 | margin-left: 300px; 779 | } 780 | 781 | .colSM #content-related { 782 | float: left; 783 | margin-right: 0; 784 | margin-left: -300px; 785 | } 786 | 787 | .colSM #content-main { 788 | float: right; 789 | } 790 | 791 | .popup .colM { 792 | width: auto; 793 | } 794 | 795 | /* HEADER */ 796 | 797 | #header { 798 | width: auto; 799 | height: 40px; 800 | padding: 10px 40px; 801 | background: #417690; 802 | line-height: 40px; 803 | color: #ffc; 804 | overflow: hidden; 805 | } 806 | 807 | #header a:link, #header a:visited { 808 | color: #fff; 809 | } 810 | 811 | #header a:hover { 812 | text-decoration: underline; 813 | } 814 | 815 | #branding { 816 | float: left; 817 | } 818 | 819 | #branding h1 { 820 | padding: 0; 821 | margin: 0 20px 0 0; 822 | font-weight: 300; 823 | font-size: 24px; 824 | color: #f5dd5d; 825 | } 826 | 827 | #branding h1, #branding h1 a:link, #branding h1 a:visited { 828 | color: #f5dd5d; 829 | } 830 | 831 | #branding h2 { 832 | padding: 0 10px; 833 | font-size: 14px; 834 | margin: -8px 0 8px 0; 835 | font-weight: normal; 836 | color: #ffc; 837 | } 838 | 839 | #branding a:hover { 840 | text-decoration: none; 841 | } 842 | 843 | #user-tools { 844 | float: right; 845 | padding: 0; 846 | margin: 0 0 0 20px; 847 | font-weight: 300; 848 | font-size: 11px; 849 | letter-spacing: 0.5px; 850 | text-transform: uppercase; 851 | text-align: right; 852 | } 853 | 854 | #user-tools a { 855 | border-bottom: 1px solid rgba(255, 255, 255, 0.25); 856 | } 857 | 858 | #user-tools a:hover { 859 | text-decoration: none; 860 | border-bottom-color: #79aec8; 861 | color: #79aec8; 862 | } 863 | 864 | /* SIDEBAR */ 865 | 866 | #content-related { 867 | background: #f8f8f8; 868 | } 869 | 870 | #content-related .module { 871 | background: none; 872 | } 873 | 874 | #content-related h3 { 875 | font-size: 14px; 876 | color: #666; 877 | padding: 0 16px; 878 | margin: 0 0 16px; 879 | } 880 | 881 | #content-related h4 { 882 | font-size: 13px; 883 | } 884 | 885 | #content-related p { 886 | padding-left: 16px; 887 | padding-right: 16px; 888 | } 889 | 890 | #content-related .actionlist { 891 | padding: 0; 892 | margin: 16px; 893 | } 894 | 895 | #content-related .actionlist li { 896 | line-height: 1.2; 897 | margin-bottom: 10px; 898 | padding-left: 18px; 899 | } 900 | 901 | #content-related .module h2 { 902 | background: none; 903 | padding: 16px; 904 | margin-bottom: 16px; 905 | border-bottom: 1px solid #eaeaea; 906 | font-size: 18px; 907 | color: #333; 908 | } 909 | 910 | .delete-confirmation form input[type="submit"] { 911 | background: #ba2121; 912 | border-radius: 4px; 913 | padding: 10px 15px; 914 | color: #fff; 915 | } 916 | 917 | .delete-confirmation form input[type="submit"]:active, 918 | .delete-confirmation form input[type="submit"]:hover { 919 | background: #a41515; 920 | } 921 | 922 | .delete-confirmation form .cancel-link { 923 | display: inline-block; 924 | vertical-align: middle; 925 | height: 15px; 926 | line-height: 15px; 927 | background: #ddd; 928 | border-radius: 4px; 929 | padding: 10px 15px; 930 | color: #333; 931 | margin: 0 0 0 10px; 932 | } 933 | 934 | .delete-confirmation form .cancel-link:active, 935 | .delete-confirmation form .cancel-link:hover { 936 | background: #ccc; 937 | } 938 | 939 | 940 | /* POPUP */ 941 | .popup #content { 942 | padding: 20px; 943 | } 944 | 945 | .popup #container { 946 | min-width: 0; 947 | } 948 | 949 | .popup #header { 950 | padding: 10px 20px; 951 | } 952 | -------------------------------------------------------------------------------- /flat/static/admin/css/changelists.css: -------------------------------------------------------------------------------- 1 | /* CHANGELISTS */ 2 | 3 | #changelist { 4 | position: relative; 5 | width: 100%; 6 | } 7 | 8 | #changelist table { 9 | width: 100%; 10 | } 11 | 12 | .change-list .hiddenfields { display:none; } 13 | 14 | .change-list .filtered table { 15 | border-right: none; 16 | } 17 | 18 | .change-list .filtered { 19 | min-height: 400px; 20 | } 21 | 22 | .change-list .filtered .results, .change-list .filtered .paginator, 23 | .filtered #toolbar, .filtered div.xfull { 24 | margin-right: 280px; 25 | width: auto; 26 | } 27 | 28 | .change-list .filtered table tbody th { 29 | padding-right: 1em; 30 | } 31 | 32 | #changelist-form .results { 33 | overflow-x: auto; 34 | } 35 | 36 | #changelist .toplinks { 37 | border-bottom: 1px solid #ddd; 38 | } 39 | 40 | #changelist .paginator { 41 | color: #666; 42 | border-bottom: 1px solid #eee; 43 | background: #fff; 44 | overflow: hidden; 45 | } 46 | 47 | /* CHANGELIST TABLES */ 48 | 49 | #changelist table thead th { 50 | padding: 0; 51 | white-space: nowrap; 52 | vertical-align: middle; 53 | } 54 | 55 | #changelist table thead th.action-checkbox-column { 56 | width: 1.5em; 57 | text-align: center; 58 | } 59 | 60 | #changelist table tbody td.action-checkbox { 61 | text-align: center; 62 | } 63 | 64 | #changelist table tfoot { 65 | color: #666; 66 | } 67 | 68 | /* TOOLBAR */ 69 | 70 | #changelist #toolbar { 71 | padding: 8px 10px; 72 | margin-bottom: 15px; 73 | border-top: 1px solid #eee; 74 | border-bottom: 1px solid #eee; 75 | background: #f8f8f8; 76 | color: #666; 77 | } 78 | 79 | #changelist #toolbar form input { 80 | border-radius: 4px; 81 | font-size: 14px; 82 | padding: 5px; 83 | color: #333; 84 | } 85 | 86 | #changelist #toolbar form #searchbar { 87 | height: 19px; 88 | border: 1px solid #ccc; 89 | padding: 2px 5px; 90 | margin: 0; 91 | vertical-align: top; 92 | font-size: 13px; 93 | } 94 | 95 | #changelist #toolbar form #searchbar:focus { 96 | outline: none; 97 | border-color: #999; 98 | } 99 | 100 | #changelist #toolbar form input[type="submit"] { 101 | border: 1px solid #ccc; 102 | padding: 2px 10px; 103 | margin: 0; 104 | vertical-align: middle; 105 | background: #fff; 106 | box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; 107 | cursor: pointer; 108 | color: #333; 109 | } 110 | 111 | #changelist #toolbar form input[type="submit"]:hover { 112 | border-color: #999; 113 | } 114 | 115 | #changelist #changelist-search img { 116 | vertical-align: middle; 117 | margin-right: 4px; 118 | } 119 | 120 | /* FILTER COLUMN */ 121 | 122 | #changelist-filter { 123 | position: absolute; 124 | top: 0; 125 | right: 0; 126 | z-index: 1000; 127 | width: 240px; 128 | background: #f8f8f8; 129 | border-left: none; 130 | margin: 0; 131 | } 132 | 133 | #changelist-filter h2 { 134 | font-size: 14px; 135 | text-transform: uppercase; 136 | letter-spacing: 0.5px; 137 | padding: 5px 15px; 138 | margin-bottom: 12px; 139 | border-bottom: none; 140 | } 141 | 142 | #changelist-filter h3 { 143 | font-weight: 400; 144 | font-size: 14px; 145 | padding: 0 15px; 146 | margin-bottom: 10px; 147 | } 148 | 149 | #changelist-filter ul { 150 | margin: 5px 0; 151 | padding: 0 15px 15px; 152 | border-bottom: 1px solid #eaeaea; 153 | } 154 | 155 | #changelist-filter ul:last-child { 156 | border-bottom: none; 157 | padding-bottom: none; 158 | } 159 | 160 | #changelist-filter li { 161 | list-style-type: none; 162 | margin-left: 0; 163 | padding-left: 0; 164 | } 165 | 166 | #changelist-filter a { 167 | display: block; 168 | color: #999; 169 | } 170 | 171 | #changelist-filter a:hover { 172 | color: #036; 173 | } 174 | 175 | #changelist-filter li.selected { 176 | border-left: 5px solid #eaeaea; 177 | padding-left: 10px; 178 | margin-left: -15px; 179 | } 180 | 181 | #changelist-filter li.selected a { 182 | color: #5b80b2; 183 | } 184 | 185 | /* DATE DRILLDOWN */ 186 | 187 | .change-list ul.toplinks { 188 | display: block; 189 | float: left; 190 | padding: 0; 191 | margin: 0; 192 | width: 100%; 193 | } 194 | 195 | .change-list ul.toplinks li { 196 | padding: 3px 6px; 197 | font-weight: bold; 198 | list-style-type: none; 199 | display: inline-block; 200 | } 201 | 202 | .change-list ul.toplinks .date-back a { 203 | color: #999; 204 | } 205 | 206 | .change-list ul.toplinks .date-back a:hover { 207 | color: #036; 208 | } 209 | 210 | /* PAGINATOR */ 211 | 212 | .paginator { 213 | font-size: 13px; 214 | padding-top: 10px; 215 | padding-bottom: 10px; 216 | line-height: 22px; 217 | margin: 0; 218 | border-top: 1px solid #ddd; 219 | } 220 | 221 | .paginator a:link, .paginator a:visited { 222 | padding: 2px 6px; 223 | background: #79aec8; 224 | text-decoration: none; 225 | color: #fff; 226 | } 227 | 228 | .paginator a.showall { 229 | padding: 0; 230 | border: none; 231 | background: none; 232 | color: #5b80b2; 233 | } 234 | 235 | .paginator a.showall:hover { 236 | color: #036; 237 | background: none; 238 | } 239 | 240 | .paginator .end { 241 | margin-right: 6px; 242 | } 243 | 244 | .paginator .this-page { 245 | padding: 2px 6px; 246 | font-weight: bold; 247 | font-size: 13px; 248 | vertical-align: top; 249 | } 250 | 251 | .paginator a:hover { 252 | color: white; 253 | background: #036; 254 | } 255 | 256 | /* ACTIONS */ 257 | 258 | .filtered .actions { 259 | margin-right: 280px; 260 | border-right: none; 261 | } 262 | 263 | #changelist table input { 264 | margin: 0; 265 | vertical-align: baseline; 266 | } 267 | 268 | #changelist table tbody tr.selected { 269 | background-color: #FFFFCC; 270 | } 271 | 272 | #changelist .actions { 273 | padding: 10px; 274 | background: #fff; 275 | border-top: none; 276 | border-bottom: none; 277 | line-height: 24px; 278 | color: #999; 279 | } 280 | 281 | #changelist .actions.selected { 282 | background: #fffccf; 283 | border-top: 1px solid #fffee8; 284 | border-bottom: 1px solid #edecd6; 285 | } 286 | 287 | #changelist .actions span.all, 288 | #changelist .actions span.action-counter, 289 | #changelist .actions span.clear, 290 | #changelist .actions span.question { 291 | font-size: 13px; 292 | margin: 0 0.5em; 293 | display: none; 294 | } 295 | 296 | #changelist .actions:last-child { 297 | border-bottom: none; 298 | } 299 | 300 | #changelist .actions select { 301 | vertical-align: top; 302 | height: 24px; 303 | background: none; 304 | border: 1px solid #ccc; 305 | border-radius: 4px; 306 | font-size: 14px; 307 | padding: 0 0 0 4px; 308 | margin: 0; 309 | margin-left: 10px; 310 | } 311 | 312 | #changelist .actions label { 313 | display: inline-block; 314 | vertical-align: middle; 315 | font-size: 13px; 316 | } 317 | 318 | #changelist .actions .button { 319 | font-size: 13px; 320 | border: 1px solid #ccc; 321 | border-radius: 4px; 322 | background: #fff; 323 | box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; 324 | cursor: pointer; 325 | height: 24px; 326 | line-height: 1; 327 | padding: 4px 8px; 328 | margin: 0; 329 | color: #333; 330 | } 331 | 332 | #changelist .actions .button:hover { 333 | border-color: #999; 334 | } 335 | -------------------------------------------------------------------------------- /flat/static/admin/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Roboto'; 3 | src: url('../fonts/Roboto-Bold-webfont.woff'); 4 | font-weight: 700; 5 | font-style: normal; 6 | } 7 | 8 | @font-face { 9 | font-family: 'Roboto'; 10 | src: url('../fonts/Roboto-Regular-webfont.woff'); 11 | font-weight: 400; 12 | font-style: normal; 13 | } 14 | 15 | @font-face { 16 | font-family: 'Roboto'; 17 | src: url('../fonts/Roboto-Light-webfont.woff'); 18 | font-weight: 300; 19 | font-style: normal; 20 | } 21 | -------------------------------------------------------------------------------- /flat/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: 13px; 9 | border-bottom: 1px solid #eee; 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 | .hidden { 26 | display: none; 27 | } 28 | 29 | /* FORM LABELS */ 30 | 31 | label { 32 | font-weight: normal; 33 | color: #666; 34 | font-size: 13px; 35 | } 36 | 37 | .required label, label.required { 38 | font-weight: bold; 39 | color: #333; 40 | } 41 | 42 | /* RADIO BUTTONS */ 43 | 44 | form ul.radiolist li { 45 | list-style-type: none; 46 | } 47 | 48 | form ul.radiolist label { 49 | float: none; 50 | display: inline; 51 | } 52 | 53 | form ul.radiolist input[type="radio"] { 54 | margin: -2px 4px 0 0; 55 | padding: 0; 56 | outline: none; 57 | } 58 | 59 | form ul.inline { 60 | margin-left: 0; 61 | padding: 0; 62 | } 63 | 64 | form ul.inline li { 65 | float: left; 66 | padding-right: 7px; 67 | } 68 | 69 | /* ALIGNED FIELDSETS */ 70 | 71 | .aligned label { 72 | display: block; 73 | padding: 4px 10px 0 0; 74 | float: left; 75 | width: 160px; 76 | word-wrap: break-word; 77 | line-height: 1; 78 | } 79 | 80 | .aligned label:not(.vCheckboxLabel):after { 81 | content: ''; 82 | display: inline-block; 83 | vertical-align: middle; 84 | height: 26px; 85 | } 86 | 87 | .aligned label + p { 88 | padding: 6px 0; 89 | margin-top: 0; 90 | margin-bottom: 0; 91 | margin-left: 170px; 92 | } 93 | 94 | .aligned ul label { 95 | display: inline; 96 | float: none; 97 | width: auto; 98 | } 99 | 100 | .aligned .form-row input { 101 | margin-bottom: 0; 102 | } 103 | 104 | .colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { 105 | width: 350px; 106 | } 107 | 108 | form .aligned ul { 109 | margin-left: 160px; 110 | padding-left: 10px; 111 | } 112 | 113 | form .aligned ul.radiolist { 114 | display: inline-block; 115 | margin: 0; 116 | padding: 0; 117 | } 118 | 119 | form .aligned p.help { 120 | clear: left; 121 | margin-top: 0; 122 | margin-left: 160px; 123 | padding-left: 10px; 124 | } 125 | 126 | form .aligned label + p.help { 127 | margin-left: 0; 128 | padding-left: 0; 129 | } 130 | 131 | form .aligned p.help:last-child { 132 | margin-bottom: 0; 133 | padding-bottom: 0; 134 | } 135 | 136 | form .aligned input + p.help, 137 | form .aligned textarea + p.help, 138 | form .aligned select + p.help { 139 | margin-left: 160px; 140 | padding-left: 10px; 141 | } 142 | 143 | form .aligned ul li { 144 | list-style: none; 145 | } 146 | 147 | form .aligned table p { 148 | margin-left: 0; 149 | padding-left: 0; 150 | } 151 | 152 | .aligned .vCheckboxLabel { 153 | float: none; 154 | width: auto; 155 | display: inline-block; 156 | vertical-align: -3px; 157 | padding: 0 0 5px 5px; 158 | } 159 | 160 | .aligned .vCheckboxLabel + p.help { 161 | margin-top: -4px; 162 | } 163 | 164 | .colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { 165 | width: 610px; 166 | } 167 | 168 | .checkbox-row p.help { 169 | margin-left: 0; 170 | padding-left: 0; 171 | } 172 | 173 | fieldset .field-box { 174 | float: left; 175 | margin-right: 20px; 176 | } 177 | 178 | /* WIDE FIELDSETS */ 179 | 180 | .wide label { 181 | width: 200px; 182 | } 183 | 184 | form .wide p, form .wide input + p.help { 185 | margin-left: 200px; 186 | } 187 | 188 | form .wide p.help { 189 | padding-left: 38px; 190 | } 191 | 192 | .colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { 193 | width: 450px; 194 | } 195 | 196 | /* COLLAPSED FIELDSETS */ 197 | 198 | fieldset.collapsed * { 199 | display: none; 200 | } 201 | 202 | fieldset.collapsed h2, fieldset.collapsed { 203 | display: block; 204 | } 205 | 206 | fieldset.collapsed { 207 | border: 1px solid #eee; 208 | border-radius: 4px; 209 | overflow: hidden; 210 | } 211 | 212 | fieldset.collapsed h2 { 213 | background: #f8f8f8; 214 | color: #666; 215 | } 216 | 217 | fieldset .collapse-toggle { 218 | color: #fff; 219 | } 220 | 221 | fieldset.collapsed .collapse-toggle { 222 | background: transparent; 223 | display: inline; 224 | color: #447e9b; 225 | } 226 | 227 | /* MONOSPACE TEXTAREAS */ 228 | 229 | fieldset.monospace textarea { 230 | font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; 231 | } 232 | 233 | /* SUBMIT ROW */ 234 | 235 | .submit-row { 236 | padding: 12px 14px; 237 | margin: 0 0 20px; 238 | background: #f8f8f8; 239 | border: 1px solid #eee; 240 | border-radius: 4px; 241 | text-align: right; 242 | overflow: hidden; 243 | } 244 | 245 | body.popup .submit-row { 246 | overflow: auto; 247 | } 248 | 249 | .submit-row input { 250 | height: 35px; 251 | line-height: 15px; 252 | margin: 0 0 0 5px; 253 | } 254 | 255 | .submit-row input.default { 256 | margin: 0 0 0 8px; 257 | text-transform: uppercase; 258 | } 259 | 260 | .submit-row p { 261 | margin: 0.3em; 262 | } 263 | 264 | .submit-row p.deletelink-box { 265 | float: left; 266 | margin: 0; 267 | } 268 | 269 | .submit-row a.deletelink { 270 | display: block; 271 | background: #ba2121; 272 | border-radius: 4px; 273 | padding: 10px 15px; 274 | height: 15px; 275 | line-height: 15px; 276 | color: #fff; 277 | } 278 | 279 | .submit-row a.deletelink:hover, 280 | .submit-row a.deletelink:active { 281 | background: #a41515; 282 | } 283 | 284 | /* CUSTOM FORM FIELDS */ 285 | 286 | .vSelectMultipleField { 287 | vertical-align: top; 288 | } 289 | 290 | .vCheckboxField { 291 | border: none; 292 | } 293 | 294 | .vDateField, .vTimeField { 295 | margin-right: 2px; 296 | margin-bottom: 4px; 297 | } 298 | 299 | .vDateField { 300 | min-width: 6.85em; 301 | } 302 | 303 | .vTimeField { 304 | min-width: 4.7em; 305 | } 306 | 307 | .vURLField { 308 | width: 30em; 309 | } 310 | 311 | .vLargeTextField, .vXMLLargeTextField { 312 | width: 48em; 313 | } 314 | 315 | .flatpages-flatpage #id_content { 316 | height: 40.2em; 317 | } 318 | 319 | .module table .vPositiveSmallIntegerField { 320 | width: 2.2em; 321 | } 322 | 323 | .vTextField { 324 | width: 20em; 325 | } 326 | 327 | .vIntegerField { 328 | width: 5em; 329 | } 330 | 331 | .vBigIntegerField { 332 | width: 10em; 333 | } 334 | 335 | .vForeignKeyRawIdAdminField { 336 | width: 5em; 337 | } 338 | 339 | /* INLINES */ 340 | 341 | .inline-group { 342 | padding: 0; 343 | margin: 0 0 30px; 344 | } 345 | 346 | .inline-group thead th { 347 | padding: 8px 10px; 348 | } 349 | 350 | .inline-group .aligned label { 351 | width: 160px; 352 | } 353 | 354 | .inline-related { 355 | position: relative; 356 | } 357 | 358 | .inline-related h3 { 359 | margin: 0; 360 | color: #666; 361 | padding: 5px; 362 | font-size: 13px; 363 | background: #f8f8f8; 364 | border-top: 1px solid #eee; 365 | border-bottom: 1px solid #eee; 366 | } 367 | 368 | .inline-related h3 span.delete { 369 | float: right; 370 | } 371 | 372 | .inline-related h3 span.delete label { 373 | margin-left: 2px; 374 | font-size: 11px; 375 | } 376 | 377 | .inline-related fieldset { 378 | margin: 0; 379 | background: #fff; 380 | border: none; 381 | width: 100%; 382 | } 383 | 384 | .inline-related fieldset.module h3 { 385 | margin: 0; 386 | padding: 2px 5px 3px 5px; 387 | font-size: 11px; 388 | text-align: left; 389 | font-weight: bold; 390 | background: #bcd; 391 | color: #fff; 392 | } 393 | 394 | .inline-group .tabular fieldset.module { 395 | border: none; 396 | } 397 | 398 | .inline-related.tabular fieldset.module table { 399 | width: 100%; 400 | } 401 | 402 | .last-related fieldset { 403 | border: none; 404 | } 405 | 406 | .inline-group .tabular tr.has_original td { 407 | padding-top: 2em; 408 | } 409 | 410 | .inline-group .tabular tr td.original { 411 | padding: 2px 0 0 0; 412 | width: 0; 413 | _position: relative; 414 | } 415 | 416 | .inline-group .tabular th.original { 417 | width: 0px; 418 | padding: 0; 419 | } 420 | 421 | .inline-group .tabular td.original p { 422 | position: absolute; 423 | left: 0; 424 | height: 1.1em; 425 | padding: 2px 9px; 426 | overflow: hidden; 427 | font-size: 9px; 428 | font-weight: bold; 429 | color: #666; 430 | _width: 700px; 431 | } 432 | 433 | .inline-group ul.tools { 434 | padding: 0; 435 | margin: 0; 436 | list-style: none; 437 | } 438 | 439 | .inline-group ul.tools li { 440 | display: inline; 441 | padding: 0 5px; 442 | } 443 | 444 | .inline-group div.add-row, 445 | .inline-group .tabular tr.add-row td { 446 | color: #666; 447 | background: #f8f8f8; 448 | padding: 8px 10px; 449 | border-bottom: 1px solid #eee; 450 | } 451 | 452 | .inline-group .tabular tr.add-row td { 453 | padding: 8px 10px; 454 | border-bottom: 1px solid #eee; 455 | } 456 | 457 | .inline-group ul.tools a.add, 458 | .inline-group div.add-row a, 459 | .inline-group .tabular tr.add-row td a { 460 | background: url(../img/svg/icon-addlink.svg) 0 1px no-repeat; 461 | padding-left: 16px; 462 | font-size: 12px; 463 | outline: 0; /* Remove dotted border around link */ 464 | } 465 | 466 | .empty-form { 467 | display: none; 468 | } 469 | 470 | /* RELATED FIELD ADD ONE / LOOKUP */ 471 | 472 | .add-another, .related-lookup { 473 | display: inline-block; 474 | vertical-align: middle; 475 | width: 16px; 476 | height: 16px; 477 | margin-left: 5px; 478 | background-repeat: no-repeat; 479 | background-size: 14px; 480 | } 481 | 482 | .add-another { 483 | background-image: url(../img/svg/icon-addlink.svg); 484 | } 485 | 486 | .related-lookup { 487 | background-image: url(../img/svg/search.svg); 488 | } 489 | 490 | .add-another img, .related-lookup img { 491 | display: none; 492 | } 493 | 494 | form .related-widget-wrapper ul { 495 | display: inline-block; 496 | margin-left: 0; 497 | padding-left: 0; 498 | } 499 | 500 | .clearable-file-input input { 501 | margin-top: 0; 502 | } 503 | -------------------------------------------------------------------------------- /flat/static/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | body.login { 4 | background: #f8f8f8; 5 | } 6 | 7 | .login #header { 8 | height: auto; 9 | padding: 5px 16px; 10 | } 11 | 12 | .login #header h1 { 13 | font-size: 18px; 14 | } 15 | 16 | .login #header h1 a { 17 | color: #fff; 18 | } 19 | 20 | .login #content { 21 | padding: 20px 20px 0; 22 | } 23 | 24 | .login #container { 25 | background: #fff; 26 | border: 1px solid #eaeaea; 27 | border-radius: 4px; 28 | overflow: hidden; 29 | width: 28em; 30 | min-width: 300px; 31 | margin: 100px auto; 32 | } 33 | 34 | .login #content-main { 35 | width: 100%; 36 | } 37 | 38 | .login .form-row { 39 | padding: 4px 0; 40 | float: left; 41 | width: 100%; 42 | border-bottom: none; 43 | } 44 | 45 | .login .form-row label { 46 | padding-right: 0.5em; 47 | line-height: 2em; 48 | font-size: 1em; 49 | clear: both; 50 | color: #333; 51 | } 52 | 53 | .login .form-row #id_username, .login .form-row #id_password { 54 | clear: both; 55 | padding: 8px; 56 | width: 100%; 57 | -webkit-box-sizing: border-box; 58 | -moz-box-sizing: border-box; 59 | box-sizing: border-box; 60 | } 61 | 62 | .login span.help { 63 | font-size: 10px; 64 | display: block; 65 | } 66 | 67 | .login .submit-row { 68 | clear: both; 69 | padding: 1em 0 0 9.4em; 70 | margin: 0; 71 | border: none; 72 | background: none; 73 | text-align: left; 74 | } 75 | 76 | .login .password-reset-link { 77 | text-align: center; 78 | } -------------------------------------------------------------------------------- /flat/static/admin/css/rtl.css: -------------------------------------------------------------------------------- 1 | body { 2 | direction: rtl; 3 | } 4 | 5 | /* LOGIN */ 6 | 7 | .login .form-row { 8 | float: right; 9 | } 10 | 11 | .login .form-row label { 12 | float: right; 13 | padding-left: 0.5em; 14 | padding-right: 0; 15 | text-align: left; 16 | } 17 | 18 | .login .submit-row { 19 | clear: both; 20 | padding: 1em 9.4em 0 0; 21 | } 22 | 23 | /* GLOBAL */ 24 | 25 | th { 26 | text-align: right; 27 | } 28 | 29 | .module h2, .module caption { 30 | text-align: right; 31 | } 32 | 33 | .module ul, .module ol { 34 | margin-left: 0; 35 | margin-right: 1.5em; 36 | } 37 | 38 | .addlink, .changelink { 39 | padding-left: 0px; 40 | padding-right: 16px; 41 | background-position: 100% 1px; 42 | } 43 | 44 | .deletelink { 45 | padding-left: 0px; 46 | padding-right: 16px; 47 | background-position: 100% 1px; 48 | } 49 | 50 | .object-tools { 51 | float: left; 52 | } 53 | 54 | thead th:first-child, 55 | tfoot td:first-child { 56 | border-left: none; 57 | } 58 | 59 | /* LAYOUT */ 60 | 61 | #user-tools { 62 | right: auto; 63 | left: 0; 64 | text-align: left; 65 | } 66 | 67 | div.breadcrumbs { 68 | text-align: right; 69 | } 70 | 71 | #content-main { 72 | float: right; 73 | } 74 | 75 | #content-related { 76 | float: left; 77 | margin-left: -300px; 78 | margin-right: auto; 79 | } 80 | 81 | .colMS { 82 | margin-left: 300px; 83 | margin-right: 0; 84 | } 85 | 86 | /* SORTABLE TABLES */ 87 | 88 | table thead th.sorted .sortoptions { 89 | float: left; 90 | } 91 | 92 | thead th.sorted .text { 93 | padding-right: 0; 94 | padding-left: 42px; 95 | } 96 | 97 | /* dashboard styles */ 98 | 99 | .dashboard .module table td a { 100 | padding-left: .6em; 101 | padding-right: 16px; 102 | } 103 | 104 | /* changelists styles */ 105 | 106 | .change-list .filtered table { 107 | border-left: none; 108 | border-right: 0px none; 109 | } 110 | 111 | #changelist-filter { 112 | right: auto; 113 | left: 0; 114 | border-left: none; 115 | border-right: none; 116 | } 117 | 118 | .change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { 119 | margin-right: 0px; 120 | margin-left: 280px; 121 | } 122 | 123 | #changelist-filter li.selected { 124 | border-left: none; 125 | padding-left: 10px; 126 | margin-left: 0; 127 | border-right: 5px solid #eaeaea; 128 | padding-right: 10px; 129 | margin-right: -15px; 130 | } 131 | 132 | .filtered .actions { 133 | margin-left: 280px; 134 | margin-right: 0; 135 | } 136 | 137 | #changelist table tbody td:first-child, #changelist table tbody th:first-child { 138 | border-right: none; 139 | border-left: none; 140 | } 141 | 142 | /* FORMS */ 143 | 144 | .aligned label { 145 | padding: 0 0 3px 1em; 146 | float: right; 147 | } 148 | 149 | .submit-row { 150 | text-align: left 151 | } 152 | 153 | .submit-row p.deletelink-box { 154 | float: right; 155 | } 156 | 157 | .submit-row input.default { 158 | margin-left: 0; 159 | } 160 | 161 | .vDateField, .vTimeField { 162 | margin-left: 2px; 163 | } 164 | 165 | .aligned .form-row input { 166 | margin-left: 5px; 167 | } 168 | 169 | form ul.inline li { 170 | float: right; 171 | padding-right: 0; 172 | padding-left: 7px; 173 | } 174 | 175 | input[type=submit].default, .submit-row input.default { 176 | float: left; 177 | } 178 | 179 | fieldset .field-box { 180 | float: right; 181 | margin-left: 20px; 182 | margin-right: 0; 183 | } 184 | 185 | .errorlist li { 186 | background-position: 100% 12px; 187 | padding: 0; 188 | } 189 | 190 | .errornote { 191 | background-position: 100% 12px; 192 | padding: 10px 12px; 193 | } 194 | 195 | /* WIDGETS */ 196 | 197 | .calendarnav-previous { 198 | top: 0; 199 | left: auto; 200 | right: 10px; 201 | } 202 | 203 | .calendarnav-next { 204 | top: 0; 205 | right: auto; 206 | left: 10px; 207 | } 208 | 209 | .calendar caption, .calendarbox h2 { 210 | text-align: center; 211 | } 212 | 213 | .selector { 214 | float: right; 215 | } 216 | 217 | .selector .selector-filter { 218 | text-align: right; 219 | } 220 | 221 | .inline-deletelink { 222 | float: left; 223 | } 224 | 225 | form .form-row p.datetime { 226 | overflow: hidden; 227 | } 228 | 229 | /* MISC */ 230 | 231 | .inline-related h2, .inline-group h2 { 232 | text-align: right 233 | } 234 | 235 | .inline-related h3 span.delete { 236 | padding-right: 20px; 237 | padding-left: inherit; 238 | left: 10px; 239 | right: inherit; 240 | float:left; 241 | } 242 | 243 | .inline-related h3 span.delete label { 244 | margin-left: inherit; 245 | margin-right: 2px; 246 | } 247 | 248 | /* IE7 specific bug fixes */ 249 | 250 | div.colM { 251 | position: relative; 252 | } 253 | 254 | .submit-row input { 255 | float: left; 256 | } 257 | -------------------------------------------------------------------------------- /flat/static/admin/css/widgets.css: -------------------------------------------------------------------------------- 1 | /* SELECTOR (FILTER INTERFACE) */ 2 | 3 | .selector { 4 | width: 800px; 5 | float: left; 6 | } 7 | 8 | .selector select { 9 | width: 380px; 10 | height: 17.2em; 11 | } 12 | 13 | .selector-available, .selector-chosen { 14 | float: left; 15 | width: 380px; 16 | text-align: center; 17 | margin-bottom: 5px; 18 | } 19 | 20 | .selector-chosen select { 21 | border-top: none; 22 | } 23 | 24 | .selector-available h2, .selector-chosen h2 { 25 | border: 1px solid #ccc; 26 | border-radius: 4px 4px 0 0; 27 | } 28 | 29 | .selector-chosen h2 { 30 | background: #79aec8; 31 | color: #fff; 32 | } 33 | 34 | .selector .selector-available h2 { 35 | background: #f8f8f8; 36 | color: #666; 37 | } 38 | 39 | .selector .selector-filter { 40 | background: white; 41 | border: 1px solid #ccc; 42 | border-width: 0 1px; 43 | padding: 8px; 44 | color: #999; 45 | font-size: 10px; 46 | margin: 0; 47 | text-align: left; 48 | } 49 | 50 | .selector .selector-filter label, 51 | .inline-group .aligned .selector .selector-filter label { 52 | float: left; 53 | margin: 7px 0 0; 54 | width: 18px; 55 | height: 18px; 56 | padding: 0; 57 | overflow: hidden; 58 | line-height: 1; 59 | } 60 | 61 | .selector .selector-available input { 62 | width: 320px; 63 | margin-left: 8px; 64 | } 65 | 66 | .selector ul.selector-chooser { 67 | float: left; 68 | width: 22px; 69 | background-color: #eee; 70 | border-radius: 10px; 71 | margin: 10em 5px 0 5px; 72 | padding: 0; 73 | } 74 | 75 | .selector-chooser li { 76 | margin: 0; 77 | padding: 3px; 78 | list-style-type: none; 79 | } 80 | 81 | .selector select { 82 | padding: 0 10px; 83 | margin: 0 0 10px; 84 | border-radius: 0 0 4px 4px; 85 | } 86 | 87 | .selector-add, .selector-remove { 88 | width: 16px; 89 | height: 16px; 90 | display: block; 91 | text-indent: -3000px; 92 | overflow: hidden; 93 | } 94 | 95 | .selector-add { 96 | background: url(../img/svg/selector-icons.svg) 0 -96px no-repeat; 97 | cursor: default; 98 | } 99 | 100 | .active.selector-add { 101 | background-position: 0 -112px; 102 | cursor: pointer; 103 | } 104 | 105 | .selector-remove { 106 | background: url(../img/svg/selector-icons.svg) 0 -64px no-repeat; 107 | cursor: default; 108 | } 109 | 110 | .active.selector-remove { 111 | background-position: 0 -80px; 112 | cursor: pointer; 113 | } 114 | 115 | a.selector-chooseall, a.selector-clearall { 116 | display: inline-block; 117 | height: 16px; 118 | text-align: left; 119 | margin: 1px auto 3px; 120 | overflow: hidden; 121 | font-weight: bold; 122 | line-height: 16px; 123 | color: #666; 124 | } 125 | 126 | a.selector-chooseall { 127 | padding: 0 18px 0 0; 128 | } 129 | 130 | a.selector-clearall { 131 | padding: 0 0 0 18px; 132 | } 133 | 134 | a.active.selector-chooseall:hover, a.active.selector-clearall:hover { 135 | color: #447e9b; 136 | } 137 | 138 | a.selector-chooseall { 139 | background: url(../img/svg/selector-icons.svg) right -160px no-repeat; 140 | cursor: default; 141 | } 142 | 143 | a.active.selector-chooseall { 144 | background-position: 100% -176px; 145 | cursor: pointer; 146 | } 147 | 148 | a.selector-clearall { 149 | background: url(../img/svg/selector-icons.svg) 0 -128px no-repeat; 150 | cursor: default; 151 | } 152 | 153 | a.active.selector-clearall { 154 | background-position: 0 -144px; 155 | cursor: pointer; 156 | } 157 | 158 | /* STACKED SELECTORS */ 159 | 160 | .stacked { 161 | float: left; 162 | width: 490px; 163 | } 164 | 165 | .stacked select { 166 | width: 480px; 167 | height: 10.1em; 168 | } 169 | 170 | .stacked .selector-available, .stacked .selector-chosen { 171 | width: 480px; 172 | } 173 | 174 | .stacked .selector-available { 175 | margin-bottom: 0; 176 | } 177 | 178 | .stacked .selector-available input { 179 | width: 422px; 180 | } 181 | 182 | .stacked ul.selector-chooser { 183 | height: 22px; 184 | width: 50px; 185 | margin: 0 0 10px 40%; 186 | background-color: #eee; 187 | border-radius: 10px; 188 | } 189 | 190 | .stacked .selector-chooser li { 191 | float: left; 192 | padding: 3px 3px 3px 5px; 193 | } 194 | 195 | .stacked .selector-chooseall, .stacked .selector-clearall { 196 | display: none; 197 | } 198 | 199 | .stacked .selector-add { 200 | background: url(../img/svg/selector-icons.svg) 0 -32px no-repeat; 201 | cursor: default; 202 | } 203 | 204 | .stacked .active.selector-add { 205 | background-position: 0 -48px; 206 | cursor: pointer; 207 | } 208 | 209 | .stacked .selector-remove { 210 | background: url(../img/svg/selector-icons.svg) 0 0 no-repeat; 211 | cursor: default; 212 | } 213 | 214 | .stacked .active.selector-remove { 215 | background-position: 0 -16px; 216 | cursor: pointer; 217 | } 218 | 219 | .selector .help-icon { 220 | background: url(../img/svg/icon-unknown.svg) 0 0 no-repeat; 221 | display: inline-block; 222 | vertical-align: middle; 223 | margin: -2px 0 0 2px; 224 | width: 13px; 225 | height: 13px; 226 | } 227 | 228 | .selector .selector-chosen .help-icon { 229 | background: url(../img/svg/icon-unknown-alt.svg) 0 0 no-repeat; 230 | } 231 | 232 | .selector .search-label-icon { 233 | background: url(../img/svg/search.svg) 0 0 no-repeat; 234 | display: inline-block; 235 | height: 18px; 236 | width: 18px; 237 | } 238 | 239 | /* DATE AND TIME */ 240 | 241 | p.datetime { 242 | line-height: 20px; 243 | margin: 0; 244 | padding: 0; 245 | color: #666; 246 | font-weight: bold; 247 | } 248 | 249 | form .form-row p.datetime { 250 | margin-left: 160px; 251 | padding-left: 10px; 252 | } 253 | 254 | form .tabular .form-row p.datetime { 255 | margin-left: 0; 256 | } 257 | 258 | .datetime span { 259 | white-space: nowrap; 260 | font-weight: normal; 261 | font-size: 11px; 262 | color: #ccc; 263 | } 264 | 265 | .datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { 266 | min-width: 0; 267 | margin-left: 5px; 268 | margin-bottom: 4px; 269 | } 270 | 271 | table p.datetime { 272 | font-size: 10px; 273 | margin-left: 0; 274 | padding-left: 0; 275 | } 276 | 277 | .datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { 278 | position: relative; 279 | display: inline-block; 280 | vertical-align: middle; 281 | height: 16px; 282 | width: 16px; 283 | overflow: hidden; 284 | } 285 | 286 | .datetimeshortcuts .clock-icon { 287 | background: url(../img/svg/icon-clock.svg) 0 0 no-repeat; 288 | } 289 | 290 | .datetimeshortcuts a:hover .clock-icon { 291 | background-position: 0 -16px; 292 | } 293 | 294 | .datetimeshortcuts .date-icon { 295 | background: url(../img/svg/icon-calendar.svg) 0 0 no-repeat; 296 | top: -1px; 297 | } 298 | 299 | .datetimeshortcuts a:hover .date-icon { 300 | background-position: 0 -16px; 301 | } 302 | 303 | .timezonewarning { 304 | font-size: 11px; 305 | color: #999; 306 | } 307 | 308 | /* URL */ 309 | 310 | p.url { 311 | line-height: 20px; 312 | margin: 0; 313 | padding: 0; 314 | color: #666; 315 | font-size: 11px; 316 | font-weight: bold; 317 | } 318 | 319 | .url a { 320 | font-weight: normal; 321 | } 322 | 323 | /* FILE UPLOADS */ 324 | 325 | p.file-upload { 326 | line-height: 20px; 327 | margin: 0; 328 | padding: 0; 329 | color: #666; 330 | font-size: 11px; 331 | font-weight: bold; 332 | } 333 | 334 | .aligned p.file-upload { 335 | margin-left: 170px; 336 | } 337 | 338 | .file-upload a { 339 | font-weight: normal; 340 | } 341 | 342 | .file-upload .deletelink { 343 | margin-left: 5px; 344 | } 345 | 346 | span.clearable-file-input label { 347 | color: #333; 348 | font-size: 11px; 349 | display: inline; 350 | float: none; 351 | } 352 | 353 | /* CALENDARS & CLOCKS */ 354 | 355 | .calendarbox, .clockbox { 356 | margin: 5px auto; 357 | font-size: 12px; 358 | width: 19em; 359 | text-align: center; 360 | background: white; 361 | border: 1px solid #ddd; 362 | border-radius: 4px; 363 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); 364 | overflow: hidden; 365 | position: relative; 366 | } 367 | 368 | .clockbox { 369 | width: auto; 370 | } 371 | 372 | .calendar { 373 | margin: 0; 374 | padding: 0; 375 | } 376 | 377 | .calendar table { 378 | margin: 0; 379 | padding: 0; 380 | border-collapse: collapse; 381 | background: white; 382 | width: 100%; 383 | } 384 | 385 | .calendar caption, .calendarbox h2 { 386 | margin: 0; 387 | text-align: center; 388 | border-top: none; 389 | background: #f5dd5d; 390 | font-weight: 700; 391 | font-size: 12px; 392 | color: #333; 393 | } 394 | 395 | .calendar th { 396 | padding: 8px 5px; 397 | background: #f8f8f8; 398 | border-bottom: 1px solid #ddd; 399 | font-weight: 400; 400 | font-size: 12px; 401 | text-align: center; 402 | color: #666; 403 | } 404 | 405 | .calendar td { 406 | font-weight: 400; 407 | font-size: 12px; 408 | text-align: center; 409 | padding: 0; 410 | border-top: 1px solid #eee; 411 | border-bottom: none; 412 | } 413 | 414 | .calendar td.selected a { 415 | background: #79aec8; 416 | color: #fff; 417 | } 418 | 419 | .calendar td.nonday { 420 | background: #f8f8f8; 421 | } 422 | 423 | .calendar td.today a { 424 | font-weight: 700; 425 | } 426 | 427 | .calendar td a, .timelist a { 428 | display: block; 429 | font-weight: 400; 430 | padding: 6px; 431 | text-decoration: none; 432 | color: #444; 433 | } 434 | 435 | .calendar td a:hover, .timelist a:hover { 436 | background: #79aec8; 437 | color: white; 438 | } 439 | 440 | .calendar td a:active, .timelist a:active { 441 | background: #417690; 442 | color: white; 443 | } 444 | 445 | .calendarnav { 446 | font-size: 10px; 447 | text-align: center; 448 | color: #ccc; 449 | margin: 0; 450 | padding: 1px 3px; 451 | } 452 | 453 | .calendarnav a:link, #calendarnav a:visited, #calendarnav a:hover { 454 | color: #999; 455 | } 456 | 457 | .calendar-shortcuts { 458 | background: white; 459 | font-size: 11px; 460 | line-height: 11px; 461 | border-top: 1px solid #eee; 462 | padding: 8px 0; 463 | color: #ccc; 464 | } 465 | 466 | .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { 467 | display: block; 468 | position: absolute; 469 | top: 8px; 470 | width: 15px; 471 | height: 15px; 472 | text-indent: -9999px; 473 | padding: 0; 474 | } 475 | 476 | .calendarnav-previous { 477 | left: 10px; 478 | background: url(../img/svg/calendar-icons.svg) 0 0 no-repeat; 479 | } 480 | 481 | .calendarbox .calendarnav-previous:hover { 482 | background-position: 0 -15px; 483 | } 484 | 485 | .calendarnav-next { 486 | right: 10px; 487 | background: url(../img/svg/calendar-icons.svg) 0 -30px no-repeat; 488 | } 489 | 490 | .calendarbox .calendarnav-next:hover { 491 | background-position: 0 -45px; 492 | } 493 | 494 | .calendar-cancel { 495 | margin: 0; 496 | padding: 4px 0; 497 | font-size: 12px; 498 | background: #eee; 499 | border-top: 1px solid #ddd; 500 | color: #333; 501 | } 502 | 503 | .calendar-cancel:hover { 504 | background: #ddd; 505 | } 506 | 507 | .calendar-cancel a { 508 | color: black; 509 | display: block; 510 | } 511 | 512 | ul.timelist, .timelist li { 513 | list-style-type: none; 514 | margin: 0; 515 | padding: 0; 516 | } 517 | 518 | .timelist a { 519 | padding: 2px; 520 | } 521 | 522 | /* EDIT INLINE */ 523 | 524 | .inline-deletelink { 525 | float: right; 526 | text-indent: -9999px; 527 | background: url(../img/svg/inline-delete.svg) 0 0 no-repeat; 528 | width: 16px; 529 | height: 16px; 530 | border: 0px none; 531 | outline: 0; /* Remove dotted border around link */ 532 | } 533 | 534 | .inline-deletelink:hover { 535 | cursor: pointer; 536 | } 537 | 538 | /* RELATED WIDGET WRAPPER */ 539 | .related-widget-wrapper { 540 | float: left; /* display properly in form rows with multiple fields */ 541 | overflow: hidden; /* clear floated contents */ 542 | } 543 | 544 | .related-widget-wrapper-link { 545 | opacity: 0.3; 546 | } 547 | 548 | .related-widget-wrapper-link:link { 549 | opacity: 1; 550 | } 551 | 552 | select + .related-widget-wrapper-link, 553 | .related-widget-wrapper-link + .related-widget-wrapper-link { 554 | margin-left: 7px; 555 | } 556 | -------------------------------------------------------------------------------- /flat/static/admin/fonts/LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /flat/static/admin/fonts/README.txt: -------------------------------------------------------------------------------- 1 | Roboto webfont source: https://code.google.com/p/roboto-webfont/ 2 | Weights used in this project: Light (300), Regular (400), Bold (700) 3 | -------------------------------------------------------------------------------- /flat/static/admin/fonts/Roboto-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /flat/static/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /flat/static/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /flat/static/admin/img/changelist-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/changelist-bg.gif -------------------------------------------------------------------------------- /flat/static/admin/img/changelist-bg_rtl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/changelist-bg_rtl.gif -------------------------------------------------------------------------------- /flat/static/admin/img/default-bg-reverse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/default-bg-reverse.gif -------------------------------------------------------------------------------- /flat/static/admin/img/default-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/default-bg.gif -------------------------------------------------------------------------------- /flat/static/admin/img/deleted-overlay.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/deleted-overlay.gif -------------------------------------------------------------------------------- /flat/static/admin/img/gis/move_vertex_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/gis/move_vertex_off.png -------------------------------------------------------------------------------- /flat/static/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /flat/static/admin/img/gis/move_vertex_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/gis/move_vertex_on.png -------------------------------------------------------------------------------- /flat/static/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /flat/static/admin/img/icon-no.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon-no.gif -------------------------------------------------------------------------------- /flat/static/admin/img/icon-unknown.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon-unknown.gif -------------------------------------------------------------------------------- /flat/static/admin/img/icon-yes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon-yes.gif -------------------------------------------------------------------------------- /flat/static/admin/img/icon_addlink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon_addlink.gif -------------------------------------------------------------------------------- /flat/static/admin/img/icon_alert.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon_alert.gif -------------------------------------------------------------------------------- /flat/static/admin/img/icon_calendar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon_calendar.gif -------------------------------------------------------------------------------- /flat/static/admin/img/icon_changelink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon_changelink.gif -------------------------------------------------------------------------------- /flat/static/admin/img/icon_clock.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon_clock.gif -------------------------------------------------------------------------------- /flat/static/admin/img/icon_deletelink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon_deletelink.gif -------------------------------------------------------------------------------- /flat/static/admin/img/icon_error.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon_error.gif -------------------------------------------------------------------------------- /flat/static/admin/img/icon_searchbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon_searchbox.png -------------------------------------------------------------------------------- /flat/static/admin/img/icon_success.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/icon_success.gif -------------------------------------------------------------------------------- /flat/static/admin/img/inline-delete-8bit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/inline-delete-8bit.png -------------------------------------------------------------------------------- /flat/static/admin/img/inline-delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/inline-delete.png -------------------------------------------------------------------------------- /flat/static/admin/img/inline-restore-8bit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/inline-restore-8bit.png -------------------------------------------------------------------------------- /flat/static/admin/img/inline-restore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/inline-restore.png -------------------------------------------------------------------------------- /flat/static/admin/img/inline-splitter-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/inline-splitter-bg.gif -------------------------------------------------------------------------------- /flat/static/admin/img/nav-bg-grabber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/nav-bg-grabber.gif -------------------------------------------------------------------------------- /flat/static/admin/img/nav-bg-reverse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/nav-bg-reverse.gif -------------------------------------------------------------------------------- /flat/static/admin/img/nav-bg-selected.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/nav-bg-selected.gif -------------------------------------------------------------------------------- /flat/static/admin/img/nav-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/nav-bg.gif -------------------------------------------------------------------------------- /flat/static/admin/img/selector-icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/selector-icons.gif -------------------------------------------------------------------------------- /flat/static/admin/img/selector-search.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/selector-search.gif -------------------------------------------------------------------------------- /flat/static/admin/img/sorting-icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/sorting-icons.gif -------------------------------------------------------------------------------- /flat/static/admin/img/svg/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Code Charm Ltd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | 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, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/README.txt: -------------------------------------------------------------------------------- 1 | All icons are taken from Font Awesome (http://fontawesome.io/) project. 2 | The Font Awesome font is licensed under the SIL OFL 1.1: 3 | - http://scripts.sil.org/OFL 4 | 5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG 6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license 7 | in current folder). 8 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/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 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/sorting-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/svg/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /flat/static/admin/img/tooltag-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/tooltag-add.png -------------------------------------------------------------------------------- /flat/static/admin/img/tooltag-arrowright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elky/django-flat-theme/368429e10ea6f7166e71a442d4b2a0361febb8d8/flat/static/admin/img/tooltag-arrowright.png -------------------------------------------------------------------------------- /flat/static/admin/js/SelectFilter2.js: -------------------------------------------------------------------------------- 1 | /* 2 | SelectFilter2 - Turns a multiple-select box into a filter interface. 3 | 4 | Requires core.js, SelectBox.js and addevent.js. 5 | */ 6 | (function($) { 7 | function findForm(node) { 8 | // returns the node of the form containing the given node 9 | if (node.tagName.toLowerCase() != 'form') { 10 | return findForm(node.parentNode); 11 | } 12 | return node; 13 | } 14 | 15 | window.SelectFilter = { 16 | init: function(field_id, field_name, is_stacked, admin_static_prefix) { 17 | if (field_id.match(/__prefix__/)){ 18 | // Don't initialize on empty forms. 19 | return; 20 | } 21 | var from_box = document.getElementById(field_id); 22 | from_box.id += '_from'; // change its ID 23 | from_box.className = 'filtered'; 24 | 25 | var ps = from_box.parentNode.getElementsByTagName('p'); 26 | for (var i=0; i, because it just gets in the way. 29 | from_box.parentNode.removeChild(ps[i]); 30 | } else if (ps[i].className.indexOf("help") != -1) { 31 | // Move help text up to the top so it isn't below the select 32 | // boxes or wrapped off on the side to the right of the add 33 | // button: 34 | from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild); 35 | } 36 | } 37 | 38 | //
or
39 | var selector_div = quickElement('div', from_box.parentNode); 40 | selector_div.className = is_stacked ? 'selector stacked' : 'selector'; 41 | 42 | //
43 | var selector_available = quickElement('div', selector_div); 44 | selector_available.className = 'selector-available'; 45 | var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); 46 | quickElement('span', title_available, '', 'class', 'help help-tooltip help-icon', 'title', interpolate(gettext('This is the list of available %s. You may choose some by selecting them in the box below and then clicking the "Choose" arrow between the two boxes.'), [field_name])); 47 | 48 | var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); 49 | filter_p.className = 'selector-filter'; 50 | 51 | var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + "_input"); 52 | 53 | var search_selector_img = quickElement('span', search_filter_label, '', 'class', 'help-tooltip search-label-icon', 'alt', '', 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name])); 54 | 55 | filter_p.appendChild(document.createTextNode(' ')); 56 | 57 | var filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); 58 | filter_input.id = field_id + '_input'; 59 | 60 | selector_available.appendChild(from_box); 61 | var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', 'javascript: (function(){ SelectBox.move_all("' + field_id + '_from", "' + field_id + '_to"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_add_all_link'); 62 | choose_all.className = 'selector-chooseall'; 63 | 64 | //
    65 | var selector_chooser = quickElement('ul', selector_div); 66 | selector_chooser.className = 'selector-chooser'; 67 | var add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_from","' + field_id + '_to"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_add_link'); 68 | add_link.className = 'selector-add'; 69 | var remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_to","' + field_id + '_from"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_remove_link'); 70 | remove_link.className = 'selector-remove'; 71 | 72 | //
    73 | var selector_chosen = quickElement('div', selector_div); 74 | selector_chosen.className = 'selector-chosen'; 75 | var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name])); 76 | quickElement('span', title_chosen, '', 'class', 'help help-tooltip help-icon', 'title', interpolate(gettext('This is the list of chosen %s. You may remove some by selecting them in the box below and then clicking the "Remove" arrow between the two boxes.'), [field_name])); 77 | 78 | var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name')); 79 | to_box.className = 'filtered'; 80 | var clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', 'javascript: (function() { SelectBox.move_all("' + field_id + '_to", "' + field_id + '_from"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_remove_all_link'); 81 | clear_all.className = 'selector-clearall'; 82 | 83 | from_box.setAttribute('name', from_box.getAttribute('name') + '_old'); 84 | 85 | // Set up the JavaScript event handlers for the select box filter interface 86 | addEvent(filter_input, 'keypress', function(e) { SelectFilter.filter_key_press(e, field_id); }); 87 | addEvent(filter_input, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); }); 88 | addEvent(filter_input, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); }); 89 | addEvent(from_box, 'change', function(e) { SelectFilter.refresh_icons(field_id) }); 90 | addEvent(to_box, 'change', function(e) { SelectFilter.refresh_icons(field_id) }); 91 | addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); SelectFilter.refresh_icons(field_id); }); 92 | addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); SelectFilter.refresh_icons(field_id); }); 93 | addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); }); 94 | SelectBox.init(field_id + '_from'); 95 | SelectBox.init(field_id + '_to'); 96 | // Move selected from_box options to to_box 97 | SelectBox.move(field_id + '_from', field_id + '_to'); 98 | 99 | if (!is_stacked) { 100 | // In horizontal mode, give the same height to the two boxes. 101 | var j_from_box = $(from_box); 102 | var j_to_box = $(to_box); 103 | var resize_filters = function() { j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight()); } 104 | if (j_from_box.outerHeight() > 0) { 105 | resize_filters(); // This fieldset is already open. Resize now. 106 | } else { 107 | // This fieldset is probably collapsed. Wait for its 'show' event. 108 | j_to_box.closest('fieldset').one('show.fieldset', resize_filters); 109 | } 110 | } 111 | 112 | // Initial icon refresh 113 | SelectFilter.refresh_icons(field_id); 114 | }, 115 | refresh_icons: function(field_id) { 116 | var from = $('#' + field_id + '_from'); 117 | var to = $('#' + field_id + '_to'); 118 | var is_from_selected = from.find('option:selected').length > 0; 119 | var is_to_selected = to.find('option:selected').length > 0; 120 | // Active if at least one item is selected 121 | $('#' + field_id + '_add_link').toggleClass('active', is_from_selected); 122 | $('#' + field_id + '_remove_link').toggleClass('active', is_to_selected); 123 | // Active if the corresponding box isn't empty 124 | $('#' + field_id + '_add_all_link').toggleClass('active', from.find('option').length > 0); 125 | $('#' + field_id + '_remove_all_link').toggleClass('active', to.find('option').length > 0); 126 | }, 127 | filter_key_press: function(event, field_id) { 128 | var from = document.getElementById(field_id + '_from'); 129 | // don't submit form if user pressed Enter 130 | if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) { 131 | from.selectedIndex = 0; 132 | SelectBox.move(field_id + '_from', field_id + '_to'); 133 | from.selectedIndex = 0; 134 | event.preventDefault() 135 | return false; 136 | } 137 | }, 138 | filter_key_up: function(event, field_id) { 139 | var from = document.getElementById(field_id + '_from'); 140 | var temp = from.selectedIndex; 141 | SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value); 142 | from.selectedIndex = temp; 143 | return true; 144 | }, 145 | filter_key_down: function(event, field_id) { 146 | var from = document.getElementById(field_id + '_from'); 147 | // right arrow -- move across 148 | if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) { 149 | var old_index = from.selectedIndex; 150 | SelectBox.move(field_id + '_from', field_id + '_to'); 151 | from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index; 152 | return false; 153 | } 154 | // down arrow -- wrap around 155 | if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) { 156 | from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1; 157 | } 158 | // up arrow -- wrap around 159 | if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) { 160 | from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1; 161 | } 162 | return true; 163 | } 164 | } 165 | 166 | })(django.jQuery); 167 | -------------------------------------------------------------------------------- /flat/static/admin/js/admin/DateTimeShortcuts.js: -------------------------------------------------------------------------------- 1 | // Inserts shortcut buttons after all of the following: 2 | // 3 | // 4 | 5 | var DateTimeShortcuts = { 6 | calendars: [], 7 | calendarInputs: [], 8 | clockInputs: [], 9 | dismissClockFunc: [], 10 | dismissCalendarFunc: [], 11 | calendarDivName1: 'calendarbox', // name of calendar
    that gets toggled 12 | calendarDivName2: 'calendarin', // name of
    that contains calendar 13 | calendarLinkName: 'calendarlink',// name of the link that is used to toggle 14 | clockDivName: 'clockbox', // name of clock
    that gets toggled 15 | clockLinkName: 'clocklink', // name of the link that is used to toggle 16 | shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts 17 | timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch 18 | timezoneOffset: 0, 19 | admin_media_prefix: '', 20 | init: function() { 21 | // Get admin_media_prefix by grabbing it off the window object. It's 22 | // set in the admin/base.html template, so if it's not there, someone's 23 | // overridden the template. In that case, we'll set a clearly-invalid 24 | // value in the hopes that someone will examine HTTP requests and see it. 25 | if (window.__admin_media_prefix__ != undefined) { 26 | DateTimeShortcuts.admin_media_prefix = window.__admin_media_prefix__; 27 | } else { 28 | DateTimeShortcuts.admin_media_prefix = '/missing-admin-media-prefix/'; 29 | } 30 | 31 | if (window.__admin_utc_offset__ != undefined) { 32 | var serverOffset = window.__admin_utc_offset__; 33 | var localOffset = new Date().getTimezoneOffset() * -60; 34 | DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; 35 | } 36 | 37 | var inputs = document.getElementsByTagName('input'); 38 | for (i=0; i 0) { 78 | message = ngettext( 79 | 'Note: You are %s hour ahead of server time.', 80 | 'Note: You are %s hours ahead of server time.', 81 | timezoneOffset 82 | ); 83 | } 84 | else { 85 | timezoneOffset *= -1 86 | message = ngettext( 87 | 'Note: You are %s hour behind server time.', 88 | 'Note: You are %s hours behind server time.', 89 | timezoneOffset 90 | ); 91 | } 92 | message = interpolate(message, [timezoneOffset]); 93 | 94 | var $warning = $(''); 95 | $warning.attr('class', warningClass); 96 | $warning.text(message); 97 | 98 | $(inp).parent() 99 | .append($('
    ')) 100 | .append($warning) 101 | }, 102 | // Add clock widget to a given field 103 | addClock: function(inp) { 104 | var num = DateTimeShortcuts.clockInputs.length; 105 | DateTimeShortcuts.clockInputs[num] = inp; 106 | DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; }; 107 | 108 | // Shortcut links (clock icon and "Now" link) 109 | var shortcuts_span = document.createElement('span'); 110 | shortcuts_span.className = DateTimeShortcuts.shortCutsClass; 111 | inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); 112 | var now_link = document.createElement('a'); 113 | now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", -1);"); 114 | now_link.appendChild(document.createTextNode(gettext('Now'))); 115 | var clock_link = document.createElement('a'); 116 | clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');'); 117 | clock_link.id = DateTimeShortcuts.clockLinkName + num; 118 | quickElement('span', clock_link, '', 'class', 'clock-icon', 'title', gettext('Clock')); 119 | shortcuts_span.appendChild(document.createTextNode('\240')); 120 | shortcuts_span.appendChild(now_link); 121 | shortcuts_span.appendChild(document.createTextNode('\240|\240')); 122 | shortcuts_span.appendChild(clock_link); 123 | 124 | // Create clock link div 125 | // 126 | // Markup looks like: 127 | //
    128 | //

    Choose a time

    129 | // 135 | //

    Cancel

    136 | //
    137 | 138 | var clock_box = document.createElement('div'); 139 | clock_box.style.display = 'none'; 140 | clock_box.style.position = 'absolute'; 141 | clock_box.className = 'clockbox module'; 142 | clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num); 143 | document.body.appendChild(clock_box); 144 | addEvent(clock_box, 'click', cancelEventPropagation); 145 | 146 | quickElement('h2', clock_box, gettext('Choose a time')); 147 | var time_list = quickElement('ul', clock_box); 148 | time_list.className = 'timelist'; 149 | quickElement("a", quickElement("li", time_list), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", -1);"); 150 | quickElement("a", quickElement("li", time_list), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 0);"); 151 | quickElement("a", quickElement("li", time_list), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 6);"); 152 | quickElement("a", quickElement("li", time_list), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 12);"); 153 | 154 | var cancel_p = quickElement('p', clock_box); 155 | cancel_p.className = 'calendar-cancel'; 156 | quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');'); 157 | django.jQuery(document).bind('keyup', function(event) { 158 | if (event.which == 27) { 159 | // ESC key closes popup 160 | DateTimeShortcuts.dismissClock(num); 161 | event.preventDefault(); 162 | } 163 | }); 164 | }, 165 | openClock: function(num) { 166 | var clock_box = document.getElementById(DateTimeShortcuts.clockDivName+num) 167 | var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName+num) 168 | 169 | // Recalculate the clockbox position 170 | // is it left-to-right or right-to-left layout ? 171 | if (getStyle(document.body,'direction')!='rtl') { 172 | clock_box.style.left = findPosX(clock_link) + 17 + 'px'; 173 | } 174 | else { 175 | // since style's width is in em, it'd be tough to calculate 176 | // px value of it. let's use an estimated px for now 177 | // TODO: IE returns wrong value for findPosX when in rtl mode 178 | // (it returns as it was left aligned), needs to be fixed. 179 | clock_box.style.left = findPosX(clock_link) - 110 + 'px'; 180 | } 181 | clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'; 182 | 183 | // Show the clock box 184 | clock_box.style.display = 'block'; 185 | addEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]); 186 | }, 187 | dismissClock: function(num) { 188 | document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none'; 189 | removeEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]); 190 | }, 191 | handleClockQuicklink: function(num, val) { 192 | var d; 193 | if (val == -1) { 194 | d = DateTimeShortcuts.now(); 195 | } 196 | else { 197 | d = new Date(1970, 1, 1, val, 0, 0, 0) 198 | } 199 | DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]); 200 | DateTimeShortcuts.clockInputs[num].focus(); 201 | DateTimeShortcuts.dismissClock(num); 202 | }, 203 | // Add calendar widget to a given field. 204 | addCalendar: function(inp) { 205 | var num = DateTimeShortcuts.calendars.length; 206 | 207 | DateTimeShortcuts.calendarInputs[num] = inp; 208 | DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; }; 209 | 210 | // Shortcut links (calendar icon and "Today" link) 211 | var shortcuts_span = document.createElement('span'); 212 | shortcuts_span.className = DateTimeShortcuts.shortCutsClass; 213 | inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); 214 | var today_link = document.createElement('a'); 215 | today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);'); 216 | today_link.appendChild(document.createTextNode(gettext('Today'))); 217 | var cal_link = document.createElement('a'); 218 | cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');'); 219 | cal_link.id = DateTimeShortcuts.calendarLinkName + num; 220 | quickElement('span', cal_link, '', 'class', 'date-icon', 'title', gettext('Choose a Date')); 221 | shortcuts_span.appendChild(document.createTextNode('\240')); 222 | shortcuts_span.appendChild(today_link); 223 | shortcuts_span.appendChild(document.createTextNode('\240|\240')); 224 | shortcuts_span.appendChild(cal_link); 225 | 226 | // Create calendarbox div. 227 | // 228 | // Markup looks like: 229 | // 230 | //
    231 | //

    232 | // 233 | // February 2003 234 | //

    235 | //
    236 | // 237 | //
    238 | //
    239 | // Yesterday | Today | Tomorrow 240 | //
    241 | //

    Cancel

    242 | //
    243 | var cal_box = document.createElement('div'); 244 | cal_box.style.display = 'none'; 245 | cal_box.style.position = 'absolute'; 246 | cal_box.className = 'calendarbox module'; 247 | cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num); 248 | document.body.appendChild(cal_box); 249 | addEvent(cal_box, 'click', cancelEventPropagation); 250 | 251 | // next-prev links 252 | var cal_nav = quickElement('div', cal_box); 253 | var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev('+num+');'); 254 | cal_nav_prev.className = 'calendarnav-previous'; 255 | var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext('+num+');'); 256 | cal_nav_next.className = 'calendarnav-next'; 257 | 258 | // main box 259 | var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num); 260 | cal_main.className = 'calendar'; 261 | DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num)); 262 | DateTimeShortcuts.calendars[num].drawCurrent(); 263 | 264 | // calendar shortcuts 265 | var shortcuts = quickElement('div', cal_box); 266 | shortcuts.className = 'calendar-shortcuts'; 267 | quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', -1);'); 268 | shortcuts.appendChild(document.createTextNode('\240|\240')); 269 | quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);'); 270 | shortcuts.appendChild(document.createTextNode('\240|\240')); 271 | quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', +1);'); 272 | 273 | // cancel bar 274 | var cancel_p = quickElement('p', cal_box); 275 | cancel_p.className = 'calendar-cancel'; 276 | quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');'); 277 | django.jQuery(document).bind('keyup', function(event) { 278 | if (event.which == 27) { 279 | // ESC key closes popup 280 | DateTimeShortcuts.dismissCalendar(num); 281 | event.preventDefault(); 282 | } 283 | }); 284 | }, 285 | openCalendar: function(num) { 286 | var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1+num) 287 | var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName+num) 288 | var inp = DateTimeShortcuts.calendarInputs[num]; 289 | 290 | // Determine if the current value in the input has a valid date. 291 | // If so, draw the calendar with that date's year and month. 292 | if (inp.value) { 293 | var format = get_format('DATE_INPUT_FORMATS')[0]; 294 | var selected = inp.value.strptime(format); 295 | var year = selected.getFullYear(); 296 | var month = selected.getMonth() + 1; 297 | var re = /\d{4}/ 298 | if (re.test(year.toString()) && month >= 1 && month <= 12) { 299 | DateTimeShortcuts.calendars[num].drawDate(month, year, selected); 300 | } 301 | } 302 | 303 | // Recalculate the clockbox position 304 | // is it left-to-right or right-to-left layout ? 305 | if (getStyle(document.body,'direction')!='rtl') { 306 | cal_box.style.left = findPosX(cal_link) + 17 + 'px'; 307 | } 308 | else { 309 | // since style's width is in em, it'd be tough to calculate 310 | // px value of it. let's use an estimated px for now 311 | // TODO: IE returns wrong value for findPosX when in rtl mode 312 | // (it returns as it was left aligned), needs to be fixed. 313 | cal_box.style.left = findPosX(cal_link) - 180 + 'px'; 314 | } 315 | cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px'; 316 | 317 | cal_box.style.display = 'block'; 318 | addEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]); 319 | }, 320 | dismissCalendar: function(num) { 321 | document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'none'; 322 | removeEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]); 323 | }, 324 | drawPrev: function(num) { 325 | DateTimeShortcuts.calendars[num].drawPreviousMonth(); 326 | }, 327 | drawNext: function(num) { 328 | DateTimeShortcuts.calendars[num].drawNextMonth(); 329 | }, 330 | handleCalendarCallback: function(num) { 331 | var format = get_format('DATE_INPUT_FORMATS')[0]; 332 | // the format needs to be escaped a little 333 | format = format.replace('\\', '\\\\'); 334 | format = format.replace('\r', '\\r'); 335 | format = format.replace('\n', '\\n'); 336 | format = format.replace('\t', '\\t'); 337 | format = format.replace("'", "\\'"); 338 | return ["function(y, m, d) { DateTimeShortcuts.calendarInputs[", 339 | num, 340 | "].value = new Date(y, m-1, d).strftime('", 341 | format, 342 | "');DateTimeShortcuts.calendarInputs[", 343 | num, 344 | "].focus();document.getElementById(DateTimeShortcuts.calendarDivName1+", 345 | num, 346 | ").style.display='none';}"].join(''); 347 | }, 348 | handleCalendarQuickLink: function(num, offset) { 349 | var d = DateTimeShortcuts.now(); 350 | d.setDate(d.getDate() + offset) 351 | DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]); 352 | DateTimeShortcuts.calendarInputs[num].focus(); 353 | DateTimeShortcuts.dismissCalendar(num); 354 | } 355 | } 356 | 357 | addEvent(window, 'load', DateTimeShortcuts.init); 358 | -------------------------------------------------------------------------------- /flat/static/admin/js/core.js: -------------------------------------------------------------------------------- 1 | // Core javascript helper functions 2 | 3 | // basic browser identification & version 4 | var isOpera = (navigator.userAgent.indexOf("Opera")>=0) && parseFloat(navigator.appVersion); 5 | var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]); 6 | 7 | // Cross-browser event handlers. 8 | function addEvent(obj, evType, fn) { 9 | if (obj.addEventListener) { 10 | obj.addEventListener(evType, fn, false); 11 | return true; 12 | } else if (obj.attachEvent) { 13 | var r = obj.attachEvent("on" + evType, fn); 14 | return r; 15 | } else { 16 | return false; 17 | } 18 | } 19 | 20 | function removeEvent(obj, evType, fn) { 21 | if (obj.removeEventListener) { 22 | obj.removeEventListener(evType, fn, false); 23 | return true; 24 | } else if (obj.detachEvent) { 25 | obj.detachEvent("on" + evType, fn); 26 | return true; 27 | } else { 28 | return false; 29 | } 30 | } 31 | 32 | function cancelEventPropagation(e) { 33 | if (!e) e = window.event; 34 | e.cancelBubble = true; 35 | if (e.stopPropagation) e.stopPropagation(); 36 | } 37 | 38 | // quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); 39 | function quickElement() { 40 | var obj = document.createElement(arguments[0]); 41 | if (arguments[2]) { 42 | var textNode = document.createTextNode(arguments[2]); 43 | obj.appendChild(textNode); 44 | } 45 | var len = arguments.length; 46 | for (var i = 3; i < len; i += 2) { 47 | obj.setAttribute(arguments[i], arguments[i+1]); 48 | } 49 | arguments[1].appendChild(obj); 50 | return obj; 51 | } 52 | 53 | // "a" is reference to an object 54 | function removeChildren(a) { 55 | while (a.hasChildNodes()) a.removeChild(a.lastChild); 56 | } 57 | 58 | // ---------------------------------------------------------------------------- 59 | // Cross-browser xmlhttp object 60 | // from http://jibbering.com/2002/4/httprequest.html 61 | // ---------------------------------------------------------------------------- 62 | var xmlhttp; 63 | /*@cc_on @*/ 64 | /*@if (@_jscript_version >= 5) 65 | try { 66 | xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 67 | } catch (e) { 68 | try { 69 | xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 70 | } catch (E) { 71 | xmlhttp = false; 72 | } 73 | } 74 | @else 75 | xmlhttp = false; 76 | @end @*/ 77 | if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { 78 | xmlhttp = new XMLHttpRequest(); 79 | } 80 | 81 | // ---------------------------------------------------------------------------- 82 | // Find-position functions by PPK 83 | // See http://www.quirksmode.org/js/findpos.html 84 | // ---------------------------------------------------------------------------- 85 | function findPosX(obj) { 86 | var curleft = 0; 87 | if (obj.offsetParent) { 88 | while (obj.offsetParent) { 89 | curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft); 90 | obj = obj.offsetParent; 91 | } 92 | // IE offsetParent does not include the top-level 93 | if (isIE && obj.parentElement){ 94 | curleft += obj.offsetLeft - obj.scrollLeft; 95 | } 96 | } else if (obj.x) { 97 | curleft += obj.x; 98 | } 99 | return curleft; 100 | } 101 | 102 | function findPosY(obj) { 103 | var curtop = 0; 104 | if (obj.offsetParent) { 105 | while (obj.offsetParent) { 106 | curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop); 107 | obj = obj.offsetParent; 108 | } 109 | // IE offsetParent does not include the top-level 110 | if (isIE && obj.parentElement){ 111 | curtop += obj.offsetTop - obj.scrollTop; 112 | } 113 | } else if (obj.y) { 114 | curtop += obj.y; 115 | } 116 | return curtop; 117 | } 118 | 119 | //----------------------------------------------------------------------------- 120 | // Date object extensions 121 | // ---------------------------------------------------------------------------- 122 | 123 | Date.prototype.getTwelveHours = function() { 124 | hours = this.getHours(); 125 | if (hours == 0) { 126 | return 12; 127 | } 128 | else { 129 | return hours <= 12 ? hours : hours-12 130 | } 131 | } 132 | 133 | Date.prototype.getTwoDigitMonth = function() { 134 | return (this.getMonth() < 9) ? '0' + (this.getMonth()+1) : (this.getMonth()+1); 135 | } 136 | 137 | Date.prototype.getTwoDigitDate = function() { 138 | return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); 139 | } 140 | 141 | Date.prototype.getTwoDigitTwelveHour = function() { 142 | return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); 143 | } 144 | 145 | Date.prototype.getTwoDigitHour = function() { 146 | return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); 147 | } 148 | 149 | Date.prototype.getTwoDigitMinute = function() { 150 | return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); 151 | } 152 | 153 | Date.prototype.getTwoDigitSecond = function() { 154 | return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); 155 | } 156 | 157 | Date.prototype.getHourMinute = function() { 158 | return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute(); 159 | } 160 | 161 | Date.prototype.getHourMinuteSecond = function() { 162 | return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond(); 163 | } 164 | 165 | Date.prototype.strftime = function(format) { 166 | var fields = { 167 | c: this.toString(), 168 | d: this.getTwoDigitDate(), 169 | H: this.getTwoDigitHour(), 170 | I: this.getTwoDigitTwelveHour(), 171 | m: this.getTwoDigitMonth(), 172 | M: this.getTwoDigitMinute(), 173 | p: (this.getHours() >= 12) ? 'PM' : 'AM', 174 | S: this.getTwoDigitSecond(), 175 | w: '0' + this.getDay(), 176 | x: this.toLocaleDateString(), 177 | X: this.toLocaleTimeString(), 178 | y: ('' + this.getFullYear()).substr(2, 4), 179 | Y: '' + this.getFullYear(), 180 | '%' : '%' 181 | }; 182 | var result = '', i = 0; 183 | while (i < format.length) { 184 | if (format.charAt(i) === '%') { 185 | result = result + fields[format.charAt(i + 1)]; 186 | ++i; 187 | } 188 | else { 189 | result = result + format.charAt(i); 190 | } 191 | ++i; 192 | } 193 | return result; 194 | } 195 | 196 | // ---------------------------------------------------------------------------- 197 | // String object extensions 198 | // ---------------------------------------------------------------------------- 199 | String.prototype.pad_left = function(pad_length, pad_string) { 200 | var new_string = this; 201 | for (var i = 0; new_string.length < pad_length; i++) { 202 | new_string = pad_string + new_string; 203 | } 204 | return new_string; 205 | } 206 | 207 | String.prototype.strptime = function(format) { 208 | var split_format = format.split(/[.\-/]/); 209 | var date = this.split(/[.\-/]/); 210 | var i = 0; 211 | while (i < split_format.length) { 212 | switch (split_format[i]) { 213 | case "%d": 214 | var day = date[i]; 215 | break; 216 | case "%m": 217 | var month = date[i] - 1; 218 | break; 219 | case "%Y": 220 | var year = date[i]; 221 | break; 222 | case "%y": 223 | var year = date[i]; 224 | break; 225 | } 226 | ++i; 227 | }; 228 | return new Date(year, month, day); 229 | } 230 | 231 | // ---------------------------------------------------------------------------- 232 | // Get the computed style for and element 233 | // ---------------------------------------------------------------------------- 234 | function getStyle(oElm, strCssRule){ 235 | var strValue = ""; 236 | if(document.defaultView && document.defaultView.getComputedStyle){ 237 | strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); 238 | } 239 | else if(oElm.currentStyle){ 240 | strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){ 241 | return p1.toUpperCase(); 242 | }); 243 | strValue = oElm.currentStyle[strCssRule]; 244 | } 245 | return strValue; 246 | } 247 | -------------------------------------------------------------------------------- /flat/templates/admin/base_site.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base.html" %} 2 | 3 | {% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} 4 | 5 | {% block branding %} 6 |

    {{ site_header|default:_('Django administration') }}

    7 | {% endblock %} 8 | 9 | {% block nav-global %}{% endblock %} 10 | 11 | {% block bodyclass %}flat-theme{% endblock %} 12 | -------------------------------------------------------------------------------- /flat/templates/admin/edit_inline/tabular.html: -------------------------------------------------------------------------------- 1 | {% load i18n admin_urls admin_static admin_modify %} 2 |
    3 | 72 |
    73 | 74 | 84 | -------------------------------------------------------------------------------- /flat/templates/admin/related_widget_wrapper.html: -------------------------------------------------------------------------------- 1 | {% load i18n admin_static %} 2 | 28 | -------------------------------------------------------------------------------- /flat/templates/admin/search_form.html: -------------------------------------------------------------------------------- 1 | {% load i18n admin_static %} 2 | {% if cl.search_fields %} 3 |
    16 | 17 | {% endif %} 18 | -------------------------------------------------------------------------------- /flat/templates/gis/admin/openlayers.html: -------------------------------------------------------------------------------- 1 | {% block extrastyle %} 2 | {% load i18n static %}{% get_current_language_bidi as LANGUAGE_BIDI %} 3 | 17 | 26 | {% endblock %} 27 | 28 | 33 |
    34 | {% if editable %} 35 | {% trans "Delete all Features" %} 36 | {% endif %} 37 | {% if display_wkt %}

    {% trans "WKT debugging window:" %}

    {% endif %} 38 | 39 | 40 |
    41 | -------------------------------------------------------------------------------- /flat/templates/gis/openlayers.html: -------------------------------------------------------------------------------- 1 | 15 | 16 |
    17 |
    18 | {% trans "Delete all Features" %} 19 | {% if display_raw %}

    {% trans "Debugging window (serialized value)" %}

    {% endif %} 20 | 21 | 34 |
    35 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | description-file = README.rst -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import find_packages, setup 2 | 3 | setup( 4 | name = 'django-flat-theme', 5 | packages = find_packages(), 6 | version = __import__('flat').__version__, 7 | author = 'Alex D', 8 | author_email = 'mail@elky.me', 9 | description = ('A flat theme for Django admin interface. Modern, fresh, simple.'), 10 | license = 'BSD', 11 | url = 'https://github.com/elky/django-flat-theme', 12 | download_url = 'https://github.com/elky/django-flat-theme/tarball/1.1.3', 13 | keywords = ['django', 'admin', 'theme', 'interface'], 14 | include_package_data = True, 15 | classifiers=[ 16 | 'Development Status :: 5 - Production/Stable', 17 | 'Environment :: Web Environment', 18 | 'Framework :: Django', 19 | 'Intended Audience :: Developers', 20 | 'License :: OSI Approved :: BSD License', 21 | 'Operating System :: OS Independent', 22 | 'Programming Language :: Python', 23 | 'Programming Language :: Python :: 2', 24 | 'Programming Language :: Python :: 2.7', 25 | 'Programming Language :: Python :: 3', 26 | 'Programming Language :: Python :: 3.4', 27 | 'Programming Language :: Python :: 3.5', 28 | ], 29 | ) 30 | --------------------------------------------------------------------------------