From 77275e510b5910d1f4b52284c2d5d1812e58f25c Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Fri, 24 Jan 2014 17:34:26 +0000 Subject: [PATCH] Move verdantadmin app to django-wagtail package --- wagtail/wagtailadmin/__init__.py | 0 wagtail/wagtailadmin/edit_handlers.py | 639 + wagtail/wagtailadmin/forms.py | 30 + wagtail/wagtailadmin/hooks.py | 31 + wagtail/wagtailadmin/menu.py | 14 + wagtail/wagtailadmin/modal_workflow.py | 25 + wagtail/wagtailadmin/models.py | 3 + .../css/components/dropdowns.less | 223 + .../wagtailadmin/css/components/explorer.less | 924 + .../css/components/formatters.less | 136 + .../wagtailadmin/css/components/forms.less | 626 + .../wagtailadmin/css/components/icons.less | 225 + .../wagtailadmin/css/components/listing.less | 446 + .../wagtailadmin/css/components/messages.less | 54 + .../wagtailadmin/css/components/modals.less | 96 + .../wagtailadmin/css/components/tabs.less | 76 + .../static/wagtailadmin/css/core.less | 727 + .../static/wagtailadmin/css/fonts/verdant.eot | Bin 0 -> 10346 bytes .../static/wagtailadmin/css/fonts/verdant.svg | 62 + .../static/wagtailadmin/css/fonts/verdant.ttf | Bin 0 -> 10184 bytes .../wagtailadmin/css/fonts/verdant.woff | Bin 0 -> 6028 bytes .../static/wagtailadmin/css/grid.less | 88 + .../static/wagtailadmin/css/layouts/home.less | 58 + .../wagtailadmin/css/layouts/login.less | 175 + .../wagtailadmin/css/layouts/page-editor.less | 158 + .../static/wagtailadmin/css/mixins.less | 91 + .../static/wagtailadmin/css/normalize.css | 533 + .../wagtailadmin/css/panels/rich-text.less | 141 + .../static/wagtailadmin/css/variables.less | 51 + .../jquery-ui/images/animated-overlay.gif | Bin 0 -> 1738 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 212 bytes .../images/ui-bg_flat_100_246060_40x100.png | Bin 0 -> 206 bytes .../images/ui-bg_flat_100_49c0c1_40x100.png | Bin 0 -> 206 bytes .../images/ui-bg_flat_100_e8f8f9_40x100.png | Bin 0 -> 206 bytes .../images/ui-bg_flat_100_f7474e_40x100.png | Bin 0 -> 206 bytes .../images/ui-bg_flat_100_ffffff_40x100.png | Bin 0 -> 208 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 208 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 335 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 332 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 280 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 6992 bytes .../images/ui-icons_49c0c1_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 6999 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 6299 bytes .../jquery-ui/jquery-ui-1.10.3.verdant.css | 1177 ++ .../vendor/jquery-ui/jquery-ui-smoothness.css | 1177 ++ .../wagtailadmin/css/vendor/jquery.tagit.css | 66 + .../css/vendor/jquery.timepicker.css | 67 + .../css/vendor/tagit.ui-zendesk.css | 56 + .../static/wagtailadmin/images/spinner.gif | Bin 0 -> 6820 bytes .../static/wagtailadmin/js/core.js | 105 + .../wagtailadmin/js/expanding_formset.js | 28 + .../js/hallo-plugins/hallo-hr.coffee | 28 + .../js/hallo-plugins/hallo-verdant-toolbar.js | 97 + .../js/hallo-plugins/hallo-verdantlink.coffee | 68 + .../static/wagtailadmin/js/modal-workflow.js | 78 + .../static/wagtailadmin/js/page-chooser.js | 31 + .../static/wagtailadmin/js/page-editor.js | 251 + .../wagtailadmin/js/vendor/bootstrap-modal.js | 246 + .../wagtailadmin/js/vendor/bootstrap-tab.js | 138 + .../static/wagtailadmin/js/vendor/hallo.js | 2949 +++ .../wagtailadmin/js/vendor/jquery-1.10.3.js | 6 + .../js/vendor/jquery-ui-1.10.3.js | 14971 ++++++++++++++++ .../wagtailadmin/js/vendor/jquery.autosize.js | 242 + .../wagtailadmin/js/vendor/jquery.dlmenu.js | 255 + .../js/vendor/jquery.timepicker.min.js | 1 + .../js/vendor/modernizr-2.6.2.min.js | 4 + .../wagtailadmin/js/vendor/rangy-core.js | 94 + .../static/wagtailadmin/js/vendor/tag-it.js | 541 + wagtail/wagtailadmin/taggable.py | 65 + wagtail/wagtailadmin/tasks.py | 68 + .../templates/wagtailadmin/base.html | 35 + .../wagtailadmin/chooser/_link_types.html | 21 + .../wagtailadmin/chooser/_search_behaviour.js | 31 + .../wagtailadmin/chooser/_search_form.html | 8 + .../wagtailadmin/chooser/_search_results.html | 18 + .../wagtailadmin/chooser/browse.html | 14 + .../templates/wagtailadmin/chooser/browse.js | 17 + .../wagtailadmin/chooser/email_link.html | 17 + .../wagtailadmin/chooser/email_link.js | 11 + .../wagtailadmin/chooser/external_link.html | 17 + .../wagtailadmin/chooser/external_link.js | 11 + .../chooser/external_link_chosen.js | 7 + .../wagtailadmin/chooser/search.html | 13 + .../templates/wagtailadmin/chooser/search.js | 9 + .../edit_handlers/chooser_panel.html | 32 + .../edit_handlers/field_panel_field.html | 18 + .../edit_handlers/field_panel_object.html | 6 + .../edit_handlers/inline_panel.html | 14 + .../edit_handlers/inline_panel.js | 17 + .../edit_handlers/inline_panel_child.html | 10 + .../edit_handlers/multi_field_panel.html | 10 + .../edit_handlers/object_list.html | 13 + .../edit_handlers/page_chooser_panel.html | 13 + .../edit_handlers/tabbed_interface.html | 13 + .../templates/wagtailadmin/home.html | 35 + .../home/pages_for_moderation.html | 47 + .../wagtailadmin/home/recent_edits.html | 33 + .../wagtailadmin/home/site_summary.html | 8 + .../templates/wagtailadmin/login.html | 56 + .../wagtailadmin/notifications/approved.html | 4 + .../wagtailadmin/notifications/rejected.html | 4 + .../wagtailadmin/notifications/submitted.html | 5 + .../wagtailadmin/pages/_editor_css.html | 19 + .../wagtailadmin/pages/_editor_js.html | 39 + .../pages/_moderator_userbar.html | 17 + .../wagtailadmin/pages/add_subpage.html | 35 + .../wagtailadmin/pages/confirm_delete.html | 20 + .../wagtailadmin/pages/confirm_move.html | 21 + .../wagtailadmin/pages/confirm_unpublish.html | 16 + .../wagtailadmin/pages/content_type_use.html | 14 + .../templates/wagtailadmin/pages/create.html | 43 + .../templates/wagtailadmin/pages/edit.html | 77 + .../templates/wagtailadmin/pages/index.html | 77 + .../templates/wagtailadmin/pages/list.html | 216 + .../pages/move_choose_destination.html | 19 + .../pages/preview_placeholder.html | 18 + .../templates/wagtailadmin/pages/search.html | 55 + .../wagtailadmin/pages/search_results.html | 39 + .../wagtailadmin/pages/select_location.html | 12 + .../wagtailadmin/pages/select_type.html | 20 + .../wagtailadmin/shared/explorer_nav.html | 13 + .../wagtailadmin/shared/field_as_li.html | 21 + .../wagtailadmin/shared/main_nav.html | 33 + .../wagtailadmin/shared/pagination_nav.html | 29 + .../wagtailadmin/shared/tag_field_css.html | 4 + .../wagtailadmin/shared/tag_field_js.html | 13 + .../templates/wagtailadmin/skeleton.html | 58 + wagtail/wagtailadmin/templatetags/__init__.py | 0 .../wagtailadmin/templatetags/ellipsistrim.py | 12 + .../wagtailadmin/templatetags/fieldtype.py | 13 + wagtail/wagtailadmin/templatetags/gravatar.py | 42 + .../templatetags/meta_description.py | 13 + .../templatetags/page_permissions.py | 19 + .../templatetags/verdantuserbar.py | 12 + .../templatetags/wagtailadmin_nav.py | 73 + wagtail/wagtailadmin/tests.py | 16 + wagtail/wagtailadmin/urls.py | 50 + wagtail/wagtailadmin/views/__init__.py | 0 wagtail/wagtailadmin/views/chooser.py | 142 + wagtail/wagtailadmin/views/home.py | 75 + wagtail/wagtailadmin/views/pages.py | 620 + wagtail/wagtailadmin/views/tags.py | 16 + wagtail/wagtailcore/fields.py | 2 +- 150 files changed, 31040 insertions(+), 1 deletion(-) create mode 100644 wagtail/wagtailadmin/__init__.py create mode 100644 wagtail/wagtailadmin/edit_handlers.py create mode 100644 wagtail/wagtailadmin/forms.py create mode 100644 wagtail/wagtailadmin/hooks.py create mode 100644 wagtail/wagtailadmin/menu.py create mode 100644 wagtail/wagtailadmin/modal_workflow.py create mode 100644 wagtail/wagtailadmin/models.py create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/components/dropdowns.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/components/explorer.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/components/formatters.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/components/forms.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/components/icons.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/components/listing.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/components/messages.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/components/modals.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/components/tabs.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/core.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.eot create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.svg create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.ttf create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.woff create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/grid.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/layouts/home.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/layouts/login.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/layouts/page-editor.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/mixins.less create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/normalize.css create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/panels/rich-text.less create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/css/variables.less create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/animated-overlay.gif create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_246060_40x100.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_49c0c1_40x100.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_e8f8f9_40x100.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_f7474e_40x100.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_ffffff_40x100.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_222222_256x240.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_2e83ff_256x240.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_454545_256x240.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_49c0c1_256x240.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_888888_256x240.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_cd0a0a_256x240.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_ffffff_256x240.png create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/jquery-ui-1.10.3.verdant.css create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/jquery-ui-smoothness.css create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery.tagit.css create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery.timepicker.css create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/css/vendor/tagit.ui-zendesk.css create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/images/spinner.gif create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/core.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/expanding_formset.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-hr.coffee create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-verdant-toolbar.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-verdantlink.coffee create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/modal-workflow.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/page-chooser.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/page-editor.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/bootstrap-modal.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/bootstrap-tab.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/hallo.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/jquery-1.10.3.js create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/jquery-ui-1.10.3.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/jquery.autosize.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/jquery.dlmenu.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/jquery.timepicker.min.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/modernizr-2.6.2.min.js create mode 100644 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/rangy-core.js create mode 100755 wagtail/wagtailadmin/static/wagtailadmin/js/vendor/tag-it.js create mode 100644 wagtail/wagtailadmin/taggable.py create mode 100644 wagtail/wagtailadmin/tasks.py create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/base.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/_link_types.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/_search_behaviour.js create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/_search_form.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/_search_results.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/browse.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/browse.js create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/email_link.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/email_link.js create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/external_link.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/external_link.js create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/external_link_chosen.js create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/search.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/chooser/search.js create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/edit_handlers/chooser_panel.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/edit_handlers/field_panel_field.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/edit_handlers/field_panel_object.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/edit_handlers/inline_panel.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/edit_handlers/inline_panel.js create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/edit_handlers/inline_panel_child.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/edit_handlers/multi_field_panel.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/edit_handlers/object_list.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/edit_handlers/page_chooser_panel.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/edit_handlers/tabbed_interface.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/home.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/home/pages_for_moderation.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/home/recent_edits.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/home/site_summary.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/login.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/notifications/approved.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/notifications/rejected.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/notifications/submitted.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/_editor_css.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/_editor_js.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/_moderator_userbar.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/add_subpage.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/confirm_delete.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/confirm_move.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/confirm_unpublish.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/content_type_use.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/create.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/edit.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/index.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/list.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/move_choose_destination.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/preview_placeholder.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/search.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/search_results.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/select_location.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/select_type.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/shared/explorer_nav.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/shared/field_as_li.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/shared/main_nav.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/shared/pagination_nav.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/shared/tag_field_css.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/shared/tag_field_js.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/skeleton.html create mode 100644 wagtail/wagtailadmin/templatetags/__init__.py create mode 100644 wagtail/wagtailadmin/templatetags/ellipsistrim.py create mode 100644 wagtail/wagtailadmin/templatetags/fieldtype.py create mode 100644 wagtail/wagtailadmin/templatetags/gravatar.py create mode 100644 wagtail/wagtailadmin/templatetags/meta_description.py create mode 100644 wagtail/wagtailadmin/templatetags/page_permissions.py create mode 100644 wagtail/wagtailadmin/templatetags/verdantuserbar.py create mode 100644 wagtail/wagtailadmin/templatetags/wagtailadmin_nav.py create mode 100644 wagtail/wagtailadmin/tests.py create mode 100644 wagtail/wagtailadmin/urls.py create mode 100644 wagtail/wagtailadmin/views/__init__.py create mode 100644 wagtail/wagtailadmin/views/chooser.py create mode 100644 wagtail/wagtailadmin/views/home.py create mode 100644 wagtail/wagtailadmin/views/pages.py create mode 100644 wagtail/wagtailadmin/views/tags.py diff --git a/wagtail/wagtailadmin/__init__.py b/wagtail/wagtailadmin/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/wagtail/wagtailadmin/edit_handlers.py b/wagtail/wagtailadmin/edit_handlers.py new file mode 100644 index 000000000..cdcae4110 --- /dev/null +++ b/wagtail/wagtailadmin/edit_handlers.py @@ -0,0 +1,639 @@ +from django.template.loader import render_to_string +from django.template.defaultfilters import addslashes +from django.utils.safestring import mark_safe +from django import forms +from django.db import models +from django.forms.models import fields_for_model +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured, ValidationError +from django.core.urlresolvers import reverse + +import copy + +from wagtail.wagtailcore.models import Page +from wagtail.wagtailcore.util import camelcase_to_underscore +from wagtail.wagtailcore.fields import RichTextArea +from cluster.forms import ClusterForm, ClusterFormMetaclass +from taggit.forms import TagWidget + +import re +import datetime + + +class FriendlyDateInput(forms.DateInput): + """ + A custom DateInput widget that formats dates as "05 Oct 2013" + and adds class="friendly_date" to be picked up by jquery datepicker. + """ + def __init__(self, attrs=None): + default_attrs = {'class': 'friendly_date'} + if attrs: + default_attrs.update(attrs) + + super(FriendlyDateInput, self).__init__(attrs=default_attrs, format='%d %b %Y') + + +class FriendlyTimeInput(forms.TimeInput): + """ + A custom TimeInput widget that formats dates as "5.30pm" + and adds class="friendly_time" to be picked up by jquery timepicker. + """ + def __init__(self, attrs=None): + default_attrs = {'class': 'friendly_time'} + if attrs: + default_attrs.update(attrs) + + super(FriendlyTimeInput, self).__init__(attrs=default_attrs, format='%I.%M%p') + + +class FriendlyTimeField(forms.CharField): + def to_python(self, time_string): + # Check if the string is blank + if not time_string: + return None + + # Look for time in the string + expr = re.compile("^(?P\d+)(?:(?:.|:)(?P\d+))?(?Pam|pm)") + match = expr.match(time_string.lower()) + if match: + # Pull out values from string + hour_string, minute_string, am_pm = match.groups() + + # Convert hours and minutes to integers + hour = int(hour_string) + if minute_string: + minute = int(minute_string) + else: + minute = 0 + + # Create python time + if am_pm == "pm" and hour < 12: + hour += 12 + + if am_pm == "am" and hour >= 12: + hour -= 12 + + return datetime.time(hour=hour, minute=minute) + else: + raise ValidationError("Please type a valid time") + + +FORM_FIELD_OVERRIDES = { + models.DateField: {'widget': FriendlyDateInput}, + models.TimeField: {'widget': FriendlyTimeInput, 'form_class': FriendlyTimeField}, +} + +WIDGET_JS = { + FriendlyDateInput: (lambda id: "initDateChooser(fixPrefix('%s'));" % id), + FriendlyTimeInput: (lambda id: "initTimeChooser(fixPrefix('%s'));" % id), + RichTextArea: (lambda id: "makeRichTextEditable(fixPrefix('%s'));" % id), + TagWidget: ( + lambda id: "initTagField(fixPrefix('%s'), '%s');" % ( + id, addslashes(reverse('wagtailadmin_tag_autocomplete')) + ) + ), +} + + +# Callback to allow us to override the default form fields provided for each model field. +def formfield_for_dbfield(db_field, **kwargs): + # snarfed from django/contrib/admin/options.py + + # If we've got overrides for the formfield defined, use 'em. **kwargs + # passed to formfield_for_dbfield override the defaults. + for klass in db_field.__class__.mro(): + if klass in FORM_FIELD_OVERRIDES: + kwargs = dict(copy.deepcopy(FORM_FIELD_OVERRIDES[klass]), **kwargs) + return db_field.formfield(**kwargs) + + # For any other type of field, just call its formfield() method. + return db_field.formfield(**kwargs) + + +class VerdantAdminModelFormMetaclass(ClusterFormMetaclass): + # Override the behaviour of the regular ModelForm metaclass - + # which handles the translation of model fields to form fields - + # to use our own formfield_for_dbfield function to do that translation. + # This is done by sneaking a formfield_callback property into the class + # being defined (unless the class already provides a formfield_callback + # of its own). + + # while we're at it, we'll also set extra_form_count to 0, as we're creating + # extra forms in JS + extra_form_count = 0 + + def __new__(cls, name, bases, attrs): + if 'formfield_callback' not in attrs or attrs['formfield_callback'] is None: + attrs['formfield_callback'] = formfield_for_dbfield + + new_class = super(VerdantAdminModelFormMetaclass, cls).__new__(cls, name, bases, attrs) + return new_class + +VerdantAdminModelForm = VerdantAdminModelFormMetaclass('VerdantAdminModelForm', (ClusterForm,), {}) + +# Now, any model forms built off VerdantAdminModelForm instead of ModelForm should pick up +# the nice form fields defined in FORM_FIELD_OVERRIDES. + + +def get_form_for_model(model, fields=None, exclude=None, formsets=None, exclude_formsets=None, + widgets=None): + + # django's modelform_factory with a bit of custom behaviour + # (dealing with Treebeard's tree-related fields that really should have + # been editable=False) + attrs = {'model': model} + + if fields is not None: + attrs['fields'] = fields + + if exclude is not None: + attrs['exclude'] = exclude + if issubclass(model, Page): + attrs['exclude'] = attrs.get('exclude', []) + ['content_type', 'path', 'depth', 'numchild'] + + if widgets is not None: + attrs['widgets'] = widgets + + if formsets is not None: + attrs['formsets'] = formsets + + if exclude_formsets is not None: + attrs['exclude_formsets'] = exclude_formsets + + # Give this new form class a reasonable name. + class_name = model.__name__ + str('Form') + form_class_attrs = { + 'Meta': type('Meta', (object,), attrs) + } + + return VerdantAdminModelFormMetaclass(class_name, (VerdantAdminModelForm,), form_class_attrs) + + +def extract_panel_definitions_from_model_class(model, exclude=None): + if hasattr(model, 'panels'): + return model.panels + + panels = [] + + _exclude = [] + if exclude: + _exclude.extend(exclude) + if issubclass(model, Page): + _exclude = ['content_type', 'path', 'depth', 'numchild'] + + fields = fields_for_model(model, exclude=_exclude, formfield_callback=formfield_for_dbfield) + + for field_name, field in fields.items(): + try: + panel_class = field.widget.get_panel() + except AttributeError: + panel_class = FieldPanel + + panel = panel_class(field_name) + panels.append(panel) + + return panels + + +class EditHandler(object): + """ + Abstract class providing sensible default behaviours for objects implementing + the EditHandler API + """ + + # return list of widget overrides that this EditHandler wants to be in place + # on the form it receives + @classmethod + def widget_overrides(cls): + return {} + + # return list of formset names that this EditHandler requires to be present + # as children of the ClusterForm + @classmethod + def required_formsets(cls): + return [] + + # the top-level edit handler is responsible for providing a form class that can produce forms + # acceptable to the edit handler + _form_class = None + @classmethod + def get_form_class(cls, model): + if cls._form_class is None: + cls._form_class = get_form_for_model(model, + formsets=cls.required_formsets(), widgets=cls.widget_overrides()) + return cls._form_class + + def __init__(self, instance=None, form=None): + if not instance: + raise ValueError("EditHandler did not receive an instance object") + self.instance = instance + + if not form: + raise ValueError("EditHandler did not receive a form object") + self.form = form + + + # Heading / help text to display to the user + heading = "" + help_text = "" + + def object_classnames(self): + """ + Additional classnames to add to the
  • when rendering this + within an ObjectList + """ + return "" + + def field_classnames(self): + """ + Additional classnames to add to the
  • when rendering this within a +
      + """ + return "" + + + def field_type(self): + """ + The kind of field it is e.g boolean_field. Useful for better semantic markup of field display based on type + """ + return "" + + def render_as_object(self): + """ + Render this object as it should appear within an ObjectList. Should not + include the

      heading or help text - ObjectList will supply those + """ + # by default, assume that the subclass provides a catch-all render() method + return self.render() + + def render_as_field(self): + """ + Render this object as it should appear within a
        list item + """ + # by default, assume that the subclass provides a catch-all render() method + return self.render() + + def render_js(self): + """ + Render a snippet of Javascript code to be executed when this object's rendered + HTML is inserted into the DOM. (This won't necessarily happen on page load...) + """ + return "" + + def rendered_fields(self): + """ + return a list of the fields of the passed form which are rendered by this + EditHandler. + """ + return [] + + def render_missing_fields(self): + """ + Helper function: render all of the fields of the form that are not accounted for + in rendered_fields + """ + rendered_fields = self.rendered_fields() + missing_fields_html = [ + unicode(self.form[field_name]) + for field_name in self.form.fields + if field_name not in rendered_fields + ] + + return mark_safe(u''.join(missing_fields_html)) + + def render_form_content(self): + """ + Render this as an 'object', along with any unaccounted-for fields to make this + a valid submittable form + """ + return mark_safe(self.render_as_object() + self.render_missing_fields()) + + +class BaseCompositeEditHandler(EditHandler): + """ + Abstract class for EditHandlers that manage a set of sub-EditHandlers. + Concrete subclasses must attach a 'children' property + """ + _widget_overrides = None + @classmethod + def widget_overrides(cls): + if cls._widget_overrides is None: + # build a collated version of all its children's widget lists + widgets = {} + for handler_class in cls.children: + widgets.update(handler_class.widget_overrides()) + cls._widget_overrides = widgets + + return cls._widget_overrides + + _required_formsets = None + @classmethod + def required_formsets(cls): + if cls._required_formsets is None: + formsets = [] + for handler_class in cls.children: + formsets.extend(handler_class.required_formsets()) + cls._required_formsets = formsets + + return cls._required_formsets + + def __init__(self, instance=None, form=None): + super(BaseCompositeEditHandler, self).__init__(instance=instance, form=form) + + self.children = [ + handler_class(instance=self.instance, form=self.form) + for handler_class in self.__class__.children + ] + + def render(self): + return mark_safe(render_to_string(self.template, { + 'self': self + })) + + def render_js(self): + return mark_safe(u'\n'.join([handler.render_js() for handler in self.children])) + + def rendered_fields(self): + result = [] + for handler in self.children: + result += handler.rendered_fields() + + return result + +class BaseTabbedInterface(BaseCompositeEditHandler): + template = "wagtailadmin/edit_handlers/tabbed_interface.html" + +def TabbedInterface(children): + return type('_TabbedInterface', (BaseTabbedInterface,), {'children': children}) + + +class BaseObjectList(BaseCompositeEditHandler): + template = "wagtailadmin/edit_handlers/object_list.html" + +def ObjectList(children, heading=""): + return type('_ObjectList', (BaseObjectList,), { + 'children': children, + 'heading': heading, + }) + + +class BaseMultiFieldPanel(BaseCompositeEditHandler): + template = "wagtailadmin/edit_handlers/multi_field_panel.html" + +def MultiFieldPanel(children, heading=""): + return type('_MultiFieldPanel', (BaseMultiFieldPanel,), { + 'children': children, + 'heading': heading, + }) + + +class BaseFieldPanel(EditHandler): + def __init__(self, instance=None, form=None): + super(BaseFieldPanel, self).__init__(instance=instance, form=form) + self.bound_field = self.form[self.field_name] + + self.heading = self.bound_field.label + self.help_text = self.bound_field.help_text + + def object_classnames(self): + try: + return "single-field " + self.classname + except (AttributeError, TypeError): + return "single-field" + + def field_type(self): + return camelcase_to_underscore(self.bound_field.field.__class__.__name__) + + def field_classnames(self): + classname = self.field_type() + if self.bound_field.field.required: + classname += " required" + if self.bound_field.errors: + classname += " error" + + return classname + + object_template = "wagtailadmin/edit_handlers/field_panel_object.html" + def render_as_object(self): + return mark_safe(render_to_string(self.object_template, { + 'self': self, + 'field_content': self.render_as_field(show_help_text=False), + })) + + def render_js(self): + try: + # see if there's an entry for this widget type in WIDGET_JS + js_func = WIDGET_JS[self.bound_field.field.widget.__class__] + except KeyError: + return '' + + return mark_safe(js_func(self.bound_field.id_for_label)) + + + field_template = "wagtailadmin/edit_handlers/field_panel_field.html" + def render_as_field(self, show_help_text=True): + return mark_safe(render_to_string(self.field_template, { + 'field': self.bound_field, + 'field_type': self.field_type(), + 'show_help_text': show_help_text, + })) + + def rendered_fields(self): + return [self.field_name] + +def FieldPanel(field_name, classname=None): + return type('_FieldPanel', (BaseFieldPanel,), { + 'field_name': field_name, + 'classname': classname, + }) + + +class BaseRichTextFieldPanel(BaseFieldPanel): + def render_js(self): + return mark_safe("makeRichTextEditable(fixPrefix('%s'));" % self.bound_field.id_for_label) + +def RichTextFieldPanel(field_name): + return type('_RichTextFieldPanel', (BaseRichTextFieldPanel,), { + 'field_name': field_name, + }) + + +class BaseChooserPanel(BaseFieldPanel): + """ + Abstract superclass for panels that provide a modal interface for choosing (or creating) + a database object such as an image, resulting in an ID that is used to populate + a hidden foreign key input. + + Subclasses provide: + * field_template + * object_type_name - something like 'image' which will be used as the var name + for the object instance in the field_template + * js_function_name - a JS function responsible for the modal workflow; this receives + the ID of the hidden field as a parameter, and should ultimately populate that field + with the appropriate object ID. If the function requires any other parameters, the + subclass will need to override render_js instead. + """ + @classmethod + def widget_overrides(cls): + return {cls.field_name: forms.HiddenInput} + + def get_chosen_item(self): + try: + return getattr(self.instance, self.field_name) + except ObjectDoesNotExist: + # if the ForeignKey is null=False, Django decides to raise + # a DoesNotExist exception here, rather than returning None + # like every other unpopulated field type. Yay consistency! + return None + + def render_as_field(self, show_help_text=True): + instance_obj = self.get_chosen_item() + return mark_safe(render_to_string(self.field_template, { + 'field': self.bound_field, + self.object_type_name: instance_obj, + 'is_chosen': bool(instance_obj), + 'show_help_text': show_help_text, + })) + + def render_js(self): + return mark_safe("%s(fixPrefix('%s'));" % (self.js_function_name, self.bound_field.id_for_label)) + +class BasePageChooserPanel(BaseChooserPanel): + field_template = "wagtailadmin/edit_handlers/page_chooser_panel.html" + object_type_name = "page" + + _target_content_type = None + @classmethod + def target_content_type(cls): + if cls._target_content_type is None: + if cls.page_type: + if isinstance(cls.page_type, basestring): + # translate the passed model name into an actual model class + from django.db.models import get_model + try: + app_label, model_name = cls.page_type.split('.') + except ValueError: + raise ImproperlyConfigured("The page_type passed to PageChooserPanel must be of the form 'app_label.model_name'") + + page_type = get_model(app_label, model_name) + if page_type is None: + raise ImproperlyConfigured("PageChooserPanel refers to model '%s' that has not been installed" % cls.page_type) + else: + page_type = cls.page_type + + cls._target_content_type = ContentType.objects.get_for_model(page_type) + else: + # TODO: infer the content type by introspection on the foreign key + cls._target_content_type = ContentType.objects.get_by_natural_key('wagtailcore', 'page') + + return cls._target_content_type + + def render_js(self): + page = getattr(self.instance, self.field_name) + parent = page.get_parent() if page else None + content_type = self.__class__.target_content_type() + + return mark_safe("createPageChooser(fixPrefix('%s'), '%s.%s', %s);" % ( + self.bound_field.id_for_label, + content_type.app_label, + content_type.model, + (parent.id if parent else 'null'), + )) + +def PageChooserPanel(field_name, page_type=None): + return type('_PageChooserPanel', (BasePageChooserPanel,), { + 'field_name': field_name, + 'page_type': page_type, + }) + + +class BaseInlinePanel(EditHandler): + @classmethod + def get_panel_definitions(cls): + # Look for a panels definition in the InlinePanel declaration + if cls.panels is not None: + return cls.panels + # Failing that, get it from the model + else: + return extract_panel_definitions_from_model_class(cls.related.model, exclude=[cls.related.field.name]) + + _child_edit_handler_class = None + @classmethod + def get_child_edit_handler_class(cls): + if cls._child_edit_handler_class is None: + panels = cls.get_panel_definitions() + cls._child_edit_handler_class = MultiFieldPanel(panels, heading=cls.heading) + + return cls._child_edit_handler_class + + @classmethod + def required_formsets(cls): + return [cls.relation_name] + + @classmethod + def widget_overrides(cls): + overrides = cls.get_child_edit_handler_class().widget_overrides() + if overrides: + return {cls.relation_name: overrides} + else: + return {} + + + def __init__(self, instance=None, form=None): + super(BaseInlinePanel, self).__init__(instance=instance, form=form) + + self.formset = form.formsets[self.__class__.relation_name] + + child_edit_handler_class = self.__class__.get_child_edit_handler_class() + self.children = [] + for subform in self.formset.forms: + # override the DELETE field to have a hidden input + subform.fields['DELETE'].widget = forms.HiddenInput() + + # ditto for the ORDER field, if present + if self.formset.can_order: + subform.fields['ORDER'].widget = forms.HiddenInput() + + self.children.append( + child_edit_handler_class(instance=subform.instance, form=subform) + ) + + empty_form = self.formset.empty_form + empty_form.fields['DELETE'].widget = forms.HiddenInput() + if self.formset.can_order: + empty_form.fields['ORDER'].widget = forms.HiddenInput() + + self.empty_child = child_edit_handler_class(instance=empty_form.instance, form=empty_form) + + template = "wagtailadmin/edit_handlers/inline_panel.html" + def render(self): + return mark_safe(render_to_string(self.template, { + 'self': self, + 'can_order': self.formset.can_order, + })) + + js_template = "wagtailadmin/edit_handlers/inline_panel.js" + def render_js(self): + return mark_safe(render_to_string(self.js_template, { + 'self': self, + 'can_order': self.formset.can_order, + })) + +def InlinePanel(base_model, relation_name, panels=None, label='', help_text=''): + rel = getattr(base_model, relation_name).related + return type('_InlinePanel', (BaseInlinePanel,), { + 'relation_name': relation_name, + 'related': rel, + 'panels': panels, + 'heading': label, + 'help_text': help_text, # TODO: can we pick this out of the foreign key definition as an alternative? (with a bit of help from the inlineformset object, as we do for label/heading) + }) + + +# Now that we've defined EditHandlers, we can set up wagtailcore.Page to have some. +Page.content_panels = [ + FieldPanel('title'), + FieldPanel('slug'), +] +Page.promote_panels = [ +] diff --git a/wagtail/wagtailadmin/forms.py b/wagtail/wagtailadmin/forms.py new file mode 100644 index 000000000..9073e57c1 --- /dev/null +++ b/wagtail/wagtailadmin/forms.py @@ -0,0 +1,30 @@ +from django import forms +from django.contrib.auth.forms import AuthenticationForm + +class SearchForm(forms.Form): + q = forms.CharField(label="Search term") + + +class ExternalLinkChooserForm(forms.Form): + url = forms.URLField(required=True) + +class ExternalLinkChooserWithLinkTextForm(forms.Form): + url = forms.URLField(required=True) + link_text = forms.CharField(required=True) + +class EmailLinkChooserForm(forms.Form): + email_address = forms.EmailField(required=True) + +class EmailLinkChooserWithLinkTextForm(forms.Form): + email_address = forms.EmailField(required=True) + link_text = forms.CharField(required=False) + + +class LoginForm(AuthenticationForm): + username = forms.CharField( + max_length=254, + widget=forms.TextInput(attrs={'placeholder': "Enter your username"}), + ) + password = forms.CharField( + widget=forms.PasswordInput(attrs={'placeholder': "Enter password"}), + ) diff --git a/wagtail/wagtailadmin/hooks.py b/wagtail/wagtailadmin/hooks.py new file mode 100644 index 000000000..2dd2cd686 --- /dev/null +++ b/wagtail/wagtailadmin/hooks.py @@ -0,0 +1,31 @@ +from django.conf import settings +from django.utils.importlib import import_module + +_hooks = {} + +# TODO: support 'register' as a decorator: +# @hooks.register('construct_main_menu') +# def construct_main_menu(menu_items): +# ... + +def register(hook_name, fn): + if hook_name not in _hooks: + _hooks[hook_name] = [] + _hooks[hook_name].append(fn) + +_searched_for_hooks = False +def search_for_hooks(): + global _searched_for_hooks + if not _searched_for_hooks: + for app_module in settings.INSTALLED_APPS: + try: + import_module('%s.verdant_hooks' % app_module) + except ImportError: + continue + + _searched_for_hooks = True + + +def get_hooks(hook_name): + search_for_hooks() + return _hooks.get(hook_name, []) diff --git a/wagtail/wagtailadmin/menu.py b/wagtail/wagtailadmin/menu.py new file mode 100644 index 000000000..23b787567 --- /dev/null +++ b/wagtail/wagtailadmin/menu.py @@ -0,0 +1,14 @@ +from django.utils.text import slugify +from django.utils.html import format_html + +class MenuItem(object): + def __init__(self, label, url, name=None, classnames='', order=1000): + self.label = label + self.url = url + self.classnames = classnames + self.name = (name or slugify(unicode(label))) + self.order = order + + def render_html(self): + return format_html(u"""""", + self.name, self.url, self.classnames, self.label) diff --git a/wagtail/wagtailadmin/modal_workflow.py b/wagtail/wagtailadmin/modal_workflow.py new file mode 100644 index 000000000..fabb5a38e --- /dev/null +++ b/wagtail/wagtailadmin/modal_workflow.py @@ -0,0 +1,25 @@ +from django.http import HttpResponse +from django.template import RequestContext +from django.template.loader import render_to_string + +import json + +def render_modal_workflow(request, html_template, js_template, template_vars={}): + """" + Render a response consisting of an HTML chunk and a JS onload chunk + in the format required by the modal-workflow framework. + """ + response_keyvars = [] + context = RequestContext(request) + + if html_template: + html = render_to_string(html_template, template_vars, context) + response_keyvars.append("'html': %s" % json.dumps(html)) + + if js_template: + js = render_to_string(js_template, template_vars, context) + response_keyvars.append("'onload': %s" % js) + + response_text = "{%s}" % ','.join(response_keyvars) + + return HttpResponse(response_text, mimetype="text/javascript") diff --git a/wagtail/wagtailadmin/models.py b/wagtail/wagtailadmin/models.py new file mode 100644 index 000000000..71a836239 --- /dev/null +++ b/wagtail/wagtailadmin/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/components/dropdowns.less b/wagtail/wagtailadmin/static/wagtailadmin/css/components/dropdowns.less new file mode 100644 index 000000000..08ee663f0 --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/components/dropdowns.less @@ -0,0 +1,223 @@ +.dropdown{ + position:relative; + .clearfix(); + + .dropdown-toggle{ + cursor:pointer; + } + + ul{ + .unlist(); + background-color:@color-teal; + position:absolute; + overflow:hidden; + top:100%; + left:-2000px; + z-index:500; + opacity:0; + + li{ + float:none; + border-top:1px solid rgba(255,255,255,0.2); + } + li:first-child{ + border-top:0; + } + + a{ + box-sizing:border-box; + white-space: nowrap; + position:relative; + text-decoration:none; + text-transform:uppercase; + display:block; + color:white; + padding:1em; + font-weight:normal; + + &:hover{ + background-color:@color-teal-darker; + } + &.icon{ + padding-right:5em; + + &:before, + &:after{ + right:1em; + } + } + &.shortcut{ + padding-right:7em; + } + } + + a, input[type=submit], input[type=reset], input[type=button], .button, button{ + font-size:0.95em; + -webkit-font-smoothing: auto; + } + + label{ + padding:1.3em; + } + + .kbd{ + position:absolute; + right:1em; + font-weight:600; + font-size:0.8em; + color:rgba(0,0,0,0.3); + } + + } + + &.open ul{ + .box-shadow(0px 3px 3px 0 rgba(0,0,0,0.2)); + opacity:1; + left:0; + display:block; + } + + &.match-width ul{ + width:100%; + min-width:110px; + + li{ + white-space: nowrap; + } + } + + + &.dropup ul{ + .box-shadow(0px -3px 3px 0 rgba(0,0,0,0.2)); + top:auto; + bottom:100%; + } + + input[type=button], input[type=submit], button{ + padding:1em 0; + .border-radius(0); + display:block; + width:100%; + text-align:left; + padding-left:1em; + } + + .button{ + float:left; + + &:hover{ + background-color:@color-teal-darker; + } + } + + & > .button + .dropdown-toggle{ + border-left:1px solid rgba(255,255,255,0.2); + position:absolute; + right:0; + height:100%; + padding:0 0.5em; + text-align:center; + + &:before{ + width:1em; + } + + &:hover{ + background-color:@color-teal-darker; + } + } + &.open > .button + .dropdown-toggle{ + background-color:@color-teal-darker; + } +} + +.dropdown.white{ + ul{ + background-color:white; + + li{ + border-top:1px solid rgba(0,0,0,0.1); + } + + a{ + color:@color-grey-2; + + &:hover{ + background-color:@color-grey-3; + } + } + } +} + +h2 .dropdown{ + display:inline-block; + font-size:0.7em; + margin-right:0.5em; + vertical-align:middle; + + .dropdown-toggle{ + padding:0.5em 0; + border-right:1px solid @color-grey-3; + + /* icon */ + &:before{ + opacity:0.5; + padding:0.2em; + height:1.1em; + text-align:left; + } + &:hover{ + background-color:@color-teal; + border-color:transparent; + } + } + &.open{ + .dropdown-toggle{ + background-color:@color-teal; + } + + ul{ + left:auto; + } + } + + .dropdown-toggle:hover{ + background-color:@color-grey-3; + &:before{ + color:white; + opacity:1; + } + } + &.open .dropdown-toggle:before{ + background-color:@color-teal; + color:white; + opacity:1; + } + + +} + +footer .actions .dropdown-toggle{ + text-transform:uppercase; + background-color:@color-teal; + line-height:3em; + color:white; + padding-left:1em; + padding-right:1em; + + &:before, + &:after{ + right:1em !important; + } +} + +footer .actions .dropdown ul li{ + border-bottom:1px solid rgba(255,255,255,0.2); + border-top:0; +} + + +/* Transitions */ +.dropdown ul{ + .transition(opacity 0.2s linear); +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/components/explorer.less b/wagtail/wagtailadmin/static/wagtailadmin/css/components/explorer.less new file mode 100644 index 000000000..b82109a5a --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/components/explorer.less @@ -0,0 +1,924 @@ +/* +min z-index: 500; +max z-index: unknown; +*/ + + +@explorer-z-index:500; + +.explorer { + pointer-events:none; + width: 100%; + position: relative; + top:0; + left:0; + display:none; + -webkit-perspective: 1000px; + -moz-perspective: 1000px; + perspective: 1000px; + -webkit-perspective-origin: 50% 200%; + -moz-perspective-origin: 50% 200%; + perspective-origin: 50% 200%; + ul { + background: @color-grey-1; + padding: 0; + margin:0; + list-style: none; + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; + } + + li { + position: relative; + border-top:1px solid @color-grey-1-1; + + &:first-child{ + border-top:0; + } + } + + a { + text-decoration:none; + padding:0.9em; + color:white; + display: block; + position: relative; + outline: none; + white-space: nowrap; + text-overflow:ellipsis; + overflow:hidden; + + &:before{ + opacity:0.5; + left:1em; + + } + + &:hover{ + background:@color-teal; + color:white; + } + } + + .has-children a{ + padding-right:5em; + } + + + .children{ + position:absolute; + z-index:@explorer-z-index + 1; + right:0; + top:0; + width:4em; + text-align:center; + height:100%; + color:white; + background-color:@color-grey-1; + cursor:pointer; + border-left:1px solid rgba(255,255,255,0.2); + + &:before{ + padding:0.55em 0; + } + + &:hover{ + background:@color-teal + } + } + .dl-subviewopen > .children, + .dl-subview > .children{ + display:none; + } + + /*.no-touch .explorer li a:hover { + background: rgba(255,248,213,0.1); + }*/ + + li.dl-back a { + /* .icon.arrow-left;*/ + + } + + li.dl-back:after { + + } + + li > a:after { + + } + + .dl-menu { + position: relative; + width: 100%; + opacity: 0; + pointer-events: none; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + + &.dl-menuopen { + opacity: 1; + pointer-events: auto; + } + } + + /* Hide the inner submenus */ + li .dl-submenu { + display: none; + } + + /* + When a submenu is openend, we will hide all li siblings. + For that we give a class to the parent menu called "dl-subview". + We also hide the submenu link. + The opened submenu will get the class "dl-subviewopen". + All this is done for any sub-level being entered. + */ + .dl-menu.dl-subview li, + .dl-menu.dl-subview li.dl-subviewopen > a, + .dl-menu.dl-subview li.dl-subview > a { + display: none; + } + + .dl-menu.dl-subview li.dl-subview, + .dl-menu.dl-subview li.dl-subview .dl-submenu, + .dl-menu.dl-subview li.dl-subviewopen, + .dl-menu.dl-subview li.dl-subviewopen > .dl-submenu, + .dl-menu.dl-subview li.dl-subviewopen > .dl-submenu > li { + display: block; + } + + /* Dynamically added submenu outside of the menu context */ + > .dl-submenu { + position: absolute; + width: 100%; + top: 0px; + left: 0; + } +} + + +/* Animation classes for moving out and in */ + +.dl-menu.dl-animate-out-1 { + -webkit-animation: MenuAnimOut1 0.4s; + -moz-animation: MenuAnimOut1 0.4s; + animation: MenuAnimOut1 0.4s; +} + +.dl-menu.dl-animate-out-2 { + -webkit-animation: MenuAnimOut2 0.3s ease-in-out; + -moz-animation: MenuAnimOut2 0.3s ease-in-out; + animation: MenuAnimOut2 0.3s ease-in-out; +} + +.dl-menu.dl-animate-out-3 { + -webkit-animation: MenuAnimOut3 0.4s ease; + -moz-animation: MenuAnimOut3 0.4s ease; + animation: MenuAnimOut3 0.4s ease; +} + +.dl-menu.dl-animate-out-4 { + -webkit-animation: MenuAnimOut4 0.4s ease; + -moz-animation: MenuAnimOut4 0.4s ease; + animation: MenuAnimOut4 0.4s ease; +} + +.dl-menu.dl-animate-out-5 { + -webkit-animation: MenuAnimOut5 0.4s ease; + -moz-animation: MenuAnimOut5 0.4s ease; + animation: MenuAnimOut5 0.4s ease; +} + +@-webkit-keyframes MenuAnimOut1 { + 50% { + -webkit-transform: translateZ(-250px) rotateY(30deg); + } + 75% { + -webkit-transform: translateZ(-372.5px) rotateY(15deg); + opacity: .5; + } + 100% { + -webkit-transform: translateZ(-500px) rotateY(0deg); + opacity: 0; + } +} + +@-webkit-keyframes MenuAnimOut2 { + 100% { + -webkit-transform: translateX(-100%); + opacity: 0; + } +} + +@-webkit-keyframes MenuAnimOut3 { + 100% { + -webkit-transform: translateZ(300px); + opacity: 0; + } +} + +@-webkit-keyframes MenuAnimOut4 { + 100% { + -webkit-transform: translateZ(-300px); + opacity: 0; + } +} + +@-webkit-keyframes MenuAnimOut5 { + 100% { + -webkit-transform: translateY(40%); + opacity: 0; + } +} + +@-moz-keyframes MenuAnimOut1 { + 50% { + -moz-transform: translateZ(-250px) rotateY(30deg); + } + 75% { + -moz-transform: translateZ(-372.5px) rotateY(15deg); + opacity: .5; + } + 100% { + -moz-transform: translateZ(-500px) rotateY(0deg); + opacity: 0; + } +} + +@-moz-keyframes MenuAnimOut2 { + 100% { + -moz-transform: translateX(-100%); + opacity: 0; + } +} + +@-moz-keyframes MenuAnimOut3 { + 100% { + -moz-transform: translateZ(300px); + opacity: 0; + } +} + +@-moz-keyframes MenuAnimOut4 { + 100% { + -moz-transform: translateZ(-300px); + opacity: 0; + } +} + +@-moz-keyframes MenuAnimOut5 { + 100% { + -moz-transform: translateY(40%); + opacity: 0; + } +} + +@keyframes MenuAnimOut1 { + 50% { + transform: translateZ(-250px) rotateY(30deg); + } + 75% { + transform: translateZ(-372.5px) rotateY(15deg); + opacity: .5; + } + 100% { + transform: translateZ(-500px) rotateY(0deg); + opacity: 0; + } +} + +@keyframes MenuAnimOut2 { + 100% { + transform: translateX(-100%); + opacity: 0; + } +} + +@keyframes MenuAnimOut3 { + 100% { + transform: translateZ(300px); + opacity: 0; + } +} + +@keyframes MenuAnimOut4 { + 100% { + transform: translateZ(-300px); + opacity: 0; + } +} + +@keyframes MenuAnimOut5 { + 100% { + transform: translateY(40%); + opacity: 0; + } +} + +.dl-menu.dl-animate-in-1 { + -webkit-animation: MenuAnimIn1 0.3s; + -moz-animation: MenuAnimIn1 0.3s; + animation: MenuAnimIn1 0.3s; +} + +.dl-menu.dl-animate-in-2 { + -webkit-animation: MenuAnimIn2 0.3s ease-in-out; + -moz-animation: MenuAnimIn2 0.3s ease-in-out; + animation: MenuAnimIn2 0.3s ease-in-out; +} + +.dl-menu.dl-animate-in-3 { + -webkit-animation: MenuAnimIn3 0.4s ease; + -moz-animation: MenuAnimIn3 0.4s ease; + animation: MenuAnimIn3 0.4s ease; +} + +.dl-menu.dl-animate-in-4 { + -webkit-animation: MenuAnimIn4 0.4s ease; + -moz-animation: MenuAnimIn4 0.4s ease; + animation: MenuAnimIn4 0.4s ease; +} + +.dl-menu.dl-animate-in-5 { + -webkit-animation: MenuAnimIn5 0.4s ease; + -moz-animation: MenuAnimIn5 0.4s ease; + animation: MenuAnimIn5 0.4s ease; +} + +@-webkit-keyframes MenuAnimIn1 { + 0% { + -webkit-transform: translateZ(-500px) rotateY(0deg); + opacity: 0; + } + 20% { + -webkit-transform: translateZ(-250px) rotateY(30deg); + opacity: 0.5; + } + 100% { + -webkit-transform: translateZ(0px) rotateY(0deg); + opacity: 1; + } +} + +@-webkit-keyframes MenuAnimIn2 { + 0% { + -webkit-transform: translateX(-100%); + opacity: 0; + } + 100% { + -webkit-transform: translateX(0px); + opacity: 1; + } +} + +@-webkit-keyframes MenuAnimIn3 { + 0% { + -webkit-transform: translateZ(300px); + opacity: 0; + } + 100% { + -webkit-transform: translateZ(0px); + opacity: 1; + } +} + +@-webkit-keyframes MenuAnimIn4 { + 0% { + -webkit-transform: translateZ(-300px); + opacity: 0; + } + 100% { + -webkit-transform: translateZ(0px); + opacity: 1; + } +} + +@-webkit-keyframes MenuAnimIn5 { + 0% { + -webkit-transform: translateY(40%); + opacity: 0; + } + 100% { + -webkit-transform: translateY(0); + opacity: 1; + } +} + +@-moz-keyframes MenuAnimIn1 { + 0% { + -moz-transform: translateZ(-500px) rotateY(0deg); + opacity: 0; + } + 20% { + -moz-transform: translateZ(-250px) rotateY(30deg); + opacity: 0.5; + } + 100% { + -moz-transform: translateZ(0px) rotateY(0deg); + opacity: 1; + } +} + +@-moz-keyframes MenuAnimIn2 { + 0% { + -moz-transform: translateX(-100%); + opacity: 0; + } + 100% { + -moz-transform: translateX(0px); + opacity: 1; + } +} + +@-moz-keyframes MenuAnimIn3 { + 0% { + -moz-transform: translateZ(300px); + opacity: 0; + } + 100% { + -moz-transform: translateZ(0px); + opacity: 1; + } +} + +@-moz-keyframes MenuAnimIn4 { + 0% { + -moz-transform: translateZ(-300px); + opacity: 0; + } + 100% { + -moz-transform: translateZ(0px); + opacity: 1; + } +} + +@-moz-keyframes MenuAnimIn5 { + 0% { + -moz-transform: translateY(40%); + opacity: 0; + } + 100% { + -moz-transform: translateY(0); + opacity: 1; + } +} + +@keyframes MenuAnimIn1 { + 0% { + transform: translateZ(-500px) rotateY(0deg); + opacity: 0; + } + 20% { + transform: translateZ(-250px) rotateY(30deg); + opacity: 0.5; + } + 100% { + transform: translateZ(0px) rotateY(0deg); + opacity: 1; + } +} + +@keyframes MenuAnimIn2 { + 0% { + transform: translateX(-100%); + opacity: 0; + } + 100% { + transform: translateX(0px); + opacity: 1; + } +} + +@keyframes MenuAnimIn3 { + 0% { + transform: translateZ(300px); + opacity: 0; + } + 100% { + transform: translateZ(0px); + opacity: 1; + } +} + +@keyframes MenuAnimIn4 { + 0% { + transform: translateZ(-300px); + opacity: 0; + } + 100% { + transform: translateZ(0px); + opacity: 1; + } +} + +@keyframes MenuAnimIn5 { + 0% { + transform: translateY(40%); + opacity: 0; + } + 100% { + transform: translateY(0); + opacity: 1; + } +} + +.explorer > .dl-submenu.dl-animate-in-1 { + -webkit-animation: SubMenuAnimIn1 0.4s ease; + -moz-animation: SubMenuAnimIn1 0.4s ease; + animation: SubMenuAnimIn1 0.4s ease; +} + +.explorer > .dl-submenu.dl-animate-in-2 { + -webkit-animation: SubMenuAnimIn2 0.3s ease-in-out; + -moz-animation: SubMenuAnimIn2 0.3s ease-in-out; + animation: SubMenuAnimIn2 0.3s ease-in-out; +} + +.explorer > .dl-submenu.dl-animate-in-3 { + -webkit-animation: SubMenuAnimIn3 0.4s ease; + -moz-animation: SubMenuAnimIn3 0.4s ease; + animation: SubMenuAnimIn3 0.4s ease; +} + +.explorer > .dl-submenu.dl-animate-in-4 { + -webkit-animation: SubMenuAnimIn4 0.4s ease; + -moz-animation: SubMenuAnimIn4 0.4s ease; + animation: SubMenuAnimIn4 0.4s ease; +} + +.explorer > .dl-submenu.dl-animate-in-5 { + -webkit-animation: SubMenuAnimIn5 0.4s ease; + -moz-animation: SubMenuAnimIn5 0.4s ease; + animation: SubMenuAnimIn5 0.4s ease; +} + +@-webkit-keyframes SubMenuAnimIn1 { + 0% { + -webkit-transform: translateX(50%); + opacity: 0; + } + 100% { + -webkit-transform: translateX(0px); + opacity: 1; + } +} + +@-webkit-keyframes SubMenuAnimIn2 { + 0% { + -webkit-transform: translateX(100%); + opacity: 0; + } + 100% { + -webkit-transform: translateX(0px); + opacity: 1; + } +} + +@-webkit-keyframes SubMenuAnimIn3 { + 0% { + -webkit-transform: translateZ(-300px); + opacity: 0; + } + 100% { + -webkit-transform: translateZ(0px); + opacity: 1; + } +} + +@-webkit-keyframes SubMenuAnimIn4 { + 0% { + -webkit-transform: translateZ(300px); + opacity: 0; + } + 100% { + -webkit-transform: translateZ(0px); + opacity: 1; + } +} + +@-webkit-keyframes SubMenuAnimIn5 { + 0% { + -webkit-transform: translateZ(-200px); + opacity: 0; + } + 100% { + -webkit-transform: translateZ(0); + opacity: 1; + } +} + +@-moz-keyframes SubMenuAnimIn1 { + 0% { + -moz-transform: translateX(50%); + opacity: 0; + } + 100% { + -moz-transform: translateX(0px); + opacity: 1; + } +} + +@-moz-keyframes SubMenuAnimIn2 { + 0% { + -moz-transform: translateX(100%); + opacity: 0; + } + 100% { + -moz-transform: translateX(0px); + opacity: 1; + } +} + +@-moz-keyframes SubMenuAnimIn3 { + 0% { + -moz-transform: translateZ(-300px); + opacity: 0; + } + 100% { + -moz-transform: translateZ(0px); + opacity: 1; + } +} + +@-moz-keyframes SubMenuAnimIn4 { + 0% { + -moz-transform: translateZ(300px); + opacity: 0; + } + 100% { + -moz-transform: translateZ(0px); + opacity: 1; + } +} + +@-moz-keyframes SubMenuAnimIn5 { + 0% { + -moz-transform: translateZ(-200px); + opacity: 0; + } + 100% { + -moz-transform: translateZ(0); + opacity: 1; + } +} + +@keyframes SubMenuAnimIn1 { + 0% { + transform: translateX(50%); + opacity: 0; + } + 100% { + transform: translateX(0px); + opacity: 1; + } +} + +@keyframes SubMenuAnimIn2 { + 0% { + transform: translateX(100%); + opacity: 0; + } + 100% { + transform: translateX(0px); + opacity: 1; + } +} + +@keyframes SubMenuAnimIn3 { + 0% { + transform: translateZ(-300px); + opacity: 0; + } + 100% { + transform: translateZ(0px); + opacity: 1; + } +} + +@keyframes SubMenuAnimIn4 { + 0% { + transform: translateZ(300px); + opacity: 0; + } + 100% { + transform: translateZ(0px); + opacity: 1; + } +} + +@keyframes SubMenuAnimIn5 { + 0% { + transform: translateZ(-200px); + opacity: 0; + } + 100% { + transform: translateZ(0); + opacity: 1; + } +} + +.explorer > .dl-submenu.dl-animate-out-1 { + -webkit-animation: SubMenuAnimOut1 0.4s ease; + -moz-animation: SubMenuAnimOut1 0.4s ease; + animation: SubMenuAnimOut1 0.4s ease; +} + +.explorer > .dl-submenu.dl-animate-out-2 { + -webkit-animation: SubMenuAnimOut2 0.3s ease-in-out; + -moz-animation: SubMenuAnimOut2 0.3s ease-in-out; + animation: SubMenuAnimOut2 0.3s ease-in-out; +} + +.explorer > .dl-submenu.dl-animate-out-3 { + -webkit-animation: SubMenuAnimOut3 0.4s ease; + -moz-animation: SubMenuAnimOut3 0.4s ease; + animation: SubMenuAnimOut3 0.4s ease; +} + +.explorer > .dl-submenu.dl-animate-out-4 { + -webkit-animation: SubMenuAnimOut4 0.4s ease; + -moz-animation: SubMenuAnimOut4 0.4s ease; + animation: SubMenuAnimOut4 0.4s ease; +} + +.explorer > .dl-submenu.dl-animate-out-5 { + -webkit-animation: SubMenuAnimOut5 0.4s ease; + -moz-animation: SubMenuAnimOut5 0.4s ease; + animation: SubMenuAnimOut5 0.4s ease; +} + +@-webkit-keyframes SubMenuAnimOut1 { + 0% { + -webkit-transform: translateX(0%); + opacity: 1; + } + 100% { + -webkit-transform: translateX(50%); + opacity: 0; + } +} + +@-webkit-keyframes SubMenuAnimOut2 { + 0% { + -webkit-transform: translateX(0%); + opacity: 1; + } + 100% { + -webkit-transform: translateX(100%); + opacity: 0; + } +} + +@-webkit-keyframes SubMenuAnimOut3 { + 0% { + -webkit-transform: translateZ(0px); + opacity: 1; + } + 100% { + -webkit-transform: translateZ(-300px); + opacity: 0; + } +} + +@-webkit-keyframes SubMenuAnimOut4 { + 0% { + -webkit-transform: translateZ(0px); + opacity: 1; + } + 100% { + -webkit-transform: translateZ(300px); + opacity: 0; + } +} + +@-webkit-keyframes SubMenuAnimOut5 { + 0% { + -webkit-transform: translateZ(0); + opacity: 1; + } + 100% { + -webkit-transform: translateZ(-200px); + opacity: 0; + } +} + +@-moz-keyframes SubMenuAnimOut1 { + 0% { + -moz-transform: translateX(0%); + opacity: 1; + } + 100% { + -moz-transform: translateX(50%); + opacity: 0; + } +} + +@-moz-keyframes SubMenuAnimOut2 { + 0% { + -moz-transform: translateX(0%); + opacity: 1; + } + 100% { + -moz-transform: translateX(100%); + opacity: 0; + } +} + +@-moz-keyframes SubMenuAnimOut3 { + 0% { + -moz-transform: translateZ(0px); + opacity: 1; + } + 100% { + -moz-transform: translateZ(-300px); + opacity: 0; + } +} + +@-moz-keyframes SubMenuAnimOut4 { + 0% { + -moz-transform: translateZ(0px); + opacity: 1; + } + 100% { + -moz-transform: translateZ(300px); + opacity: 0; + } +} + +@-moz-keyframes SubMenuAnimOut5 { + 0% { + -moz-transform: translateZ(0); + opacity: 1; + } + 100% { + -moz-transform: translateZ(-200px); + opacity: 0; + } +} + +@keyframes SubMenuAnimOut1 { + 0% { + transform: translateX(0%); + opacity: 1; + } + 100% { + transform: translateX(50%); + opacity: 0; + } +} + +@keyframes SubMenuAnimOut2 { + 0% { + transform: translateX(0%); + opacity: 1; + } + 100% { + transform: translateX(100%); + opacity: 0; + } +} + +@keyframes SubMenuAnimOut3 { + 0% { + transform: translateZ(0px); + opacity: 1; + } + 100% { + transform: translateZ(-300px); + opacity: 0; + } +} + +@keyframes SubMenuAnimOut4 { + 0% { + transform: translateZ(0px); + opacity: 1; + } + 100% { + transform: translateZ(300px); + opacity: 0; + } +} + +@keyframes SubMenuAnimOut5 { + 0% { + transform: translateZ(0); + opacity: 1; + } + 100% { + transform: translateZ(-200px); + opacity: 0; + } +} + +/* Transitions */ +.children{ + .transition(all 0.2s linear); +} +.dl-menu.dl-menu-toggle { + .transition(all 0.3s ease); +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/components/formatters.less b/wagtail/wagtailadmin/static/wagtailadmin/css/components/formatters.less new file mode 100644 index 000000000..45407c89b --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/components/formatters.less @@ -0,0 +1,136 @@ +.avatar{ + .border-radius(100%); + position:relative; + display:inline-block; + width:50px; + height:50px; + + &:before{ + .border-radius(100%); + color:@color-grey-3; + border: 2px solid @color-grey-3; + text-align:center; + display:block; + width:42px; + height:42px; + margin:2px 0 0 2px; + line-height:42px; + position:absolute; + z-index:1; + left:0; + } + a{ + position:absolute; + z-index:2; + left:0; + display:block; + width:100%; + height:50px; + } + img{ + .border-radius(100%); + } + &:hover{ + &:before{ + color:@color-teal; + border-color:@color-teal; + } + } +} + +.media-placeholder { + width: 600px; + height: 400px; + background-color: #CCC; + padding: 5px; + h3, p { + margin: 0; + } + img { + max-width: 350px; + max-height: 350px; + margin: 20px; + } +} + +/* Displays "timesince" formatted date with full date on hover */ +.human-readable-date{ + overflow:hidden; + display:block; + position:relative; + + &:before{ + position:absolute; + display:none; + content:attr(title); + } + + &:hover{ + visibility:hidden; + + &:before{ + visibility:visible; + display:block; + } + } +} + +/* makes a link look like regular text */ +.nolink{ + color:@color-text-base; +} + +/* Status tags */ +.status-tag{ + text-align:center; + display:inline-block; + .border-radius(2px); + text-transform:uppercase; + padding:0em 0.5em; + border:1px solid @color-grey-3; + color:@color-grey-3; + -webkit-font-smoothing: auto; + font-size:0.80em; + margin:0 0.5em; + + &.primary{ + color:@color-grey-2; + border:1px solid @color-grey-2; + } +} + +/* tags */ +.tag{ + background-color:@color-teal; + padding-right:0.5em; + padding:0.2em 0.5em; + color:white; + line-height:2em; + white-space: nowrap; + .border-radius(2px); + + + &:before{ + font-family:verdant; + display:inline-block; + color:white; + content:"u"; + padding-right:0.5em; + } + a&:hover{ + background-color:@color-teal-darker; + color:white; + } + + .taglist &{ + margin-right:0.8em; + } +} +.taglist { + font-size:0.9em; + line-height:2.4em; + h3{ + display:inline; + margin-right:1em; + } +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/components/forms.less b/wagtail/wagtailadmin/static/wagtailadmin/css/components/forms.less new file mode 100644 index 000000000..a3572371c --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/components/forms.less @@ -0,0 +1,626 @@ +form { + ul, li{ + list-style-type:none; + } + ul{ + margin:0; + padding:0; + } + li{ + .row(); + } +} + +fieldset{ + border:0; + padding:2em 0; + margin:0; + /* position:relative; See if we can get away without this */ +} + + + +legend{ + .visuallyhidden(); +} + +.fields li{ + padding-top:0.5em; + padding-bottom:0.5em; +} + +.field{ + padding:0 0 0.5em 0; +} + +label{ + font-weight:normal; + display:block; + padding:0 0 0.5em 0; + line-height:1em; + + .checkbox &, + .radio &{ + display:inline; + } +} + +input, textarea, select, .richtext, .tagit{ + .border-radius(6px); + .border-box(); + font-family:Open Sans,Arial,sans-serif; + width:100%; + border:1px dashed @color-input-border; + padding:1.2em; + background-color:white; + -webkit-appearance: none; + color:@color-text-input; + font-size:1.1em; + outline:none; + + &:hover{ + background-color:@color-fieldset-hover; + } + &:focus{ + border-color: darken(@color-input-focus, 40%); + outline:none; + background-color:@color-input-focus; + } +} + +.full .richtext{ + border:0; +} + +input[type=radio],input[type=checkbox]{ + .border-radius(0); + cursor:pointer; + float:left; + border:0; +} + +input[type=radio]{ + -webkit-appearance: radio; + width:auto; + position:relative; + margin-right:15px; +} + +input[type=radio]:before{ + .border-radius(100%); + font-family: verdant; + font-style: normal; + text-align:center; + position:absolute; + top:-5px; + left:-2px; + cursor:pointer; + display:block; + content:"K"; + width: 1em; + line-height: 1.1em; + padding: 4px; + background-color: white; + color:@color-grey-4; + border: 1px solid @color-grey-4; +} +input[type=radio]:checked:before{ + content:"K"; + color:@color-teal; +} + +input[type=checkbox]{ + -webkit-appearance: checkbox; + width:auto; + position:relative; + margin-right:15px; +} + +input[type=checkbox]:before{ + font-family: verdant; + font-style: normal; + text-align:center; + position:absolute; + top:-5px; + cursor:pointer; + display:block; + content:"x"; + line-height:20px; + width:20px; + height:20px; + background-color:white; + border:1px solid @color-grey-4; + color:#EEE; +} +input[type=checkbox]:checked:before{ + color:@color-teal; +} + +input[type=submit], input[type=reset], input[type=button], .button, button{ + .border-radius(2px); + width:auto; + padding:0.6em 1.2em; + border:none; + background-color: @color-button; + color:white; + text-decoration:none; + text-transform:uppercase; + font-size:1em; + white-space: nowrap; + position:relative; + -webkit-font-smoothing: auto; + vertical-align: middle; + line-height:1em; + display:inline-block; + + &.icon:before{ + font-size:1.5em; + } + &.icon.text-replace:before{ + font-size:auto; + } + + &.button-small{ + font-size:0.85em; + padding:1em 1.8em; + } + + &.button-secondary{ + border:1px solid @color-button; + color:@color-button; + background-color:transparent; + } + + &:hover{ + background-color: @color-button-hover; + color:white; + border-color:transparent; + } + + &.yes{ + background-color: @color-button-yes; + + &.button-secondary{ + border:1px solid @color-button-yes; + color:@color-button-yes; + background-color:transparent; + } + &:hover{ + color:white; + border-color:transparent; + background-color: @color-button-yes-hover; + } + } + &.no, &.serious{ + background-color: @color-button-no; + + &.button-secondary{ + border:1px solid @color-button-no; + color:@color-button-no; + background-color:transparent; + } + &:hover{ + color:white; + border-color:transparent; + background-color: @color-button-no-hover; + } + } + + /* special consideration for buttons with icons in them, to make them smaller */ + &.icon{ + padding:1em 2.4em; + padding:0.6em 1.2em; + } + + + input[type=submit], + + input[type=reset], + + input[type=button], + + .button, + + button{ + margin-left:1em; + } +} + +/* multiple-item forms where groups of fields can be added */ +.multiple { + + + > li{ + position:relative; + border-bottom: 1px solid @color-input-border; + + &:first-child fieldset{ + padding-top:0; + } + } + + /* styles applied to an element as it is being reordered */ + &.moving{ + position:relative; + } + li.moving{ + position:absolute; + width:100%; + } + + /* Object controls */ + .controls{ + position:absolute; + right:0; + top:2em; + text-transform:uppercase; + color:@color-grey-2; + -webkit-border-radius: 3px; + border-radius: 3px; + overflow:hidden; + line-height:0em; + + li{ + background-color: @color-grey-4; + display:inline-block; + cursor:pointer; + } + .icon{ + padding:0.3em; + } + .icon:before{ + vertical-align:middle; + line-height:2em; + } + .icon:hover{ + background-color:@color-teal; + + &:before{ + color:white; + } + } + .disabled{ + display:none; + } + } + > li:first-child .controls{ + top:0; + } +} + +/* wrapper around add button for mutliple objects */ +p.add{ + font-weight:700; + cursor:pointer; + margin-top:0; + margin-bottom:0; + padding-top:2.5em; + padding-bottom:2em; +} + +/* Other text */ +.help, .error-message{ + font-size:0.85em; + font-weight:normal; + margin:0 0 0.5em 0; +} +.help{ + color:@color-grey-2; + opacity:0; +} + +/* permanently show checkbox/radio help as they have no focus state */ +.boolean_field .help, .radio .help{ + opacity:1; +} + + +fieldset:hover > .help, +.field.focused + .help, +.field:focus + .help, +.field:hover + .help, +li.focused > .help{ + opacity:1; +} + +.required label:after{ + content:"*"; + color:@color-red; + font-weight:bold; + display:inline-block; + margin-left:0.5em; + line-height:1em; + font-size:13px; +} + +.error-message{ + margin:0; + color:@color-red; + clear:both; +} +.error input[type=text], .error input[type=email], .error input[type=tel], .error textarea, .error select, .error .tagit{ + border-color:@color-red; + background-color:@color-input-error-bg; +} + +/* field sizing */ +.field{ + &.col1, + &.col2, + &.col3, + &.col4, + &.col5, + &.col6, + &.col7, + &.col8, + &.col9, + &.col10, + &.col11, + &.col12{clear:both;} +} + +li.inline .field{ + &.col1, + &.col2, + &.col3, + &.col4, + &.col5, + &.col6, + &.col7, + &.col8, + &.col9, + &.col10, + &.col11, + &.col12{clear:none;} +} + +/* solve gutter issues of inline fields */ +ul.inline li:first-child, li.inline:first-child{ + margin-left:-@grid-gutter-width / 2; +} + + +/* TODO this chooser style has been made more generic based on two identical methods for choosing pages and images that were previously included in their own less files in each app directory (and since deleted). It would be best if an admin "theme" provided all the design for a UI in a single place, but should that be a series of overrides to the css provided from an app? If so, perhaps those two previous less files should be re-instated and then overriden here? hmm. */ + +.chooser { + /* We show the 'chosen' state...*/ + .clearfix(); + + input[type=text]{ + float:left; + width:50%; + margin-right:1em; + } + .chosen { + display: block; + } + .unchosen, .chosen{ + position:relative; + padding-left:@thumbnail-width+15; + + &:before{ + font-family:verdant; + content:""; + position:absolute; + top:0; + left:0; + margin-top:auto; + margin-bottom:auto; + display:inline-block; + opacity:0.1; + font-size:7.5em; + line-height:1em; + } + &:hover:before{ + opacity:0.2; + } + } + .unchosen { + display: none; + } + + /* ...unless the .page-chooser has the 'blank' class set */ + &.blank { + .chosen { display: none; } + .unchosen { display: block; } + } + + input[type=button]{ + font-size:0.85em; + padding:0.9em 1.4em; + } +} + +/* standard way of doing a chooser where the chosen object's title is overlayed */ +.page-chooser, +.snippet-chooser, +.document-chooser { + .unchosen, .chosen{ + height:100px; + + &:before{ + content:"c"; + left:0.2em; + } + } + .chosen{ + &:before{ + content:"b"; + } + .title{ + z-index:0; + float: left; + margin-left: -146px; + width: 126px; + max-height: 40px; + overflow: hidden; + font-size: 0.7em; + padding: 30px 10px 0px 10px; + display: block; + top: 0px; + position: absolute; + line-height: 1.4em; + text-align: center; + color: black; + white-space:nowrap; + text-overflow:ellipsis; + } + &:hover .title{ + } + } +} + +.snippet-chooser { + .unchosen:before, + .chosen:before{ + content:"D"; + } +} + +.document-chooser { + .unchosen, .chosen{ + height:100px; + + &:before{ + content:"h"; + left:0.2em; + } + } + .chosen:before{ + content:"r"; + } +} + +.image-chooser { + .unchosen, .chosen{ + .clearfix; + min-height:95px; + + &:before{ + content:"o"; + font-size:120px; + line-height:97px; + } + } + .chosen{ + &:before{ + content:""; + } + .preview-image{ + float:left; + margin-left:-(@thumbnail-width)-15; + } + } +} + +/* Tags */ + +.tagit{ + padding:0.6saem 1.2em; + + .tagit-choice{ + border:0; + } + + ul& input[type="text"]{ + padding: 0.2em 0.5em !important; /* having to use important, FML*/ + } + ul& li.tagit-choice-editable{ + padding:0 23px 0 0 !important; /* having to use important, FML*/ + } +} + +.tagit-close{ + .ui-icon-close{ + margin-left:1em; + text-indent:0; + background:none; + } + + .ui-icon-close:before{ + font-family:verdant; + display:block; + color:@color-grey-3; + content:"g"; + } + .ui-icon-close:hover:before{ + color:@color-red + } +} + + +/* search bars (search integrated into header area) */ +.search-bar{ + margin-top:-2em; + padding-top:1em; + padding-bottom:1em; + margin-bottom:2em; + + &.full-width{ + .nice-padding(); + background-color:@color-header-bg; + border-bottom:1px solid @color-grey-4; + } + + .fields{ + position:relative; + + .field label{ + display:none; + } + .field input{ + padding-left:3em; + } + .field:before{ + position:absolute; + left:0.5em; + top:1em; + font-family:verdant; + content:"f"; + font-size:25px; + color:@color-grey-3; + } + } + .submit{ + display:none; + position:absolute; + right:0; + top:0; + input{ + padding:1.55em 2em; + } + } + .taglist{ + font-size:0.9em; + line-height:2.4em; + h3{ + display:inline; + } + a{ + white-space: nowrap + } + } +} + +/* Transitions */ +fieldset, input, textarea, select{ + .transition(background-color 0.2s ease); +} +input[type=submit], input[type=reset], input[type=button], .button, button{ + .transition(~"background-color 0.2s ease, color 0.2s ease"); +} +.help{ + /* TODO: This transitionmakes the browser go nuts and the left menu jerk around. Find way to solve */ + .transition(opacity 0.2s ease); +} +.chooser { + .unchosen:before, .chosen:before{ + .transition(opacity 0.3s ease); + } +} + +@media screen and (min-width: @breakpoint-mobile){ + input[type=submit], input[type=reset], input[type=button], .button, button{ + font-size:0.95em; + padding:1.3em 2.2em; + + &.icon{ + padding:1em 2.4em; + } + } +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/components/icons.less b/wagtail/wagtailadmin/static/wagtailadmin/css/components/icons.less new file mode 100644 index 000000000..5cdb4439e --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/components/icons.less @@ -0,0 +1,225 @@ +@font-face { + font-family: "verdant"; + src:url("@{css-root}fonts/verdant.eot"); + src:url("@{css-root}fonts/verdant.eot?#iefix") format("embedded-opentype"), + url("@{css-root}fonts/verdant.ttf") format("truetype"), + url("@{css-root}fonts/verdant.svg#verdant") format("svg"), + url("@{css-root}fonts/verdant.woff") format("woff"); + font-weight: normal; + font-style: normal; +} + +.icon.teal{ + color:@color-teal; +} +.icon.white{ + color:white +} + +.icon:before, +.icon:after, +.hallotoolbar [class^="icon-"], +.hallotoolbar [class*=" icon-"]:before, +.hallotoolbar [class^="icon-"]:before{ + font-family: "verdant"; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none !important; + speak: none; + display: inline-block; + text-decoration: none; + width: 1.3em; + line-height: 1em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + vertical-align: -20%; + font-size:20px; + text-align:left; +} +.icon:after, +.hallotoolbar [class^="icon-"]:after, +.hallotoolbar [class^="icon-"]:after{ + text-align:right; +} + +.hallotoolbar [class^="icon-"], +.hallotoolbar [class*=" icon-"]:before, +.hallotoolbar [class*=" icon-"]:before, +.hallotoolbar [class^="icon-"]:before{ + font-size:1.1em; + vertical-align:-10%; + font-size:1.05em; +} + + +.icon-cogs:before, { + content: "a"; +} +.icon-doc-empty-inverse:before { + content: "b"; +} +.icon-doc-empty:before{ + content: "c"; +} +.icon-edit:before { + content: "d"; +} +.icon-arrow-up:before, +.icon-arrow-up-after:after { + content: "e"; +} +.icon-arrow-down:before, +.icon-arrow-down-after:after { + content: "q"; +} +.icon-search:before { + content: "f"; +} +.icon-cross:before { + content: "g"; +} +.icon-folder-open-1:before { + content: "i"; +} +.icon-folder-inverse:before { + content: "j"; +} +.icon-mail:before { + content: "k"; +} +.icon-arrows-up-down:before { + content: "l"; +} +.icon-locked:before { + content: "m"; +} +.icon-arrow-right:before, +.icon-arrow-right-after:after { + content: "n"; +} +.icon-doc-full:before, +.icon-file-text-alt:before { + content: "h"; +} +.icon-image:before, +.icon-picture:before { + content: "o"; +} +.icon-unlocked:before { + content: "p"; +} + +.icon-doc-full-inverse:before { + content: "r"; +} +.icon-folder:before { + content: "s"; +} +.icon-plus:before { + content: "t"; +} +.icon-tag:before { + content: "u"; +} +.icon-folder-open-inverse:before { + content: "v"; +} +.icon-cog:before { + content: "w"; +} +.icon-tick:before { + content: "x"; +} +.icon-user:before { + content: "y"; +} +.icon-arrow-left:before { + content: "z"; +} +.icon-tick-inverse:before { + content: "A"; +} +.icon-plus-inverse:before { + content: "B"; +} +.icon-snippet:before { + content: "D"; +} +.icon-verdant:before { + content: "V"; +} +.icon-bold:before{ + content:"C"; +} +.icon-italic:before{ + content:"E"; +} +.icon-undo:before{ + content:"H"; +} +.icon-repeat:before{ + content:"I"; +} +.icon-list-ol:before{ + content:"G"; +} +.icon-list-ul:before{ + content:"F"; +} +.icon-link:before{ + content:"J"; +} +.icon-radio-full:before{ + content:"K"; +} +.icon-radio-empty:before{ + content:"L"; +} +.icon-arrow-up-big:before{ + content:"M"; +} +.icon-arrow-down-big:before{ + content:"N"; +} +.icon-group:before{ + content:"O"; +} +.icon-media:before{ + content:"P"; +} +.icon-horizontalrule{ + &:before{ + font-family: Open Sans,Arial,sans-serif !important; // FML + content:"—"; + } +} +.icon-password:before{ + content:"Q"; +} +.icon-download:before{ + content:"S"; +} +.icon-home:before{ + content:"W"; +} +.icon-order:before{ + content:"T"; +} +.icon-grip:before{ + content:"U"; +} + +.icon.text-replace{ + font-size:0em; + line-height:0; + overflow:hidden; + + &:before{ + font-size:1rem; + display:inline-block; + width:100%; + line-height:1.2em; + text-align:center; + } +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/components/listing.less b/wagtail/wagtailadmin/static/wagtailadmin/css/components/listing.less new file mode 100644 index 000000000..370cc2d8b --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/components/listing.less @@ -0,0 +1,446 @@ +/* General listings, like for pages, images or snippets */ +ul.listing{ + .unlist(); +} + +.listing{ + margin-bottom:2em; + ul&{ + border-top:1px dashed @color-input-border; + margin-bottom:2em; + } + ul{ + .unlist(); + } + > li{ + padding:1em 0; + border-bottom:1px dashed @color-input-border; + } + + h3{ + margin:0; + font-size:0.95em; + } + + table&{ + width:100%; + } + + td, th{ + padding:1.5em 1em; + } + + &.small td, th{ + padding:0.6em 1em; + } + + thead{ + color: @color-grey-2; + border-bottom:1px solid @color-grey-4; + + th{ + font-size:0.85em; + text-align:left; + font-weight:normal; + white-space: nowrap; + text-transform:uppercase; + } + th.children{ + border:0; + } + + th a{ + text-decoration:none; + color:inherit; + position:relative; + + &.icon:after{ + opacity:0.5; + right:0; + } + } + + .dropdown{ + padding:0; + } + .dropdown-toggle{ + display:block; + padding:1.5em; + } + .dropdown:hover, + .dropdown.open{ + .box-shadow(0px 0px 3px 0 rgba(0,0,0,0.2)); + background-color:white; + margin-left:-@grid-gutter-width * 2; + } + } + + &.full-width td:first-child, + &.full-width th:first-child{ + .push-padding(@grid-content-indent); + } + + &.full-width{ + margin-bottom:-3em; /* this negates the padding added to the bottom of .content */ + } + &.full-width th{ + background-color:@color-thead-bg; + } + + .table-headers{ + border-bottom:1px solid @color-grey-4 + } + + tbody{ + border-bottom:1px dashed @color-input-border; + } + tbody tr{ + border-top:1px dashed @color-input-border; + &:first-child{ + border-top:1px dashed @color-input-border; + } + + } + &.full-width tbody{ + border:0; + } + &.full-width tbody tr:hover{ + background-color:#FDFDFD; + } + &.chooser tr.can-choose:hover{ + background-color:@color-teal; + color:white; + + a,a:hover{ + color:white; + } + .status-tag{ + border-color:white; + color:white; + } + } + + &.small tbody tr{ + font-size:1em; + } + + + .divider{ + text-transform:uppercase; + font-size:0.8em; + background-color:@color-grey-3; + td{ + + padding-top:0.5em; + padding-bottom:0.5em; + } + } + + &.full-width .divider td{ + .push-padding(@grid-content-indent); + } + + .index { + background-color:@color-header-bg; + .title h2{ + font-size:1.2em; + } + a{ + color:auto; + } + } + + + /* specific columns */ + .bulk{ + padding-right:0; + + label{ + font-size:1em; + display:block; + width:100%; + position:relative; + } + label span{ + .visuallyhidden(); + } + input{ + margin-top:3px; + + } + + } + .title{ + h2{ + text-transform:none; + margin:0; + font-size:1.1em; + font-weight:700; + color:@color-grey-2; + line-height:1.5em; + + a{ + color:inherit; + text-decoration:none; + display: block; + + &:hover{ + color:@color-link; + } + } + } + } + + .actions{ + margin-top:0.5em; + text-transform:uppercase; + font-size:0.85em; + + a{ + text-decoration:none; + } + + li{ + display:inline-block; + padding:0 0.5em; + border-left:1px solid @color-grey-3; + line-height:1em; + + &:first-child{ + border:0; + padding-left:0; + } + &.no-border{ + border:0; + } + } + + .button-small{ + font-size:1em; + padding:0.6em 1.2em; + margin-right:1em; + + &:before{ + font-size:1.7em; + } + } + } + + .moderate-actions form{ + float:left; + margin:0 1em 1em 0; + } + + .children, + .no-children{ + padding:0 !important; + border-left:1px dashed @color-input-border; + &:hover{ + background-color:@color-header-bg; + } + } + .children a, + .no-children a{ + color:@color-grey-3; + display:block; + padding:2em 0; + } + + .children a{ + display:block; + &:before{ + font-size:3rem; + } + } + .no-children a{ + display:block; + &:before{ + font-size:1.5rem; + } + } + &.small .children a:before{ + font-size:30px; + } + + .ord{ + padding-left:10px !important; + } + th.ord a:before{ + width:1em; + font-size:15px; + } + th.ord a:hover:before{ + color:@color-teal; + } + .handle{ + cursor:move; + width:20px; + + &:before{ + font-size:20px; + color:@color-grey-3; + width:1em; + } + &:hover:before{ + color:@color-text-base; + } + } + + .ui-sortable-helper{ + border:1px dashed @color-input-border; + border-width:1px 0; + + + td{ + display:none; + + } + .ord,.title{ + display:table-cell; + } + .ord{ + + } + } + .dropzone{ + height:80px; + background-color:@color-grey-1; + + &:hover{ + background-color:@color-grey-1; + } + td{ + padding: 0 !important; + } + } + + + td.children:hover{ + background-color:@color-teal; + + a:before{ + color:white; + } + } + + table .no-results-message{ + .push-padding(@grid-content-indent); + } + + .inactive h2{ + opacity:0.5; + } +} + + +.pagination{ + text-align:center; + p{ + margin:0; + } + ul{ + .unlist(); + } + ul{ + margin-top:-1.7em; + } + li{ + line-height:1em; + } + .prev{ + float:left; + } + .next{ + float:right; + } +} + +@media screen and (min-width: @breakpoint-mobile){ + .listing{ + &.horiz > li{ + float:left; + } + &.images { + .clearfix(); + border: 1px solid @color-grey-4; + border-width:0 0 0 1px !important; + + > li{ + padding:@grid-gutter-width/2; + width:200px; + height:220px; + text-align:center; + margin-top:-1px; + border:1px solid @color-grey-4; + border-width:1px 1px 1px 0px; + + .image{ + text-align:center; + height:180px; + + &:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; + margin-right: -0.25em; + } + + img{ + border:3px solid transparent; + display:inline-block; + vertical-align: middle; + } + } + + &:hover{ + background-color:#FDFDFD; + + img{ + border-color:@color-teal; + } + } + } + a{ + color:inherit; + } + + } + .actions{ + visibility: hidden; + } + .index .actions{ + visibility:visible; + } + td:hover .actions{ + visibility:visible; + } + .no-children { + border-color:transparent; + } + .no-children a{ + color:@color-teal; + opacity:0; + } + .no-children:hover{ + border-color:@color-input-border; + a{opacity:1;} + } + } + +} + + +/* Transitions */ +.listing { + thead .dropdown ul{ + .transition(none); + } + .children, .no-children{ + .transition(background-color 0.2s ease); + } + .children a, + .no-children a{ + .transition(all 0.2s ease); + } +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/components/messages.less b/wagtail/wagtailadmin/static/wagtailadmin/css/components/messages.less new file mode 100644 index 000000000..59b5f6189 --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/components/messages.less @@ -0,0 +1,54 @@ +.messages{ + position:relative; + + z-index:5; + + background-color:@color-grey-5; + + ul{ + .unlist(); + margin-left:-15px; + padding-left:10px; + position:relative; + top:-100px; + + &:before{ + content: ""; + height: 0; + width: 0; + display: block; + position: absolute; + bottom: -15px; + left: 0; + border-top: 15px solid #000; + border-left: 15px solid transparent; + } + } + li{ + .nice-padding; + padding-top:1.3em; + padding-bottom:1.3em; + color:white; + } + .error{ + background-color:@color-red; + } + .warning{ + background-color:@color-orange; + } + .success{ + background-color:@color-teal-dark; + } +} +.ready .messages ul{ + .transition-immediate(~"top 0.5s ease, max-height 1.2s ease"); + top:0px; +} +.messages.new ul{ + .transition-immediate(none); + top:-100px; +} +.messages.appear ul{ + .transition-immediate(~"top 0.5s ease, max-height 1.2s ease"); + top:0; +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/components/modals.less b/wagtail/wagtailadmin/static/wagtailadmin/css/components/modals.less new file mode 100644 index 000000000..ddba2803b --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/components/modals.less @@ -0,0 +1,96 @@ +@zindex-modal-background: 500; + +// Kill the scroll on the body +.modal-open { + overflow: hidden; + + .content-wrapper{ + -webkit-transform:none; + transform:none; + } +} + +// Container that the modal scrolls within +.modal { + .border-box(); + display: none; + overflow: auto; + overflow-y: scroll; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: @zindex-modal-background; +} + +// Shell div to position the modal with bottom padding +.modal-dialog { + .border-box(); + margin-left: auto; + margin-right: auto; + width: auto; + padding: 0px; + z-index: (@zindex-modal-background + 10); + height:90%; + width:85%; + + &:before{ + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; + margin-right: -0.25em; + } +} + +// Actual modal +.modal-content { + .border-box(); + .border-radius(3px); + width:99.70%; + position: relative; + background-color: white; + outline: none; + margin-top:2em; + padding-bottom:3em; + display:inline-block; + vertical-align: middle; + overflow:hidden; +} + +// Modal background +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: (@zindex-modal-background - 10); + background-color: black; + // Fade for backdrop + &.fade { opacity:0; } + &.in { opacity:0.7; } +} + +.modal .close{ + padding:0; + position:absolute; + width:50px; + height:50px; + top:10px; + right:10px; + z-index:1; +} + +// Where all modal content resides +.modal-body { + position: relative; + padding-bottom:2em; +} + +@media screen and (min-width: @breakpoint-mobile) { + .modal-dialog { + padding:0px 0 2em @menu-width; + } +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/components/tabs.less b/wagtail/wagtailadmin/static/wagtailadmin/css/components/tabs.less new file mode 100644 index 000000000..83dda6dbf --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/components/tabs.less @@ -0,0 +1,76 @@ +.tab-nav{ + .clearfix(); + border:1px solid @color-grey-4; + border-width:0 0 1px 1px; + padding:0; + + li{ + border:1px solid @color-grey-4; + border-width:1px 1px 0px 1px; + text-align:center; + } + a{ + outline:none; + line-height:3em; + text-transform:uppercase; + font-weight:700; + font-size:1.2em; + text-decoration:none; + background-color:@color-grey-5; + display:block; + padding:0 1em; + color:@color-grey-2; + border-top:0.3em solid @color-grey-3; + border-bottom:1px solid transparent; + + &:hover{ + color:inherit; + border-top-color:@color-grey-3; + } + + &.active{ + background-color:white; + .box-shadow(none); + color:@color-grey-1; + border-top:0.3em solid @color-grey-1; + border-bottom:2px solid white; + margin-bottom:-1px; + z-index:1; + position:relative; + } + } + + /* For cases where tab-nav should merge with header */ + &.merged{ + background-color:@color-header-bg; + margin-top:0; + } +} +.tab-content{ + section{ + display:none; + padding-top:1em; + + &.active{ + display:block; + } + } +} + + + +@media screen and (min-width: @breakpoint-mobile){ + .tab-nav li{ + .column(2); + padding:0; + } + + .modal-content .tab-nav li{ + .column(2); + padding:0; + min-width:110px; + } + .modal-content .tab-nav li{ + min-width:0; + } +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/core.less b/wagtail/wagtailadmin/static/wagtailadmin/css/core.less new file mode 100644 index 000000000..2043f951f --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/core.less @@ -0,0 +1,727 @@ +/* +min z-index: 1; +max z-index: 5; +*/ + +@import "variables.less"; +@import "mixins.less"; +@import "grid.less"; + +@import "components/explorer.less"; +@import "components/icons.less"; +@import "components/tabs.less"; +@import "components/dropdowns.less"; +@import "components/modals.less"; +@import "components/forms.less"; +@import "components/listing.less"; +@import "components/messages.less"; +@import "components/formatters.less"; + +html{ + background-color:@color-header-bg; +} + +body{ + -webkit-font-smoothing: antialiased; /* Do not remove! */ + font-family:Open Sans,Arial,sans-serif; + font-size:80%; + line-height:1.5em; + color:@color-text-base; + overflow-x: hidden; + position: relative; + + &.reordering{ + overflow:visible; + } +} + +h1,h2,h3,h4,h5,h6{ + font-weight:normal; + -webkit-font-smoothing: auto; +} + +h1{ + line-height:1.3em; + font-size:1.5em; + text-transform:uppercase; + color:@color-grey-2; + font-weight:700; + + span{ + text-transform:none; + font-weight:300; + } + + .homepage &{ + text-transform:none; + } +} +h2{ + text-transform:uppercase; + font-size:1.3em; + font-family:Open Sans; + font-weight:600; + color:@color-grey-2; + + .page-explorer &{ + text-transform:none; + } +} +a{ + color:@color-link; + text-decoration:none; + + &:hover{ + color:@color-link-hover; + } +} + +code{ + .box-shadow(inset 0px 0px 4px 0px rgba(0, 0, 0, 0.2)); + background-color:@color-fieldset-hover; + padding:2px 5px; +} + +kbd{ + .border-radius(3px); + font-family:Open Sans, Arial, sans-serif; + border:1px solid @color-grey-2; + border-color:rgba(0,0,0,0.2); + padding:0.3em 0.5em; +} + +img{ + max-width:100%; + height:auto; +} + +.browsermessage{ + background-color:@color-red; + color:white; + padding:1em 2em; + margin:0; + position:relative; + left:0; + top:0; + right:0; + + a{ + color:white; + text-decoration:underline; + } +} + +.wrapper{ + .clearfix(); +} + +.nav-wrapper{ + .box-shadow(inset -2px 0px 10px 0px rgba(0, 0, 0, 0.5)); + position:relative; + background: @color-grey-1; + margin-left: -100%; + width: 80%; + float: left; + height:100%; + min-height:800px; +} + .logo{ + display:block; + margin:2em auto; + text-align:center; + text-decoration:none; + color:white; + opacity:0.4; + + em{ + font-family: verdant; + font-style: normal; + font-size:7.7em; + line-height:1em; + } + span{ + display:none; + } + &:hover{ + opacity:1; + } + } + + #nav-toggle{ + .push(0.65); + .box-shadow(0px 0px 10px 5px rgba(255, 255, 255, 0.5)); + cursor:pointer; + position:fixed; + background: @color-grey-1; + width:40px; + opacity:0.8; + + &:before{ + font-size:30px; + color:white; + line-height:40px; + } + } + + .nav-main{ + position:absolute; + top: 150px; + bottom: 0px; + overflow: auto; + width:100%; + + ul, li{ + margin:0; + padding:0; + list-style-type:none; + } + + ul{ + border-top:1px solid @color-grey-1-1; + } + + li{ + border-bottom:1px solid @color-grey-1-1; + position:relative; + + &.selected{ + background-color:@color-grey-1; + } + + .menu-snippets &.menu-snippets, + .menu-users &.menu-users, + .menu-snippets &.menu-snippets, + .menu-documents &.menu-documents, + .menu-images &.menu-images, + .menu-search &.menu-search, + .menu-explorer &.menu-explorer{ + background:#222; + + &:after{ + content: " "; + width: 0px; + height: 0px; + display: block; + position: absolute; + right: 0; + top: 0.9em; + border: 0.7em solid #fff; + border-color: transparent #fff transparent transparent; + } + } + } + + a { + -webkit-font-smoothing: auto; + text-decoration:none; + text-transform:uppercase; + display: block; + color: #AAA; + padding: 0.9em 1.2em; + position:relative; + font-size:0.9em; + font-weight:400; + white-space:nowrap; + + &:before{ + margin-right:0.3em; + } + &:hover{ + color:white; + } + } + + .more > a{ + &:before{ + margin-right:0.4em; + } + font-size:0.8em; + padding:0.2em 1.2em; + background-color:@color-grey-1-1; + } + .more{ + border:0; + } + + .avatar{ + display:none; + } + + /* search form */ + #menu-search{ + position:relative; + .fields{ + .transition(background-color 0.2s ease); + background-color:@color-grey-1; + border:0; + li{ + border:0; + } + } + .field{ + padding:0; + color: #AAA; + + &:before{ + position:absolute; + left:0.75em; + top:0.45em; + } + } + .submit{ + .visuallyhidden(); + } + label{ + -webkit-font-smoothing: auto; + line-height:inherit; + text-transform:uppercase; + padding: 0.9em 1.2em 0.9em 3.5em; + } + input{ + float:left; + margin-top:-1000px; + text-transform:uppercase; + font-size:1em; + padding: 0.9em 1.2em 0.9em 3.5em; + border:0; + border-radius:0; + background-color:transparent; + line-height:inherit; + } + + &:hover{ + .field, input{ + color:white; + } + } + + &.focussed{ + label{ + display:none; + } + .fields{ + background-color:@color-grey-4; + } + .field{ + color: @color-grey-1; + } + input{ + margin-top:0px; + color:@color-grey-1; + } + } + } + } + + .js .nav-main .more ul{ + display:none; + } + + .explorer{ + position:absolute; + margin-top:150px; /* same as .nav-main */ + } + +.content-wrapper{ + width:100%; + float: right; + position: relative; + background-color:white; + border-bottom:1px solid @color-grey-4; + transform: translate3d(0,0,0); + -webkit-transform: translate3d(0,0,0); +} + .content{ + .row(); + border-top:40px solid @color-grey-5; /* this top border provides space for the floating logo to toggle the menu */ + padding-bottom:3em; + } + +body.nav-open .nav-wrapper{ + margin-left:0; +} + +body.nav-open .content-wrapper{ + transform: translate3d(80%,0,0); + -webkit-transform: translate3d(80%,0,0); + + position:fixed; +} + +body.nav-open #nav-toggle{ + left:80%; + &:before{ + content:"z"; + } +} + +body.explorer-open .explorer{ + display:block; + border-top:1px solid rgba(200,200,200,0.1); + + &:before{ + position:absolute; + top:-3em; + content:"Close explorer"; + padding:0.9em; + } +} + +body.explorer-open .nav-main{ + display:none; +} + +header{ + .nice-padding(); + padding-top:2em; + padding-bottom:1em; + background-color: @color-grey-5; + border-bottom:1px solid @color-grey-4; + margin-bottom:2em; + + h1, h2{ + margin:0; + } + + .left{ + float:left; + } + .right{ + float:right; + text-align:right; + } + + /* For case where content below header should merge with it */ + &.merged{ + margin-bottom:0; + } + &.tab-merged, &.no-border{ + border:0; + } + &.merged.no-border{ + padding-bottom:0; + } +} + +.page-explorer header{ + margin-bottom:0; + padding-bottom:1em; +} + + +footer{ + .row(); + background: @color-grey-1; + background: rgba(0,0,0,0.7); + position:fixed; + bottom:0; + height:3.4em; + padding:0.3em; + width:90%; + margin:0 5%; + color:white; + + ul{ + .unlist(); + } + li{ + float:left; + } + + .actions{ + width:250px; + margin-right:@grid-gutter-width/2; + + .button{ + padding-top:1em; + padding-bottom:1em; + } + } + + .meta{ + float:right; + text-align:right; + padding-right:@grid-gutter-width/2; + line-height:3.5em; + font-size:0.85em; + + span{ + margin-right:@grid-gutter-width; + } + + } +} + +::-webkit-scrollbar { + height: 10px; + width: 10px; + background: @color-grey-1; +} +::-webkit-scrollbar-thumb { + background: @color-grey-2; + -webkit-border-radius: 1ex; +} +::-webkit-scrollbar-corner { + background: @color-grey-1; +} + + +/* Z-indexes */ +#nav-toggle{ + z-index:5; +} +.nav-wrapper{ + z-index:2; +} +.content-wrapper{ + z-index:3; +} +footer, .logo{ + z-index:1; +} + +.breadcrumb{ + .unlist(); + .clearfix(); + + font-size:0.85em; + margin-top:1em !important; + + li { + display: block; + float: left; + background: @color-grey-3; + padding: 0.5em 1em 0.5em 2em; + position: relative; + margin: 0 4px 4px 0; + text-decoration: none; + color: #fff; + line-height:1em; + white-space: nowrap; + max-width:30em; + line-height:1.5em; + + a{ + color:@color-grey-2; + display:block; + max-width:25em; + white-space: nowrap; + text-overflow:ellipsis; + overflow:hidden; + line-height:1.6em; + } + + &:after, &:before{ + content: ""; + border-top: 1.3em solid transparent; + border-bottom: 1.3em solid transparent; + } + &:after { + border-left: 1em solid @color-grey-3; + position: absolute; right: -0.9em; top: 0; + z-index: 1; + } + &:before { + border-left: 1em solid @color-header-bg; + position: absolute; left: 0; top: 0; + } + + &:hover { + background: @color-teal; + + a{ + color:white; + } + } + &:hover:after { + border-left-color: @color-teal; + } + + &:first-child { + padding:0.5em; + .border-radius(3px 0px 0px 3px); + + &:before{ + display:none; + width:1em; + } + a { + width:2em; + font-size:1em; + &:before{ + line-height:1em; + font-size:1.7em; + } + } + } + } +} + +@media screen and (min-width: @breakpoint-mobile){ + .col1{ + .column(1); + } + .col2{ + .column(2); + } + .col3{ + .column(3); + } + .col4{ + .column(4); + } + .col5{ + .column(5); + } + .col6{ + .column(6); + } + .col7{ + .column(7); + } + .col8{ + .column(8); + } + .col9{ + .column(9); + } + .col10{ + .column(10); + } + .col11{ + .column(11); + } + .col12{ + .column(12); + } + + body{ + margin-left:@menu-width; + } + + .browsermessage{ + margin:0 0 0 -150px; + } + .content-wrapper{ + z-index:0; + -webkit-transform:none; + transform:none; + } + + .nav-wrapper{ + /* heigt and position necessary to force it to 100% height of screen (with some JS help) */ + position:absolute; + left:0; + height:100%; + width:@menu-width; + margin-left: -@menu-width; + } + + .content{ + border-top:0; + background-color:none; + padding-top:0; + } + + .inner{ /* inner only serves a purpose to position content */ + height:100%; + position:fixed; + width:@menu-width; + } + + #nav-toggle{ + display:none; + } + + .nav-main{ + margin-bottom: 116px; /* WARNING: magic number - the height of the .footer */ + + li{ + z-index:1; + } + .footer{ + padding-top:1em; + background-color:@color-grey-1; + position:fixed; + width:@menu-width - 7; + bottom:0; + text-align:center; + z-index:2; + } + .avatar{ + display:block; + margin:auto; + text-align:center; + margin-bottom:1em; + + a{ + padding:0 0 1em 0; + border-bottom:1px solid rgba(200,200,200,0.1); + } + &:before{ + color:@color-grey-2; + border: 2px solid @color-grey-2; + } + &:hover{ + .box-shadow(0px 0px 6px 0px rgba(0,0,0,1)); + } + } + } + + .explorer { + width: 400px; + position: absolute; + z-index:@explorer-z-index; + top:0; + left:99%; + } + .dl-menu { + position: absolute; + } + + /* UN-set the transformations used on mobile */ + body.nav-open .content-wrapper{ + position:relative; + transform: none; + -webkit-transform: none; + } + body.nav-open .nav-wrapper{ + margin-left: -@menu-width; + } + body.nav-open .nav-wrapper, + body.nav-open .nav-main{ + width:@menu-width; + } + + body.explorer-open .explorer:before{ + display:none; + } + body.explorer-open .nav-main{ + display:block; + } + + header{ + padding-top:2em; + padding-bottom:2em; + .nice-padding(); + } + footer{ + width:80%; + margin-left:40px; + } +} + +/* Transitions */ +.content-wrapper, +.nav-main, +#nav-toggle, +footer, +.logo{ + .transition(all 0.2s ease); /* TODO: ensure that nav-wrapper can't be seen to be gradually expanding to fill height of screen, by removing unnecessary transitions */ +} +.nav-wrapper{ + .transition-transform(0.2s ease); +} +.nav-main a, a{ + .transition(~"color 0.2s ease, background-color 0.2s ease"); +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.eot b/wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.eot new file mode 100644 index 0000000000000000000000000000000000000000..5156f60b3b55da63be1c7f85f46fa648ebd54c54 GIT binary patch literal 10346 zcmd5?Ym8l2b>8dj^Stl(xifQLGxz0rKknRnZO_=_B#wg<{F*pU9Gj9c9zO_v#<3x- zNDwiKaT^sG$y2Dix?n97AXYQi()GT2z&BzqQZ3^ROpr ztM*6FojGUkeb#=hz1FwZUi*A_g%E#T6@r8&_|k;ws02!WN1S^9R`u`-)xDih^*(s- zqT*IEBu?;*gtdM(W_U{lBhn6_xAped~9E4*KI3>(ANpkJ#t`nX7AkNU;byjdmaCc z11QiV^cLzSkS`rLbmF5vG7cdB0`f;ca^yoZKYQ-ScMBnZg8YXM&3yEz_&D|BJ=zq7 z!!w6whkj9=5~6$*WuH2FKs$`s2pcY?DNUCfdXK@i){hcs`P4B0D z$lua>z9TvWxU(P$Ov@G8*VcVE?-lFB4dMZe;fff-*t+qqMdOXg>rkaPijATyj)@qS zUEnUnvtpO{5=uFD49}Qof&xquMe%jq%OZ@D!zj^J&QBd4`BWIxV3JdK!A|iak4`B~NjKd;|S;a*{Bq8puNQ0-H5b`c` zX3n#Um%w8bkEngM_}I=a`^;qXxk7hOu~e>9SM>Jv4-Suvjt$i2X{BzMmhD7*{y;Dk zj>h7NWXerR6ZsDRUgxj>gVqsc#2Qg2KVlGRFG71qY`$nvk2%2Ud1Hfm_hO`rvpAH#jD zIaV91rD~{&ccZGitm+26j#@ovx5w%!_7p2c?ip>5svg#;mMisf)qW%Tf7sSnRwV3F zB(fsmlp-Y3ww5x@luxEjqr>8~>(g9wii}=EH{u#mIxIkh9nRc|zqo!sCZ9Ao7s5u7{ zPFv*0Od_+_kZFyyq9rvM2+E*il64KWmNsNIu!LAg17XXQH-&7p7WWgyG%IIWhAiv4 zW#vsR9&&8-W2CQpMLIZU85C6%3Ey=DsLQRsM_tCIjl!Up=w;v-kd~k)6O@F=7Q1^O z*HOsZ1i8gJ3owbeuAfin`rHqbCM68{^ox(D!aKuMNSO4G_>UWs9>Vk7IU}?)0`zRR z&DaV2Cp5W+iqY#Fd^!1%{@#h|~ZZvq_>z-IJ5MO7*MHI^#%$pETt}w9>q-}d0Of^ zZjb3QBuPUto_KQ_nbRY%tg;+?t0f4}shi?V?hp zUN2XuT&>kBem=Awd+)dnS>sp^_{%g!r*Jstx4=dMJFNvlx_G zB+^yT(t|URV8(G!P9xnzqp@H#9!PY?9J_C$zYx^(mTh!7&Rb#MmUsu$$4XMHaHBu; zRu&b`Wo+L-k6Y*tIes6-LZ*=$vy%nLf^wZnJPY~X1&#1xu z>~byo5)_H_jc}KYjfM=DO4sD+ct~oteyc(Ht)>}~bFVMWQwhA%;L-Ndv(P&q>m7_V zB&x>3TWw@Y+JVmtcuP5nh6MEZM>k0rUt-h7-mOMv@=#jWmTK#}vviurQVw z^Z4wC2ipxFcnx$Xh-Vo)O| zW>fjU1bH3n5{C@4-lyQrgH>@}epU{a3<#%@?5;Q6DR^()rWIv4Xi6qour{nfwNr(V znfLh%AtUFbt#gm;=sWYcX3g#3QPFcYIT^p+>DY5SyeA#Z`U4=&`u*J@Ea!fo3t5arKg6rnlr3EQ!VKv*O zmL+1NWUwL9b(ks&dE$hZFjw%|jvd1-%o{Y=+_t@Ec^VYskfuhnUa7*Bg@FQ~ETrGl z&sZWvEpeJ%-uKwd0t3$Drew!Uo&jT)aY!&m*v}T0X0ZbmWdI#icCkr-aln2diUHQ% z3u`^rzoHl`cXLkHi6QqI1m2AD7FEpin&#dHHIw7JjLs$0aN|(nb^0e zur4j#KULeE!An|z*y=-Y5#URx`*zndPjzRAF2N0Yl-;FEuB3_fYbM&=;b`z>FZsh^ z-=Bi&)l84qw-9xD2f7@`E}BuOZImljMmWf2Q_YiibL!XfO})uqPQi@a?Uqbq?y^hH z&Q#elz6dLNd9-Ti;aoo4vc^{^|^1DTNo1T$fvRiC7$i66v{-jfh#?<{cWQ|*f zl?Hf6Ivri=D?$MPytU3DJ7%vyfh_x=i!u<9wmxoQPg2+Ia0K){F^zP2J$*5-i2liT zN8H_kDO=i6$CqUr0)v2^M&8o%DYRx(BN9Y8yD1Dg%+w}|%HD@QL$Ud38NS*2@C&aYkoJF+avpPFRXB#Z2RtnZ%> zr2{Jxskyhk=b^t)FHJH|PjUs$?Za~1zKDimpl#`|H=ZKP^@f&suu+68wfj!An2vnGjf;Qbe}wiI;hCTPQR(dEmx?on1)1ybNKhR{0uI zuEhEkh9CED@Z*APi8zSTgwDIzoT2{;b}}i;M6AX9+5^S0XD-H$TjQN}r}@Fs>NU?; zAFmGdt(#7j@A|~02S3(->`%V%vGYB{`zO{Kzf4=fZIf6F>xvatrZ(c#dMf5DIrJ56rxGqZ~YqsJI$74(wFt*mHfF`&Z?Bb@V_J?~Z;10w( zlQzkuH67B)?HF+Yf6?w(GM(QFl=l^C9i0<~KD>Tq$E0-g$sxxe_@kO>1+|=Z+ed;W z?T-ravMFWn*e1hv-l&D5-N~e`JElxGGb!z&-FeH3E-M_&FXK6F>(c<^D&`5flF4yzB3!W+ACn!5B9| zE9165w@M#$4MWB|En6BsQ|h)wwt+wog)-25GIk~MV?IsVu@1*Vw8GS)emL;vu%Tf< z0C~ffzIex2CKw+`%E6cui#mQ&qpYq61JbZ$EEmsbd^-nk3hI(X zVTZkkW8}~ao>8URwmwlpJ_^!sJ*gTo~R19C>xp;B(Y)|1dp;APO4j?m8+ zIC7XQD^bnm@1b8W&$5-iEZeDAM^FpJw1{*PFe>5xj=#;?R%Z;+JS#dFqFg!zi3$-# zqPZ6r*!26Gb)T6k-IvMCF3(1q$7FaBaW4SN%z->qE0BK`k!2M?77SvP@my~p&cSte z?pilRGv+FcX>Qx<{@8E{X{yw6d6&RO_4MWj*qlJNCd!mB9z#JDtQ|TReMOc46vQTIM?hkjMm`kWtu44y6NYEI##vHV^9!etkrC> z`(UgmkZ__J+~|iFUiq9QuM8R>x38nSCq0p-bVs^aOo?paduWQ@oM*I)w8DwhEX zI|_(`zxz@g-3I(PXCSN3@u`G*2OsB^o^&6Yo9yT=xg8xUffAS8iH`2FDw%+(TD+Dn z`1NiU^tA=+xRAQCoH1PRBV3$b2sSv_fiM!Myg&>aa0D9OttYW%$kY>SZL8QnpL$`T z&xI8I@lqm>{ORS!M2H96MsL!Gmc$$whFbBx);hjPz9jqkXV0=jpYoIMB4;o9Plx>} zxc6tz;+6`8!v2d$Tx2%|y3j3FqU~+h>_OX+oVL@4wlAuhXf?@+vuF99^plI`xT{u{ zduI}~4Q0FfTVUvqvCkWXL~j!J2%OAvd<*8m<0ym{Hs1A$6e4(RW^7P~hP{Br7KcMT zi}MCnf>DEym(&u~QVN9`rnyyYl*apj@de#3bi^QyiNVhC20W^@ftYR$RmvIL?`Ruh z#&94o_gi)F!Uqqf$a9T+bhtCy%twYgDOa(qV%GqIW3kS>BfIzEoCYTpiu}7d)BFIU zT2a&XmGfHR)ggc20fZEdd-0QMc{u{naK~yRtW)lI(ZupVm+)it zV#`Sp(pDUkTHz>sSOdpU8rj2xTdjJniGAvM8ThH}{P6i=5uOb;Kbc2&Y#XQOAmG5modj?k3zLWcjFt_34yMf)N)Qf5%IO|5InPFiNb{@z&Q#;(Bog292o8!|yE z@9WAK7eGAT4u`eCH#`Czbx0??AA4YyK6k1 zt=DF|G8U!}UWc##JN=e^(Au>l-p1BddDe=}P-@K4n{}822fPp-ywM{EXfCJiABx8a zODr8nBU8iKVai>#+I6MrNZY4jzOne>O1jbLK-4Ri!+Cca+uuxB*E-{wT$VD~?4TLW zNW<<3hWxo0e}I5-4IrNI6FRH*mSAL-SUdSps}(!p!vGcm`j!`To%^i!%yk&{ZMLb$ zX%?ZB-+P7pD466JK>S7ek;1GuK*l`1P}r!>82AL(O;-P>K)wr@q3vRezRUJWt)X0; z@-lM2EV^GI8x>*VcR>UYLL+E)DdS-jW92=-&I(iIi^xsi8FynkFA^C-4v$tPGm z%cz=VRJr3=QOGSERMcq}7i4%G(KWRnZaJMb`ec_$X`kJt!;}0h2Fdf4ayQSnsrg*1KV}|>H`E19 z7IApU7;@2im**4Pww;-tK6Blju1rr)uf_kG)|30uAcMX1OZq(aq8ul{2{vncKh@#E zSE`W0q?73Ch8cy*bMRFY>&4BO=q=#n zMsX|7H#dpRVhe2CHgTJn#twPAxC48|J7Irzio0=6^#S!&Qx$93{;FvJQy!ZCvZ*Fk zAvV7o>}ViLvJwpAi}1A+94DlBCDUA_@)B$!#P-|cRpY$0=8HdO0(`&rWc&G_9~%6c literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.svg b/wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.svg new file mode 100644 index 000000000..7fcbdd94a --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.svg @@ -0,0 +1,62 @@ + + + +This SVG font generated by Fontastic.me + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<<<<<<< HEAD + +======= +>>>>>>> feature/ordering-integrated + + \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.ttf b/wagtail/wagtailadmin/static/wagtailadmin/css/fonts/verdant.ttf new file mode 100644 index 0000000000000000000000000000000000000000..59f9617e7ef4a9c16f20824d4fac9e3b4de7cb6e GIT binary patch literal 10184 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 h2, .single-field label{ + -webkit-font-smoothing: auto; + .border-radius(2px); + background-color:@color-grey-4; + text-transform:uppercase; + padding:2px 5px; + position:absolute; + top:0; + left:0; + font-size:0.85em; + z-index:1; + margin:0 0 0.2em 0; + line-height:1.5em; + font-weight:normal; + } + + .title input, + .title textarea{ + font-size:2em; + padding-top:2em; + } + + .multiple > li{ + border-bottom: 1px dashed @color-input-border; + } + + .multiple .controls{ + top:auto; + -webkit-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + } + + +} + +@media screen and (min-width: @breakpoint-mobile){ + .page-editor .tab-nav li{ + .column(2); + padding:0; + min-width:110px; + } +} diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/mixins.less b/wagtail/wagtailadmin/static/wagtailadmin/css/mixins.less new file mode 100644 index 000000000..9eb711a27 --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/mixins.less @@ -0,0 +1,91 @@ +.clearfix() { + &:before, + &:after { + content: " "; /* 1 */ + display: table; /* 2 */ + } + &:after { + clear: both; + } +} + +.unlist(){ + &, ul, li{ + list-style-type:none; + font-style: normal; + } + &, ul{ + margin-top:0; + margin-bottom:0; + padding-left:0; + } +} + +.transition(@transition){ + body.ready &{ + -webkit-transition: @transition; + -moz-transition: @transition; + -o-transition: @transition; + transition: @transition; + } +} +.transition-immediate(@transition){ + -webkit-transition: @transition; + -moz-transition: @transition; + -o-transition: @transition; + transition: @transition; +} + +.transition-transform(@transition) { + -webkit-transition: -webkit-transform @transition; + -moz-transition: -moz-transform @transition; + -o-transition: -o-transform @transition; + transition: transform @transition; +} + +.notransition() { + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; + -ms-transition: none !important; + transition: none !important; +} + +.border-radius(@radius){ + -webkit-border-radius: @radius; + border-radius: @radius; +} + +.box-shadow(@shadow){ + -webkit-box-shadow: @shadow; //inset 2px 2px 3px 2px rgba(0, 0, 0, 1) + box-shadow: @shadow; //inset 2px 2px 3px 2px rgba(0, 0, 0, 1) +} + +.visuallyhidden() { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + + &:active, &:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; + } +} + +.visuallyvisible(){ + clip:none; + height:auto; + width:auto; + margin:auto; + overflow:visible; + position:initial; +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/normalize.css b/wagtail/wagtailadmin/static/wagtailadmin/css/normalize.css new file mode 100755 index 000000000..8d57e3c96 --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/normalize.css @@ -0,0 +1,533 @@ +/*! normalize.css v1.1.1 | MIT License | git.io/normalize */ + +/* ========================================================================== + HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +/** + * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. + */ + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. + * Known issue: no IE 6 support. + */ + +[hidden] { + display: none; +} + +/* ========================================================================== + Base + ========================================================================== */ + +/** + * 1. Prevent system color scheme's background color being used in Firefox, IE, + * and Opera. + * 2. Prevent system color scheme's text color being used in Firefox, IE, and + * Opera. + * 3. Correct text resizing oddly in IE 6/7 when body `font-size` is set using + * `em` units. + * 4. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + background: #fff; /* 1 */ + color: #000; /* 2 */ + font-size: 100%; /* 3 */ + -webkit-text-size-adjust: 100%; /* 4 */ + -ms-text-size-adjust: 100%; /* 4 */ +} + +/** + * Address `font-family` inconsistency between `textarea` and other form + * elements. + */ + +html, +button, +input, +select, +textarea { + font-family: sans-serif; +} + +/** + * Address margins handled incorrectly in IE 6/7. + */ + +body { + margin: 0; +} + +/* ========================================================================== + Links + ========================================================================== */ + +/** + * Address `outline` inconsistency between Chrome and other browsers. + */ + +a:focus { + outline: thin dotted; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* ========================================================================== + Typography + ========================================================================== */ + +/** + * Address font sizes and margins set differently in IE 6/7. + * Address font sizes within `section` and `article` in Firefox 4+, Safari 5, + * and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +/** + * Address styling not present in IE 7/8/9, Safari 5, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +blockquote { + margin: 1em 40px; +} + +/** + * Address styling not present in Safari 5 and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address differences between Firefox and other browsers. + * Known issue: no IE 6/7 normalization. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Address styling not present in IE 6/7/8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address margins set differently in IE 6/7. + */ + +p, +pre { + margin: 1em 0; +} + +/** + * Correct font family set oddly in IE 6, Safari 4/5, and Chrome. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + _font-family: 'courier new', monospace; + font-size: 1em; +} + +/** + * Improve readability of pre-formatted text in all browsers. + */ + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +/** + * Address CSS quotes not supported in IE 6/7. + */ + +q { + quotes: none; +} + +/** + * Address `quotes` property not supported in Safari 4. + */ + +q:before, +q:after { + content: ''; + content: none; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== + Lists + ========================================================================== */ + +/** + * Address margins set differently in IE 6/7. + */ + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +/** + * Address paddings set differently in IE 6/7. + */ + +menu, +ol, +ul { + padding: 0 0 0 40px; +} + +/** + * Correct list images handled incorrectly in IE 7. + */ + +nav ul, +nav ol { + list-style: none; + list-style-image: none; +} + +/* ========================================================================== + Embedded content + ========================================================================== */ + +/** + * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. + * 2. Improve image quality when scaled in IE 7. + */ + +img { + border: 0; /* 1 */ + -ms-interpolation-mode: bicubic; /* 2 */ +} + +/** + * Correct overflow displayed oddly in IE 9. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + Figures + ========================================================================== */ + +/** + * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. + */ + +figure { + margin: 0; +} + +/* ========================================================================== + Forms + ========================================================================== */ + +/** + * Correct margin displayed oddly in IE 6/7. + */ + +form { + margin: 0; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct color not being inherited in IE 6/7/8/9. + * 2. Correct text not wrapping in Firefox 3. + * 3. Correct alignment displayed oddly in IE 6/7. + */ + +legend { + border: 0; /* 1 */ + padding: 0; + white-space: normal; /* 2 */ + *margin-left: -7px; /* 3 */ +} + +/** + * 1. Correct font size not being inherited in all browsers. + * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, + * and Chrome. + * 3. Improve appearance and consistency in all browsers. + */ + +button, +input, +select, +textarea { + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ + vertical-align: baseline; /* 3 */ + *vertical-align: middle; /* 3 */ +} + +/** + * Address Firefox 3+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +button, +input { + line-height: normal; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + * 4. Remove inner spacing in IE 7 without affecting normal text inputs. + * Known issue: inner spacing remains in IE 6. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ + *overflow: visible; /* 4 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * 1. Address box sizing set to content-box in IE 8/9. + * 2. Remove excess padding in IE 8/9. + * 3. Remove excess padding in IE 7. + * Known issue: excess padding remains in IE 6. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + *height: 13px; /* 3 */ + *width: 13px; /* 3 */ +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Remove inner padding and border in Firefox 3+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * 1. Remove default vertical scrollbar in IE 6/7/8/9. + * 2. Improve readability and alignment in all browsers. + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/* ========================================================================== + Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/panels/rich-text.less b/wagtail/wagtailadmin/static/wagtailadmin/css/panels/rich-text.less new file mode 100644 index 000000000..22b431edf --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/panels/rich-text.less @@ -0,0 +1,141 @@ +@import "../variables.less"; + +.hallotoolbar{ + position:absolute; + left:5.83%; +} +.hallotoolbar.affixed{ + position:fixed; + left:5.83%; + margin-left:140px; +} + +.richtext { + min-height:50px; + overflow: hidden; + + /* Resetting various html tags that have been messed with by Verdant's main css */ + h1{ + text-transform:none; + } + h2 { + text-transform:none; + display:block !important; + } + h1 span { + font-weight: normal; + color: inherit; + } + *:before, + *:after{ + display:none; + } + + ol, + ul { + margin: 1em 0; + padding: 0 0 0 40px; + } + li{ + display:list-item !important; + } + ul li{ + list-style-type:disc !important; + } + ol li{ + list-style-type:decimal !important; + } + + /* Delete controls on embedded blocks with contenteditable="false" */ + .rich-text-deletable { + position: relative; + a.delete-control { + position: absolute; + right: 0; + cursor: pointer; + display: none; + + &:before{ + background-color:rgba(255,255,255,0.8); + } + &:hover:before{ + background-color:white; + } + } + } + &.inEditMode { + .rich-text-deletable a.delete-control { + display: block; + } + } + + /* === CSS BELOW THIS POINT IS CUSTOM TO RCA === */ + /* TODO: find extensible way for developers to style rich text to suit their implementation, without making changes to anything within wagtailadmin */ + + h1,h2,h3,h4,h5,h6{ + font-family:inherit; + } + h1{} /* shouldn't be used */ + + h2 { + font-size: 2em; + line-height: 1.2em; + padding-top:0.5em; + border-top:1px solid #CCC; + clear:both + } + h3 { + font-size: 1.7em; + line-height: 1.194em; + } + h4 { + font-size: 1.5em; + line-height: 1.267em; + } + h5 { + /* used for large body text, not really heading */ + font-size: 1.200em; + line-height: 1.278em; + } + + hr { + border-bottom: 1px solid #ccc; + border-top: none; + border-left: none; + } + + /* + These styles correspond to the image formats defined in verdantimages/formats.py, + so that images displayed in the rich text field receive more or less the same + styling that they would receive on the site front-end. + TODO: when we implement a mechanism to configure the image format list on a + per-installation / per-site basis, we'll need a way to insert the corresponding + CSS here. + */ + + .bodytext-image { + margin-top: 3px; /* close as possible to match line-height space above p */ + img { + width:100%; + } + figcaption { + display: block; + width: 100%; + text-align: left; + margin-top: 16px; + margin-bottom: 16px; + } + &.small { + max-width: 45%; + } + &.left { + float: left; + margin-right: 16px; + } + &.right { + float: right; + margin-left: 16px; + } + } + +} diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/variables.less b/wagtail/wagtailadmin/static/wagtailadmin/css/variables.less new file mode 100644 index 000000000..fcacfb40c --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/css/variables.less @@ -0,0 +1,51 @@ +@static-root: "/static/wagtailadmin/images/"; +@css-root: "/static/wagtailadmin/css/"; + +@grid-columns: 12; +@grid-gutter-width: 3%; +@grid-max-width: 1200px; +@grid-content-indent:0.7; + +@breakpoint-mobile:50em; /* 800px */ +@breakpoint-desktop-small:56.25em; /* 900px */ +@breakpoint-desktop-large:75em; /* 1200px */ +@breakpoint-desktop-larger:100em; /* 1600px */ + +// generic colours +@color-teal: #43b1b0; +@color-teal-darker: darken(@color-teal, 10%); +@color-teal-dark: #246060; +@color-red: #f7474e; +@color-orange:#e9b04d; +@color-green: #00FF00; + +/* greys, darker to lighter */ +@color-grey-1: #333333; +@color-grey-1-1: #404040; +@color-grey-2: #666666; +@color-grey-3: #d9d9d9; +@color-grey-4: #e6e6e6; +@color-grey-5: #fafafa; + +@color-thead-bg: @color-grey-5; +@color-header-bg: @color-grey-5; +@color-fieldset-hover: @color-grey-5; +@color-input-border: @color-grey-3; +@color-input-focus: #f4fcfc; +@color-input-error-bg: #feedee; +@color-button: @color-teal; +@color-button-hover: @color-teal-darker; +@color-button-yes: @color-green; +@color-button-yes-hover: darken(@color-button-yes, 8%); +@color-button-no: @color-red; +@color-button-no-hover: darken(@color-button-no, 20%); +@color-link: @color-teal; +@color-link-hover: darken(@color-button, 8%); + +@color-text-base: @color-grey-2; +@color-text-input: @color-grey-1; + + +@thumbnail-width:130px; + +@menu-width: 150px; \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/animated-overlay.gif b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/animated-overlay.gif new file mode 100755 index 0000000000000000000000000000000000000000..d441f75ebfbdf26a265dfccd670120d25c0a341c GIT binary patch literal 1738 zcmZ|OX;ji_6b5ixNYt8>l?gOuO)6lU%W(mxn(`>1S(XO;u`D+P%xqBvMr|w-Vyr1s z7R|Cn0b8|Hu<=Zmv1mFqh9Fj!NuZfKB2MP$e75`XJ@>=!y!Ux9xR3x;EW!q1^V>X| znVFuRUN`NqJ2)ybXh%e__h!!pv(M|S3+?9F%(K}zyE40MGyhWF5-IDgL&=%2-9`Nk z!1@8uk4t%_{(K~>N;sK&dzJbwJ=$kYTlL=$%#0Pfh>U{%i@~wWbvYsD_K-D`&+u1( z#Ma`>%q<^UhzGvi(hyE`zCD{-=2|zL5>wnB=DE!U?(CZG%q4@lDnCq_%&3DCla#(X zmBhDD+RN$aMWWHm?ig*>1Onn6~r?Ma~N2JKAxN>H%UtRyRqS)6Um!-Tz%-r=& zQmTb^JFIe3W^-kAm`}`2P|niMh>RYyd)S^f(dbrx965?rzbhP|XeP}o&&DSZ4|oYQ z)I{f!SfycYw?3=9W;o-B%U5xs(pP267X~9-7L|4WzaYexC0GtG8wWygm63rF{llCEraxzkc=IxvFQ-y37=_;e5 zJLq^gsSO0Ayz?a>E_?{dmUc+t#qv$)XN8$<<}rQ#)lsiw+pmL&J>~+hgpo>i$m+;l zZIa_ZRIfSeT$~v5d`EBV&*k`apPgjv&B|+d`Q!nyu{L4rs%ZfoF0*Kq8I%ByOcFpL zK=>wzofZo<+0GZLCnWM3oQ^pb(gRSf02;~cEn@LJ>~XB9IkEX{$N#Z`m%>S!U{uPx zloI%bLdo$Adxlh(Uv^yX7s5G&C zLwNRG>~T?G{kzupp8EcyLGPoPf)@&9Wqfw_l&uU-6cexk%5;uQg%wb=0k_733{i#& z1a2p)gV3S2+QG1-K9tZ}E~I<(P0r2aFFY-c{o?TUOz3Xjod#TLE2A_c?*T7t z=1>~%YW450{Qqno4t`}gvLnuMrcu8+#xEBoY%2_+Mb#Z6S38+r*M4O`-+!zl(@m`D zQsi|GA2l3gEy}LFe<#Hv8?$_L#u8E|3-bP$*La*E>B{X!Sy4i6?TKam!49aXCAW4S*P_O^H4^*DpiA40o}Uqw~Eo&veh1`|8i zD2$x+>_b^bXE4N;AW=5>iYak2%!JAh0j1*k1{p#iRCjbB7!cSws~U{1IA@acLII$t z$>X#A+^s6iJ5~DFG!xa?>z{=lxtdi1rzbM-(nqAu3D8h-&64xo6|E!p?pK0xT;qoK z`6%+SpBk+~M?nO}>2mTw!A{yZ6O>Z@kwSd4;8aWU5z!P~tQl?u==^+R`{OmOS}oZh zOXQ3{6kuz?Is^n^L7;9ieB9C+8B{>t+pDrlq4xGDDn#T#3T5$l1g`FTQkU;b-981j zNm{zC`$wn7etklM#qHI4=3m5gwa6DNS{?Z!vSObi_od{4eUo=_S2BKNpkSdiqe(k9WtkeM79;2-%CFbb)aB=&H1?i1}uwFzoZQ(38Kn1zBP ORn*B%u*Wk|4g3!*Rv{Mv literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..88ce02b1ab86a9678eef18e1123920306cddeea1 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F1SA+{?>A)!QcOwS?k)_>#w|r1Kptm-M`SUO z_5fqIli7AahM1>|V~EA+ zRdP`(kYX@0Ff`URu+%j&4KXycGBvO=G1N6Mw=ysg)68o?(U6;;l9^VCTSI!uH5;G? N22WQ%mvv4FO#oUZGO_>w literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_246060_40x100.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_246060_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..84acb340d7e312c58e4c98f7f5cf469bda0eae11 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F$P6UUt$JVyq?iMILR?i65;hdxlmv1)3p^r= zfwTu0yPeFo12XtMT^vI+&L<~Gur6-+#lXN6!N6E*)>aObQY~?fC`m~yNwrEYN(E93 zMh1q)x(1fIMrI)frdB2S%}>cptHiBgip|~#paup{S3j3^ HP6u$9Q?mx-CrP=v%n*= z7)X17vD?XPJ0OGK)5S4F<9u?01nc64UknUP5e$r_W^Ls_Db*6!h?11Vl2ohYqEsNo zU}RuutZQJYYh)H;U}|MzZe?hxYhZ3=VBlVPxd25&ZhlH;S|x4`W-8fdfEpM)UHx3v IIVCg!07-;27ytkO literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_e8f8f9_40x100.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_e8f8f9_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..41354d93eb955790f6f85ff9b63b424de2b1abb3 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F$P6UUt$JVyq?iMILR??`_$kpp_dJlxS>O>_ z45U54*zIJt9gxBA>EaloaXvXgf^~7jF9rst2nNPdv$k@elxm4~=ES4#?p5ba4#PIG>y#!MeEN7Xt%R1OsEKSz9?!O0~o_q9i4;B-JXpC>2OC z7#SEE>l#?<8kvO{m{}Q_TbWqu8kk!d7(_j*o{6F%H$NpatrE8e?cIk}ff^V*UHx3v IIVCg!0Mqd^#{d8T literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_ffffff_40x100.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_100_ffffff_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..7fe582a82fc5d6f71ec3e8c2ffdfcc89db6e0827 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8A6^ejv*T7lYj6t@hpC#;TbB#aBAWwna#KLs)4eqC9V-ADTyViR>?)F zK#IZ0z|dINz*5)9G{nfr%EZjd$U@h^+{(bfblM>~6b-rgDVb@NxHY((u37}tz~JfX K=d#Wzp$P!ek2GKa literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..577ee285a3d9b5a9190ed7de87d09b2c82a1c89c GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8A6^ejv*T7lYj6t@hpC#;TbB#aBAWwna#KLs)4eqC9V-ADTyViR>?)F zK#IZ0z|dINz*5)HJjBSz%GlD%z*N`3+{(Z}DsPGxiiX_$l+3hB+#0ftb-n>LFnGH9 KxvXNBhW literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..a14fc17a3353e050f25cdc467b9c7ecf8f6d318e GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12TF&T^vI^j=w#x$i?I+((tf;UXnmgbH|3oY>pC!)f}(GR!16S-u+#{ ze6YEqRkW=8vGl=5qArKM<9}TC-}iEvB{zdaTcX5$wyRTK&ALKd7b7@Ap`8dw<{=^B_@85roY)Uu#x$jwj5OsmALAtv(Z4xk1GPgg&e IbxsLQ0I!@f8~^|S literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..4c025741ade6055406f85ed015d435e336766965 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!T=8puqDZgOs>RXUCGx5b?-VBQkUm|IuXOmYJrBRJgj{Vx zMbNnqUkncy+qa2-mWYc>swkcIuvGK#>(0d)B7)5f`@$Ei28nH~0h*~=;u=wsl30>z zm0Xkxq!^4042^XSEOiadLyU~9j4iDU%ybRRtqcsb+xo7fXvob^$xN%nts&~RSvF7u NgQu&X%Q~loCIDT3PImwR literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..da46f6ca5bc30e4388a1c1321465ed4e0652f0ad GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!TrvH)L6@80)r*_cdCvDr%)6ghVL16=s@mbz7H!uRdGeDa z?kzLg)16i!f8fKx84s0>4wE)h OVDNPHb6Mw<&;$T`Els@u literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..f0589a9bdce887727dbef9aeb4a4bc54a5f29676 GIT binary patch literal 332 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 QJ~;stWz}Trq%1=J3#jBGg8%>k literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_2e83ff_256x240.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_2e83ff_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..84b601bf0f726bf95801da487deaf2344a32e4b8 GIT binary patch literal 4549 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 F{{S81aohj^ literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_454545_256x240.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_454545_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..b6db1acdd433be80a472b045018f25c7f2cf7e08 GIT binary patch literal 6992 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 D^wE0= literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_888888_256x240.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_888888_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..feea0e20264c4649b2ef03fe6705d69b4937c04e GIT binary patch literal 6999 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 literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_cd0a0a_256x240.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_cd0a0a_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..ed5b6b0930f672fa08e9b9bdbe5e55370fd1dc30 GIT binary patch literal 4549 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 DTfr$v literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_ffffff_256x240.png b/wagtail/wagtailadmin/static/wagtailadmin/css/vendor/jquery-ui/images/ui-icons_ffffff_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..4f624bb2b193750f1a5b36c8c307168c6681a861 GIT binary patch literal 6299 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 literal 0 HcmV?d00001 diff --git a/wagtail/wagtailadmin/static/wagtailadmin/js/core.js b/wagtail/wagtailadmin/static/wagtailadmin/js/core.js new file mode 100644 index 000000000..5506736d3 --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/js/core.js @@ -0,0 +1,105 @@ +/* generic function for adding a message to message area through JS alone */ +function addMessage(status,text){ + $('.messages').addClass('new').empty().append('
        • ' + text + '
        '); + var addMsgTimeout = setTimeout(function(){ + $('.messages').addClass('appear'); + clearTimeout(addMsgTimeout); + }, 100) +} + +$(function(){ + // Add class to the body from which transitions may be hung so they don't appear to transition as the page loads + $('body').addClass('ready'); + + // Enable toggle to open/close nav + $('#nav-toggle').click(function(){ + $('body').toggleClass('nav-open'); + }); + + // Enable swishy section navigation menu + $('.explorer').addClass('dl-menuwrapper').dlmenu({ + animationClasses : { + classin : 'dl-animate-in-2', + classout : 'dl-animate-out-2' + } + }); + + // Resize nav to fit height of window. This is an unimportant bell/whistle to make it look nice + var fitNav = function(){ + $('.nav-wrapper').css('min-height',$(window).height()); + $('.nav-main').each(function(){ + var thisHeight = $(this).height(); + var footerHeight = $('.footer', $(this)).height(); + + // $(this).css({'height':thisHeight - footerHeight, 'overflow-y':'scroll'}); + // $('> ul', $(this)).height(thisHeight) + }); + } + fitNav(); + $(window).resize(function(){ + fitNav(); + }) + + // Apply auto-height sizing to text areas + // NB .richtext (hallo.js-enabled) divs do not need this as they expand to fit their content by default + // $('.page-editor textarea').autosize(); + + // Enable nice focus effects on all fields. This enables help text on hover. + $(document).on('focus mouseover', 'input,textarea,select', function(){ + $(this).closest('.field').addClass('focused') + $(this).closest('fieldset').addClass('focused') + $(this).closest('li').addClass('focused') + }) + $(document).on('blur mouseout', 'input,textarea,select', function(){ + $(this).closest('.field').removeClass('focused') + $(this).closest('fieldset').removeClass('focused') + $(this).closest('li').removeClass('focused') + }); + + /* tabs */ + $(document).on('click', '.tab-nav a', function (e) { + e.preventDefault() + $(this).tab('show'); + }); + $(document).on('click', '.tab-toggle', function(e){ + e.preventDefault() + $('.tab-nav a[href="'+ $(this).attr('href') +'"]').click(); + }) + + + $('.dropdown-toggle').bind('click', function(){ + $(this).closest('.dropdown').toggleClass('open'); + + // Stop event propagating so the "close all dropdowns on body clicks" code (below) doesn't immediately close the dropdown + return false; + }); + + /* close all dropdowns on body clicks */ + $(document).on('click', function(e){ + var relTarg = e.relatedTarget || e.toElement; + if(!$(relTarg).hasClass('dropdown-toggle')){ + $('.dropdown').removeClass('open'); + } + }) + + /* Bulk-selection */ + $(document).on('click', 'thead .bulk', function(){ + $(this).closest('table').find('tbody .bulk input').each(function(){ + $(this).prop('checked', !$(this).prop('checked')); + }) + }); + + $(".nav-main .more > a").bind('click keydown', function(){ + $(this).parent().find('ul').toggle('fast'); + return false; + }); + + $('#menu-search input').bind('focus', function(){ + $('#menu-search').addClass('focussed'); + }).bind('blur', function(){ + $('#menu-search').removeClass('focussed'); + }) + $('#menu-search').bind('focus click', function(){ + $(this).addClass('focussed'); + }) +}) \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/js/expanding_formset.js b/wagtail/wagtailadmin/static/wagtailadmin/js/expanding_formset.js new file mode 100644 index 000000000..9c6007dfd --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/js/expanding_formset.js @@ -0,0 +1,28 @@ +function buildExpandingFormset(prefix, opts) { + if (!opts) { + opts = {}; + } + + var addButton = $('#' + prefix + '-ADD'); + var formContainer = $('#' + prefix + '-FORMS'); + var totalFormsInput = $('#' + prefix + '-TOTAL_FORMS'); + var formCount = parseInt(totalFormsInput.val(), 10); + + var emptyFormTemplate = document.getElementById(prefix + '-EMPTY_FORM_TEMPLATE'); + if (emptyFormTemplate.innerText) { + emptyFormTemplate = emptyFormTemplate.innerText; + } else if (emptyFormTemplate.textContent) { + emptyFormTemplate = emptyFormTemplate.textContent; + } + + addButton.click(function() { + var newFormHtml = emptyFormTemplate.replace(/__prefix__/g, formCount); + formContainer.append(newFormHtml); + if (opts.onAdd) { + opts.onAdd(formCount); + } + + formCount++; + totalFormsInput.val(formCount); + }); +} diff --git a/wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-hr.coffee b/wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-hr.coffee new file mode 100644 index 000000000..76eb5a04c --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-hr.coffee @@ -0,0 +1,28 @@ +# Hallo - a rich text editing jQuery UI widget +# (c) 2011 Henri Bergius, IKS Consortium +# Hallo may be freely distributed under the MIT license +((jQuery) -> + jQuery.widget "IKS.hallohr", + options: + editable: null + toolbar: null + uuid: '' + buttonCssClass: null + + populateToolbar: (toolbar) -> + buttonset = jQuery "" + + buttonElement = jQuery '' + buttonElement.hallobutton + uuid: @options.uuid + editable: @options.editable + label: "Horizontal rule" + command: "insertHorizontalRule" + icon: "icon-horizontalrule" + cssClass: @options.buttonCssClass + buttonset.append buttonElement + + buttonset.hallobuttonset() + toolbar.append buttonset + +)(jQuery) diff --git a/wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-verdant-toolbar.js b/wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-verdant-toolbar.js new file mode 100644 index 000000000..8e93b8543 --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-verdant-toolbar.js @@ -0,0 +1,97 @@ +(function(jQuery) { + return jQuery.widget('IKS.halloToolbarFixed', { + toolbar: null, + options: { + parentElement: 'body', + editable: null, + toolbar: null, + affix: true, + affixTopOffset: 2 + }, + _create: function() { + var el, widthToAdd, + _this = this; + this.toolbar = this.options.toolbar; + this.toolbar.show(); + jQuery(this.options.parentElement).append(this.toolbar); + this._bindEvents(); + jQuery(window).resize(function(event) { + return _this.setPosition(); + }); + jQuery(window).scroll(function(event) { + return _this.setPosition(); + }); + if (this.options.parentElement === 'body') { + el = jQuery(this.element); + widthToAdd = parseFloat(el.css('padding-left')); + widthToAdd += parseFloat(el.css('padding-right')); + widthToAdd += parseFloat(el.css('border-left-width')); + widthToAdd += parseFloat(el.css('border-right-width')); + widthToAdd += (parseFloat(el.css('outline-width'))) * 2; + widthToAdd += (parseFloat(el.css('outline-offset'))) * 2; + return jQuery(this.toolbar).css("width", el.width() + widthToAdd); + } + }, + _getPosition: function(event, selection) { + var offset, position, width; + if (!event) { + return; + } + width = parseFloat(this.element.css('outline-width')); + offset = width + parseFloat(this.element.css('outline-offset')); + return position = { + top: this.element.offset().top - this.toolbar.outerHeight() - offset, + left: this.element.offset().left - offset + }; + }, + _getCaretPosition: function(range) { + var newRange, position, tmpSpan; + tmpSpan = jQuery(""); + newRange = rangy.createRange(); + newRange.setStart(range.endContainer, range.endOffset); + newRange.insertNode(tmpSpan.get(0)); + position = { + top: tmpSpan.offset().top, + left: tmpSpan.offset().left + }; + tmpSpan.remove(); + return position; + }, + setPosition: function() { + var elementBottom, elementTop, height, offset, scrollTop, topOffset; + if (this.options.parentElement !== 'body') { + return; + } + + this.toolbar.css('top', this.element.offset().top - this.toolbar.outerHeight()); + + if (this.options.affix) { + this.toolbar.removeClass('affixed'); + scrollTop = jQuery(window).scrollTop(); + offset = this.element.offset(); + height = this.element.height(); + topOffset = this.options.affixTopOffset; + elementTop = offset.top - (this.toolbar.height() + this.options.affixTopOffset); + elementBottom = (height - topOffset) + (offset.top - this.toolbar.height()); + if (scrollTop > elementTop && scrollTop < elementBottom) { + this.toolbar.addClass('affixed'); + this.toolbar.css('top', this.options.affixTopOffset); + } + } else { + + } + return this.toolbar; + }, + _updatePosition: function(position) {}, + _bindEvents: function() { + var _this = this; + this.element.on('halloactivated', function(event, data) { + _this.setPosition(); + return _this.toolbar.show(); + }); + return this.element.on('hallodeactivated', function(event, data) { + return _this.toolbar.hide(); + }); + } + }); +})(jQuery); \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-verdantlink.coffee b/wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-verdantlink.coffee new file mode 100644 index 000000000..ef7963690 --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/js/hallo-plugins/hallo-verdantlink.coffee @@ -0,0 +1,68 @@ +# plugin for hallo.js to allow inserting links using Verdant's page chooser + +(($) -> + $.widget "IKS.halloverdantlink", + options: + uuid: '' + editable: null + + populateToolbar: (toolbar) -> + widget = this + + getEnclosingLink = () -> + # if cursor is currently within a link element, return it, otherwise return null + node = widget.options.editable.getSelection().commonAncestorContainer + return $(node).parents('a').get(0) + + # Create an element for holding the button + button = $('') + button.hallobutton + uuid: @options.uuid + editable: @options.editable + label: 'Links' + icon: 'icon-link' + command: null + queryState: (event) -> + button.hallobutton('checked', !!getEnclosingLink()) + + # Append the button to toolbar + toolbar.append button + + button.on "click", (event) -> + enclosingLink = getEnclosingLink() + if enclosingLink + # remove existing link + $(enclosingLink).replaceWith(enclosingLink.innerHTML) + button.hallobutton('checked', false) + widget.options.editable.element.trigger('change') + else + # commence workflow to add a link + lastSelection = widget.options.editable.getSelection() + + if lastSelection.collapsed + # TODO: don't hard-code this, as it may be changed in urls.py + url = '/admin/choose-page/?allow_external_link=true&allow_email_link=true&prompt_for_link_text=true' + else + url = '/admin/choose-page/?allow_external_link=true&allow_email_link=true' + + ModalWorkflow + url: url + responses: + pageChosen: (pageData) -> + a = document.createElement('a') + a.setAttribute('href', pageData.url) + if pageData.id + a.setAttribute('data-id', pageData.id) + a.setAttribute('data-linktype', 'page') + + if (not lastSelection.collapsed) and lastSelection.canSurroundContents() + # use the selected content as the link text + lastSelection.surroundContents(a) + else + # no text is selected, so use the page title as link text + a.appendChild(document.createTextNode pageData.title) + lastSelection.insertNode(a) + + widget.options.editable.element.trigger('change') + +)(jQuery) diff --git a/wagtail/wagtailadmin/static/wagtailadmin/js/modal-workflow.js b/wagtail/wagtailadmin/static/wagtailadmin/js/modal-workflow.js new file mode 100644 index 000000000..de88192fe --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/js/modal-workflow.js @@ -0,0 +1,78 @@ +/* A framework for modal popups that are loaded via AJAX, allowing navigation to other +subpages to happen within the lightbox, and returning a response to the calling page, +possibly after several navigation steps +*/ + +function ModalWorkflow(opts) { + /* options passed in 'opts': + 'url' (required): initial + 'responses' (optional): dict of callbacks to be called when the modal content + calls modal.respond(callbackName, params) + */ + + var self = {}; + var responseCallbacks = opts.responses || {}; + + /* remove any previous modals before continuing (closing doesn't remove them from the dom) */ + $('body > .modal').remove(); + + var container = $(''); + $('body').append(container); + container.modal(); + + self.body = container.find('.modal-body'); + + self.loadUrl = function(url, urlParams) { + $.get(url, urlParams, self.loadResponseText, 'text'); + }; + + self.postForm = function(url, formData) { + $.post(url, formData, self.loadResponseText, 'text'); + }; + + self.ajaxifyForm = function(formSelector) { + $(formSelector).each(function() { + var action = this.action; + if (this.method.toLowerCase() == 'get') { + $(this).submit(function() { + self.loadUrl(action, $(this).serialize()); + return false; + }); + } else { + $(this).submit(function() { + self.postForm(action, $(this).serialize()); + return false; + }); + } + }); + }; + + self.loadResponseText = function(responseText) { + var response = eval('(' + responseText + ')'); + self.loadBody(response); + }; + + self.loadBody = function(body) { + if (body.html) { + self.body.html(body.html); + } + if (body.onload) { + body.onload(self); + } + }; + + self.respond = function(responseType) { + if (responseType in responseCallbacks) { + args = Array.prototype.slice.call(arguments, 1); + responseCallbacks[responseType].apply(self, args); + } + }; + + self.close = function() { + container.modal('hide'); + }; + + self.loadUrl(opts.url, opts.urlParams); + + return self; +} diff --git a/wagtail/wagtailadmin/static/wagtailadmin/js/page-chooser.js b/wagtail/wagtailadmin/static/wagtailadmin/js/page-chooser.js new file mode 100644 index 000000000..337fc30be --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/js/page-chooser.js @@ -0,0 +1,31 @@ +function createPageChooser(id, pageType, openAtParentId) { + var chooserElement = $('#' + id + '-chooser'); + var pageTitle = chooserElement.find('.title'); + var input = $('#' + id); + + $('.action-choose', chooserElement).click(function() { + var initialUrl = '/admin/choose-page/'; + /* TODO: don't hard-code this URL, as it may be changed in urls.py */ + if (openAtParentId) { + initialUrl += openAtParentId + '/'; + } + ModalWorkflow({ + 'url': initialUrl, + 'urlParams': {'page_type': pageType}, + 'responses': { + 'pageChosen': function(pageData) { + input.val(pageData.id); + openAtParentId = pageData.parentId; + pageTitle.text(pageData.title); + chooserElement.removeClass('blank'); + } + } + }); + }); + + $('.action-clear', chooserElement).click(function() { + input.val(''); + openAtParentId = null; + chooserElement.addClass('blank'); + }); +} \ No newline at end of file diff --git a/wagtail/wagtailadmin/static/wagtailadmin/js/page-editor.js b/wagtail/wagtailadmin/static/wagtailadmin/js/page-editor.js new file mode 100644 index 000000000..3af65aae2 --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/js/page-editor.js @@ -0,0 +1,251 @@ +function makeRichTextEditable(id) { + var input = $('#' + id); + var richText = $('
        ').html(input.val()); + richText.insertBefore(input); + input.hide(); + + var removeStylingPending = false; + function removeStyling() { + /* Strip the 'style' attribute from spans that have no other attributes. + (we don't remove the span entirely as that messes with the cursor position, + and spans will be removed anyway by our whitelisting) + */ + $('span[style]', richText).filter(function() { + return this.attributes.length === 1; + }).removeAttr('style'); + removeStylingPending = false; + } + + richText.hallo({ + toolbar: 'halloToolbarFixed', + toolbarcssClass: 'testy', + plugins: { + 'halloformat': {}, + 'halloheadings': {formatBlocks: ["p", "h2", "h3", "h4", "h5"]}, + 'hallolists': {}, + 'hallohr': {}, + 'halloreundo': {}, + 'halloverdantimage': {}, + 'halloverdantembeds': {}, + 'halloverdantlink': {}, + 'halloverdantdoclink': {}, + } + }).bind('hallomodified', function(event, data) { + input.val(data.content); + if (!removeStylingPending) { + setTimeout(removeStyling, 100); + removeStylingPending = true; + } + }).bind('paste', function(event, data) { + setTimeout(removeStyling, 1); + }); +} + +function insertRichTextDeleteControl(elem) { + var a = $('
        Delete'); + $(elem).addClass('rich-text-deletable').prepend(a); + a.click(function() { + $(elem).fadeOut(function() { + $(elem).remove(); + }); + }) +} + +function initDateChoosers(context) { + $('input.friendly_date', context).datepicker({ + dateFormat: 'd M yy', constrainInput: false, /* showOn: 'button', */ firstDay: 1 + }); +} +function initDateChooser(id) { + $('#' + id).datepicker({ + dateFormat: 'd M yy', constrainInput: false, /* showOn: 'button', */ firstDay: 1 + }); +} + +function initTimeChoosers(context) { + $('input.friendly_time', context).timepicker({ + timeFormat: 'g.ia' + }); +} +function initTimeChooser(id) { + $('#' + id).timepicker({ + timeFormat: 'g.ia' + }); +} + +function initTagField(id, autocompleteUrl) { + $('#' + id).tagit({ + autocomplete: {source: autocompleteUrl} + }); +} + +function InlinePanel(opts) { + var self = {}; + + self.initChildControls = function (prefix) { + var childId = 'inline_child_' + prefix; + var deleteInputId = 'id_' + prefix + '-DELETE'; + $('#' + deleteInputId + '-button').click(function() { + /* set 'deleted' form field to true */ + $('#' + deleteInputId).val('1'); + $('#' + childId).fadeOut(function() { + self.updateMoveButtonDisabledStates(); + }); + }); + if (opts.canOrder) { + $('#' + prefix + '-move-up').click(function() { + var currentChild = $('#' + childId); + var currentChildOrderElem = currentChild.find('input[name$="-ORDER"]'); + var currentChildOrder = currentChildOrderElem.val(); + + /* find the previous visible 'inline_child' li before this one */ + var prevChild = currentChild.prev(':visible'); + if (!prevChild.length) return; + var prevChildOrderElem = prevChild.find('input[name$="-ORDER"]'); + var prevChildOrder = prevChildOrderElem.val(); + + // async swap animation must run before the insertBefore line below, but doesn't need to finish first + self.animateSwap(currentChild, prevChild); + + currentChild.insertBefore(prevChild); + currentChildOrderElem.val(prevChildOrder); + prevChildOrderElem.val(currentChildOrder); + + self.updateMoveButtonDisabledStates(); + }); + + $('#' + prefix + '-move-down').click(function() { + var currentChild = $('#' + childId); + var currentChildOrderElem = currentChild.find('input[name$="-ORDER"]'); + var currentChildOrder = currentChildOrderElem.val(); + + /* find the next visible 'inline_child' li after this one */ + var nextChild = currentChild.next(':visible'); + if (!nextChild.length) return; + var nextChildOrderElem = nextChild.find('input[name$="-ORDER"]'); + var nextChildOrder = nextChildOrderElem.val(); + + // async swap animation must run before the insertAfter line below, but doesn't need to finish first + self.animateSwap(currentChild, nextChild); + + currentChild.insertAfter(nextChild); + currentChildOrderElem.val(nextChildOrder); + nextChildOrderElem.val(currentChildOrder); + + self.updateMoveButtonDisabledStates(); + }); + } + }; + + self.formsUl = $('#' + opts.formsetPrefix + '-FORMS'); + + self.updateMoveButtonDisabledStates = function() { + if (opts.canOrder) { + forms = self.formsUl.children('li:visible'); + forms.each(function(i) { + $('ul.controls .inline-child-move-up', this).toggleClass('disabled', i == 0).toggleClass('enabled', i != 0); + $('ul.controls .inline-child-move-down', this).toggleClass('disabled', i == forms.length - 1).toggleClass('enabled', i != forms.length - 1); + }); + } + } + + self.animateSwap = function(item1, item2){ + var parent = self.formsUl; + var children = parent.children('li:visible'); + + // Apply moving class to container (ul.multiple) so it can assist absolute positioning of it's children + // Also set it's relatively calculated height to be an absolute one, to prevent the container collapsing while its children go absolute + parent.addClass('moving').css('height', parent.height()); + + children.each(function(){ + // console.log($(this)); + $(this).css('top', $(this).position().top); + }).addClass('moving'); + + // animate swapping around + item1.animate({ + top:item2.position().top + }, 200, function(){ + parent.removeClass('moving').removeAttr('style'); + children.removeClass('moving').removeAttr('style'); + }); + item2.animate({ + top:item1.position().top + }, 200, function(){ + parent.removeClass('moving').removeAttr('style'); + children.removeClass('moving').removeAttr('style'); + }) + } + + buildExpandingFormset(opts.formsetPrefix, { + onAdd: function(formCount) { + function fixPrefix(str) { + return str.replace(/__prefix__/g, formCount); + } + self.initChildControls(fixPrefix(opts.emptyChildFormPrefix)); + if (opts.canOrder) { + $(fixPrefix('#id_' + opts.emptyChildFormPrefix + '-ORDER')).val(formCount); + } + self.updateMoveButtonDisabledStates(); + opts.onAdd(fixPrefix); + } + }); + + return self; +} + +function cleanForSlug(val){ + return val.replace(/\s/g,"-").replace(/[^A-Za-z0-9\-]/g,"").toLowerCase(); +} + +function initSlugAutoPopulate(){ + $('#id_title').on('focus', function(){ + $('#id_slug').data('previous-val', $('#id_slug').val()); + $(this).data('previous-val', $(this).val()); + }); + $('#id_title').on('keyup keydown keypress blur', function(){ + if($('body').hasClass('create') || (!$('#id_slug').data('previous-val').length || cleanForSlug($('#id_title').data('previous-val')) === $('#id_slug').data('previous-val'))){ + // only update slug if the page is being created from scratch, if slug is completely blank, or if title and slug prior to typing were identical + $('#id_slug').val(cleanForSlug($('#id_title').val())); + } + }); +} + +function initSlugCleaning(){ + $('#id_slug').on('keyup blur', function(){ + $(this).val(cleanForSlug($(this).val())); + }) +} + +$(function() { + initDateChoosers(); + initTimeChoosers(); + initSlugAutoPopulate(); + initSlugCleaning(); + + + $('.richtext [contenteditable="false"]').each(function() { + insertRichTextDeleteControl(this); + }); + + /* Set up behaviour of preview button */ + $('#action-preview').click(function() { + var previewWindow = window.open($(this).data('placeholder'), $(this).data('windowname')); + $.post( + $(this).data('action'), + $('#page-edit-form').serialize(), + function(data, textStatus, request) { + if (request.getResponseHeader('X-Verdant-Preview') == 'ok') { + previewWindow.document.open(); + previewWindow.document.write(data); + previewWindow.document.close(); + } else { + previewWindow.close(); + document.open(); + document.write(data); + document.close(); + } + } + ); + }); +}); diff --git a/wagtail/wagtailadmin/static/wagtailadmin/js/vendor/bootstrap-modal.js b/wagtail/wagtailadmin/static/wagtailadmin/js/vendor/bootstrap-modal.js new file mode 100644 index 000000000..6684c865b --- /dev/null +++ b/wagtail/wagtailadmin/static/wagtailadmin/js/vendor/bootstrap-modal.js @@ -0,0 +1,246 @@ +/* ======================================================================== + * Bootstrap: modal.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#modals + * ======================================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$element = $(element) + this.$backdrop = + this.isShown = null + + if (this.options.remote) this.$element.load(this.options.remote) + } + + Modal.DEFAULTS = { + backdrop: true + , keyboard: true + , show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this[!this.isShown ? 'show' : 'hide'](_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.escape() + + this.$element.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) // don't move modals dom position + } + + that.$element.show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$element.find('.modal-dialog') // wait for modal to slide in + .one($.support.transition.end, function () { + that.$element.focus().trigger(e) + }) + .emulateTransitionEnd(300) : + that.$element.focus().trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + .off('click.dismiss.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one($.support.transition.end, $.proxy(this.hideModal, this)) + .emulateTransitionEnd(300) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + this.$element.focus() + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.removeBackdrop() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('