summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Tomasek <jtomasek@redhat.com>2014-07-02 14:05:54 +0200
committerJiri Tomasek <jtomasek@redhat.com>2014-07-28 16:13:21 +0200
commit92146772b677e9fce57cc11b4a4a1542a05c23b2 (patch)
tree8458f99e3c3d68a537383587724908ee5b2fffe5
parentb04f020fc1dce27b47a174259ea3ba542127401b (diff)
downloadhorizon-92146772b677e9fce57cc11b4a4a1542a05c23b2.tar.gz
Update Twitter Bootstrap to version 3
Updated to bootstrap 3.2.0 back to v3.1.1 fix base-line-height variable Revamped grid system Replaced help-inline with help-block Change .control-group to .form-group Add column widths to horizontal form labels and .controls, remove .controls class Datepicker form fix Add btn-default to btn elements with no other color Topbar switcher fix Rename button sizes Replace alert-error with alert-danger Removed alert-block Alerts fixing Updated LinkAction and Action table actions to define icon, replaced btn-default icon with glyphicon Replaced icons with glyphicons, removed btn-icon styling from horizon.scss change Button Icons text in customizing docs Fixed table header Fix page_header h2 margin Nav accordion fix Tables fix Modal fixes added form-control class to input and selects Forms fixes Workflow modal fix Fix quota bar updated customizing docs removed unused styling from horizon.scss make datepicker form inline fix table filter styling added btn-danger to terminate instances button fixed loading spinner form fields and validations Created bootstrap_form_field filter and template to render bootstrap forms properly Style up the datepicker Fixed failing test cases Implements: blueprint bootstrap-update Change-Id: Ic826849be1af7fc6bf06f97dd7a60fc54b862148
-rw-r--r--doc/source/topics/customizing.rst49
-rw-r--r--doc/source/topics/tutorial.rst4
-rw-r--r--horizon/static/bootstrap/js/bootstrap.js2749
-rw-r--r--horizon/static/horizon/js/horizon.d3linechart.js16
-rw-r--r--horizon/static/horizon/js/horizon.firewalls.js4
-rw-r--r--horizon/static/horizon/js/horizon.forms.js16
-rw-r--r--horizon/static/horizon/js/horizon.formset_table.js2
-rw-r--r--horizon/static/horizon/js/horizon.instances.js16
-rw-r--r--horizon/static/horizon/js/horizon.messages.js2
-rw-r--r--horizon/static/horizon/js/horizon.modals.js24
-rw-r--r--horizon/static/horizon/js/horizon.tables.js2
-rw-r--r--horizon/static/horizon/js/horizon.users.js2
-rw-r--r--horizon/static/horizon/lib/angular/angular.js102
-rw-r--r--horizon/static/horizon/tests/messages.js4
-rw-r--r--horizon/tables/actions.py15
-rw-r--r--horizon/tables/formset.py2
-rw-r--r--horizon/templates/auth/_login.html8
-rw-r--r--horizon/templates/horizon/_messages.html8
-rw-r--r--horizon/templates/horizon/client_side/_alert_message.html2
-rw-r--r--horizon/templates/horizon/client_side/_loading.html10
-rw-r--r--horizon/templates/horizon/client_side/_modal.html26
-rw-r--r--horizon/templates/horizon/common/_bootstrap_form_field.html59
-rw-r--r--horizon/templates/horizon/common/_data_table_cell.html4
-rw-r--r--horizon/templates/horizon/common/_data_table_row_actions.html2
-rw-r--r--horizon/templates/horizon/common/_data_table_table_action.html10
-rw-r--r--horizon/templates/horizon/common/_data_table_table_actions.html11
-rw-r--r--horizon/templates/horizon/common/_form_fields.html14
-rw-r--r--horizon/templates/horizon/common/_formset_table.html2
-rw-r--r--horizon/templates/horizon/common/_formset_table_row.html4
-rw-r--r--horizon/templates/horizon/common/_modal.html20
-rw-r--r--horizon/templates/horizon/common/_modal_form.html60
-rw-r--r--horizon/templates/horizon/common/_usage_summary.html15
-rw-r--r--horizon/templates/horizon/common/_workflow.html86
-rw-r--r--horizon/templates/horizon/common/_workflow_step_update_members.html4
-rw-r--r--horizon/templatetags/bootstrap_form_field.py47
-rw-r--r--horizon/workflows/views.py2
-rw-r--r--openstack_dashboard/dashboards/admin/aggregates/tables.py9
-rw-r--r--openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/_update.html4
-rw-r--r--openstack_dashboard/dashboards/admin/domains/tables.py9
-rw-r--r--openstack_dashboard/dashboards/admin/flavors/extras/tables.py6
-rw-r--r--openstack_dashboard/dashboards/admin/flavors/tables.py13
-rw-r--r--openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_create.html2
-rw-r--r--openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_edit.html2
-rw-r--r--openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_index.html2
-rw-r--r--openstack_dashboard/dashboards/admin/groups/tables.py13
-rw-r--r--openstack_dashboard/dashboards/admin/groups/templates/groups/_add_non_member.html2
-rw-r--r--openstack_dashboard/dashboards/admin/groups/templates/groups/_create.html2
-rw-r--r--openstack_dashboard/dashboards/admin/groups/templates/groups/_update.html2
-rw-r--r--openstack_dashboard/dashboards/admin/images/templates/images/_create.html2
-rw-r--r--openstack_dashboard/dashboards/admin/images/templates/images/_update.html2
-rw-r--r--openstack_dashboard/dashboards/admin/info/templates/info/index.html4
-rw-r--r--openstack_dashboard/dashboards/admin/instances/templates/instances/_live_migrate.html2
-rw-r--r--openstack_dashboard/dashboards/admin/metering/templates/metering/daily.html40
-rw-r--r--openstack_dashboard/dashboards/admin/metering/templates/metering/index.html4
-rw-r--r--openstack_dashboard/dashboards/admin/metering/templates/metering/report.html4
-rw-r--r--openstack_dashboard/dashboards/admin/metering/templates/metering/stats.html60
-rw-r--r--openstack_dashboard/dashboards/admin/networks/ports/tables.py6
-rw-r--r--openstack_dashboard/dashboards/admin/networks/subnets/tables.py6
-rw-r--r--openstack_dashboard/dashboards/admin/networks/tables.py6
-rw-r--r--openstack_dashboard/dashboards/admin/networks/templates/networks/_create.html2
-rw-r--r--openstack_dashboard/dashboards/admin/networks/templates/networks/_update.html2
-rw-r--r--openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_create.html2
-rw-r--r--openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_update.html2
-rw-r--r--openstack_dashboard/dashboards/admin/projects/tables.py14
-rw-r--r--openstack_dashboard/dashboards/admin/projects/tests.py15
-rw-r--r--openstack_dashboard/dashboards/admin/roles/tables.py6
-rw-r--r--openstack_dashboard/dashboards/admin/roles/templates/roles/_create.html2
-rw-r--r--openstack_dashboard/dashboards/admin/roles/templates/roles/_update.html2
-rw-r--r--openstack_dashboard/dashboards/admin/routers/templates/routers/detail.html4
-rw-r--r--openstack_dashboard/dashboards/admin/users/tables.py6
-rw-r--r--openstack_dashboard/dashboards/admin/users/templates/users/_create.html2
-rw-r--r--openstack_dashboard/dashboards/admin/users/templates/users/_update.html2
-rw-r--r--openstack_dashboard/dashboards/admin/volumes/tables.py3
-rw-r--r--openstack_dashboard/dashboards/admin/volumes/templates/volumes/_create_volume_type.html2
-rw-r--r--openstack_dashboard/dashboards/admin/volumes/templates/volumes/detail.html4
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/api_access/tables.py4
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/floating_ips/tables.py9
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/keypairs/tables.py6
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/security_groups/tables.py11
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/floating_ips/_allocate.html2
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/index.html4
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_import.html2
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_add_rule.html2
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_update.html2
-rw-r--r--openstack_dashboard/dashboards/project/containers/tables.py23
-rw-r--r--openstack_dashboard/dashboards/project/containers/templates/containers/_container_detail.html6
-rw-r--r--openstack_dashboard/dashboards/project/containers/templates/containers/_copy.html2
-rw-r--r--openstack_dashboard/dashboards/project/containers/templates/containers/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/containers/templates/containers/_create_pseudo_folder.html2
-rw-r--r--openstack_dashboard/dashboards/project/containers/templates/containers/_object_detail.html6
-rw-r--r--openstack_dashboard/dashboards/project/containers/templates/containers/_update.html2
-rw-r--r--openstack_dashboard/dashboards/project/containers/templates/containers/_upload.html2
-rw-r--r--openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/_details.html4
-rw-r--r--openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/details.html6
-rw-r--r--openstack_dashboard/dashboards/project/database_backups/tables.py9
-rw-r--r--openstack_dashboard/dashboards/project/database_backups/templates/database_backups/details.html8
-rw-r--r--openstack_dashboard/dashboards/project/databases/tables.py9
-rw-r--r--openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview.html17
-rw-r--r--openstack_dashboard/dashboards/project/databases/templates/databases/detail.html4
-rw-r--r--openstack_dashboard/dashboards/project/firewalls/tables.py6
-rw-r--r--openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_firewall_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_insert_rule_to_policy.html2
-rw-r--r--openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_policy_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_remove_rule_from_policy.html2
-rw-r--r--openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_rule_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updatefirewall.html2
-rw-r--r--openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updatepolicy.html2
-rw-r--r--openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updaterule.html2
-rw-r--r--openstack_dashboard/dashboards/project/firewalls/templates/firewalls/details_tabs.html4
-rw-r--r--openstack_dashboard/dashboards/project/images/images/tables.py12
-rw-r--r--openstack_dashboard/dashboards/project/images/templates/images/images/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/images/templates/images/images/_detail_overview.html6
-rw-r--r--openstack_dashboard/dashboards/project/images/templates/images/images/_update.html2
-rw-r--r--openstack_dashboard/dashboards/project/images/templates/images/images/detail.html4
-rw-r--r--openstack_dashboard/dashboards/project/images/templates/images/snapshots/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/instances/tables.py21
-rw-r--r--openstack_dashboard/dashboards/project/instances/templates/instances/_decryptpassword.html2
-rw-r--r--openstack_dashboard/dashboards/project/instances/templates/instances/_detail_console.html4
-rw-r--r--openstack_dashboard/dashboards/project/instances/templates/instances/_detail_log.html4
-rw-r--r--openstack_dashboard/dashboards/project/instances/templates/instances/_detail_overview.html14
-rw-r--r--openstack_dashboard/dashboards/project/instances/templates/instances/_rebuild.html2
-rw-r--r--openstack_dashboard/dashboards/project/instances/templates/instances/detail.html4
-rw-r--r--openstack_dashboard/dashboards/project/instances/tests.py9
-rw-r--r--openstack_dashboard/dashboards/project/loadbalancers/tables.py18
-rw-r--r--openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_member_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_pool_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemember.html4
-rw-r--r--openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemonitor.html2
-rw-r--r--openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatepool.html2
-rw-r--r--openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatevip.html2
-rw-r--r--openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_vip_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/details_tabs.html4
-rw-r--r--openstack_dashboard/dashboards/project/network_topology/templates/network_topology/_create_router.html2
-rw-r--r--openstack_dashboard/dashboards/project/network_topology/templates/network_topology/_post_massage.html4
-rw-r--r--openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_container.html4
-rw-r--r--openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_port.html2
-rw-r--r--openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html8
-rw-r--r--openstack_dashboard/dashboards/project/networks/ports/tables.py3
-rw-r--r--openstack_dashboard/dashboards/project/networks/subnets/tables.py6
-rw-r--r--openstack_dashboard/dashboards/project/networks/tables.py9
-rw-r--r--openstack_dashboard/dashboards/project/networks/templates/networks/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/networks/templates/networks/_update.html2
-rw-r--r--openstack_dashboard/dashboards/project/networks/templates/networks/ports/_detail_overview.html2
-rw-r--r--openstack_dashboard/dashboards/project/networks/templates/networks/ports/_update.html2
-rw-r--r--openstack_dashboard/dashboards/project/networks/templates/networks/ports/detail.html4
-rw-r--r--openstack_dashboard/dashboards/project/networks/templates/networks/subnets/_detail_overview.html2
-rw-r--r--openstack_dashboard/dashboards/project/networks/templates/networks/subnets/detail.html4
-rw-r--r--openstack_dashboard/dashboards/project/overview/tests.py8
-rw-r--r--openstack_dashboard/dashboards/project/routers/extensions/routerrules/tables.py3
-rw-r--r--openstack_dashboard/dashboards/project/routers/ports/tables.py3
-rw-r--r--openstack_dashboard/dashboards/project/routers/tables.py6
-rw-r--r--openstack_dashboard/dashboards/project/routers/templates/routers/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/routers/templates/routers/detail.html4
-rw-r--r--openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/grid.html10
-rw-r--r--openstack_dashboard/dashboards/project/routers/templates/routers/ports/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/routers/templates/routers/ports/_setgateway.html2
-rw-r--r--openstack_dashboard/dashboards/project/stacks/tables.py9
-rw-r--r--openstack_dashboard/dashboards/project/stacks/templates/stacks/_change_template.html2
-rw-r--r--openstack_dashboard/dashboards/project/stacks/templates/stacks/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html10
-rw-r--r--openstack_dashboard/dashboards/project/stacks/templates/stacks/_resource_overview.html6
-rw-r--r--openstack_dashboard/dashboards/project/stacks/templates/stacks/_select_template.html2
-rw-r--r--openstack_dashboard/dashboards/project/stacks/templates/stacks/_update.html2
-rw-r--r--openstack_dashboard/dashboards/project/stacks/templates/stacks/detail.html4
-rw-r--r--openstack_dashboard/dashboards/project/stacks/templates/stacks/resource.html4
-rw-r--r--openstack_dashboard/dashboards/project/volumes/snapshots/tables.py6
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/index.html4
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_detail_overview.html4
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_update.html2
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/detail.html4
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_attach.html2
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create.html2
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create_snapshot.html2
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_detail_overview.html10
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_extend.html2
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_update.html2
-rw-r--r--openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/detail.html4
-rw-r--r--openstack_dashboard/dashboards/project/volumes/volumes/tables.py15
-rw-r--r--openstack_dashboard/dashboards/project/volumes/volumes/tests.py3
-rw-r--r--openstack_dashboard/dashboards/project/vpn/templates/vpn/_ikepolicy_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecpolicy_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecsiteconnection_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ikepolicy.html4
-rw-r--r--openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecpolicy.html4
-rw-r--r--openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecsiteconnection.html4
-rw-r--r--openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_vpnservice.html4
-rw-r--r--openstack_dashboard/dashboards/project/vpn/templates/vpn/_vpnservice_details.html2
-rw-r--r--openstack_dashboard/dashboards/project/vpn/templates/vpn/details_tabs.html4
-rw-r--r--openstack_dashboard/dashboards/project/vpn/templates/vpn/index.html4
-rw-r--r--openstack_dashboard/dashboards/router/nexus1000v/tables.py6
-rw-r--r--openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/_create_network_profile.html2
-rw-r--r--openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/_update_network_profile.html2
-rw-r--r--openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/index.html4
-rw-r--r--openstack_dashboard/dashboards/settings/password/templates/password/_change.html2
-rw-r--r--openstack_dashboard/dashboards/settings/user/templates/user/_settings.html2
-rw-r--r--openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eotbin0 -> 20335 bytes
-rw-r--r--openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg229
-rw-r--r--openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttfbin0 -> 41280 bytes
-rw-r--r--openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woffbin0 -> 23320 bytes
-rw-r--r--openstack_dashboard/static/bootstrap/img/glyphicons-halflings-white.pngbin4352 -> 0 bytes
-rw-r--r--openstack_dashboard/static/bootstrap/img/glyphicons-halflings.pngbin4352 -> 0 bytes
-rw-r--r--openstack_dashboard/static/bootstrap/scss/_bootstrap-mincer.scss17
-rw-r--r--openstack_dashboard/static/bootstrap/scss/_bootstrap-responsive.scss318
-rw-r--r--openstack_dashboard/static/bootstrap/scss/_bootstrap.scss63
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap.scss50
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_accordion.scss28
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_alerts.scss101
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_badges.scss57
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_breadcrumbs.scss38
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_button-groups.scss274
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_buttons.scss242
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_carousel.scss243
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_close.scss39
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_code.scss68
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_component-animations.scss33
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_dropdowns.scss262
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_forms.scss717
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_glyphicons.scss237
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_grid.scss88
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_hero-unit.scss20
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_input-groups.scss162
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_jumbotron.scss48
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_labels.scss76
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_layouts.scss17
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_list-group.scss129
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_media.scss56
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_mixins.scss565
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_modals.scss176
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_navbar.scss826
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_navs.scss477
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_normalize.scss425
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_pager.scss73
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_pagination.scss129
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_panels.scss240
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_popovers.scss154
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_print.scss101
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_progress-bars.scss110
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_reset.scss105
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-embed.scss34
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-utilities.scss173
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_scaffolding.scss155
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_sprites.scss157
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_tables.scss257
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_theme.scss247
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_thumbnails.scss61
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_tooltip.scss96
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_type.scss365
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_utilities.scss53
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_variables.scss920
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/_wells.scss26
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/bootstrap.scss50
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_alerts.scss14
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_background-variant.scss11
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_border-radius.scss18
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_buttons.scss50
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_center-block.scss7
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_clearfix.scss22
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_forms.scss84
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_gradients.scss58
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid-framework.scss87
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid.scss122
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_hide-text.scss21
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_image.scss33
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_labels.scss12
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_list-group.scss31
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-divider.scss10
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-vertical-align.scss9
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_opacity.scss8
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_pagination.scss23
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_panels.scss20
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_progress-bar.scss8
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_reset-filter.scss8
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_resize.scss6
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_responsive-visibility.scss21
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_size.scss10
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_tab-focus.scss9
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_table-row.scss28
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-emphasis.scss11
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-overflow.scss8
-rw-r--r--openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_vendor-prefixes.scss224
-rw-r--r--openstack_dashboard/static/dashboard/scss/_accordion_nav.scss9
-rw-r--r--openstack_dashboard/static/dashboard/scss/horizon.scss242
-rw-r--r--openstack_dashboard/static/dashboard/scss/horizon_workflow.scss2
-rw-r--r--openstack_dashboard/templates/_header.html4
-rw-r--r--openstack_dashboard/test/test_panels/plugin_panel/templates/plugin_panel/index.html4
-rw-r--r--openstack_dashboard/usage/tables.py2
290 files changed, 9776 insertions, 5275 deletions
diff --git a/doc/source/topics/customizing.rst b/doc/source/topics/customizing.rst
index 0a2ab7cb0..dbf39e9a0 100644
--- a/doc/source/topics/customizing.rst
+++ b/doc/source/topics/customizing.rst
@@ -15,7 +15,7 @@ The file ``local_settings.py`` can be found at the Horizon directory path of
Changing the Logo
=================
-There are currently two places where the OpenStack logo is pulled in
+There are currently two places where the OpenStack logo is pulled in
through ``horizon.less``. The first is shown at the login screen and the other
on top of the menu bar::
@@ -52,7 +52,7 @@ This allows for common site-customization requirements such as:
To specify the python module containing your modifications, add the key
``customization_module`` to your ``HORIZON_CONFIG`` dictionary in
-``local_settings.py``. The value should be a string containing the path to your
+``local_settings.py``. The value should be a string containing the path to your
module in dotted python path notation. Example::
HORIZON_CONFIG = {
@@ -148,41 +148,16 @@ similar way, add the new column definition and then use the ``Meta``
Button Icons
============
-Horizon provides hooks for customizing the look and feel of each class of
-button on the site. The following classes are used to identify each type of
-button:
-
-* Generic Classes
- * btn-search
- * btn-delete
- * btn-upload
- * btn-download
- * btn-create
- * btn-edit
- * btn-list
- * btn-copy
- * btn-camera
- * btn-stats
- * btn-enable
- * btn-disable
-
-* Floating IP-specific Classes
- * btn-allocate
- * btn-release
- * btn-associate
- * btn-disassociate
-
-* Instance-specific Classes
- * btn-launch
- * btn-terminate
- * btn-reboot
- * btn-pause
- * btn-suspend
- * btn-console
- * btn-log
-
-* Volume-specific classes
- * btn-detach
+Horizon uses font icons (glyphicons) from Twitter Bootstrap to add icons to buttons.
+Please see http://bootstrapdocs.com/v3.1.1/docs/components/#glyphicons for instructions
+how to use icons in the code.
+
+To add icon to Table Action, use icon property. Example:
+
+ class CreateSnapshot(tables.LinkAction):
+ name = "snapshot"
+ verbose_name = _("Create Snapshot")
+ icon = "camera"
Additionally, the site-wide default button classes can be configured by
setting ``ACTION_CSS_CLASSES`` to a tuple of the classes you wish to appear
diff --git a/doc/source/topics/tutorial.rst b/doc/source/topics/tutorial.rst
index a46679547..5abe02aad 100644
--- a/doc/source/topics/tutorial.rst
+++ b/doc/source/topics/tutorial.rst
@@ -411,8 +411,8 @@ dashboards::
{% endblock page_header %}
{% block main %}
- <div class="row-fluid">
- <div class="span12">
+ <div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/horizon/static/bootstrap/js/bootstrap.js b/horizon/static/bootstrap/js/bootstrap.js
index 4412304eb..8ae571b6d 100644
--- a/horizon/static/bootstrap/js/bootstrap.js
+++ b/horizon/static/bootstrap/js/bootstrap.js
@@ -1,132 +1,126 @@
-/* ===================================================
- * bootstrap-transition.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#transitions
- * ===================================================
- * 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( $ ) {
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
- $(function () {
+if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.1.1
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+ // ============================================================
+
+ function transitionEnd() {
+ var el = document.createElement('bootstrap')
+
+ var transEndEventNames = {
+ 'WebkitTransition' : 'webkitTransitionEnd',
+ 'MozTransition' : 'transitionend',
+ 'OTransition' : 'oTransitionEnd otransitionend',
+ 'transition' : 'transitionend'
+ }
- "use strict"
-
- /* CSS TRANSITION SUPPORT (https://gist.github.com/373874)
- * ======================================================= */
-
- $.support.transition = (function () {
- var thisBody = document.body || document.documentElement
- , thisStyle = thisBody.style
- , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined
-
- return support && {
- end: (function () {
- var transitionEnd = "TransitionEnd"
- if ( $.browser.webkit ) {
- transitionEnd = "webkitTransitionEnd"
- } else if ( $.browser.mozilla ) {
- transitionEnd = "transitionend"
- } else if ( $.browser.opera ) {
- transitionEnd = "oTransitionEnd"
- }
- return transitionEnd
- }())
+ for (var name in transEndEventNames) {
+ if (el.style[name] !== undefined) {
+ return { end: transEndEventNames[name] }
}
- })()
+ }
+
+ return false // explicit for ie8 ( ._.)
+ }
+
+ // http://blog.alexmaccaw.com/css-transitions
+ $.fn.emulateTransitionEnd = function (duration) {
+ var called = false, $el = this
+ $(this).one($.support.transition.end, function () { called = true })
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+ setTimeout(callback, duration)
+ return this
+ }
+ $(function () {
+ $.support.transition = transitionEnd()
})
-}( window.jQuery );/* ==========================================================
- * bootstrap-alert.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#alerts
- * ==========================================================
- * 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"
-
- /* ALERT CLASS DEFINITION
- * ====================== */
+}(jQuery);
- var dismiss = '[data-dismiss="alert"]'
- , Alert = function ( el ) {
- $(el).on('click', dismiss, this.close)
- }
+/* ========================================================================
+ * Bootstrap: alert.js v3.1.1
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
- Alert.prototype = {
- constructor: Alert
++function ($) {
+ 'use strict';
- , close: function ( e ) {
- var $this = $(this)
- , selector = $this.attr('data-target')
- , $parent
+ // ALERT CLASS DEFINITION
+ // ======================
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
- }
+ var dismiss = '[data-dismiss="alert"]'
+ var Alert = function (el) {
+ $(el).on('click', dismiss, this.close)
+ }
- $parent = $(selector)
- $parent.trigger('close')
+ Alert.prototype.close = function (e) {
+ var $this = $(this)
+ var selector = $this.attr('data-target')
- e && e.preventDefault()
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+ }
- $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
+ var $parent = $(selector)
- $parent
- .trigger('close')
- .removeClass('in')
+ if (e) e.preventDefault()
- function removeElement() {
- $parent
- .trigger('closed')
- .remove()
- }
+ if (!$parent.length) {
+ $parent = $this.hasClass('alert') ? $this : $this.parent()
+ }
- $.support.transition && $parent.hasClass('fade') ?
- $parent.on($.support.transition.end, removeElement) :
- removeElement()
+ $parent.trigger(e = $.Event('close.bs.alert'))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent.removeClass('in')
+
+ function removeElement() {
+ $parent.trigger('closed.bs.alert').remove()
}
+ $.support.transition && $parent.hasClass('fade') ?
+ $parent
+ .one($.support.transition.end, removeElement)
+ .emulateTransitionEnd(150) :
+ removeElement()
}
- /* ALERT PLUGIN DEFINITION
- * ======================= */
+ // ALERT PLUGIN DEFINITION
+ // =======================
- $.fn.alert = function ( option ) {
+ var old = $.fn.alert
+
+ $.fn.alert = function (option) {
return this.each(function () {
var $this = $(this)
- , data = $this.data('alert')
- if (!data) $this.data('alert', (data = new Alert(this)))
+ var data = $this.data('bs.alert')
+
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
if (typeof option == 'string') data[option].call($this)
})
}
@@ -134,479 +128,628 @@
$.fn.alert.Constructor = Alert
- /* ALERT DATA-API
- * ============== */
+ // ALERT NO CONFLICT
+ // =================
- $(function () {
- $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
- })
+ $.fn.alert.noConflict = function () {
+ $.fn.alert = old
+ return this
+ }
-}( window.jQuery );/* ============================================================
- * bootstrap-button.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#buttons
- * ============================================================
- * 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"
-
- /* BUTTON PUBLIC CLASS DEFINITION
- * ============================== */
-
- var Button = function ( element, options ) {
- this.$element = $(element)
- this.options = $.extend({}, $.fn.button.defaults, options)
+
+ // ALERT DATA-API
+ // ==============
+
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.1.1
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // BUTTON PUBLIC CLASS DEFINITION
+ // ==============================
+
+ var Button = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Button.DEFAULTS, options)
+ this.isLoading = false
}
- Button.prototype = {
+ Button.DEFAULTS = {
+ loadingText: 'loading...'
+ }
- constructor: Button
+ Button.prototype.setState = function (state) {
+ var d = 'disabled'
+ var $el = this.$element
+ var val = $el.is('input') ? 'val' : 'html'
+ var data = $el.data()
- , setState: function ( state ) {
- var d = 'disabled'
- , $el = this.$element
- , data = $el.data()
- , val = $el.is('input') ? 'val' : 'html'
+ state = state + 'Text'
- state = state + 'Text'
- data.resetText || $el.data('resetText', $el[val]())
+ if (!data.resetText) $el.data('resetText', $el[val]())
- $el[val](data[state] || this.options[state])
+ $el[val](data[state] || this.options[state])
- // push to event loop to allow forms to submit
- setTimeout(function () {
- state == 'loadingText' ?
- $el.addClass(d).attr(d, d) :
- $el.removeClass(d).removeAttr(d)
- }, 0)
+ // push to event loop to allow forms to submit
+ setTimeout($.proxy(function () {
+ if (state == 'loadingText') {
+ this.isLoading = true
+ $el.addClass(d).attr(d, d)
+ } else if (this.isLoading) {
+ this.isLoading = false
+ $el.removeClass(d).removeAttr(d)
}
+ }, this), 0)
+ }
- , toggle: function () {
- var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
-
- $parent && $parent
- .find('.active')
- .removeClass('active')
+ Button.prototype.toggle = function () {
+ var changed = true
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
- this.$element.toggleClass('active')
+ if ($parent.length) {
+ var $input = this.$element.find('input')
+ if ($input.prop('type') == 'radio') {
+ if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
+ else $parent.find('.active').removeClass('active')
}
+ if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
+ }
+ if (changed) this.$element.toggleClass('active')
}
- /* BUTTON PLUGIN DEFINITION
- * ======================== */
+ // BUTTON PLUGIN DEFINITION
+ // ========================
+
+ var old = $.fn.button
- $.fn.button = function ( option ) {
+ $.fn.button = function (option) {
return this.each(function () {
- var $this = $(this)
- , data = $this.data('button')
- , options = typeof option == 'object' && option
- if (!data) $this.data('button', (data = new Button(this, options)))
+ var $this = $(this)
+ var data = $this.data('bs.button')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
if (option == 'toggle') data.toggle()
else if (option) data.setState(option)
})
}
- $.fn.button.defaults = {
- loadingText: 'loading...'
- }
-
$.fn.button.Constructor = Button
- /* BUTTON DATA-API
- * =============== */
+ // BUTTON NO CONFLICT
+ // ==================
- $(function () {
- $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
- var $btn = $(e.target)
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
- $btn.button('toggle')
- })
+ $.fn.button.noConflict = function () {
+ $.fn.button = old
+ return this
+ }
+
+
+ // BUTTON DATA-API
+ // ===============
+
+ $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
+ var $btn = $(e.target)
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+ $btn.button('toggle')
+ e.preventDefault()
})
-}( window.jQuery );/* ==========================================================
- * bootstrap-carousel.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#carousel
- * ==========================================================
- * 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"
-
- /* CAROUSEL CLASS DEFINITION
- * ========================= */
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.1.1
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CAROUSEL CLASS DEFINITION
+ // =========================
var Carousel = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, $.fn.carousel.defaults, options)
- this.options.slide && this.slide(this.options.slide)
+ this.$element = $(element)
+ this.$indicators = this.$element.find('.carousel-indicators')
+ this.options = options
+ this.paused =
+ this.sliding =
+ this.interval =
+ this.$active =
+ this.$items = null
+
+ this.options.pause == 'hover' && this.$element
+ .on('mouseenter', $.proxy(this.pause, this))
+ .on('mouseleave', $.proxy(this.cycle, this))
}
- Carousel.prototype = {
+ Carousel.DEFAULTS = {
+ interval: 5000,
+ pause: 'hover',
+ wrap: true
+ }
- cycle: function () {
- this.interval = setInterval($.proxy(this.next, this), this.options.interval)
- return this
- }
+ Carousel.prototype.cycle = function (e) {
+ e || (this.paused = false)
- , to: function (pos) {
- var $active = this.$element.find('.active')
- , children = $active.parent().children()
- , activePos = children.index($active)
- , that = this
+ this.interval && clearInterval(this.interval)
- if (pos > (children.length - 1) || pos < 0) return
+ this.options.interval
+ && !this.paused
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
- if (this.sliding) {
- return this.$element.one('slid', function () {
- that.to(pos)
- })
- }
+ return this
+ }
- if (activePos == pos) {
- return this.pause().cycle()
- }
+ Carousel.prototype.getActiveIndex = function () {
+ this.$active = this.$element.find('.item.active')
+ this.$items = this.$active.parent().children()
- return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
- }
+ return this.$items.index(this.$active)
+ }
- , pause: function () {
- clearInterval(this.interval)
- this.interval = null
- return this
- }
+ Carousel.prototype.to = function (pos) {
+ var that = this
+ var activeIndex = this.getActiveIndex()
+
+ if (pos > (this.$items.length - 1) || pos < 0) return
+
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
+ if (activeIndex == pos) return this.pause().cycle()
- , next: function () {
- if (this.sliding) return
- return this.slide('next')
+ return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
+ }
+
+ Carousel.prototype.pause = function (e) {
+ e || (this.paused = true)
+
+ if (this.$element.find('.next, .prev').length && $.support.transition) {
+ this.$element.trigger($.support.transition.end)
+ this.cycle(true)
}
- , prev: function () {
- if (this.sliding) return
- return this.slide('prev')
+ this.interval = clearInterval(this.interval)
+
+ return this
+ }
+
+ Carousel.prototype.next = function () {
+ if (this.sliding) return
+ return this.slide('next')
+ }
+
+ Carousel.prototype.prev = function () {
+ if (this.sliding) return
+ return this.slide('prev')
+ }
+
+ Carousel.prototype.slide = function (type, next) {
+ var $active = this.$element.find('.item.active')
+ var $next = next || $active[type]()
+ var isCycling = this.interval
+ var direction = type == 'next' ? 'left' : 'right'
+ var fallback = type == 'next' ? 'first' : 'last'
+ var that = this
+
+ if (!$next.length) {
+ if (!this.options.wrap) return
+ $next = this.$element.find('.item')[fallback]()
}
- , slide: function (type, next) {
- var $active = this.$element.find('.active')
- , $next = next || $active[type]()
- , isCycling = this.interval
- , direction = type == 'next' ? 'left' : 'right'
- , fallback = type == 'next' ? 'first' : 'last'
- , that = this
+ if ($next.hasClass('active')) return this.sliding = false
- if (!$next.length) return
+ var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
+ this.$element.trigger(e)
+ if (e.isDefaultPrevented()) return
- this.sliding = true
+ this.sliding = true
- isCycling && this.pause()
+ isCycling && this.pause()
- $next = $next.length ? $next : this.$element.find('.item')[fallback]()
+ if (this.$indicators.length) {
+ this.$indicators.find('.active').removeClass('active')
+ this.$element.one('slid.bs.carousel', function () {
+ var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
+ $nextIndicator && $nextIndicator.addClass('active')
+ })
+ }
- if (!$.support.transition && this.$element.hasClass('slide')) {
- this.$element.trigger('slide')
- $active.removeClass('active')
- $next.addClass('active')
- this.sliding = false
- this.$element.trigger('slid')
- } else {
- $next.addClass(type)
- $next[0].offsetWidth // force reflow
- $active.addClass(direction)
- $next.addClass(direction)
- this.$element.trigger('slide')
- this.$element.one($.support.transition.end, function () {
+ if ($.support.transition && this.$element.hasClass('slide')) {
+ $next.addClass(type)
+ $next[0].offsetWidth // force reflow
+ $active.addClass(direction)
+ $next.addClass(direction)
+ $active
+ .one($.support.transition.end, function () {
$next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' '))
that.sliding = false
- setTimeout(function () { that.$element.trigger('slid') }, 0)
+ setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
})
- }
-
- isCycling && this.cycle()
-
- return this
+ .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
+ } else {
+ $active.removeClass('active')
+ $next.addClass('active')
+ this.sliding = false
+ this.$element.trigger('slid.bs.carousel')
}
+ isCycling && this.cycle()
+
+ return this
}
- /* CAROUSEL PLUGIN DEFINITION
- * ========================== */
+ // CAROUSEL PLUGIN DEFINITION
+ // ==========================
+
+ var old = $.fn.carousel
- $.fn.carousel = function ( option ) {
+ $.fn.carousel = function (option) {
return this.each(function () {
- var $this = $(this)
- , data = $this.data('carousel')
- , options = typeof option == 'object' && option
- if (!data) $this.data('carousel', (data = new Carousel(this, options)))
+ var $this = $(this)
+ var data = $this.data('bs.carousel')
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+ var action = typeof option == 'string' ? option : options.slide
+
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
if (typeof option == 'number') data.to(option)
- else if (typeof option == 'string' || (option = options.slide)) data[option]()
- else data.cycle()
+ else if (action) data[action]()
+ else if (options.interval) data.pause().cycle()
})
}
- $.fn.carousel.defaults = {
- interval: 5000
+ $.fn.carousel.Constructor = Carousel
+
+
+ // CAROUSEL NO CONFLICT
+ // ====================
+
+ $.fn.carousel.noConflict = function () {
+ $.fn.carousel = old
+ return this
}
- $.fn.carousel.Constructor = Carousel
+ // CAROUSEL DATA-API
+ // =================
- /* CAROUSEL DATA-API
- * ================= */
+ $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
+ var $this = $(this), href
+ var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+ var options = $.extend({}, $target.data(), $this.data())
+ var slideIndex = $this.attr('data-slide-to')
+ if (slideIndex) options.interval = false
- $(function () {
- $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
- var $this = $(this), href
- , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
- , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
- $target.carousel(options)
- e.preventDefault()
+ $target.carousel(options)
+
+ if (slideIndex = $this.attr('data-slide-to')) {
+ $target.data('bs.carousel').to(slideIndex)
+ }
+
+ e.preventDefault()
+ })
+
+ $(window).on('load', function () {
+ $('[data-ride="carousel"]').each(function () {
+ var $carousel = $(this)
+ $carousel.carousel($carousel.data())
})
})
-}( window.jQuery );/* =============================================================
- * bootstrap-collapse.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#collapse
- * =============================================================
- * 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"
-
- var Collapse = function ( element, options ) {
- this.$element = $(element)
- this.options = $.extend({}, $.fn.collapse.defaults, options)
-
- if (this.options["parent"]) {
- this.$parent = $(this.options["parent"])
- }
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.1.1
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // COLLAPSE PUBLIC CLASS DEFINITION
+ // ================================
- this.options.toggle && this.toggle()
+ var Collapse = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
+ this.transitioning = null
+
+ if (this.options.parent) this.$parent = $(this.options.parent)
+ if (this.options.toggle) this.toggle()
+ }
+
+ Collapse.DEFAULTS = {
+ toggle: true
}
- Collapse.prototype = {
+ Collapse.prototype.dimension = function () {
+ var hasWidth = this.$element.hasClass('width')
+ return hasWidth ? 'width' : 'height'
+ }
+
+ Collapse.prototype.show = function () {
+ if (this.transitioning || this.$element.hasClass('in')) return
- constructor: Collapse
+ var startEvent = $.Event('show.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
- , dimension: function () {
- var hasWidth = this.$element.hasClass('width')
- return hasWidth ? 'width' : 'height'
+ var actives = this.$parent && this.$parent.find('> .panel > .in')
+
+ if (actives && actives.length) {
+ var hasData = actives.data('bs.collapse')
+ if (hasData && hasData.transitioning) return
+ actives.collapse('hide')
+ hasData || actives.data('bs.collapse', null)
}
- , show: function () {
- var dimension = this.dimension()
- , scroll = $.camelCase(['scroll', dimension].join('-'))
- , actives = this.$parent && this.$parent.find('.in')
- , hasData
+ var dimension = this.dimension()
- if (actives && actives.length) {
- hasData = actives.data('collapse')
- actives.collapse('hide')
- hasData || actives.data('collapse', null)
- }
+ this.$element
+ .removeClass('collapse')
+ .addClass('collapsing')
+ [dimension](0)
- this.$element[dimension](0)
- this.transition('addClass', 'show', 'shown')
- this.$element[dimension](this.$element[0][scroll])
+ this.transitioning = 1
+ var complete = function () {
+ this.$element
+ .removeClass('collapsing')
+ .addClass('collapse in')
+ [dimension]('auto')
+ this.transitioning = 0
+ this.$element.trigger('shown.bs.collapse')
}
- , hide: function () {
- var dimension = this.dimension()
- this.reset(this.$element[dimension]())
- this.transition('removeClass', 'hide', 'hidden')
- this.$element[dimension](0)
- }
+ if (!$.support.transition) return complete.call(this)
- , reset: function ( size ) {
- var dimension = this.dimension()
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
- this.$element
- .removeClass('collapse')
- [dimension](size || 'auto')
- [0].offsetWidth
+ this.$element
+ .one($.support.transition.end, $.proxy(complete, this))
+ .emulateTransitionEnd(350)
+ [dimension](this.$element[0][scrollSize])
+ }
- this.$element.addClass('collapse')
- }
+ Collapse.prototype.hide = function () {
+ if (this.transitioning || !this.$element.hasClass('in')) return
- , transition: function ( method, startEvent, completeEvent ) {
- var that = this
- , complete = function () {
- if (startEvent == 'show') that.reset()
- that.$element.trigger(completeEvent)
- }
+ var startEvent = $.Event('hide.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+ var dimension = this.dimension()
+
+ this.$element
+ [dimension](this.$element[dimension]())
+ [0].offsetHeight
+
+ this.$element
+ .addClass('collapsing')
+ .removeClass('collapse')
+ .removeClass('in')
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.transitioning = 0
this.$element
- .trigger(startEvent)
- [method]('in')
+ .trigger('hidden.bs.collapse')
+ .removeClass('collapsing')
+ .addClass('collapse')
+ }
- $.support.transition && this.$element.hasClass('collapse') ?
- this.$element.one($.support.transition.end, complete) :
- complete()
- }
+ if (!$.support.transition) return complete.call(this)
- , toggle: function () {
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
- }
+ this.$element
+ [dimension](0)
+ .one($.support.transition.end, $.proxy(complete, this))
+ .emulateTransitionEnd(350)
+ }
+ Collapse.prototype.toggle = function () {
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
}
- /* COLLAPSIBLE PLUGIN DEFINITION
- * ============================== */
- $.fn.collapse = function ( option ) {
+ // COLLAPSE PLUGIN DEFINITION
+ // ==========================
+
+ var old = $.fn.collapse
+
+ $.fn.collapse = function (option) {
return this.each(function () {
- var $this = $(this)
- , data = $this.data('collapse')
- , options = typeof option == 'object' && option
- if (!data) $this.data('collapse', (data = new Collapse(this, options)))
+ var $this = $(this)
+ var data = $this.data('bs.collapse')
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+ if (!data && options.toggle && option == 'show') option = !option
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
if (typeof option == 'string') data[option]()
})
}
- $.fn.collapse.defaults = {
- toggle: true
+ $.fn.collapse.Constructor = Collapse
+
+
+ // COLLAPSE NO CONFLICT
+ // ====================
+
+ $.fn.collapse.noConflict = function () {
+ $.fn.collapse = old
+ return this
}
- $.fn.collapse.Constructor = Collapse
+ // COLLAPSE DATA-API
+ // =================
- /* COLLAPSIBLE DATA-API
- * ==================== */
+ $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
+ var $this = $(this), href
+ var target = $this.attr('data-target')
+ || e.preventDefault()
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+ var $target = $(target)
+ var data = $target.data('bs.collapse')
+ var option = data ? 'toggle' : $this.data()
+ var parent = $this.attr('data-parent')
+ var $parent = parent && $(parent)
- $(function () {
- $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {
- var $this = $(this), href
- , target = $this.attr('data-target')
- || e.preventDefault()
- || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
- , option = $(target).data('collapse') ? 'toggle' : $this.data()
- $(target).collapse(option)
- })
+ if (!data || !data.transitioning) {
+ if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
+ $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+ }
+
+ $target.collapse(option)
})
-}( window.jQuery );/* ============================================================
- * bootstrap-dropdown.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#dropdowns
- * ============================================================
- * 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"
-
- /* DROPDOWN CLASS DEFINITION
- * ========================= */
-
- var toggle = '[data-toggle="dropdown"]'
- , Dropdown = function ( element ) {
- var $el = $(element).on('click.dropdown.data-api', this.toggle)
- $('html').on('click.dropdown.data-api', function () {
- $el.parent().removeClass('open')
- })
- }
+}(jQuery);
- Dropdown.prototype = {
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.1.1
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
- constructor: Dropdown
- , toggle: function ( e ) {
- var $this = $(this)
- , selector = $this.attr('data-target')
- , $parent
- , isActive
++function ($) {
+ 'use strict';
+
+ // DROPDOWN CLASS DEFINITION
+ // =========================
+
+ var backdrop = '.dropdown-backdrop'
+ var toggle = '[data-toggle=dropdown]'
+ var Dropdown = function (element) {
+ $(element).on('click.bs.dropdown', this.toggle)
+ }
+
+ Dropdown.prototype.toggle = function (e) {
+ var $this = $(this)
+
+ if ($this.is('.disabled, :disabled')) return
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ clearMenus()
+
+ if (!isActive) {
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+ // if mobile we use a backdrop because click events don't delegate
+ $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
}
- $parent = $(selector)
- $parent.length || ($parent = $this.parent())
+ var relatedTarget = { relatedTarget: this }
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent
+ .toggleClass('open')
+ .trigger('shown.bs.dropdown', relatedTarget)
+
+ $this.focus()
+ }
+
+ return false
+ }
+
+ Dropdown.prototype.keydown = function (e) {
+ if (!/(38|40|27)/.test(e.keyCode)) return
+
+ var $this = $(this)
+
+ e.preventDefault()
+ e.stopPropagation()
- isActive = $parent.hasClass('open')
+ if ($this.is('.disabled, :disabled')) return
- clearMenus()
- !isActive && $parent.toggleClass('open')
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
- return false
+ if (!isActive || (isActive && e.keyCode == 27)) {
+ if (e.which == 27) $parent.find(toggle).focus()
+ return $this.click()
}
+ var desc = ' li:not(.divider):visible a'
+ var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)
+
+ if (!$items.length) return
+
+ var index = $items.index($items.filter(':focus'))
+
+ if (e.keyCode == 38 && index > 0) index-- // up
+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down
+ if (!~index) index = 0
+
+ $items.eq(index).focus()
}
- function clearMenus() {
- $(toggle).parent().removeClass('open')
+ function clearMenus(e) {
+ $(backdrop).remove()
+ $(toggle).each(function () {
+ var $parent = getParent($(this))
+ var relatedTarget = { relatedTarget: this }
+ if (!$parent.hasClass('open')) return
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+ if (e.isDefaultPrevented()) return
+ $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
+ })
+ }
+
+ function getParent($this) {
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ var $parent = selector && $(selector)
+
+ return $parent && $parent.length ? $parent : $this.parent()
}
- /* DROPDOWN PLUGIN DEFINITION
- * ========================== */
+ // DROPDOWN PLUGIN DEFINITION
+ // ==========================
+
+ var old = $.fn.dropdown
- $.fn.dropdown = function ( option ) {
+ $.fn.dropdown = function (option) {
return this.each(function () {
var $this = $(this)
- , data = $this.data('dropdown')
- if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+ var data = $this.data('bs.dropdown')
+
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
if (typeof option == 'string') data[option].call($this)
})
}
@@ -614,138 +757,176 @@
$.fn.dropdown.Constructor = Dropdown
- /* APPLY TO STANDARD DROPDOWN ELEMENTS
- * =================================== */
+ // DROPDOWN NO CONFLICT
+ // ====================
- $(function () {
- $('html').on('click.dropdown.data-api', clearMenus)
- $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
- })
+ $.fn.dropdown.noConflict = function () {
+ $.fn.dropdown = old
+ return this
+ }
-}( window.jQuery );/* =========================================================
- * bootstrap-modal.js v2.0.1
- * http://twitter.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.
- * ========================================================= */
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
+ // ===================================
-!function( $ ){
+ $(document)
+ .on('click.bs.dropdown.data-api', clearMenus)
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+ .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)
- "use strict"
+}(jQuery);
- /* MODAL CLASS DEFINITION
- * ====================== */
+/* ========================================================================
+ * Bootstrap: modal.js v3.1.1
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
- var Modal = function ( content, options ) {
- this.options = options
- this.$element = $(content)
- .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
- }
- Modal.prototype = {
++function ($) {
+ 'use strict';
- constructor: Modal
+ // MODAL CLASS DEFINITION
+ // ======================
- , toggle: function () {
- return this[!this.isShown ? 'show' : 'hide']()
- }
+ var Modal = function (element, options) {
+ this.options = options
+ this.$element = $(element)
+ this.$backdrop =
+ this.isShown = null
- , show: function () {
- var that = this
+ if (this.options.remote) {
+ this.$element
+ .find('.modal-content')
+ .load(this.options.remote, $.proxy(function () {
+ this.$element.trigger('loaded.bs.modal')
+ }, this))
+ }
+ }
+
+ Modal.DEFAULTS = {
+ backdrop: true,
+ keyboard: true,
+ show: true
+ }
+
+ Modal.prototype.toggle = function (_relatedTarget) {
+ return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
+ }
- if (this.isShown) return
+ Modal.prototype.show = function (_relatedTarget) {
+ var that = this
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
- $('body').addClass('modal-open')
+ this.$element.trigger(e)
- this.isShown = true
- this.$element.trigger('show')
+ if (this.isShown || e.isDefaultPrevented()) return
- escape.call(this)
- backdrop.call(this, function () {
- var transition = $.support.transition && that.$element.hasClass('fade')
+ this.isShown = true
- !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position
+ this.escape()
- that.$element
- .show()
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
- if (transition) {
- that.$element[0].offsetWidth // force reflow
- }
+ this.backdrop(function () {
+ var transition = $.support.transition && that.$element.hasClass('fade')
- that.$element.addClass('in')
+ if (!that.$element.parent().length) {
+ that.$element.appendTo(document.body) // don't move modals dom position
+ }
- transition ?
- that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
- that.$element.trigger('shown')
+ that.$element
+ .show()
+ .scrollTop(0)
- })
+ if (transition) {
+ that.$element[0].offsetWidth // force reflow
}
- , hide: function ( e ) {
- e && e.preventDefault()
+ that.$element
+ .addClass('in')
+ .attr('aria-hidden', false)
- if (!this.isShown) return
+ that.enforceFocus()
- var that = this
- this.isShown = false
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
- $('body').removeClass('modal-open')
+ 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)
+ })
+ }
- escape.call(this)
+ Modal.prototype.hide = function (e) {
+ if (e) e.preventDefault()
- this.$element
- .trigger('hide')
- .removeClass('in')
+ e = $.Event('hide.bs.modal')
- $.support.transition && this.$element.hasClass('fade') ?
- hideWithTransition.call(this) :
- hideModal.call(this)
- }
+ 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.bs.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 PRIVATE METHODS
- * ===================== */
+ 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')
+ }
+ }
- function hideWithTransition() {
+ Modal.prototype.hideModal = function () {
var that = this
- , timeout = setTimeout(function () {
- that.$element.off($.support.transition.end)
- hideModal.call(that)
- }, 500)
-
- this.$element.one($.support.transition.end, function () {
- clearTimeout(timeout)
- hideModal.call(that)
+ this.$element.hide()
+ this.backdrop(function () {
+ that.removeBackdrop()
+ that.$element.trigger('hidden.bs.modal')
})
}
- function hideModal( that ) {
- this.$element
- .hide()
- .trigger('hidden')
-
- backdrop.call(this)
+ Modal.prototype.removeBackdrop = function () {
+ this.$backdrop && this.$backdrop.remove()
+ this.$backdrop = null
}
- function backdrop( callback ) {
- var that = this
- , animate = this.$element.hasClass('fade') ? 'fade' : ''
+ Modal.prototype.backdrop = function (callback) {
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
if (this.isShown && this.options.backdrop) {
var doAnimate = $.support.transition && animate
@@ -753,683 +934,858 @@
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
.appendTo(document.body)
- if (this.options.backdrop != 'static') {
- this.$backdrop.click($.proxy(this.hide, this))
- }
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+ if (e.target !== e.currentTarget) return
+ this.options.backdrop == 'static'
+ ? this.$element[0].focus.call(this.$element[0])
+ : this.hide.call(this)
+ }, this))
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
this.$backdrop.addClass('in')
+ if (!callback) return
+
doAnimate ?
- this.$backdrop.one($.support.transition.end, callback) :
+ this.$backdrop
+ .one($.support.transition.end, callback)
+ .emulateTransitionEnd(150) :
callback()
} else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in')
- $.support.transition && this.$element.hasClass('fade')?
- this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :
- removeBackdrop.call(this)
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$backdrop
+ .one($.support.transition.end, callback)
+ .emulateTransitionEnd(150) :
+ callback()
} else if (callback) {
callback()
}
}
- function removeBackdrop() {
- this.$backdrop.remove()
- this.$backdrop = null
- }
-
- function escape() {
- var that = this
- if (this.isShown && this.options.keyboard) {
- $(document).on('keyup.dismiss.modal', function ( e ) {
- e.which == 27 && that.hide()
- })
- } else if (!this.isShown) {
- $(document).off('keyup.dismiss.modal')
- }
- }
+ // MODAL PLUGIN DEFINITION
+ // =======================
- /* MODAL PLUGIN DEFINITION
- * ======================= */
+ var old = $.fn.modal
- $.fn.modal = function ( option ) {
+ $.fn.modal = function (option, _relatedTarget) {
return this.each(function () {
- var $this = $(this)
- , data = $this.data('modal')
- , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
- if (!data) $this.data('modal', (data = new Modal(this, options)))
- if (typeof option == 'string') data[option]()
- else if (options.show) data.show()
+ var $this = $(this)
+ var data = $this.data('bs.modal')
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+ if (typeof option == 'string') data[option](_relatedTarget)
+ else if (options.show) data.show(_relatedTarget)
})
}
- $.fn.modal.defaults = {
- backdrop: true
- , keyboard: true
- , show: true
+ $.fn.modal.Constructor = Modal
+
+
+ // MODAL NO CONFLICT
+ // =================
+
+ $.fn.modal.noConflict = function () {
+ $.fn.modal = old
+ return this
}
- $.fn.modal.Constructor = Modal
+ // MODAL DATA-API
+ // ==============
- /* MODAL DATA-API
- * ============== */
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+ var $this = $(this)
+ var href = $this.attr('href')
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
- $(function () {
- $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
- var $this = $(this), href
- , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
- , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())
+ if ($this.is('a')) e.preventDefault()
- e.preventDefault()
- $target.modal(option)
- })
+ $target
+ .modal(option, this)
+ .one('hide', function () {
+ $this.is(':visible') && $this.focus()
+ })
})
-}( window.jQuery );/* ===========================================================
- * bootstrap-tooltip.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#tooltips
+ $(document)
+ .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
+ .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.1.1
+ * http://getbootstrap.com/javascript/#tooltip
* Inspired by the original jQuery.tipsy by Jason Frame
- * ===========================================================
- * 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"
-
- /* TOOLTIP PUBLIC CLASS DEFINITION
- * =============================== */
-
- var Tooltip = function ( element, options ) {
- this.init('tooltip', element, options)
- }
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
- Tooltip.prototype = {
- constructor: Tooltip
++function ($) {
+ 'use strict';
- , init: function ( type, element, options ) {
- var eventIn
- , eventOut
+ // TOOLTIP PUBLIC CLASS DEFINITION
+ // ===============================
- this.type = type
- this.$element = $(element)
- this.options = this.getOptions(options)
- this.enabled = true
+ var Tooltip = function (element, options) {
+ this.type =
+ this.options =
+ this.enabled =
+ this.timeout =
+ this.hoverState =
+ this.$element = null
- if (this.options.trigger != 'manual') {
- eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
- eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
- this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
- this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
- }
+ this.init('tooltip', element, options)
+ }
- this.options.selector ?
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
- this.fixTitle()
- }
+ Tooltip.DEFAULTS = {
+ animation: true,
+ placement: 'top',
+ selector: false,
+ template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ container: false
+ }
- , getOptions: function ( options ) {
- options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
+ Tooltip.prototype.init = function (type, element, options) {
+ this.enabled = true
+ this.type = type
+ this.$element = $(element)
+ this.options = this.getOptions(options)
- if (options.delay && typeof options.delay == 'number') {
- options.delay = {
- show: options.delay
- , hide: options.delay
- }
- }
+ var triggers = this.options.trigger.split(' ')
- return options
- }
+ for (var i = triggers.length; i--;) {
+ var trigger = triggers[i]
- , enter: function ( e ) {
- var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+ if (trigger == 'click') {
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+ } else if (trigger != 'manual') {
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
- if (!self.options.delay || !self.options.delay.show) {
- self.show()
- } else {
- self.hoverState = 'in'
- setTimeout(function() {
- if (self.hoverState == 'in') {
- self.show()
- }
- }, self.options.delay.show)
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
}
}
- , leave: function ( e ) {
- var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+ this.options.selector ?
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+ this.fixTitle()
+ }
- if (!self.options.delay || !self.options.delay.hide) {
- self.hide()
- } else {
- self.hoverState = 'out'
- setTimeout(function() {
- if (self.hoverState == 'out') {
- self.hide()
- }
- }, self.options.delay.hide)
+ Tooltip.prototype.getDefaults = function () {
+ return Tooltip.DEFAULTS
+ }
+
+ Tooltip.prototype.getOptions = function (options) {
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+ if (options.delay && typeof options.delay == 'number') {
+ options.delay = {
+ show: options.delay,
+ hide: options.delay
}
}
- , show: function () {
- var $tip
- , inside
- , pos
- , actualWidth
- , actualHeight
- , placement
- , tp
-
- if (this.hasContent() && this.enabled) {
- $tip = this.tip()
- this.setContent()
-
- if (this.options.animation) {
- $tip.addClass('fade')
- }
+ return options
+ }
- placement = typeof this.options.placement == 'function' ?
- this.options.placement.call(this, $tip[0], this.$element[0]) :
- this.options.placement
+ Tooltip.prototype.getDelegateOptions = function () {
+ var options = {}
+ var defaults = this.getDefaults()
- inside = /in/.test(placement)
+ this._options && $.each(this._options, function (key, value) {
+ if (defaults[key] != value) options[key] = value
+ })
- $tip
- .remove()
- .css({ top: 0, left: 0, display: 'block' })
- .appendTo(inside ? this.$element : document.body)
+ return options
+ }
- pos = this.getPosition(inside)
+ Tooltip.prototype.enter = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
- actualWidth = $tip[0].offsetWidth
- actualHeight = $tip[0].offsetHeight
+ clearTimeout(self.timeout)
- switch (inside ? placement.split(' ')[1] : placement) {
- case 'bottom':
- tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
- break
- case 'top':
- tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
- break
- case 'left':
- tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
- break
- case 'right':
- tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
- break
- }
+ self.hoverState = 'in'
+
+ if (!self.options.delay || !self.options.delay.show) return self.show()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'in') self.show()
+ }, self.options.delay.show)
+ }
+
+ Tooltip.prototype.leave = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'out'
+
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'out') self.hide()
+ }, self.options.delay.hide)
+ }
+
+ Tooltip.prototype.show = function () {
+ var e = $.Event('show.bs.' + this.type)
+
+ if (this.hasContent() && this.enabled) {
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+ var that = this;
+
+ var $tip = this.tip()
+
+ this.setContent()
+
+ if (this.options.animation) $tip.addClass('fade')
+
+ var placement = typeof this.options.placement == 'function' ?
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
+ this.options.placement
+
+ var autoToken = /\s?auto?\s?/i
+ var autoPlace = autoToken.test(placement)
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+ $tip
+ .detach()
+ .css({ top: 0, left: 0, display: 'block' })
+ .addClass(placement)
+
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+ var pos = this.getPosition()
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (autoPlace) {
+ var $parent = this.$element.parent()
+
+ var orgPlacement = placement
+ var docScroll = document.documentElement.scrollTop || document.body.scrollTop
+ var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
+ var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
+ var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
+
+ placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
+ placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
+ placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
+ placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
+ placement
$tip
- .css(tp)
+ .removeClass(orgPlacement)
.addClass(placement)
- .addClass('in')
}
- }
- , setContent: function () {
- var $tip = this.tip()
- $tip.find('.tooltip-inner').html(this.getTitle())
- $tip.removeClass('fade in top bottom left right')
- }
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
- , hide: function () {
- var that = this
- , $tip = this.tip()
+ this.applyPlacement(calculatedOffset, placement)
+ this.hoverState = null
- $tip.removeClass('in')
+ var complete = function() {
+ that.$element.trigger('shown.bs.' + that.type)
+ }
- function removeWithAnimation() {
- var timeout = setTimeout(function () {
- $tip.off($.support.transition.end).remove()
- }, 500)
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one($.support.transition.end, complete)
+ .emulateTransitionEnd(150) :
+ complete()
+ }
+ }
- $tip.one($.support.transition.end, function () {
- clearTimeout(timeout)
- $tip.remove()
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
+ var replace
+ var $tip = this.tip()
+ var width = $tip[0].offsetWidth
+ var height = $tip[0].offsetHeight
+
+ // manually read margins because getBoundingClientRect includes difference
+ var marginTop = parseInt($tip.css('margin-top'), 10)
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+ // we must check for NaN for ie 8/9
+ if (isNaN(marginTop)) marginTop = 0
+ if (isNaN(marginLeft)) marginLeft = 0
+
+ offset.top = offset.top + marginTop
+ offset.left = offset.left + marginLeft
+
+ // $.fn.offset doesn't round pixel values
+ // so we use setOffset directly with our own function B-0
+ $.offset.setOffset($tip[0], $.extend({
+ using: function (props) {
+ $tip.css({
+ top: Math.round(props.top),
+ left: Math.round(props.left)
})
}
+ }, offset), 0)
- $.support.transition && this.$tip.hasClass('fade') ?
- removeWithAnimation() :
- $tip.remove()
+ $tip.addClass('in')
+
+ // check to see if placing tip in new offset caused the tip to resize itself
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (placement == 'top' && actualHeight != height) {
+ replace = true
+ offset.top = offset.top + height - actualHeight
}
- , fixTitle: function () {
- var $e = this.$element
- if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
- $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
+ if (/bottom|top/.test(placement)) {
+ var delta = 0
+
+ if (offset.left < 0) {
+ delta = offset.left * -2
+ offset.left = 0
+
+ $tip.offset(offset)
+
+ actualWidth = $tip[0].offsetWidth
+ actualHeight = $tip[0].offsetHeight
}
- }
- , hasContent: function () {
- return this.getTitle()
+ this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+ } else {
+ this.replaceArrow(actualHeight - height, actualHeight, 'top')
}
- , getPosition: function (inside) {
- return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
- width: this.$element[0].offsetWidth
- , height: this.$element[0].offsetHeight
- })
- }
+ if (replace) $tip.offset(offset)
+ }
- , getTitle: function () {
- var title
- , $e = this.$element
- , o = this.options
+ Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
+ this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
+ }
- title = $e.attr('data-original-title')
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+ Tooltip.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
- title = title.toString().replace(/(^\s*|\s*$)/, "")
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+ $tip.removeClass('fade in top bottom left right')
+ }
- return title
- }
+ Tooltip.prototype.hide = function () {
+ var that = this
+ var $tip = this.tip()
+ var e = $.Event('hide.bs.' + this.type)
- , tip: function () {
- return this.$tip = this.$tip || $(this.options.template)
+ function complete() {
+ if (that.hoverState != 'in') $tip.detach()
+ that.$element.trigger('hidden.bs.' + that.type)
}
- , validate: function () {
- if (!this.$element[0].parentNode) {
- this.hide()
- this.$element = null
- this.options = null
- }
- }
+ this.$element.trigger(e)
- , enable: function () {
- this.enabled = true
- }
+ if (e.isDefaultPrevented()) return
- , disable: function () {
- this.enabled = false
- }
+ $tip.removeClass('in')
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one($.support.transition.end, complete)
+ .emulateTransitionEnd(150) :
+ complete()
+
+ this.hoverState = null
+
+ return this
+ }
- , toggleEnabled: function () {
- this.enabled = !this.enabled
+ Tooltip.prototype.fixTitle = function () {
+ var $e = this.$element
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
}
+ }
+
+ Tooltip.prototype.hasContent = function () {
+ return this.getTitle()
+ }
+
+ Tooltip.prototype.getPosition = function () {
+ var el = this.$element[0]
+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
+ width: el.offsetWidth,
+ height: el.offsetHeight
+ }, this.$element.offset())
+ }
+
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+ }
+
+ Tooltip.prototype.getTitle = function () {
+ var title
+ var $e = this.$element
+ var o = this.options
- , toggle: function () {
- this[this.tip().hasClass('in') ? 'hide' : 'show']()
+ title = $e.attr('data-original-title')
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+
+ return title
+ }
+
+ Tooltip.prototype.tip = function () {
+ return this.$tip = this.$tip || $(this.options.template)
+ }
+
+ Tooltip.prototype.arrow = function () {
+ return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
+ }
+
+ Tooltip.prototype.validate = function () {
+ if (!this.$element[0].parentNode) {
+ this.hide()
+ this.$element = null
+ this.options = null
}
+ }
+
+ Tooltip.prototype.enable = function () {
+ this.enabled = true
+ }
+
+ Tooltip.prototype.disable = function () {
+ this.enabled = false
+ }
+
+ Tooltip.prototype.toggleEnabled = function () {
+ this.enabled = !this.enabled
+ }
+
+ Tooltip.prototype.toggle = function (e) {
+ var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+ }
+ Tooltip.prototype.destroy = function () {
+ clearTimeout(this.timeout)
+ this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
}
- /* TOOLTIP PLUGIN DEFINITION
- * ========================= */
+ // TOOLTIP PLUGIN DEFINITION
+ // =========================
- $.fn.tooltip = function ( option ) {
+ var old = $.fn.tooltip
+
+ $.fn.tooltip = function (option) {
return this.each(function () {
- var $this = $(this)
- , data = $this.data('tooltip')
- , options = typeof option == 'object' && option
- if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
+ var $this = $(this)
+ var data = $this.data('bs.tooltip')
+ var options = typeof option == 'object' && option
+
+ if (!data && option == 'destroy') return
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.tooltip.Constructor = Tooltip
- $.fn.tooltip.defaults = {
- animation: true
- , delay: 0
- , selector: false
- , placement: 'top'
- , trigger: 'hover'
- , title: ''
- , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
- }
-
-}( window.jQuery );/* ===========================================================
- * bootstrap-popover.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#popovers
- * ===========================================================
- * 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"
-
- var Popover = function ( element, options ) {
+
+ // TOOLTIP NO CONFLICT
+ // ===================
+
+ $.fn.tooltip.noConflict = function () {
+ $.fn.tooltip = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.1.1
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // POPOVER PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Popover = function (element, options) {
this.init('popover', element, options)
}
- /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
- ========================================== */
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+ })
- constructor: Popover
- , setContent: function () {
- var $tip = this.tip()
- , title = this.getTitle()
- , content = this.getContent()
+ // NOTE: POPOVER EXTENDS tooltip.js
+ // ================================
- $tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title)
- $tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content)
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
- $tip.removeClass('fade top bottom left right in')
- }
+ Popover.prototype.constructor = Popover
- , hasContent: function () {
- return this.getTitle() || this.getContent()
- }
+ Popover.prototype.getDefaults = function () {
+ return Popover.DEFAULTS
+ }
- , getContent: function () {
- var content
- , $e = this.$element
- , o = this.options
+ Popover.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+ var content = this.getContent()
- content = $e.attr('data-content')
- || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+ $tip.find('.popover-content')[ // we use append for html objects to maintain js events
+ this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+ ](content)
- content = content.toString().replace(/(^\s*|\s*$)/, "")
+ $tip.removeClass('fade top bottom left right in')
- return content
- }
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+ // this manually by checking the contents.
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+ }
- , tip: function() {
- if (!this.$tip) {
- this.$tip = $(this.options.template)
- }
- return this.$tip
- }
+ Popover.prototype.hasContent = function () {
+ return this.getTitle() || this.getContent()
+ }
- })
+ Popover.prototype.getContent = function () {
+ var $e = this.$element
+ var o = this.options
+ return $e.attr('data-content')
+ || (typeof o.content == 'function' ?
+ o.content.call($e[0]) :
+ o.content)
+ }
+
+ Popover.prototype.arrow = function () {
+ return this.$arrow = this.$arrow || this.tip().find('.arrow')
+ }
+
+ Popover.prototype.tip = function () {
+ if (!this.$tip) this.$tip = $(this.options.template)
+ return this.$tip
+ }
- /* POPOVER PLUGIN DEFINITION
- * ======================= */
- $.fn.popover = function ( option ) {
+ // POPOVER PLUGIN DEFINITION
+ // =========================
+
+ var old = $.fn.popover
+
+ $.fn.popover = function (option) {
return this.each(function () {
- var $this = $(this)
- , data = $this.data('popover')
- , options = typeof option == 'object' && option
- if (!data) $this.data('popover', (data = new Popover(this, options)))
+ var $this = $(this)
+ var data = $this.data('bs.popover')
+ var options = typeof option == 'object' && option
+
+ if (!data && option == 'destroy') return
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.popover.Constructor = Popover
- $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
- placement: 'right'
- , content: ''
- , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
- })
-}( window.jQuery );/* =============================================================
- * bootstrap-scrollspy.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#scrollspy
- * =============================================================
- * 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"
-
- /* SCROLLSPY CLASS DEFINITION
- * ========================== */
-
- function ScrollSpy( element, options) {
- var process = $.proxy(this.process, this)
- , $element = $(element).is('body') ? $(window) : $(element)
- , href
- this.options = $.extend({}, $.fn.scrollspy.defaults, options)
- this.$scrollElement = $element.on('scroll.scroll.data-api', process)
- this.selector = (this.options.target
+ // POPOVER NO CONFLICT
+ // ===================
+
+ $.fn.popover.noConflict = function () {
+ $.fn.popover = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.1.1
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ var href
+ var process = $.proxy(this.process, this)
+
+ this.$element = $(element).is('body') ? $(window) : $(element)
+ this.$body = $('body')
+ this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target
|| ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|| '') + ' .nav li > a'
- this.$body = $('body').on('click.scroll.data-api', this.selector, process)
+ this.offsets = $([])
+ this.targets = $([])
+ this.activeTarget = null
+
this.refresh()
this.process()
}
- ScrollSpy.prototype = {
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
- constructor: ScrollSpy
+ ScrollSpy.prototype.refresh = function () {
+ var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
- , refresh: function () {
- this.targets = this.$body
- .find(this.selector)
- .map(function () {
- var href = $(this).attr('href')
- return /^#\w/.test(href) && $(href).length ? href : null
- })
+ this.offsets = $([])
+ this.targets = $([])
- this.offsets = $.map(this.targets, function (id) {
- return $(id).position().top
- })
- }
+ var self = this
+ var $targets = this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ var href = $el.data('target') || $el.attr('href')
+ var $href = /^#./.test(href) && $(href)
- , process: function () {
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
- , offsets = this.offsets
- , targets = this.targets
- , activeTarget = this.activeTarget
- , i
-
- for (i = offsets.length; i--;) {
- activeTarget != targets[i]
- && scrollTop >= offsets[i]
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
- && this.activate( targets[i] )
- }
- }
+ return ($href
+ && $href.length
+ && $href.is(':visible')
+ && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ self.offsets.push(this[0])
+ self.targets.push(this[1])
+ })
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+ var maxScroll = scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets.last()[0]) && this.activate(i)
+ }
- , activate: function (target) {
- var active
+ if (activeTarget && scrollTop <= offsets[0]) {
+ return activeTarget != (i = targets[0]) && this.activate(i)
+ }
- this.activeTarget = target
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activate( targets[i] )
+ }
+ }
- this.$body
- .find(this.selector).parent('.active')
- .removeClass('active')
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
- active = this.$body
- .find(this.selector + '[href="' + target + '"]')
- .parent('li')
- .addClass('active')
+ $(this.selector)
+ .parentsUntil(this.options.target, '.active')
+ .removeClass('active')
- if ( active.parent('.dropdown-menu') ) {
- active.closest('li.dropdown').addClass('active')
- }
- }
+ var selector = this.selector +
+ '[data-target="' + target + '"],' +
+ this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+ active.trigger('activate.bs.scrollspy')
}
- /* SCROLLSPY PLUGIN DEFINITION
- * =========================== */
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
- $.fn.scrollspy = function ( option ) {
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = function (option) {
return this.each(function () {
- var $this = $(this)
- , data = $this.data('scrollspy')
- , options = typeof option == 'object' && option
- if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.scrollspy.Constructor = ScrollSpy
- $.fn.scrollspy.defaults = {
- offset: 10
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
}
- /* SCROLLSPY DATA-API
- * ================== */
+ // SCROLLSPY DATA-API
+ // ==================
- $(function () {
+ $(window).on('load', function () {
$('[data-spy="scroll"]').each(function () {
var $spy = $(this)
$spy.scrollspy($spy.data())
})
})
-}( window.jQuery );/* ========================================================
- * bootstrap-tab.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#tabs
- * ========================================================
- * 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"
-
- /* TAB CLASS DEFINITION
- * ==================== */
-
- var Tab = function ( element ) {
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.1.1
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TAB CLASS DEFINITION
+ // ====================
+
+ var Tab = function (element) {
this.element = $(element)
}
- Tab.prototype = {
+ Tab.prototype.show = function () {
+ var $this = this.element
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
+ var selector = $this.data('target')
- constructor: Tab
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
- , show: function () {
- var $this = this.element
- , $ul = $this.closest('ul:not(.dropdown-menu)')
- , selector = $this.attr('data-target')
- , previous
- , $target
+ if ($this.parent('li').hasClass('active')) return
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
- }
+ var previous = $ul.find('.active:last a')[0]
+ var e = $.Event('show.bs.tab', {
+ relatedTarget: previous
+ })
+
+ $this.trigger(e)
- if ( $this.parent('li').hasClass('active') ) return
+ if (e.isDefaultPrevented()) return
- previous = $ul.find('.active a').last()[0]
+ var $target = $(selector)
+ this.activate($this.parent('li'), $ul)
+ this.activate($target, $target.parent(), function () {
$this.trigger({
- type: 'show'
- , relatedTarget: previous
+ type: 'shown.bs.tab',
+ relatedTarget: previous
})
+ })
+ }
- $target = $(selector)
-
- this.activate($this.parent('li'), $ul)
- this.activate($target, $target.parent(), function () {
- $this.trigger({
- type: 'shown'
- , relatedTarget: previous
- })
- })
- }
+ Tab.prototype.activate = function (element, container, callback) {
+ var $active = container.find('> .active')
+ var transition = callback
+ && $.support.transition
+ && $active.hasClass('fade')
- , activate: function ( element, container, callback) {
- var $active = container.find('> .active')
- , transition = callback
- && $.support.transition
- && $active.hasClass('fade')
-
- function next() {
- $active
- .removeClass('active')
- .find('> .dropdown-menu > .active')
- .removeClass('active')
-
- element.addClass('active')
-
- if (transition) {
- element[0].offsetWidth // reflow for transition
- element.addClass('in')
- } else {
- element.removeClass('fade')
- }
+ function next() {
+ $active
+ .removeClass('active')
+ .find('> .dropdown-menu > .active')
+ .removeClass('active')
- if ( element.parent('.dropdown-menu') ) {
- element.closest('li.dropdown').addClass('active')
- }
+ element.addClass('active')
- callback && callback()
+ if (transition) {
+ element[0].offsetWidth // reflow for transition
+ element.addClass('in')
+ } else {
+ element.removeClass('fade')
}
- transition ?
- $active.one($.support.transition.end, next) :
- next()
+ if (element.parent('.dropdown-menu')) {
+ element.closest('li.dropdown').addClass('active')
+ }
- $active.removeClass('in')
+ callback && callback()
}
+
+ transition ?
+ $active
+ .one($.support.transition.end, next)
+ .emulateTransitionEnd(150) :
+ next()
+
+ $active.removeClass('in')
}
- /* TAB PLUGIN DEFINITION
- * ===================== */
+ // TAB PLUGIN DEFINITION
+ // =====================
+
+ var old = $.fn.tab
$.fn.tab = function ( option ) {
return this.each(function () {
var $this = $(this)
- , data = $this.data('tab')
- if (!data) $this.data('tab', (data = new Tab(this)))
+ var data = $this.data('bs.tab')
+
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
if (typeof option == 'string') data[option]()
})
}
@@ -1437,284 +1793,159 @@
$.fn.tab.Constructor = Tab
- /* TAB DATA-API
- * ============ */
+ // TAB NO CONFLICT
+ // ===============
- $(function () {
- $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
- e.preventDefault()
- $(this).tab('show')
- })
- })
-
-}( window.jQuery );/* =============================================================
- * bootstrap-typeahead.js v2.0.1
- * http://twitter.github.com/bootstrap/javascript.html#typeahead
- * =============================================================
- * 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"
-
- var Typeahead = function ( element, options ) {
- this.$element = $(element)
- this.options = $.extend({}, $.fn.typeahead.defaults, options)
- this.matcher = this.options.matcher || this.matcher
- this.sorter = this.options.sorter || this.sorter
- this.highlighter = this.options.highlighter || this.highlighter
- this.$menu = $(this.options.menu).appendTo('body')
- this.source = this.options.source
- this.shown = false
- this.listen()
+ $.fn.tab.noConflict = function () {
+ $.fn.tab = old
+ return this
}
- Typeahead.prototype = {
-
- constructor: Typeahead
-
- , select: function () {
- var val = this.$menu.find('.active').attr('data-value')
- this.$element.val(val)
- return this.hide()
- }
- , show: function () {
- var pos = $.extend({}, this.$element.offset(), {
- height: this.$element[0].offsetHeight
- })
+ // TAB DATA-API
+ // ============
- this.$menu.css({
- top: pos.top + pos.height
- , left: pos.left
- })
+ $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+ e.preventDefault()
+ $(this).tab('show')
+ })
- this.$menu.show()
- this.shown = true
- return this
- }
+}(jQuery);
- , hide: function () {
- this.$menu.hide()
- this.shown = false
- return this
- }
+/* ========================================================================
+ * Bootstrap: affix.js v3.1.1
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
- , lookup: function (event) {
- var that = this
- , items
- , q
- this.query = this.$element.val()
++function ($) {
+ 'use strict';
- if (!this.query) {
- return this.shown ? this.hide() : this
- }
+ // AFFIX CLASS DEFINITION
+ // ======================
- items = $.grep(this.source, function (item) {
- if (that.matcher(item)) return item
- })
+ var Affix = function (element, options) {
+ this.options = $.extend({}, Affix.DEFAULTS, options)
+ this.$window = $(window)
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
- items = this.sorter(items)
+ this.$element = $(element)
+ this.affixed =
+ this.unpin =
+ this.pinnedOffset = null
- if (!items.length) {
- return this.shown ? this.hide() : this
- }
+ this.checkPosition()
+ }
- return this.render(items.slice(0, this.options.items)).show()
- }
+ Affix.RESET = 'affix affix-top affix-bottom'
- , matcher: function (item) {
- return ~item.toLowerCase().indexOf(this.query.toLowerCase())
- }
+ Affix.DEFAULTS = {
+ offset: 0
+ }
- , sorter: function (items) {
- var beginswith = []
- , caseSensitive = []
- , caseInsensitive = []
- , item
+ Affix.prototype.getPinnedOffset = function () {
+ if (this.pinnedOffset) return this.pinnedOffset
+ this.$element.removeClass(Affix.RESET).addClass('affix')
+ var scrollTop = this.$window.scrollTop()
+ var position = this.$element.offset()
+ return (this.pinnedOffset = position.top - scrollTop)
+ }
- while (item = items.shift()) {
- if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
- else if (~item.indexOf(this.query)) caseSensitive.push(item)
- else caseInsensitive.push(item)
- }
+ Affix.prototype.checkPositionWithEventLoop = function () {
+ setTimeout($.proxy(this.checkPosition, this), 1)
+ }
- return beginswith.concat(caseSensitive, caseInsensitive)
- }
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
- , highlighter: function (item) {
- return item.replace(new RegExp('(' + this.query + ')', 'ig'), function ($1, match) {
- return '<strong>' + match + '</strong>'
- })
- }
+ var scrollHeight = $(document).height()
+ var scrollTop = this.$window.scrollTop()
+ var position = this.$element.offset()
+ var offset = this.options.offset
+ var offsetTop = offset.top
+ var offsetBottom = offset.bottom
- , render: function (items) {
- var that = this
+ if (this.affixed == 'top') position.top += scrollTop
- items = $(items).map(function (i, item) {
- i = $(that.options.item).attr('data-value', item)
- i.find('a').html(that.highlighter(item))
- return i[0]
- })
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
- items.first().addClass('active')
- this.$menu.html(items)
- return this
- }
+ var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
+ offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
+ offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
- , next: function (event) {
- var active = this.$menu.find('.active').removeClass('active')
- , next = active.next()
+ if (this.affixed === affix) return
+ if (this.unpin) this.$element.css('top', '')
- if (!next.length) {
- next = $(this.$menu.find('li')[0])
- }
+ var affixType = 'affix' + (affix ? '-' + affix : '')
+ var e = $.Event(affixType + '.bs.affix')
- next.addClass('active')
- }
+ this.$element.trigger(e)
- , prev: function (event) {
- var active = this.$menu.find('.active').removeClass('active')
- , prev = active.prev()
+ if (e.isDefaultPrevented()) return
- if (!prev.length) {
- prev = this.$menu.find('li').last()
- }
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
- prev.addClass('active')
- }
-
- , listen: function () {
- this.$element
- .on('blur', $.proxy(this.blur, this))
- .on('keypress', $.proxy(this.keypress, this))
- .on('keyup', $.proxy(this.keyup, this))
-
- if ($.browser.webkit || $.browser.msie) {
- this.$element.on('keydown', $.proxy(this.keypress, this))
- }
+ this.$element
+ .removeClass(Affix.RESET)
+ .addClass(affixType)
+ .trigger($.Event(affixType.replace('affix', 'affixed')))
- this.$menu
- .on('click', $.proxy(this.click, this))
- .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+ if (affix == 'bottom') {
+ this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() })
}
+ }
- , keyup: function (e) {
- e.stopPropagation()
- e.preventDefault()
-
- switch(e.keyCode) {
- case 40: // down arrow
- case 38: // up arrow
- break
- case 9: // tab
- case 13: // enter
- if (!this.shown) return
- this.select()
- break
+ // AFFIX PLUGIN DEFINITION
+ // =======================
- case 27: // escape
- this.hide()
- break
+ var old = $.fn.affix
- default:
- this.lookup()
- }
+ $.fn.affix = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.affix')
+ var options = typeof option == 'object' && option
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
}
- , keypress: function (e) {
- e.stopPropagation()
- if (!this.shown) return
-
- switch(e.keyCode) {
- case 9: // tab
- case 13: // enter
- case 27: // escape
- e.preventDefault()
- break
+ $.fn.affix.Constructor = Affix
- case 38: // up arrow
- e.preventDefault()
- this.prev()
- break
- case 40: // down arrow
- e.preventDefault()
- this.next()
- break
- }
- }
-
- , blur: function (e) {
- var that = this
- e.stopPropagation()
- e.preventDefault()
- setTimeout(function () { that.hide() }, 150)
- }
-
- , click: function (e) {
- e.stopPropagation()
- e.preventDefault()
- this.select()
- }
-
- , mouseenter: function (e) {
- this.$menu.find('.active').removeClass('active')
- $(e.currentTarget).addClass('active')
- }
+ // AFFIX NO CONFLICT
+ // =================
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
}
- /* TYPEAHEAD PLUGIN DEFINITION
- * =========================== */
+ // AFFIX DATA-API
+ // ==============
- $.fn.typeahead = function ( option ) {
- return this.each(function () {
- var $this = $(this)
- , data = $this.data('typeahead')
- , options = typeof option == 'object' && option
- if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- $.fn.typeahead.defaults = {
- source: []
- , items: 8
- , menu: '<ul class="typeahead dropdown-menu"></ul>'
- , item: '<li><a href="#"></a></li>'
- }
-
- $.fn.typeahead.Constructor = Typeahead
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ var data = $spy.data()
+ data.offset = data.offset || {}
- /* TYPEAHEAD DATA-API
- * ================== */
+ if (data.offsetBottom) data.offset.bottom = data.offsetBottom
+ if (data.offsetTop) data.offset.top = data.offsetTop
- $(function () {
- $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
- var $this = $(this)
- if ($this.data('typeahead')) return
- e.preventDefault()
- $this.typeahead($this.data())
+ $spy.affix(data)
})
})
-}( window.jQuery ); \ No newline at end of file
+}(jQuery);
diff --git a/horizon/static/horizon/js/horizon.d3linechart.js b/horizon/static/horizon/js/horizon.d3linechart.js
index 3527bd3f5..907d9745e 100644
--- a/horizon/static/horizon/js/horizon.d3linechart.js
+++ b/horizon/static/horizon/js/horizon.d3linechart.js
@@ -127,11 +127,11 @@
<form class="form-horizontal"
id="linechart_general_form">
- <div class="control-group">
- <label for="meter" class="control-label">{% trans "Metric" %}:&nbsp;</label>
- <div class="controls">
+ <div class="form-group">
+ <label for="meter" class="control-label col-sm-2">{% trans "Metric" %}:&nbsp;</label>
+ <div class="col-sm-10">
<select data-line-chart-command="select_box_change"
- name="meter" id="meter" class="span2 example">
+ name="meter" id="meter" class="col-sm-w form-control example">
{% for meter in meters %}
<option value="{{ meter }}" data-unit="{{ meter }}">
{{ meter }}
@@ -149,11 +149,11 @@
Example:
<form class="form-horizontal"
id="linechart_general_form">
- <div class="control-group" id="date_from">
- <label for="date_from" class="control-label">{% trans "From" %}:&nbsp;</label>
- <div class="controls">
+ <div class="form-group" id="date_from">
+ <label for="date_from" class="control-label col-sm-2">{% trans "From" %}:&nbsp;</label>
+ <div class="col-sm-10">
<input data-line-chart-command="date_picker_change"
- type="text" id="date_from" name="date_from" class="span2 example"/>
+ type="text" id="date_from" name="date_from" class="form-control example"/>
</div>
</div>
</form>
diff --git a/horizon/static/horizon/js/horizon.firewalls.js b/horizon/static/horizon/js/horizon.firewalls.js
index 80b9a7d91..07269167d 100644
--- a/horizon/static/horizon/js/horizon.firewalls.js
+++ b/horizon/static/horizon/js/horizon.firewalls.js
@@ -122,8 +122,8 @@ horizon.firewalls = {
}
updateForm();
});
- if ($("#ruleListId > div.control-group.error").length > 0) {
- var errortext = $("#ruleListId > div.control-group.error").find("span.help-inline").text();
+ if ($("#ruleListId > div.form-group.error").length > 0) {
+ var errortext = $("#ruleListId > div.form-group.error").find("span.help-block").text();
$("#selected_rule_h4").before($('<div class="dynamic-error">').html(errortext));
}
$(".rulelist").sortable({
diff --git a/horizon/static/horizon/js/horizon.forms.js b/horizon/static/horizon/js/horizon.forms.js
index bc3c0af65..ad6454cd3 100644
--- a/horizon/static/horizon/js/horizon.forms.js
+++ b/horizon/static/horizon/js/horizon.forms.js
@@ -197,10 +197,10 @@ horizon.addInitFunction(function () {
data = $input.data(slug + "-" + val);
if (typeof data === "undefined" || !visible) {
- $input.closest('.form-field').hide();
+ $input.closest('.form-group').hide();
} else {
$('label[for=' + $input.attr('id') + ']').html(data);
- $input.closest('.form-field').show();
+ $input.closest('.form-group').show();
}
});
});
@@ -220,9 +220,9 @@ horizon.addInitFunction(function () {
$this.find("option").each(function () {
if (this.value !== base_type) {
- $("#id_" + this.value).closest(".control-group").hide();
+ $("#id_" + this.value).closest(".form-group").hide();
} else {
- $("#id_" + this.value).closest(".control-group").show();
+ $("#id_" + this.value).closest(".form-group").show();
}
});
}
@@ -240,19 +240,19 @@ horizon.addInitFunction(function () {
// Apply standard handler for everything but checkboxes.
$(document).tooltip({
- selector: "div.form-field .help-icon",
+ selector: "div.form-group .help-icon",
placement: function (tip, input) {
// Position to the right unless this is a "split" for in which case put
// the tooltip below so it doesn't block the next field.
return $(input).closest("form[class*='split']").length ? "bottom" : 'right';
},
title: function () {
- return $(this).closest('div.form-field').children('.help-block').text();
+ return $(this).closest('div.form-group').children('.help-block').text();
}
});
// Hide the tooltip upon interaction with the field for select boxes.
// We use mousedown and keydown since those "open" the select dropdown.
- $(document).on('mousedown keydown', '.form-field select', function (evt) {
+ $(document).on('mousedown keydown', '.form-group select', function (evt) {
$(this).tooltip('hide');
});
// Hide the tooltip after escape button pressed
@@ -263,5 +263,5 @@ horizon.addInitFunction(function () {
});
// Hide the help text for js-capable browsers
- $('span.help-block').hide();
+ $('p.help-block').hide();
});
diff --git a/horizon/static/horizon/js/horizon.formset_table.js b/horizon/static/horizon/js/horizon.formset_table.js
index 536524882..239d9d2fc 100644
--- a/horizon/static/horizon/js/horizon.formset_table.js
+++ b/horizon/static/horizon/js/horizon.formset_table.js
@@ -53,7 +53,7 @@ horizon.formset_table = (function () {
// if there are extra empty rows, add the button for new rows
if (add_label) {
- var button = $('<a href="#" class="btn btn-small pull-right">' +
+ var button = $('<a href="#" class="btn btn-primary btn-sm pull-right">' +
add_label + '</a>');
table.find('tfoot td').append(button);
button.click(function () {
diff --git a/horizon/static/horizon/js/horizon.instances.js b/horizon/static/horizon/js/horizon.instances.js
index 017d8023d..907aa2dae 100644
--- a/horizon/static/horizon/js/horizon.instances.js
+++ b/horizon/static/horizon/js/horizon.instances.js
@@ -126,8 +126,8 @@ horizon.instances = {
}
updateForm();
});
- if ($("#networkListId > div.control-group.error").length > 0) {
- var errortext = $("#networkListId > div.control-group.error").find("span.help-inline").text();
+ if ($("#networkListId > div.form-group.error").length > 0) {
+ var errortext = $("#networkListId > div.form-group.error").find("span.help-block").text();
$("#selected_network_label").before($('<div class="dynamic-error">').html(errortext));
}
$(".networklist").sortable({
@@ -164,29 +164,29 @@ horizon.addInitFunction(function () {
var $this = $(field),
base_type = $this.val();
- $this.closest(".control-group").nextAll().hide();
+ $this.closest(".form-group").nextAll().hide();
switch(base_type) {
case "image_id":
- $("#id_image_id").closest(".control-group").show();
+ $("#id_image_id").closest(".form-group").show();
break;
case "instance_snapshot_id":
- $("#id_instance_snapshot_id").closest(".control-group").show();
+ $("#id_instance_snapshot_id").closest(".form-group").show();
break;
case "volume_id":
- $("#id_volume_id, #id_delete_on_terminate").closest(".control-group").show();
+ $("#id_volume_id, #id_delete_on_terminate").closest(".form-group").show();
break;
case "volume_image_id":
$("#id_image_id, #id_volume_size, #id_device_name, #id_delete_on_terminate")
- .closest(".control-group").show();
+ .closest(".form-group").show();
break;
case "volume_snapshot_id":
$("#id_volume_snapshot_id, #id_device_name, #id_delete_on_terminate")
- .closest(".control-group").show();
+ .closest(".form-group").show();
break;
}
}
diff --git a/horizon/static/horizon/js/horizon.messages.js b/horizon/static/horizon/js/horizon.messages.js
index fdf6ab9a0..a97790b9b 100644
--- a/horizon/static/horizon/js/horizon.messages.js
+++ b/horizon/static/horizon/js/horizon.messages.js
@@ -21,7 +21,7 @@ horizon.alert = function (type, message, extra_tags) {
};
horizon.clearErrorMessages = function() {
- $('#main_content .messages .alert.alert-error').remove();
+ $('#main_content .messages .alert.alert-danger').remove();
};
horizon.clearSuccessMessages = function() {
diff --git a/horizon/static/horizon/js/horizon.modals.js b/horizon/static/horizon/js/horizon.modals.js
index e018e6363..1bdd8f667 100644
--- a/horizon/static/horizon/js/horizon.modals.js
+++ b/horizon/static/horizon/js/horizon.modals.js
@@ -54,7 +54,7 @@ horizon.modals.modal_spinner = function (text) {
horizon.modals.spinner = $(template.render({text: text}));
horizon.modals.spinner.appendTo("#modal_wrapper");
horizon.modals.spinner.modal({backdrop: 'static'});
- horizon.modals.spinner.spin(horizon.conf.spinner_options.modal);
+ horizon.modals.spinner.find(".modal-body").spin(horizon.conf.spinner_options.modal);
};
horizon.modals.init_wizard = function () {
@@ -69,11 +69,11 @@ horizon.modals.init_wizard = function () {
}
// Clear old errors.
- $form.find('td.actions div.alert-error').remove();
- $form.find('.control-group.error').each(function () {
+ $form.find('td.actions div.alert-danger').remove();
+ $form.find('.form-group.error').each(function () {
var $group = $(this);
$group.removeClass('error');
- $group.find('span.help-inline.error').remove();
+ $group.find('span.help-block.error').remove();
});
// Send the data for validation.
@@ -103,7 +103,7 @@ horizon.modals.init_wizard = function () {
// Add global errors.
$.each(errors, function (index, error) {
$fieldset.find('td.actions').prepend(
- '<div class="alert alert-message alert-error">' +
+ '<div class="alert alert-message alert-danger">' +
error + '</div>');
});
$fieldset.find('input, select, textarea').first().focus();
@@ -111,10 +111,10 @@ horizon.modals.init_wizard = function () {
}
// Add field errors.
$field = $fieldset.find('[name="' + field + '"]');
- $field.closest('.control-group').addClass('error');
+ $field.closest('.form-group').addClass('error');
$.each(errors, function (index, error) {
$field.before(
- '<span class="help-inline error">' +
+ '<span class="help-block error">' +
error + '</span>');
});
// Focus the first invalid field.
@@ -235,14 +235,14 @@ horizon.addInitFunction(function() {
location.href = jqXHR.getResponseHeader("X-Horizon-Location");
} else {
$form.closest(".modal").modal("hide");
- horizon.alert("error", gettext("There was an error submitting the form. Please try again."));
+ horizon.alert("danger", gettext("There was an error submitting the form. Please try again."));
}
}
});
});
// Position modal so it's in-view even when scrolled down.
- $(document).on('show', '.modal', function (evt) {
+ $(document).on('show.bs.modal', '.modal', function (evt) {
// Filter out indirect triggers of "show" from (for example) tabs.
if ($(evt.target).hasClass("modal")) {
var scrollShift = $('body').scrollTop() || $('html').scrollTop(),
@@ -297,7 +297,7 @@ horizon.addInitFunction(function() {
else {
if (!horizon.ajax.get_messages(jqXHR)) {
// Generic error handler. Really generic.
- horizon.alert("error", gettext("An error occurred. Please try again later."));
+ horizon.alert("danger", gettext("An error occurred. Please try again later."));
}
}
},
@@ -321,7 +321,7 @@ horizon.addInitFunction(function() {
/* Manage the modal "stack" */
// When a new modal is opened, hide any that are already in the stack.
- $(document).on("show", ".modal", function () {
+ $(document).on("show.bs.modal", ".modal", function () {
var container = $("#modal_wrapper"),
modal_stack = container.find(".modal"),
$this = $(this);
@@ -334,7 +334,7 @@ horizon.addInitFunction(function() {
// Note: the modal should only be removed if it is the "top" of the stack of
// modals, e.g. it's the one currently being interacted with and isn't just
// temporarily being hidden.
- $(document).on('hidden', '.modal', function () {
+ $(document).on('hidden.bs.modal', '.modal', function () {
var $this = $(this),
modal_stack = $("#modal_wrapper .modal");
if ($this[0] === modal_stack.last()[0] || $this.hasClass("loading")) {
diff --git a/horizon/static/horizon/js/horizon.tables.js b/horizon/static/horizon/js/horizon.tables.js
index 0adfd24a2..884ab26aa 100644
--- a/horizon/static/horizon/js/horizon.tables.js
+++ b/horizon/static/horizon/js/horizon.tables.js
@@ -392,7 +392,7 @@ horizon.datatables.set_table_query_filter = function (parent) {
return false;
}
});
- input.next('button.btn-search').on('click keypress', function (evt) {
+ input.next('button.btn span.glyphicon-search').on('click keypress', function (evt) {
return false;
});
diff --git a/horizon/static/horizon/js/horizon.users.js b/horizon/static/horizon/js/horizon.users.js
index 06cf379d3..3cd85f5f3 100644
--- a/horizon/static/horizon/js/horizon.users.js
+++ b/horizon/static/horizon/js/horizon.users.js
@@ -15,7 +15,7 @@ horizon.user = {
check_passwords_match: function() {
var row = $("label[for='id_confirm_password']");
var error_id = "id_confirm_password_error";
- var msg = "<span id='" + error_id + "' class='help-inline'>" + gettext("Passwords do not match.") + "</span>";
+ var msg = "<span id='" + error_id + "' class='help-block'>" + gettext("Passwords do not match.") + "</span>";
var password = $("#id_password").val();
var confirm_password = $("#id_confirm_password").val();
diff --git a/horizon/static/horizon/lib/angular/angular.js b/horizon/static/horizon/lib/angular/angular.js
index d93e85858..589ddb327 100644
--- a/horizon/static/horizon/lib/angular/angular.js
+++ b/horizon/static/horizon/lib/angular/angular.js
@@ -1723,10 +1723,10 @@ function setupModuleLoader(window) {
/* global
angularModule: true,
version: true,
-
+
$LocaleProvider,
$CompileProvider,
-
+
htmlAnchorDirective,
inputDirective,
inputDirective,
@@ -3664,7 +3664,7 @@ function createInjector(modulesToLoad) {
*
* It also watches the `$location.hash()` and scrolls whenever it changes to match any anchor.
* This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`.
- *
+ *
* @example
<example>
<file name="index.html">
@@ -3679,7 +3679,7 @@ function createInjector(modulesToLoad) {
// set the location.hash to the id of
// the element you wish to scroll to.
$location.hash('bottom');
-
+
// call $anchorScroll()
$anchorScroll();
}
@@ -3767,7 +3767,7 @@ var $animateMinErr = minErr('$animate');
*/
var $AnimateProvider = ['$provide', function($provide) {
-
+
this.$$selectors = {};
@@ -3885,7 +3885,7 @@ var $AnimateProvider = ['$provide', function($provide) {
* @description Moves the position of the provided element within the DOM to be placed
* either after the `after` element or inside of the `parent` element. Once complete, the
* done() callback will be fired (if provided).
- *
+ *
* @param {jQuery/jqLite element} element the element which will be moved around within the
* DOM
* @param {jQuery/jqLite element} parent the parent element where the element will be
@@ -4197,7 +4197,7 @@ function Browser(window, document, $log, $sniffer) {
/**
* @name ng.$browser#baseHref
* @methodOf ng.$browser
- *
+ *
* @description
* Returns current <base href>
* (always relative - without domain)
@@ -4228,13 +4228,13 @@ function Browser(window, document, $log, $sniffer) {
* It is not meant to be used directly, use the $cookie service instead.
*
* The return values vary depending on the arguments that the method was called with as follows:
- *
+ *
* - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify
* it
* - cookies(name, value) -> set name to value, if value is undefined delete the cookie
* - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that
* way)
- *
+ *
* @returns {Object} Hash of all cookies (if called without any parameter)
*/
self.cookies = function(name, value) {
@@ -4349,9 +4349,9 @@ function $BrowserProvider(){
*
* @description
* Factory that constructs cache objects and gives access to them.
- *
+ *
* <pre>
- *
+ *
* var cache = $cacheFactory('cacheId');
* expect($cacheFactory.get('cacheId')).toBe(cache);
* expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();
@@ -4360,8 +4360,8 @@ function $BrowserProvider(){
* cache.put("another key", "another value");
*
* // We've specified no options on creation
- * expect(cache.info()).toEqual({id: 'cacheId', size: 2});
- *
+ * expect(cache.info()).toEqual({id: 'cacheId', size: 2});
+ *
* </pre>
*
*
@@ -4544,7 +4544,7 @@ function $CacheFactoryProvider() {
* The first time a template is used, it is loaded in the template cache for quick retrieval. You
* can load templates directly into the cache in a `script` tag, or by consuming the
* `$templateCache` service directly.
- *
+ *
* Adding via the `script` tag:
* <pre>
* <html ng-app>
@@ -4556,29 +4556,29 @@ function $CacheFactoryProvider() {
* ...
* </html>
* </pre>
- *
+ *
* **Note:** the `script` tag containing the template does not need to be included in the `head` of
* the document, but it must be below the `ng-app` definition.
- *
+ *
* Adding via the $templateCache service:
- *
+ *
* <pre>
* var myApp = angular.module('myApp', []);
* myApp.run(function($templateCache) {
* $templateCache.put('templateId.html', 'This is the content of the template');
* });
* </pre>
- *
+ *
* To retrieve the template later, simply use it in your HTML:
* <pre>
* <div ng-include=" 'templateId.html' "></div>
* </pre>
- *
+ *
* or get it via Javascript:
* <pre>
* $templateCache.get('templateId.html')
* </pre>
- *
+ *
* See {@link ng.$cacheFactory $cacheFactory}.
*
*/
@@ -4870,7 +4870,7 @@ function $TemplateCacheProvider() {
* should be done in a linking function rather than in a compile function.
* </div>
*
- * <div class="alert alert-error">
+ * <div class="alert alert-danger">
* **Note:** The `transclude` function that is passed to the compile function is deperecated, as it
* e.g. does not know about the right outer scope. Please use the transclude function that is passed
* to the link function instead.
@@ -6677,12 +6677,12 @@ function $DocumentProvider(){
* Any uncaught exception in angular expressions is delegated to this service.
* The default implementation simply delegates to `$log.error` which logs it into
* the browser console.
- *
+ *
* In unit tests, if `angular-mocks.js` is loaded, this service is overridden by
* {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.
*
* ## Example:
- *
+ *
* <pre>
* angular.module('exceptionOverride', []).factory('$exceptionHandler', function () {
* return function (exception, cause) {
@@ -6691,7 +6691,7 @@ function $DocumentProvider(){
* };
* });
* </pre>
- *
+ *
* This example will override the normal action of `$exceptionHandler`, to make angular
* exceptions fail hard when they happen, instead of just logging to the console.
*
@@ -6930,7 +6930,7 @@ function $HttpProvider() {
* will result in the success callback being called. Note that if the response is a redirect,
* XMLHttpRequest will transparently follow it, meaning that the error callback will not be
* called for such responses.
- *
+ *
* # Calling $http from outside AngularJS
* The `$http` service will not actually send the request until the next `$digest()` is
* executed. Normally this is not an issue, since almost all the time your call to `$http` will
@@ -8172,7 +8172,7 @@ function $IntervalProvider() {
promise = deferred.promise,
iteration = 0,
skipApply = (isDefined(invokeApply) && !invokeApply);
-
+
count = isDefined(count) ? count : 0,
promise.then(null, null, fn);
@@ -8959,7 +8959,7 @@ function $LocationProvider(){
* @description
* Simple service for logging. Default implementation safely writes the message
* into the browser's console (if present).
- *
+ *
* The main purpose of this service is to simplify debugging and troubleshooting.
*
* The default is not to log `debug` messages. You can use
@@ -8996,7 +8996,7 @@ function $LocationProvider(){
function $LogProvider(){
var debug = true,
self = this;
-
+
/**
* @ngdoc property
* @name ng.$logProvider#debugEnabled
@@ -9013,7 +9013,7 @@ function $LogProvider(){
return debug;
}
};
-
+
this.$get = ['$window', function($window){
return {
/**
@@ -9055,12 +9055,12 @@ function $LogProvider(){
* Write an error message
*/
error: consoleLog('error'),
-
+
/**
* @ngdoc method
* @name ng.$log#debug
* @methodOf ng.$log
- *
+ *
* @description
* Write a debug message
*/
@@ -11124,7 +11124,7 @@ function $RootScopeProvider(){
- // Using a listener function
+ // Using a listener function
var food;
scope.foodCounter = 0;
expect(scope.foodCounter).toEqual(0);
@@ -11149,7 +11149,7 @@ function $RootScopeProvider(){
// Update food and run digest. Now the counter will increment
food = 'cheeseburger';
scope.$digest();
- expect(scope.foodCounter).toEqual(1);
+ expect(scope.foodCounter).toEqual(1);
* </pre>
*
@@ -11568,7 +11568,7 @@ function $RootScopeProvider(){
*
* - `string`: execute using the rules as defined in {@link guide/expression expression}.
* - `function(scope)`: execute the function with the current `scope` parameter.
- *
+ *
* @param {(object)=} locals Local variables object, useful for overriding values in scope.
* @returns {*} The result of evaluating the expression.
*/
@@ -12351,7 +12351,7 @@ function $SceDelegateProvider() {
* allowing only the files in a specific directory to do this. Ensuring that the internal API
* exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.
*
- * In the case of AngularJS' SCE service, one uses {@link ng.$sce#methods_trustAs $sce.trustAs}
+ * In the case of AngularJS' SCE service, one uses {@link ng.$sce#methods_trustAs $sce.trustAs}
* (and shorthand methods such as {@link ng.$sce#methods_trustAsHtml $sce.trustAsHtml}, etc.) to
* obtain values that will be accepted by SCE / privileged contexts.
*
@@ -13100,7 +13100,7 @@ function $TimeoutProvider() {
* will invoke `fn` within the {@link ng.$rootScope.Scope#methods_$apply $apply} block.
* @returns {Promise} Promise that will be resolved when the timeout is reached. The value this
* promise will be resolved with is the return value of the `fn` function.
- *
+ *
* @example
<doc:example module="time">
<doc:source>
@@ -13459,7 +13459,7 @@ function $WindowProvider(){
*
* The filter function is registered with the `$injector` under the filter name suffix with
* `Filter`.
- *
+ *
* <pre>
* it('should be the same instance', inject(
* function($filterProvider) {
@@ -13535,7 +13535,7 @@ function $FilterProvider($provide) {
}];
////////////////////////////////////////
-
+
/* global
currencyFilter: false,
dateFilter: false,
@@ -14254,9 +14254,9 @@ var uppercaseFilter = valueFn(uppercase);
* the value and sign (positive or negative) of `limit`.
*
* @param {Array|string} input Source array or string to be limited.
- * @param {string|number} limit The length of the returned array or string. If the `limit` number
+ * @param {string|number} limit The length of the returned array or string. If the `limit` number
* is positive, `limit` number of items from the beginning of the source array/string are copied.
- * If the number is negative, `limit` number of items from the end of the source array/string
+ * If the number is negative, `limit` number of items from the end of the source array/string
* are copied. The `limit` will be trimmed if it exceeds `array.length`
* @returns {Array|string} A new sub-array or substring of length `limit` or less if input array
* had less than `limit` elements.
@@ -14306,7 +14306,7 @@ var uppercaseFilter = valueFn(uppercase);
function limitToFilter(){
return function(input, limit) {
if (!isArray(input) && !isString(input)) return input;
-
+
limit = int(limit);
if (isString(input)) {
@@ -14699,7 +14699,7 @@ var htmlAnchorDirective = valueFn({
</doc:example>
*
* @element INPUT
- * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,
+ * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,
* then special attribute "disabled" will be set on the element
*/
@@ -14730,7 +14730,7 @@ var htmlAnchorDirective = valueFn({
</doc:example>
*
* @element INPUT
- * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,
+ * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,
* then special attribute "checked" will be set on the element
*/
@@ -14761,7 +14761,7 @@ var htmlAnchorDirective = valueFn({
</doc:example>
*
* @element INPUT
- * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,
+ * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,
* then special attribute "readonly" will be set on the element
*/
@@ -14795,7 +14795,7 @@ var htmlAnchorDirective = valueFn({
</doc:example>
*
* @element OPTION
- * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,
+ * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,
* then special attribute "selected" will be set on the element
*/
@@ -14828,7 +14828,7 @@ var htmlAnchorDirective = valueFn({
</doc:example>
*
* @element DETAILS
- * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,
+ * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,
* then special attribute "open" will be set on the element
*/
@@ -16363,7 +16363,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
* It will update the $viewValue, then pass this value through each of the functions in `$parsers`,
* which includes any validators. The value that comes out of this `$parsers` pipeline, be applied to
* `$modelValue` and the **expression** specified in the `ng-model` attribute.
- *
+ *
* Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.
*
* Note that calling this function does not trigger a `$digest`.
@@ -16869,14 +16869,14 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
*
* @example
Try it here: enter text in text box and watch the greeting change.
-
+
<example module="ngBindHtmlExample" deps="angular-sanitize.js">
<file name="index.html">
<div ng-controller="ngBindHtmlCtrl">
<p ng-bind-html="myHTML"></p>
</div>
</file>
-
+
<file name="script.js">
angular.module('ngBindHtmlExample', ['ngSanitize'])
@@ -18166,7 +18166,7 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
* The `ngInit` directive allows you to evaluate an expression in the
* current scope.
*
- * <div class="alert alert-error">
+ * <div class="alert alert-danger">
* The only appropriate use of `ngInit` for aliasing special properties of
* {@link api/ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below. Besides this case, you
* should use {@link guide/controller controllers} rather than `ngInit`
@@ -19920,7 +19920,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
// We now build up the list of options we need (we merge later)
for (index = 0; length = keys.length, index < length; index++) {
-
+
key = index;
if (keyName) {
key = keys[index];
diff --git a/horizon/static/horizon/tests/messages.js b/horizon/static/horizon/tests/messages.js
index c84541b75..97984ce9d 100644
--- a/horizon/static/horizon/tests/messages.js
+++ b/horizon/static/horizon/tests/messages.js
@@ -13,13 +13,13 @@ horizon.addInitFunction(function () {
test("Multiple Alerts", function () {
message = horizon.alert("error", "An error!");
- ok(message.hasClass("alert-error"), 'Verify the first message has the "alert-error" class.');
+ ok(message.hasClass("alert-danger"), 'Verify the first message has the "alert-danger" class.');
message2 = horizon.alert("success", "Another message");
equal($('#main_content .messages .alert').length, 2, "Verify two messages have been added to the DOM.");
horizon.clearErrorMessages();
- equal($('#main_content .messages .alert-error').length, 0, "Verify our error message was removed.");
+ equal($('#main_content .messages .alert-danger').length, 0, "Verify our error message was removed.");
equal($('#main_content .messages .alert').length, 1, "Verify one message remains.");
horizon.clearSuccessMessages();
equal($('#main_content .messages .alert-success').length, 0, "Verify our success message was removed.");
diff --git a/horizon/tables/actions.py b/horizon/tables/actions.py
index 5736fe5d0..9e5485090 100644
--- a/horizon/tables/actions.py
+++ b/horizon/tables/actions.py
@@ -36,7 +36,7 @@ from horizon.utils import html
LOG = logging.getLogger(__name__)
# For Bootstrap integration; can be overridden in settings.
-ACTION_CSS_CLASSES = ("btn", "btn-small")
+ACTION_CSS_CLASSES = ("btn", "btn-default", "btn-sm")
STRING_SEPARATOR = "__"
@@ -147,7 +147,7 @@ class BaseAction(html.HTMLElement):
def get_default_classes(self):
"""Returns a list of the default classes for the action. Defaults to
- ``["btn", "btn-small"]``.
+ ``["btn", "btn-default", "btn-sm"]``.
"""
return getattr(settings, "ACTION_CSS_CLASSES", ACTION_CSS_CLASSES)
@@ -263,6 +263,7 @@ class Action(BaseAction):
self.verbose_name_plural = kwargs.get('verbose_name_plural',
"%ss" % self.verbose_name)
self.allowed_data_types = kwargs.get('allowed_data_types', [])
+ self.icon = kwargs.get('icon', None)
if attrs:
self.attrs.update(attrs)
@@ -347,6 +348,7 @@ class LinkAction(BaseAction):
self.verbose_name = kwargs.get('verbose_name', self.name.title())
self.url = kwargs.get('url', None)
self.allowed_data_types = kwargs.get('allowed_data_types', [])
+ self.icon = kwargs.get('icon', None)
if not kwargs.get('verbose_name', None):
raise NotImplementedError('A LinkAction object must have a '
@@ -443,6 +445,7 @@ class FilterAction(BaseAction):
self.filter_type = kwargs.get('filter_type', "query")
self.needs_preloading = kwargs.get('needs_preloading', False)
self.param_name = kwargs.get('param_name', 'q')
+ self.icon = "search"
def get_param_name(self):
"""Returns the full query parameter name for this action.
@@ -452,11 +455,6 @@ class FilterAction(BaseAction):
"""
return "__".join([self.table.name, self.name, self.param_name])
- def get_default_classes(self):
- classes = super(FilterAction, self).get_default_classes()
- classes += ("btn-search",)
- return classes
-
def assign_type_string(self, table, data, type_string):
for datum in data:
setattr(datum, table._meta.data_type_name, type_string)
@@ -722,6 +720,7 @@ class DeleteAction(BatchAction):
self.name = kwargs.get('name', self.name)
self.action_present = kwargs.get('action_present', _("Delete"))
self.action_past = kwargs.get('action_past', _("Deleted"))
+ self.icon = "remove"
def action(self, request, obj_id):
return self.delete(request, obj_id)
@@ -731,7 +730,7 @@ class DeleteAction(BatchAction):
def get_default_classes(self):
classes = super(DeleteAction, self).get_default_classes()
- classes += ("btn-danger", "btn-delete")
+ classes += ("btn-danger",)
return classes
diff --git a/horizon/tables/formset.py b/horizon/tables/formset.py
index 3f01f3099..7c6afe631 100644
--- a/horizon/tables/formset.py
+++ b/horizon/tables/formset.py
@@ -36,7 +36,7 @@ class FormsetCell(horizon_tables.Cell):
else:
if self.field.errors:
self.attrs['class'] = (self.attrs.get('class', '') +
- ' error control-group')
+ ' error form-group')
self.attrs['title'] = ' '.join(
unicode(error) for error in self.field.errors)
diff --git a/horizon/templates/auth/_login.html b/horizon/templates/auth/_login.html
index 9c4bf5967..5418ed6ad 100644
--- a/horizon/templates/auth/_login.html
+++ b/horizon/templates/auth/_login.html
@@ -11,16 +11,16 @@
{% block modal-body %}
<fieldset>
{% if request.user.is_authenticated and 'next' in request.GET %}
- <div class="control-group clearfix error">
- <span class="help-inline"><p>{% trans "You do not have permission to access the resource:" %}</p>
+ <div class="form-group clearfix error">
+ <span class="help-block"><p>{% trans "You do not have permission to access the resource:" %}</p>
<p><b>{{ request.GET.next }}</b></p>
<p>{% url 'horizon:user_home' as home_url %}{% blocktrans %}Login as different user or go back to <a href="{{ home_url }}"> home page</a>{% endblocktrans %}</p>
</span>
</div>
{% endif %}
{% if request.COOKIES.logout_reason %}
- <div class="control-group clearfix error">
- <span class="help-inline"><p>{{ request.COOKIES.logout_reason }}</p></span>
+ <div class="form-group clearfix error">
+ <span class="help-block"><p>{{ request.COOKIES.logout_reason }}</p></span>
</div>
{% endif %}
{% if next %}<input type="hidden" name="{{ redirect_field_name }}" value="{{ next }}" />{% endif %}
diff --git a/horizon/templates/horizon/_messages.html b/horizon/templates/horizon/_messages.html
index b8a80b53e..328bb8785 100644
--- a/horizon/templates/horizon/_messages.html
+++ b/horizon/templates/horizon/_messages.html
@@ -2,25 +2,25 @@
<div class="messages">
{% for message in messages %}
{% if "info" in message.tags %}
- <div class="alert alert-block alert-info fade in">
+ <div class="alert alert-info alert-dismissable fade in">
<a class="close" data-dismiss="alert" href="#">&times;</a>
<p><strong>{% trans "Info: " %}</strong>{{ message }}</p>
</div>
{% endif %}
{% if "warning" in message.tags %}
- <div class="alert alert-block alert-warning fade in">
+ <div class="alert alert-warning alert-dismissable fade in">
<a class="close" data-dismiss="alert" href="#">&times;</a>
<p><strong>{% trans "Warning: " %}</strong>{{ message }}</p>
</div>
{% endif %}
{% if "success" in message.tags %}
- <div class="alert alert-block alert-success fade in">
+ <div class="alert alert-success alert-dismissable fade in">
<a class="close" data-dismiss="alert" href="#">&times;</a>
<p><strong>{% trans "Success: " %}</strong>{{ message }}</p>
</div>
{% endif %}
{% if "error" in message.tags %}
- <div class="alert alert-block alert-error fade in">
+ <div class="alert alert-danger alert-dismissable fade in">
<a class="close" data-dismiss="alert" href="#">&times;</a>
<p><strong>{% trans "Error: " %}</strong>{{ message }}</p>
</div>
diff --git a/horizon/templates/horizon/client_side/_alert_message.html b/horizon/templates/horizon/client_side/_alert_message.html
index b8a2e5331..7391989bf 100644
--- a/horizon/templates/horizon/client_side/_alert_message.html
+++ b/horizon/templates/horizon/client_side/_alert_message.html
@@ -4,7 +4,7 @@
{% block id %}alert_message_template{% endblock %}
{% block template %}{% spaceless %}{% jstemplate %}
-<div class="alert alert-block fade in alert-[[type]]">
+<div class="alert alert-dismissable fade in alert-[[type]]">
<a class="close" data-dismiss="alert" href="#">&times;</a>
<p>
<strong>[[type_display]]</strong>
diff --git a/horizon/templates/horizon/client_side/_loading.html b/horizon/templates/horizon/client_side/_loading.html
index ecb27966c..7deae3bb7 100644
--- a/horizon/templates/horizon/client_side/_loading.html
+++ b/horizon/templates/horizon/client_side/_loading.html
@@ -4,7 +4,13 @@
{% block id %}spinner-modal{% endblock %}
{% block template %}{% spaceless %}{% jstemplate %}
-<div class="modal loading hide">
- <p>[[text]]&hellip;</p>
+<div class="modal loading">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-body">
+ <p>[[text]]&hellip;</p>
+ </div>
+ </div>
+ </div>
</div>
{% endjstemplate %}{% endspaceless %}{% endblock %}
diff --git a/horizon/templates/horizon/client_side/_modal.html b/horizon/templates/horizon/client_side/_modal.html
index 30e0a909a..cc0845174 100644
--- a/horizon/templates/horizon/client_side/_modal.html
+++ b/horizon/templates/horizon/client_side/_modal.html
@@ -4,17 +4,21 @@
{% block id %}modal_template{% endblock %}
{% block template %}{% spaceless %}{% jstemplate %}
-<div class="modal hide">
- <div class='modal-header'>
- <a class='close' data-dismiss='modal'>&times;</a>
- <h3>[[title]]</h3>
- </div>
- <div class='modal-body'>
- [[body]]
- </div>
- <div class='modal-footer'>
- <a href='#' class='btn btn-primary'>[[confirm]]</a>
- <a href='#' class='btn cancel' data-dismiss='modal'>[[cancel]]</a>
+<div class="modal">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class='modal-header'>
+ <a class='close' data-dismiss='modal'>&times;</a>
+ <h3>[[title]]</h3>
+ </div>
+ <div class='modal-body'>
+ [[body]]
+ </div>
+ <div class='modal-footer'>
+ <a href='#' class='btn btn-primary'>[[confirm]]</a>
+ <a href='#' class='btn btn-default cancel' data-dismiss='modal'>[[cancel]]</a>
+ </div>
+ </div>
</div>
</div>
{% endjstemplate %}{% endspaceless %}{% endblock %}
diff --git a/horizon/templates/horizon/common/_bootstrap_form_field.html b/horizon/templates/horizon/common/_bootstrap_form_field.html
new file mode 100644
index 000000000..203027e60
--- /dev/null
+++ b/horizon/templates/horizon/common/_bootstrap_form_field.html
@@ -0,0 +1,59 @@
+{% load bootstrap_form_field %}
+
+<div class="form-group{% if field.errors %} has-error{% endif %} {{ field.css_classes }}">
+ {% if field|is_checkbox %}
+ <div class="{{ classes.single_value }}">
+ <div class="checkbox">
+ {% if field.auto_id %}
+ <label {% if field.field.required and form.required_css_class %}class="{{ form.required_css_class }}"{% endif %}>
+ {{ field }} <span>{{ field.label }}</span>
+ </label>
+ {% if field.help_text %}
+ <span class="help-icon" data-toggle="tooltip" data-placement="top" title="{{ field.help_text|safe }}"><span class="glyphicon glyphicon-question-sign"></span></span>
+ {% endif %}
+ {% endif %}
+ {% for error in field.errors %}
+ <span class="help-block alert alert-danger {{ form.error_css_class }}">{{ error }}</span>
+ {% endfor %}
+
+ </div>
+ </div>
+ {% elif field|is_radio %}
+ {% if field.auto_id %}
+ <label class="control-label {{ classes.label }} {% if field.field.required %}{{ form.required_css_class }}{% endif %}">{{ field.label }}</label>
+ {% if field.help_text %}
+ <span class="help-icon" data-toggle="tooltip" data-placement="top" title="{{ field.help_text|safe }}"><span class="glyphicon glyphicon-question-sign"></span></span>
+ {% endif %}
+ {% endif %}
+ <div class="{{ classes.value }}">
+ {% for choice in field %}
+ <div class="radio">
+ <label>
+ {{ choice.tag }}
+ {{ choice.choice_label }}
+ </label>
+ </div>
+ {% endfor %}
+
+ {% for error in field.errors %}
+ <span class="help-block alert alert-danger {{ form.error_css_class }}">{{ error }}</span>
+ {% endfor %}
+
+ </div>
+ {% else %}
+ {% if field.auto_id %}
+ <label class="control-label {{ classes.label }} {% if field.field.required %}{{ form.required_css_class }}{% endif %}" for="{{ field.auto_id }}">{{ field.label }}</label>
+ {% if field.help_text %}
+ <span class="help-icon" data-toggle="tooltip" data-placement="top" title="{{ field.help_text|safe }}"><span class="glyphicon glyphicon-question-sign"></span></span>
+ {% endif %}
+ {% endif %}
+
+ <div class="{{ classes.value }} {% if field|is_multiple_checkbox %}multiple-checkbox{% endif %}">
+ {{ field }}
+
+ {% for error in field.errors %}
+ <span class="help-block alert alert-danger {{ form.error_css_class }}">{{ error }}</span>
+ {% endfor %}
+ </div>
+ {% endif %}
+</div>
diff --git a/horizon/templates/horizon/common/_data_table_cell.html b/horizon/templates/horizon/common/_data_table_cell.html
index cb04e7e6c..1c3ffa34f 100644
--- a/horizon/templates/horizon/common/_data_table_cell.html
+++ b/horizon/templates/horizon/common/_data_table_cell.html
@@ -13,7 +13,7 @@
name="action"
value="" type="submit">
</button>
- <button class="inline-edit-cancel btn secondary cancel"></button>
+ <button class="inline-edit-cancel btn btn-default secondary cancel"></button>
</div>
<div class="inline-edit-status inline-edit-mod"></div>
</div>
@@ -26,7 +26,7 @@
{%if cell.wrap_list %}<ul>{% endif %}{{ cell.value }}{%if cell.wrap_list %}</ul>{% endif %}
</div>
<div class="table_cell_action">
- <button class="ajax-inline-edit btn-edit"></button>
+ <button class="ajax-inline-edit"><span class="glyphicon glyphicon-pencil"></span></button>
</div>
<div class="inline-edit-status"></div>
</div>
diff --git a/horizon/templates/horizon/common/_data_table_row_actions.html b/horizon/templates/horizon/common/_data_table_row_actions.html
index 8619da17f..a9b5c7c1e 100644
--- a/horizon/templates/horizon/common/_data_table_row_actions.html
+++ b/horizon/templates/horizon/common/_data_table_row_actions.html
@@ -6,7 +6,7 @@
{% for action in row_actions %}
{% if forloop.first %}
{% include "horizon/common/_data_table_row_action.html" %}
- <a class="btn btn-small dropdown-toggle" data-toggle="dropdown" href="#">
+ <a class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" href="#">
{% trans "More" %}
<span class="caret"></span>
</a>
diff --git a/horizon/templates/horizon/common/_data_table_table_action.html b/horizon/templates/horizon/common/_data_table_table_action.html
index 96cb40973..83d0c4a62 100644
--- a/horizon/templates/horizon/common/_data_table_table_action.html
+++ b/horizon/templates/horizon/common/_data_table_table_action.html
@@ -1,5 +1,11 @@
{% if action.method != "GET" %}
- <button {{ action.attr_string|safe }} name="action" value="{{ action.get_param_name }}" type="submit">{% if action.handles_multiple %}{{ action.verbose_name_plural }}{% else %}{{ action.verbose_name }}{% endif %}</button>
+ <button {{ action.attr_string|safe }} name="action" value="{{ action.get_param_name }}" type="submit">
+ {% if action.icon != None %}<span class="glyphicon glyphicon-{{ action.icon }}"></span> {% endif %}
+ {% if action.handles_multiple %}{{ action.verbose_name_plural }}{% else %}{{ action.verbose_name }}{% endif %}
+ </button>
{% else %}
- <a href='{{ action.get_link_url }}' title='{{ action.verbose_name }}' {{ action.attr_string|safe }}>{{ action.verbose_name }}</a>
+ <a href='{{ action.get_link_url }}' title='{{ action.verbose_name }}' {{ action.attr_string|safe }}>
+ {% if action.icon != None %}<span class="glyphicon glyphicon-{{ action.icon }}"></span> {% endif %}
+ {{ action.verbose_name }}
+ </a>
{% endif %}
diff --git a/horizon/templates/horizon/common/_data_table_table_actions.html b/horizon/templates/horizon/common/_data_table_table_actions.html
index 5152bb5ab..501a32cb9 100644
--- a/horizon/templates/horizon/common/_data_table_table_actions.html
+++ b/horizon/templates/horizon/common/_data_table_table_actions.html
@@ -4,22 +4,25 @@
{% if filter.filter_type == 'fixed' %}
<div class="table_filter btn-group" data-toggle="buttons-radio">
{% for button in filter.fixed_buttons %}
- <button name="{{ filter.get_param_name }}" type="submit" value="{{ button.value }}" class="btn btn-small{% ifequal button.value filter.filter_string %} active{% endifequal %}">{% if button.icon %}<i class="{{ button.icon }}"></i> {% endif %}{{ button.text }}{% if button.count >= 0 %} ({{ button.count }}){% endif %}</button>
+ <button name="{{ filter.get_param_name }}" type="submit" value="{{ button.value }}" class="btn btn-default btn-sm{% ifequal button.value filter.filter_string %} active{% endifequal %}">{% if button.icon %}<i class="{{ button.icon }}"></i> {% endif %}{{ button.text }}{% if button.count >= 0 %} ({{ button.count }}){% endif %}</button>
{% endfor %}
</div>
{% elif filter.filter_type == 'query' %}
<div class="table_search client">
- <input class="span3 example" value="{{ filter.filter_string|default:'' }}" type="text" name="{{ filter.get_param_name }}" />
+ <div class="form-group has-feedback">
+ <input class="form-control" value="{{ filter.filter_string|default:'' }}" type="text" name="{{ filter.get_param_name }}" />
+ <span class="glyphicon glyphicon-search form-control-feedback"></span>
+ </div>
<button type="submit" {{ filter.attr_string|safe }}>{% trans "Filter" %}</button>
</div>
{% elif filter.filter_type == 'server' %}
<div class="table_search">
- <select name="{{ filter.get_param_name }}_field" class="span2">
+ <select name="{{ filter.get_param_name }}_field" class="form-control">
{% for choice in filter.filter_choices %}
<option value="{{ choice.0 }}" {% if choice.0 == filter.filter_field %} selected{% endif %}>{{ choice.1 }}</option>
{% endfor %}
</select>
- <input class="span3 example" value="{{ filter.filter_string|default:'' }}" type="text" name="{{ filter.get_param_name }}" />
+ <input class="form-control" value="{{ filter.filter_string|default:'' }}" type="text" name="{{ filter.get_param_name }}" />
<button type="submit" {{ filter.attr_string|safe }}>{% trans "Filter" %}</button>
</div>
{% endif %}
diff --git a/horizon/templates/horizon/common/_form_fields.html b/horizon/templates/horizon/common/_form_fields.html
index 34727c96f..c97329c65 100644
--- a/horizon/templates/horizon/common/_form_fields.html
+++ b/horizon/templates/horizon/common/_form_fields.html
@@ -1,3 +1,5 @@
+{% load bootstrap_form_field %}
+
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
@@ -7,19 +9,19 @@
</div>
{% endif %}
{% if form.non_field_errors %}
- <div class="alert alert-message alert-error">
+ <div class="alert alert-message alert-danger">
{{ form.non_field_errors }}
</div>
{% endif %}
{% for field in form.visible_fields %}
- <div class="control-group form-field clearfix{% if field.errors %} error{% endif %} {{ field.css_classes }}">
+ <!-- <div class="form-group form-field clearfix{% if field.errors %} has-error{% endif %} {{ field.css_classes }}">
{{ field.label_tag }}
{% if field.help_text %}
<span class="help-icon"><i class="icon-question-sign"></i></span>
{% endif %}
{% if field.errors %}
{% for error in field.errors %}
- <span class="help-inline">{{ error }}</span>
+ <p class="help-block">{{ error }}</p>
{% endfor %}
{% endif %}
{% comment %}
@@ -28,8 +30,8 @@
Note: the spaces are necessary here.
{% endcomment %}
<span class="help-block">{% filter force_escape %} {{ field.help_text }} {% endfilter %} </span>
- <div class="input">
- {{ field }}
- </div>
+ {{ field }}
</div>
+ -->
+ {{ field|bootstrap_form_field }}
{% endfor %}
diff --git a/horizon/templates/horizon/common/_formset_table.html b/horizon/templates/horizon/common/_formset_table.html
index fa7dc1d45..21d052474 100644
--- a/horizon/templates/horizon/common/_formset_table.html
+++ b/horizon/templates/horizon/common/_formset_table.html
@@ -19,7 +19,7 @@
{% with table.get_formset as formset %}
{{ formset.management_form }}
{% if formset.non_field_errors %}
- <div class="alert alert-error">
+ <div class="alert alert-danger">
{{ formset.non_field_errors }}
</div>
{% endif %}
diff --git a/horizon/templates/horizon/common/_formset_table_row.html b/horizon/templates/horizon/common/_formset_table_row.html
index 5409a0b51..b89a1627d 100644
--- a/horizon/templates/horizon/common/_formset_table_row.html
+++ b/horizon/templates/horizon/common/_formset_table_row.html
@@ -10,11 +10,11 @@
{% for field in row.form.hidden_fields %}
{{ field }}
{% for error in field.errors %}
- <span class="help-inline">{{ field.name }}: {{ error }}</span>
+ <span class="help-block">{{ field.name }}: {{ error }}</span>
{% endfor %}
{% endfor %}
{% if row.form.non_field_errors %}
- <div class="alert alert-error">
+ <div class="alert alert-danger">
{{ row.form.non_field_errors }}
</div>
{% endif %}
diff --git a/horizon/templates/horizon/common/_modal.html b/horizon/templates/horizon/common/_modal.html
index 34863bf59..788ab953b 100644
--- a/horizon/templates/horizon/common/_modal.html
+++ b/horizon/templates/horizon/common/_modal.html
@@ -1,10 +1,14 @@
-<div id="{% block modal_id %}{% endblock %}" class="{% block modal_class %}{% if hide %}modal hide{% else %}static_page{% endif %}{% endblock %}">
- <div class="modal-header">
- {% if hide %}<a href="#" class="close" data-dismiss="modal">&times;</a>{% endif %}
- <h3>{% block modal-header %}{% endblock %}</h3>
+<div id="{% block modal_id %}{% endblock %}" class="{% block modal_class %}{% if hide %}modal{% else %}static_page{% endif %}{% endblock %}">
+ <div class="{% if hide %}modal-dialog{% endif %}">
+ <div class="{% if hide %}modal-content{% endif %}">
+ <div class="modal-header">
+ {% if hide %}<a href="#" class="close" data-dismiss="modal">&times;</a>{% endif %}
+ <h3>{% block modal-header %}{% endblock %}</h3>
+ </div>
+ <div class="modal-body clearfix">
+ {% block modal-body %}{% endblock %}
+ </div>
+ <div class="modal-footer">{% block modal-footer %}{% endblock %}</div>
+ </div>
</div>
- <div class="modal-body clearfix">
- {% block modal-body %}{% endblock %}
- </div>
- <div class="modal-footer">{% block modal-footer %}{% endblock %}</div>
</div>
diff --git a/horizon/templates/horizon/common/_modal_form.html b/horizon/templates/horizon/common/_modal_form.html
index 11a2c59e6..285f8bd5d 100644
--- a/horizon/templates/horizon/common/_modal_form.html
+++ b/horizon/templates/horizon/common/_modal_form.html
@@ -1,31 +1,35 @@
-<div id="{% block modal_id %}{% endblock %}" class="{% block modal_class %}{% if hide %}modal hide{% else %}static_page{% endif %}{% endblock %}">
- <div class="modal-header">
- {% if hide %}<a href="#" class="close" data-dismiss="modal">&times;</a>{% endif %}
- <h3>{% block modal-header %}{% endblock %}</h3>
- </div>
- {% if table %}
- <div class="modal-body">
- {{ table.render }}
- </div>
- <hr />
- {% endif %}
- <form id="{% block form_id %}{% endblock %}"
- ng-controller="{% block ng_controller %}DummyCtrl{% endblock %}"
- name="{% block form_name %}{% endblock %}"
- autocomplete="{% block autocomplete %}{% endblock %}"
- class="{% block form_class %}{% endblock %}"
- action="{% block form_action %}{% endblock %}"
- method="{% block form-method %}POST{% endblock %}"
- {% if add_to_field %}data-add-to-field="{{ add_to_field }}"{% endif %} {% block form_attrs %}{% endblock %}>{% csrf_token %}
- <div class="modal-body clearfix">
- {% block modal-body %}
- <fieldset>
- {% include "horizon/common/_form_fields.html" %}
- </fieldset>
- {% endblock %}
+<div id="{% block modal_id %}{% endblock %}" class="{% block modal_class %}{% if hide %}modal{% else %}static_page{% endif %}{% endblock %}">
+ <div class="{% if hide %}modal-dialog{% endif %}">
+ <div class="{% if hide %}modal-content{% endif %}">
+ <div class="modal-header">
+ {% if hide %}<a href="#" class="close" data-dismiss="modal">&times;</a>{% endif %}
+ <h3>{% block modal-header %}{% endblock %}</h3>
+ </div>
+ {% if table %}
+ <div class="modal-body">
+ {{ table.render }}
+ </div>
+ <hr />
+ {% endif %}
+ <form id="{% block form_id %}{% endblock %}"
+ ng-controller="{% block ng_controller %}DummyCtrl{% endblock %}"
+ name="{% block form_name %}{% endblock %}"
+ autocomplete="{% block autocomplete %}{% endblock %}"
+ class="{% block form_class %}{% endblock %}"
+ action="{% block form_action %}{% endblock %}"
+ method="{% block form-method %}POST{% endblock %}"
+ {% if add_to_field %}data-add-to-field="{{ add_to_field }}"{% endif %} {% block form_attrs %}{% endblock %}>{% csrf_token %}
+ <div class="modal-body clearfix">
+ {% block modal-body %}
+ <fieldset>
+ {% include "horizon/common/_form_fields.html" %}
+ </fieldset>
+ {% endblock %}
+ </div>
+ <div class="modal-footer">{% block modal-footer %}{% endblock %}</div>
+ </form>
</div>
- <div class="modal-footer">{% block modal-footer %}{% endblock %}</div>
- </form>
+ </div>
+</div>
{% block modal-js %}
{% endblock %}
-</div>
diff --git a/horizon/templates/horizon/common/_usage_summary.html b/horizon/templates/horizon/common/_usage_summary.html
index 164f02043..0dfe9e218 100644
--- a/horizon/templates/horizon/common/_usage_summary.html
+++ b/horizon/templates/horizon/common/_usage_summary.html
@@ -3,15 +3,18 @@
<h3 class="quota-heading">{% trans "Usage Summary" %}</h3>
</div>
<div class="usage_info_wrapper">
- <form action="?" method="get" id="date_form" class="form-horizontal">
+ <form action="?" method="get" id="date_form" class="form-inline">
<h3>{% trans "Select a period of time to query its usage" %}: </h3>
- <div class="datepicker">
- {% blocktrans with start=form.start end=form.end %}<span>From: {{ start }} </span><span>To: {{ end }} </span>{% endblocktrans %}
- <button class="btn btn-primary" type="submit">{% trans "Submit" %}</button>
- <small>{% trans "The date should be in YYYY-mm-dd format." %}</small>
+ <div class="datepicker form-group">
+ {% blocktrans with start=form.start end=form.end %}
+ <label>From:</label> {{ start }}
</div>
+ <div class="datepicker form-group">
+ <label>To:</label>{{ end }}{% endblocktrans %}
+ </div>
+ <button class="btn btn-primary" type="submit">{% trans "Submit" %}</button>
+ <small>{% trans "The date should be in YYYY-mm-dd format." %}</small>
</form>
-
<p id="activity">
<span><strong>{% trans "Active Instances" %}:</strong> {{ usage.summary.instances|default:'0' }}</span>
<span><strong>{% trans "Active RAM" %}:</strong> {{ usage.summary.memory_mb|mbformat|default:'0' }}</span>
diff --git a/horizon/templates/horizon/common/_workflow.html b/horizon/templates/horizon/common/_workflow.html
index 10ef58240..b64b7e2d4 100644
--- a/horizon/templates/horizon/common/_workflow.html
+++ b/horizon/templates/horizon/common/_workflow.html
@@ -3,50 +3,54 @@
<div class="workflow {{ layout|join:' ' }}">
<form {{ workflow.attr_string|safe }} action="{{ workflow.get_absolute_url }}" {% if add_to_field %}data-add-to-field="{{ add_to_field }}"{% endif %} method="POST"{% if workflow.multipart %} enctype="multipart/form-data"{% endif %}>{% csrf_token %}
{% if REDIRECT_URL %}<input type="hidden" name="{{ workflow.redirect_param_name }}" value="{{ REDIRECT_URL }}"/>{% endif %}
- <div class="modal-header">
- {% block modal-header %}
- {% if modal %}<a href="#" class="close" data-dismiss="modal">&times;</a>{% endif %}
- <h3>{{ workflow.name }}</h3>
- {% endblock %}
- </div>
- <div class="modal-body clearfix">
- {% block modal-body %}
- <ul class="nav nav-tabs{% if workflow.wizard %} wizard-tabs{% endif %}">
- {% for step in workflow.steps %}
- <li class="{% if entry_point == step.slug %}active{% endif %}{% if step.has_errors %} error{% endif %}{% if step.has_required_fields %} required{% endif %}">
- <a href="#{{ step.get_id }}" data-toggle="tab" data-target="#{{ step.get_id }}">{{ step }}</a>
- </li>
- {% endfor %}
- </ul>
- <div class="tab-content">
- {% for step in workflow.steps %}
- <fieldset id="{{ step.get_id }}" class="js-tab-pane{% if entry_point == step.slug %} active{% endif %}">
- {{ step.render }}
- </fieldset>
- {% if not forloop.last %}
- <noscript><hr /></noscript>
- {% endif %}
- {% endfor %}
- </div>
- {% endblock %}
- </div>
- <div class="modal-footer">
- {% block modal-footer %}
- {% if workflow.wizard %}
- <div class="row-fluid">
- <div class="span6 back">
- <button type="button" class="btn button-previous">&laquo; {% trans "Back" %}</button>
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ {% block modal-header %}
+ {% if modal %}<a href="#" class="close" data-dismiss="modal">&times;</a>{% endif %}
+ <h3>{{ workflow.name }}</h3>
+ {% endblock %}
+ </div>
+ <div class="modal-body clearfix">
+ {% block modal-body %}
+ <ul class="nav nav-tabs{% if workflow.wizard %} wizard-tabs{% endif %}">
+ {% for step in workflow.steps %}
+ <li class="{% if entry_point == step.slug %}active{% endif %}{% if step.has_errors %} error{% endif %}{% if step.has_required_fields %} required{% endif %}">
+ <a href="#{{ step.get_id }}" data-toggle="tab" data-target="#{{ step.get_id }}">{{ step }}</a>
+ </li>
+ {% endfor %}
+ </ul>
+ <div class="tab-content">
+ {% for step in workflow.steps %}
+ <fieldset id="{{ step.get_id }}" class="js-tab-pane{% if entry_point == step.slug %} active{% endif %}">
+ {{ step.render }}
+ </fieldset>
+ {% if not forloop.last %}
+ <noscript><hr /></noscript>
+ {% endif %}
+ {% endfor %}
+ </div>
+ {% endblock %}
</div>
- <div class="span6 next">
- <button type="button" class="btn btn-primary button-next">{% trans "Next" %} &raquo;</button>
- <button type="submit" class="btn btn-primary button-final">{{ workflow.finalize_button_name }}</button>
+ <div class="modal-footer">
+ {% block modal-footer %}
+ {% if workflow.wizard %}
+ <div class="row">
+ <div class="col-sm-6 back">
+ <button type="button" class="btn btn-default button-previous">&laquo; {% trans "Back" %}</button>
+ </div>
+ <div class="col-sm-6 next">
+ <button type="button" class="btn btn-primary button-next">{% trans "Next" %} &raquo;</button>
+ <button type="submit" class="btn btn-primary button-final">{{ workflow.finalize_button_name }}</button>
+ </div>
+ </div>
+ {% else %}
+ <input class="btn btn-primary pull-right" type="submit" value="{{ workflow.finalize_button_name }}" />
+ {% if modal %}<a class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>{% endif %}
+ {% endif %}
+ {% endblock %}
</div>
</div>
- {% else %}
- <input class="btn btn-primary pull-right" type="submit" value="{{ workflow.finalize_button_name }}" />
- {% if modal %}<a class="btn secondary cancel close">{% trans "Cancel" %}</a>{% endif %}
- {% endif %}
- {% endblock %}
</div>
</form>
</div>
diff --git a/horizon/templates/horizon/common/_workflow_step_update_members.html b/horizon/templates/horizon/common/_workflow_step_update_members.html
index 920a18a21..836dae3be 100644
--- a/horizon/templates/horizon/common/_workflow_step_update_members.html
+++ b/horizon/templates/horizon/common/_workflow_step_update_members.html
@@ -8,13 +8,13 @@
<div class="left">
<div class="fake_table fake_table_header fake_{{ step.slug }}_table">
<span class="members_title">{{ step.available_list_title }}</span>
- <input type="text" name="available_{{ step.slug }}_filter" id="available_{{ step.slug }}" class="filter {{ step.slug }}_filter" placeholder="{% trans "Filter" %}">
+ <input type="text" name="available_{{ step.slug }}_filter form-control input-sm" id="available_{{ step.slug }}" class="filter {{ step.slug }}_filter" placeholder="{% trans "Filter" %}">
</div>
</div>
<div class="right">
<div class="fake_table fake_table_header fake_{{ step.slug }}_table">
<span class="members_title">{{ step.members_list_title }}</span>
- <input type="text" name="{{ step.slug }}_members_filter" id="{{ step.slug }}_members" class="filter {{ step.slug }}_filter" placeholder="{% trans "Filter" %}">
+ <input type="text" name="{{ step.slug }}_members_filter" id="{{ step.slug }}_members" class="filter {{ step.slug }}_filter form-control input-sm" placeholder="{% trans "Filter" %}">
</div>
</div>
</div>
diff --git a/horizon/templatetags/bootstrap_form_field.py b/horizon/templatetags/bootstrap_form_field.py
new file mode 100644
index 000000000..fec7fcce6
--- /dev/null
+++ b/horizon/templatetags/bootstrap_form_field.py
@@ -0,0 +1,47 @@
+from django import forms
+from django.template import Context
+from django.template.loader import get_template
+from django import template
+
+register = template.Library()
+
+@register.filter
+def bootstrap_form_field(element):
+ markup_classes = {'label': '', 'value': '', 'single_value': ''}
+ return render(element, markup_classes)
+
+
+def add_input_classes(field):
+ if not is_checkbox(field) and not is_multiple_checkbox(field) and not is_radio(field) \
+ and not is_file(field):
+ field_classes = field.field.widget.attrs.get('class', '')
+ field_classes += ' form-control'
+ field.field.widget.attrs['class'] = field_classes
+
+
+def render(element, markup_classes):
+ add_input_classes(element)
+ template = get_template("horizon/common/_bootstrap_form_field.html")
+ context = Context({'field': element, 'classes': markup_classes})
+
+ return template.render(context)
+
+
+@register.filter
+def is_checkbox(field):
+ return isinstance(field.field.widget, forms.CheckboxInput)
+
+
+@register.filter
+def is_multiple_checkbox(field):
+ return isinstance(field.field.widget, forms.CheckboxSelectMultiple)
+
+
+@register.filter
+def is_radio(field):
+ return isinstance(field.field.widget, forms.RadioSelect)
+
+
+@register.filter
+def is_file(field):
+ return isinstance(field.field.widget, forms.FileInput)
diff --git a/horizon/workflows/views.py b/horizon/workflows/views.py
index 8455c8071..3e5565a8b 100644
--- a/horizon/workflows/views.py
+++ b/horizon/workflows/views.py
@@ -103,7 +103,7 @@ class WorkflowView(generic.TemplateView):
the workflow characteristics
"""
if self.request.is_ajax():
- layout = ['modal', 'hide', ]
+ layout = ['modal', ]
if self.workflow_class.fullscreen:
layout += ['fullscreen', ]
else:
diff --git a/openstack_dashboard/dashboards/admin/aggregates/tables.py b/openstack_dashboard/dashboards/admin/aggregates/tables.py
index 99d9e258a..4f2c9aa31 100644
--- a/openstack_dashboard/dashboards/admin/aggregates/tables.py
+++ b/openstack_dashboard/dashboards/admin/aggregates/tables.py
@@ -33,21 +33,24 @@ class CreateAggregateAction(tables.LinkAction):
name = "create"
verbose_name = _("Create Host Aggregate")
url = constants.AGGREGATES_CREATE_URL
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
class ManageHostsAction(tables.LinkAction):
name = "manage"
verbose_name = _("Manage Hosts")
url = constants.AGGREGATES_MANAGE_HOSTS_URL
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
class UpdateAggregateAction(tables.LinkAction):
name = "update"
verbose_name = _("Edit Host Aggregate")
url = constants.AGGREGATES_UPDATE_URL
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
class AggregateFilterAction(tables.FilterAction):
diff --git a/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/_update.html b/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/_update.html
index f6f2edb5f..33faaa2e3 100644
--- a/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/_update.html
+++ b/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/_update.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save" %}" />
- <a href="{% url 'horizon:admin:aggregates:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
-{% endblock %} \ No newline at end of file
+ <a href="{% url 'horizon:admin:aggregates:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
+{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/domains/tables.py b/openstack_dashboard/dashboards/admin/domains/tables.py
index 52b22e4ff..60ce476df 100644
--- a/openstack_dashboard/dashboards/admin/domains/tables.py
+++ b/openstack_dashboard/dashboards/admin/domains/tables.py
@@ -36,7 +36,8 @@ class ViewGroupsLink(tables.LinkAction):
name = "groups"
verbose_name = _("Modify Groups")
url = "horizon:admin:domains:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
def get_link_url(self, domain):
step = 'update_group_members'
@@ -49,7 +50,8 @@ class CreateDomainLink(tables.LinkAction):
name = "create"
verbose_name = _("Create Domain")
url = constants.DOMAINS_CREATE_URL
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (('identity', 'identity:create_domain'),)
def allowed(self, request, domain):
@@ -60,7 +62,8 @@ class EditDomainLink(tables.LinkAction):
name = "edit"
verbose_name = _("Edit")
url = constants.DOMAINS_UPDATE_URL
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (('identity', 'identity:update_domain'),)
def allowed(self, request, domain):
diff --git a/openstack_dashboard/dashboards/admin/flavors/extras/tables.py b/openstack_dashboard/dashboards/admin/flavors/extras/tables.py
index 842b582b5..43d8a568d 100644
--- a/openstack_dashboard/dashboards/admin/flavors/extras/tables.py
+++ b/openstack_dashboard/dashboards/admin/flavors/extras/tables.py
@@ -33,7 +33,8 @@ class ExtraSpecCreate(tables.LinkAction):
name = "create"
verbose_name = _("Create")
url = "horizon:admin:flavors:extras:create"
- classes = ("btn-create", "ajax-modal")
+ classes = ("ajax-modal",)
+ icon = "plus"
def get_link_url(self, extra_spec=None):
return reverse(self.url, args=[self.table.kwargs['id']])
@@ -43,7 +44,8 @@ class ExtraSpecEdit(tables.LinkAction):
name = "edit"
verbose_name = _("Edit")
url = "horizon:admin:flavors:extras:edit"
- classes = ("btn-edit", "ajax-modal")
+ classes = ("ajax-modal",)
+ icon = "pencil"
def get_link_url(self, extra_spec):
return reverse(self.url, args=[self.table.kwargs['id'],
diff --git a/openstack_dashboard/dashboards/admin/flavors/tables.py b/openstack_dashboard/dashboards/admin/flavors/tables.py
index 7e07af6f4..1c3666ebe 100644
--- a/openstack_dashboard/dashboards/admin/flavors/tables.py
+++ b/openstack_dashboard/dashboards/admin/flavors/tables.py
@@ -38,28 +38,31 @@ class CreateFlavor(tables.LinkAction):
name = "create"
verbose_name = _("Create Flavor")
url = "horizon:admin:flavors:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
class UpdateFlavor(tables.LinkAction):
name = "update"
verbose_name = _("Edit Flavor")
url = "horizon:admin:flavors:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
class ViewFlavorExtras(tables.LinkAction):
name = "extras"
verbose_name = _("View Extra Specs")
url = "horizon:admin:flavors:extras:index"
- classes = ("btn-edit",)
-
+ icon = "pencil"
class ModifyAccess(tables.LinkAction):
name = "projects"
verbose_name = _("Modify Access")
url = "horizon:admin:flavors:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
+
def get_link_url(self, flavor):
step = 'update_flavor_access'
diff --git a/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_create.html b/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_create.html
index 2192658f9..287d866a9 100644
--- a/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_create.html
+++ b/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_create.html
@@ -23,6 +23,6 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create" %}" />
- <a href="{% url 'horizon:admin:flavors:extras:index' flavor.id %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:flavors:extras:index' flavor.id %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_edit.html b/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_edit.html
index b57371419..65e13474c 100644
--- a/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_edit.html
+++ b/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_edit.html
@@ -23,6 +23,6 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save" %}" />
- <a href="{% url 'horizon:admin:flavors:extras:index' flavor.id %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:flavors:extras:index' flavor.id %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_index.html b/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_index.html
index da96be950..c7054e705 100644
--- a/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_index.html
+++ b/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_index.html
@@ -10,6 +10,6 @@
{% endblock %}
{% block modal-footer %}
- <a href="{% url 'horizon:admin:flavors:index' %}" class="btn secondary cancel close">{% trans "Close" %}</a>
+ <a href="{% url 'horizon:admin:flavors:index' %}" class="btn btn-default secondary cancel close">{% trans "Close" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/groups/tables.py b/openstack_dashboard/dashboards/admin/groups/tables.py
index 1bb6004c0..9d5644e02 100644
--- a/openstack_dashboard/dashboards/admin/groups/tables.py
+++ b/openstack_dashboard/dashboards/admin/groups/tables.py
@@ -37,7 +37,8 @@ class CreateGroupLink(tables.LinkAction):
name = "create"
verbose_name = _("Create Group")
url = constants.GROUPS_CREATE_URL
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("identity", "identity:create_group"),)
def allowed(self, request, group):
@@ -48,7 +49,8 @@ class EditGroupLink(tables.LinkAction):
name = "edit"
verbose_name = _("Edit Group")
url = constants.GROUPS_UPDATE_URL
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("identity", "identity:update_group"),)
def allowed(self, request, group):
@@ -73,7 +75,7 @@ class ManageUsersLink(tables.LinkAction):
name = "users"
verbose_name = _("Modify Users")
url = constants.GROUPS_MANAGE_URL
- classes = ("btn-edit")
+ icon = "pencil"
policy_rules = (("identity", "identity:get_group"),
("identity", "identity:list_users"),)
@@ -144,7 +146,8 @@ class RemoveMembers(tables.DeleteAction):
class AddMembersLink(tables.LinkAction):
name = "add_user_link"
verbose_name = _("Add...")
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
url = constants.GROUPS_ADD_MEMBER_URL
policy_rules = (("identity", "identity:list_users"),
("identity", "identity:add_user_to_group"),)
@@ -181,7 +184,7 @@ class AddMembers(tables.BatchAction):
action_past = _("Added")
data_type_singular = _("User")
data_type_plural = _("Users")
- classes = ("btn-create", )
+ icon = "plus"
requires_input = True
success_url = constants.GROUPS_MANAGE_URL
policy_rules = (("identity", "identity:add_user_to_group"),)
diff --git a/openstack_dashboard/dashboards/admin/groups/templates/groups/_add_non_member.html b/openstack_dashboard/dashboards/admin/groups/templates/groups/_add_non_member.html
index 360045ad5..c21b75ba4 100644
--- a/openstack_dashboard/dashboards/admin/groups/templates/groups/_add_non_member.html
+++ b/openstack_dashboard/dashboards/admin/groups/templates/groups/_add_non_member.html
@@ -5,5 +5,5 @@
{% block modal-header %}{% trans "Add Group Assignment" %}{% endblock %}
{% block modal-footer %}
- <a href="{% url 'horizon:admin:groups:manage_members' group.id %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:groups:manage_members' group.id %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/groups/templates/groups/_create.html b/openstack_dashboard/dashboards/admin/groups/templates/groups/_create.html
index 5b4c3df6e..d997ae094 100644
--- a/openstack_dashboard/dashboards/admin/groups/templates/groups/_create.html
+++ b/openstack_dashboard/dashboards/admin/groups/templates/groups/_create.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Group" %}" />
- <a href="{% url 'horizon:admin:groups:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:groups:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/groups/templates/groups/_update.html b/openstack_dashboard/dashboards/admin/groups/templates/groups/_update.html
index 6ad94e325..943244269 100644
--- a/openstack_dashboard/dashboards/admin/groups/templates/groups/_update.html
+++ b/openstack_dashboard/dashboards/admin/groups/templates/groups/_update.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Update Group" %}" />
- <a href="{% url 'horizon:admin:groups:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:groups:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/images/templates/images/_create.html b/openstack_dashboard/dashboards/admin/images/templates/images/_create.html
index ecdd0d391..24ae524fb 100644
--- a/openstack_dashboard/dashboards/admin/images/templates/images/_create.html
+++ b/openstack_dashboard/dashboards/admin/images/templates/images/_create.html
@@ -31,5 +31,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Image" %}" />
- <a href="{% url 'horizon:admin:images:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:images:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/images/templates/images/_update.html b/openstack_dashboard/dashboards/admin/images/templates/images/_update.html
index 7fa462d83..deed6c48d 100644
--- a/openstack_dashboard/dashboards/admin/images/templates/images/_update.html
+++ b/openstack_dashboard/dashboards/admin/images/templates/images/_update.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Update Image" %}" />
- <a href="{% url 'horizon:admin:images:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:images:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/info/templates/info/index.html b/openstack_dashboard/dashboards/admin/info/templates/info/index.html
index 0c1af1d78..25199fa2a 100644
--- a/openstack_dashboard/dashboards/admin/info/templates/info/index.html
+++ b/openstack_dashboard/dashboards/admin/info/templates/info/index.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
<div class="version_label">
{% blocktrans with version_info=version %}Version: {{version_info}}
diff --git a/openstack_dashboard/dashboards/admin/instances/templates/instances/_live_migrate.html b/openstack_dashboard/dashboards/admin/instances/templates/instances/_live_migrate.html
index a92e18be2..6ff30d5f7 100644
--- a/openstack_dashboard/dashboards/admin/instances/templates/instances/_live_migrate.html
+++ b/openstack_dashboard/dashboards/admin/instances/templates/instances/_live_migrate.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Live Migrate Instance" %}" />
- <a href="{% url 'horizon:admin:instances:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:instances:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/metering/templates/metering/daily.html b/openstack_dashboard/dashboards/admin/metering/templates/metering/daily.html
index ea85ea64d..9559e959f 100644
--- a/openstack_dashboard/dashboards/admin/metering/templates/metering/daily.html
+++ b/openstack_dashboard/dashboards/admin/metering/templates/metering/daily.html
@@ -2,11 +2,11 @@
<div id="ceilometer-report">
<form class="form-horizontal" action="{% url 'horizon:admin:metering:report' %}" method="POST">
{% csrf_token %}
- <div class="control-group">
- <label for="report_date_options" class="control-label">{% trans "Period" %}:&nbsp;</label>
- <div class="controls">
+ <div class="form-group">
+ <label for="report_date_options" class="control-label col-sm-2">{% trans "Period" %}:&nbsp;</label>
+ <div class="col-sm-10">
<select data-line-chart-command="select_box_change"
- id="report_date_options" name="date_options" class="span2">
+ id="report_date_options" name="date_options" class="form-control">
<option value="1">{% trans "Last day" %}</option>
<option value="7" selected="selected">{% trans "Last week" %}</option>
<option value="{% now 'j' %}">{% trans "Month to date" %}</option>
@@ -17,27 +17,31 @@
</select>
</div>
</div>
- <div class="control-group" id="report_date_from">
- <label for="date_from" class="control-label">{% trans "From" %}:&nbsp;</label>
- <div class="controls">
+ <div class="form-group" id="report_date_from">
+ <label for="date_from" class="control-label col-sm-2">{% trans "From" %}:&nbsp;</label>
+ <div class="col-sm-10">
<input data-line-chart-command="date_picker_change"
- type="text" id="date_from" name="date_from" class="span2 example"/>
+ type="text" id="date_from" name="date_from" class="form-control example"/>
</div>
</div>
- <div class="control-group" id="report_date_to">
- <label for="date_to" class="control-label">{% trans "To" %}:&nbsp;</label>
- <div class="controls">
+ <div class="form-group" id="report_date_to">
+ <label for="date_to" class="control-label col-sm-2">{% trans "To" %}:&nbsp;</label>
+ <div class="col-sm-10">
<input data-line-chart-command="date_picker_change"
- type="text" name="date_to" class="span2 example"/>
+ type="text" name="date_to" class="form-control example"/>
</div>
</div>
- <div class="control-group">
- <label for="limit" class="control-label">{% trans "Limit project count" %}:&nbsp;</label>
- <div class="controls">
- <input type="text" name="limit" class="span2 example" value="20"/>
+ <div class="form-group">
+ <label for="limit" class="control-label col-sm-2">{% trans "Limit project count" %}:&nbsp;</label>
+ <div class="col-sm-10">
+ <input type="text" name="limit" class="form-control example" value="20"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="col-sm-offset-2 col-sm-10">
+ <button type="submit" class="btn btn-default btn-sm">{% trans 'Generate Report' %}</button>
</div>
</div>
- <button type="submit" class="btn btn-small">{% trans 'Generate Report' %}</button>
</form>
</div>
<script type="text/javascript">
@@ -55,7 +59,7 @@
// want to refresh, but show hide the date fields
if ($(this).find("option:selected").val() == "other"){
evt.stopPropagation();
- $("#date_from .controls input, #date_to .controls input").val('');
+ $("#date_from input, #date_to input").val('');
$("#report_date_from, #report_date_to").show();
} else {
$("#report_date_from, #report_date_to").hide();
diff --git a/openstack_dashboard/dashboards/admin/metering/templates/metering/index.html b/openstack_dashboard/dashboards/admin/metering/templates/metering/index.html
index fe7e605c5..50d5f80ba 100644
--- a/openstack_dashboard/dashboards/admin/metering/templates/metering/index.html
+++ b/openstack_dashboard/dashboards/admin/metering/templates/metering/index.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/admin/metering/templates/metering/report.html b/openstack_dashboard/dashboards/admin/metering/templates/metering/report.html
index 5e8eabbb7..acb9f8ef3 100644
--- a/openstack_dashboard/dashboards/admin/metering/templates/metering/report.html
+++ b/openstack_dashboard/dashboards/admin/metering/templates/metering/report.html
@@ -9,8 +9,8 @@
{% block main %}
<div class="table_actions">
- <a href="{{ csv_url }}"><button class="btn btn-small btn-download" >{% trans 'Download CSV Summary' %}</button></a>
- <a href="{% url 'horizon:admin:metering:index' %}"><button class="btn btn-small">{% trans 'Back' %}</button></a>
+ <a href="{{ csv_url }}"><button class="btn btn-default btn-sm" ><span class="glyphicon glyphicon-download"></span>{% trans 'Download CSV Summary' %}</button></a>
+ <a href="{% url 'horizon:admin:metering:index' %}"><button class="btn btn-default btn-sm">{% trans 'Back' %}</button></a>
</div>
{% for table in tables %}
{{ table.render }}
diff --git a/openstack_dashboard/dashboards/admin/metering/templates/metering/stats.html b/openstack_dashboard/dashboards/admin/metering/templates/metering/stats.html
index 343995712..04b727a78 100644
--- a/openstack_dashboard/dashboards/admin/metering/templates/metering/stats.html
+++ b/openstack_dashboard/dashboards/admin/metering/templates/metering/stats.html
@@ -6,11 +6,11 @@
<form class="form-horizontal"
id="linechart_general_form">
- <div class="control-group">
- <label for="meter" class="control-label">{% trans "Metric" %}:&nbsp;</label>
- <div class="controls line_chart_time_picker">
+ <div class="form-group">
+ <label for="meter" class="col-sm-2 control-label">{% trans "Metric" %}:&nbsp;</label>
+ <div class="col-sm-10 line_chart_time_picker">
<select data-line-chart-command="select_box_change"
- name="meter" id="meter" class="span2 example">
+ name="meter" id="meter" class="form-control example">
{% if nova_meters %}
<optgroup label='{% trans "Compute (Nova)" %}'>
@@ -75,21 +75,21 @@
</div>
</div>
- <div class="control-group">
- <label for="group_by" class="control-label">{% trans "Group by" %}:&nbsp;</label>
- <div class="controls">
+ <div class="form-group">
+ <label for="group_by" class="col-sm-2 control-label">{% trans "Group by" %}:&nbsp;</label>
+ <div class="col-sm-10">
<select data-line-chart-command="select_box_change"
- id="group_by" name="group_by" class="span2">
+ id="group_by" name="group_by" class="form-control">
<option value="" selected="selected">{% trans "--" %}</option>
<option selected="selected" value="project" selected>{% trans "Project" %}</option>
</select>
</div>
</div>
- <div class="control-group">
- <label for="stats_attr" class="control-label">{% trans "Value" %}:&nbsp;</label>
- <div class="controls">
+ <div class="form-group">
+ <label for="stats_attr" class="col-sm-2 control-label">{% trans "Value" %}:&nbsp;</label>
+ <div class="col-sm-10">
<select data-line-chart-command="select_box_change"
- id="stats_attr" name="stats_attr" class="span2">
+ id="stats_attr" name="stats_attr" class="form-control">
<option selected="selected" value="avg">{% trans "Avg." %}</option>
<option value="min">{% trans "Min." %}</option>
@@ -98,11 +98,11 @@
</select>
</div>
</div>
- <div class="control-group">
- <label for="date_options" class="control-label">{% trans "Period" %}:&nbsp;</label>
- <div class="controls">
+ <div class="form-group">
+ <label for="date_options" class="col-sm-2 control-label">{% trans "Period" %}:&nbsp;</label>
+ <div class="col-sm-10">
<select data-line-chart-command="select_box_change"
- id="date_options" name="date_options" class="span2">
+ id="date_options" name="date_options" class="form-control">
<option value="1">{% trans "Last day" %}</option>
<option value="7" selected="selected">{% trans "Last week" %}</option>
<option value="{% now 'j' %}">{% trans "Month to date" %}</option>
@@ -113,30 +113,30 @@
</select>
</div>
</div>
- <div class="control-group" id="date_from">
- <label for="date_from" class="control-label">{% trans "From" %}:&nbsp;</label>
- <div class="controls">
+ <div class="form-group" id="date_from">
+ <label for="date_from" class="col-sm-2 control-label">{% trans "From" %}:&nbsp;</label>
+ <div class="col-sm-10">
<input data-line-chart-command="date_picker_change"
- type="text" id="date_from" name="date_from" class="span2 example"/>
+ type="text" id="date_from" name="date_from" class="form-control example"/>
</div>
</div>
- <div class="control-group" id="date_to">
- <label for="date_to" class="control-label">{% trans "To" %}:&nbsp;</label>
- <div class="controls">
+ <div class="form-group" id="date_to">
+ <label for="date_to" class="col-sm-2 control-label">{% trans "To" %}:&nbsp;</label>
+ <div class="col-sm-10">
<input data-line-chart-command="date_picker_change"
- type="text" name="date_to" class="span2 example"/>
+ type="text" name="date_to" class="form-control example"/>
</div>
</div>
</form>
</div>
-<div class="info row-fluid detail">
- <div class="span12">
+<div class="info row detail">
+ <div class="col-sm-12">
<h4>{% trans "Statistics of all resources" %}</h4>
<hr class="header_rule" />
- <div class="info row-fluid detail">
- <div class="span9 chart_container">
+ <div class="info row detail">
+ <div class="col-sm-9 chart_container">
<div class="chart"
data-chart-type="line_chart"
data-url="{% url 'horizon:admin:metering:samples'%}"
@@ -146,7 +146,7 @@
data-slider-selector="#slider">
</div>
<div id="slider"></div>
- <div class="span3 legend_container">
+ <div class="col-sm-3 legend_container">
<div id="smoother" title="Smoothing"></div>
<div id="legend"></div>
</div>
@@ -175,7 +175,7 @@
// want to refresh, but show hide the date fields
if ($(this).find("option:selected").val() == "other"){
evt.stopPropagation();
- $("#date_from .controls input, #date_to .controls input").val('');
+ $("#date_from input, #date_to input").val('');
$("#date_from, #date_to").show();
} else {
$("#date_from, #date_to").hide();
diff --git a/openstack_dashboard/dashboards/admin/networks/ports/tables.py b/openstack_dashboard/dashboards/admin/networks/ports/tables.py
index b5b6967be..b63c2834c 100644
--- a/openstack_dashboard/dashboards/admin/networks/ports/tables.py
+++ b/openstack_dashboard/dashboards/admin/networks/ports/tables.py
@@ -55,7 +55,8 @@ class CreatePort(tables.LinkAction):
name = "create"
verbose_name = _("Create Port")
url = "horizon:admin:networks:addport"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_port"),)
def get_link_url(self, datum=None):
@@ -67,7 +68,8 @@ class UpdatePort(tables.LinkAction):
name = "update"
verbose_name = _("Edit Port")
url = "horizon:admin:networks:editport"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("network", "update_port"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/admin/networks/subnets/tables.py b/openstack_dashboard/dashboards/admin/networks/subnets/tables.py
index 3ee1bf361..bea550e84 100644
--- a/openstack_dashboard/dashboards/admin/networks/subnets/tables.py
+++ b/openstack_dashboard/dashboards/admin/networks/subnets/tables.py
@@ -54,7 +54,8 @@ class CreateSubnet(tables.LinkAction):
name = "create"
verbose_name = _("Create Subnet")
url = "horizon:admin:networks:addsubnet"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_subnet"),)
def get_policy_target(self, request, datum=None):
@@ -73,7 +74,8 @@ class UpdateSubnet(tables.LinkAction):
name = "update"
verbose_name = _("Edit Subnet")
url = "horizon:admin:networks:editsubnet"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("network", "update_subnet"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/admin/networks/tables.py b/openstack_dashboard/dashboards/admin/networks/tables.py
index 491de6674..39fd3a61c 100644
--- a/openstack_dashboard/dashboards/admin/networks/tables.py
+++ b/openstack_dashboard/dashboards/admin/networks/tables.py
@@ -54,7 +54,8 @@ class CreateNetwork(tables.LinkAction):
name = "create"
verbose_name = _("Create Network")
url = "horizon:admin:networks:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_network"),)
@@ -62,7 +63,8 @@ class EditNetwork(tables.LinkAction):
name = "update"
verbose_name = _("Edit Network")
url = "horizon:admin:networks:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("network", "update_network"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/admin/networks/templates/networks/_create.html b/openstack_dashboard/dashboards/admin/networks/templates/networks/_create.html
index 391848a66..f89c2a5f8 100644
--- a/openstack_dashboard/dashboards/admin/networks/templates/networks/_create.html
+++ b/openstack_dashboard/dashboards/admin/networks/templates/networks/_create.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Network" %}" />
- <a href="{% url 'horizon:admin:networks:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:networks:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/networks/templates/networks/_update.html b/openstack_dashboard/dashboards/admin/networks/templates/networks/_update.html
index 6c1c36baa..d82ee47e6 100644
--- a/openstack_dashboard/dashboards/admin/networks/templates/networks/_update.html
+++ b/openstack_dashboard/dashboards/admin/networks/templates/networks/_update.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:admin:networks:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:networks:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_create.html b/openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_create.html
index 8f9e94939..577e68385 100644
--- a/openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_create.html
+++ b/openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_create.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Port" %}" />
- <a href="{% url 'horizon:admin:networks:detail' network.id %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:networks:detail' network.id %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_update.html b/openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_update.html
index 7c4091713..5fa5ca974 100644
--- a/openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_update.html
+++ b/openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_update.html
@@ -26,5 +26,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:admin:networks:detail' network_id %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:networks:detail' network_id %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/projects/tables.py b/openstack_dashboard/dashboards/admin/projects/tables.py
index ffb47a32a..58fe58b1e 100644
--- a/openstack_dashboard/dashboards/admin/projects/tables.py
+++ b/openstack_dashboard/dashboards/admin/projects/tables.py
@@ -28,7 +28,8 @@ class ViewMembersLink(tables.LinkAction):
name = "users"
verbose_name = _("Modify Users")
url = "horizon:admin:projects:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("identity", "identity:list_users"),
("identity", "identity:list_roles"))
@@ -43,7 +44,8 @@ class ViewGroupsLink(tables.LinkAction):
name = "groups"
verbose_name = _("Modify Groups")
url = "horizon:admin:projects:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
def allowed(self, request, project):
return keystone.VERSIONS.active >= 3
@@ -59,7 +61,7 @@ class UsageLink(tables.LinkAction):
name = "usage"
verbose_name = _("View Usage")
url = "horizon:admin:projects:usage"
- classes = ("btn-stats",)
+ icon = "stats"
policy_rules = (("compute", "compute_extension:simple_tenant_usage:show"),)
@@ -78,7 +80,8 @@ class UpdateProject(tables.LinkAction):
name = "update"
verbose_name = _("Edit Project")
url = "horizon:admin:projects:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (('identity', 'identity:update_project'),)
def allowed(self, request, project):
@@ -89,7 +92,8 @@ class ModifyQuotas(tables.LinkAction):
name = "quotas"
verbose_name = _("Modify Quotas")
url = "horizon:admin:projects:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (('compute', "compute_extension:quotas:update"),)
def get_link_url(self, project):
diff --git a/openstack_dashboard/dashboards/admin/projects/tests.py b/openstack_dashboard/dashboards/admin/projects/tests.py
index 468e4483a..0e99f1342 100644
--- a/openstack_dashboard/dashboards/admin/projects/tests.py
+++ b/openstack_dashboard/dashboards/admin/projects/tests.py
@@ -244,12 +244,17 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
self.assertTemplateUsed(res, views.WorkflowView.template_name)
if django.VERSION >= (1, 6):
- self.assertContains(res, '<input id="id_subnet" min="-1" '
- 'name="subnet" type="number" value="10" />',
- html=True)
+ self.assertContains(res, '''
+ <input class=" form-control"
+ id="id_subnet" min="-1"
+ name="subnet" type="number" value="10" />
+ ''', html=True)
else:
- self.assertContains(res, '<input name="subnet" id="id_subnet" '
- 'value="10" type="text" />', html=True)
+ self.assertContains(res, '''
+ <input class=" form-control"
+ name="subnet" id="id_subnet"
+ value="10" type="text" />
+ ''', html=True)
workflow = res.context['workflow']
self.assertEqual(res.context['workflow'].name,
diff --git a/openstack_dashboard/dashboards/admin/roles/tables.py b/openstack_dashboard/dashboards/admin/roles/tables.py
index e175dc441..e09e8bad5 100644
--- a/openstack_dashboard/dashboards/admin/roles/tables.py
+++ b/openstack_dashboard/dashboards/admin/roles/tables.py
@@ -23,7 +23,8 @@ class CreateRoleLink(tables.LinkAction):
name = "create"
verbose_name = _("Create Role")
url = "horizon:admin:roles:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("identity", "identity:create_role"),)
def allowed(self, request, role):
@@ -34,7 +35,8 @@ class EditRoleLink(tables.LinkAction):
name = "edit"
verbose_name = _("Edit")
url = "horizon:admin:roles:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("identity", "identity:update_role"),)
def allowed(self, request, role):
diff --git a/openstack_dashboard/dashboards/admin/roles/templates/roles/_create.html b/openstack_dashboard/dashboards/admin/roles/templates/roles/_create.html
index 4ddd8bc73..aba973e89 100644
--- a/openstack_dashboard/dashboards/admin/roles/templates/roles/_create.html
+++ b/openstack_dashboard/dashboards/admin/roles/templates/roles/_create.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Role" %}" />
- <a href="{% url 'horizon:admin:roles:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:roles:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/roles/templates/roles/_update.html b/openstack_dashboard/dashboards/admin/roles/templates/roles/_update.html
index 6b3c4c42b..7c1b18323 100644
--- a/openstack_dashboard/dashboards/admin/roles/templates/roles/_update.html
+++ b/openstack_dashboard/dashboards/admin/roles/templates/roles/_update.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Update Role" %}" />
- <a href="{% url 'horizon:admin:roles:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:roles:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/routers/templates/routers/detail.html b/openstack_dashboard/dashboards/admin/routers/templates/routers/detail.html
index 6d85a974f..15b214f56 100644
--- a/openstack_dashboard/dashboards/admin/routers/templates/routers/detail.html
+++ b/openstack_dashboard/dashboards/admin/routers/templates/routers/detail.html
@@ -8,8 +8,8 @@
{% block main %}
{% include "admin/routers/_detail_overview.html" %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/admin/users/tables.py b/openstack_dashboard/dashboards/admin/users/tables.py
index 9c6dc04cb..4d3d5c828 100644
--- a/openstack_dashboard/dashboards/admin/users/tables.py
+++ b/openstack_dashboard/dashboards/admin/users/tables.py
@@ -27,7 +27,8 @@ class CreateUserLink(tables.LinkAction):
name = "create"
verbose_name = _("Create User")
url = "horizon:admin:users:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (('identity', 'identity:create_grant'),
("identity", "identity:create_user"),
("identity", "identity:list_roles"),
@@ -41,7 +42,8 @@ class EditUserLink(tables.LinkAction):
name = "edit"
verbose_name = _("Edit")
url = "horizon:admin:users:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("identity", "identity:update_user"),
("identity", "identity:list_projects"),)
diff --git a/openstack_dashboard/dashboards/admin/users/templates/users/_create.html b/openstack_dashboard/dashboards/admin/users/templates/users/_create.html
index 9da7b7619..13488a8dc 100644
--- a/openstack_dashboard/dashboards/admin/users/templates/users/_create.html
+++ b/openstack_dashboard/dashboards/admin/users/templates/users/_create.html
@@ -31,5 +31,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create User" %}" />
- <a href="{% url 'horizon:admin:users:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:users:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/users/templates/users/_update.html b/openstack_dashboard/dashboards/admin/users/templates/users/_update.html
index 98e9013ac..652fd5243 100644
--- a/openstack_dashboard/dashboards/admin/users/templates/users/_update.html
+++ b/openstack_dashboard/dashboards/admin/users/templates/users/_update.html
@@ -31,5 +31,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Update User" %}" />
- <a href="{% url 'horizon:admin:users:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:users:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/volumes/tables.py b/openstack_dashboard/dashboards/admin/volumes/tables.py
index 3d4a5fe57..284c4b62e 100644
--- a/openstack_dashboard/dashboards/admin/volumes/tables.py
+++ b/openstack_dashboard/dashboards/admin/volumes/tables.py
@@ -22,7 +22,8 @@ class CreateVolumeType(tables.LinkAction):
name = "create"
verbose_name = _("Create Volume Type")
url = "horizon:admin:volumes:create_type"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("volume", "volume_extension:types_manage"),)
diff --git a/openstack_dashboard/dashboards/admin/volumes/templates/volumes/_create_volume_type.html b/openstack_dashboard/dashboards/admin/volumes/templates/volumes/_create_volume_type.html
index 305093d30..779f830fc 100644
--- a/openstack_dashboard/dashboards/admin/volumes/templates/volumes/_create_volume_type.html
+++ b/openstack_dashboard/dashboards/admin/volumes/templates/volumes/_create_volume_type.html
@@ -26,5 +26,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Volume Type" %}" />
- <a href="{% url 'horizon:admin:volumes:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:admin:volumes:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/admin/volumes/templates/volumes/detail.html b/openstack_dashboard/dashboards/admin/volumes/templates/volumes/detail.html
index 59dbb7d5a..469d662e3 100644
--- a/openstack_dashboard/dashboards/admin/volumes/templates/volumes/detail.html
+++ b/openstack_dashboard/dashboards/admin/volumes/templates/volumes/detail.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/access_and_security/api_access/tables.py b/openstack_dashboard/dashboards/project/access_and_security/api_access/tables.py
index 13bbaa340..56d5b0dc8 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/api_access/tables.py
+++ b/openstack_dashboard/dashboards/project/access_and_security/api_access/tables.py
@@ -32,7 +32,7 @@ class DownloadEC2(tables.LinkAction):
name = "download_ec2"
verbose_name = _("Download EC2 Credentials")
verbose_name_plural = _("Download EC2 Credentials")
- classes = ("btn-download",)
+ icon = "download"
url = "horizon:project:access_and_security:api_access:ec2"
policy_rules = (("compute", "compute_extension:certificates"),)
@@ -44,7 +44,7 @@ class DownloadOpenRC(tables.LinkAction):
name = "download_openrc"
verbose_name = _("Download OpenStack RC File")
verbose_name_plural = _("Download OpenStack RC File")
- classes = ("btn-download",)
+ icon = "download"
url = "horizon:project:access_and_security:api_access:openrc"
diff --git a/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tables.py b/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tables.py
index 1d398935b..96f1b94a0 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tables.py
+++ b/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tables.py
@@ -39,7 +39,8 @@ POLICY_CHECK = getattr(settings, "POLICY_CHECK_FUNCTION", lambda p, r: True)
class AllocateIP(tables.LinkAction):
name = "allocate"
verbose_name = _("Allocate IP To Project")
- classes = ("ajax-modal", "btn-allocate")
+ classes = ("ajax-modal",)
+ icon = "download-alt"
url = "horizon:project:access_and_security:floating_ips:allocate"
def single(self, data_table, request, *args):
@@ -72,7 +73,8 @@ class ReleaseIPs(tables.BatchAction):
action_past = _("Released")
data_type_singular = _("Floating IP")
data_type_plural = _("Floating IPs")
- classes = ('btn-danger', 'btn-release')
+ classes = ('btn-danger',)
+ icon = "arrow-up"
def allowed(self, request, fip=None):
if api.base.is_service_enabled(request, "network"):
@@ -91,7 +93,8 @@ class AssociateIP(tables.LinkAction):
name = "associate"
verbose_name = _("Associate")
url = "horizon:project:access_and_security:floating_ips:associate"
- classes = ("ajax-modal", "btn-associate")
+ classes = ("ajax-modal",)
+ icon = "link"
def allowed(self, request, fip):
if api.base.is_service_enabled(request, "network"):
diff --git a/openstack_dashboard/dashboards/project/access_and_security/keypairs/tables.py b/openstack_dashboard/dashboards/project/access_and_security/keypairs/tables.py
index 027b9077e..9c37e484b 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/keypairs/tables.py
+++ b/openstack_dashboard/dashboards/project/access_and_security/keypairs/tables.py
@@ -34,7 +34,8 @@ class ImportKeyPair(tables.LinkAction):
name = "import"
verbose_name = _("Import Key Pair")
url = "horizon:project:access_and_security:keypairs:import"
- classes = ("ajax-modal", "btn-upload")
+ classes = ("ajax-modal",)
+ icon = "upload"
policy_rules = (("compute", "compute_extension:keypairs:create"),)
@@ -42,7 +43,8 @@ class CreateKeyPair(tables.LinkAction):
name = "create"
verbose_name = _("Create Key Pair")
url = "horizon:project:access_and_security:keypairs:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("compute", "compute_extension:keypairs:create"),)
def allowed(self, request, keypair=None):
diff --git a/openstack_dashboard/dashboards/project/access_and_security/security_groups/tables.py b/openstack_dashboard/dashboards/project/access_and_security/security_groups/tables.py
index 2a5a6001a..40d6c8428 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/security_groups/tables.py
+++ b/openstack_dashboard/dashboards/project/access_and_security/security_groups/tables.py
@@ -58,7 +58,8 @@ class CreateGroup(tables.LinkAction):
name = "create"
verbose_name = _("Create Security Group")
url = "horizon:project:access_and_security:security_groups:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
def allowed(self, request, security_group=None):
if api.base.is_service_enabled(request, "network"):
@@ -73,7 +74,8 @@ class EditGroup(tables.LinkAction):
name = "edit"
verbose_name = _("Edit Security Group")
url = "horizon:project:access_and_security:security_groups:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
def get_policy_target(self, request, datum=None):
project_id = None
@@ -100,7 +102,7 @@ class ManageRules(tables.LinkAction):
name = "manage_rules"
verbose_name = _("Manage Rules")
url = "horizon:project:access_and_security:security_groups:detail"
- classes = ("btn-edit")
+ icon = "pencil"
def get_policy_target(self, request, datum=None):
project_id = None
@@ -136,7 +138,8 @@ class CreateRule(tables.LinkAction):
name = "add_rule"
verbose_name = _("Add Rule")
url = "horizon:project:access_and_security:security_groups:add_rule"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
def allowed(self, request, security_group_rule=None):
if api.base.is_service_enabled(request, "network"):
diff --git a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/floating_ips/_allocate.html b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/floating_ips/_allocate.html
index fae32807d..3c3b02b82 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/floating_ips/_allocate.html
+++ b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/floating_ips/_allocate.html
@@ -40,5 +40,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Allocate IP" %}" />
- <a href="{% url 'horizon:project:access_and_security:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:access_and_security:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/index.html b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/index.html
index 7a00d8dbb..14d51ac32 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/index.html
+++ b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/index.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_create.html b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_create.html
index eeab9ae3d..a1e8fcee3 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_create.html
+++ b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_create.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Key Pair" %}" />
- <a href="{% url 'horizon:project:access_and_security:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:access_and_security:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_import.html b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_import.html
index 3c310b01f..93f6d61c2 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_import.html
+++ b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/_import.html
@@ -29,5 +29,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Import Key Pair" %}" />
- <a href="{% url 'horizon:project:access_and_security:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:access_and_security:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_add_rule.html b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_add_rule.html
index 4f47dbe7e..174e81e1d 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_add_rule.html
+++ b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_add_rule.html
@@ -25,5 +25,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Add" %}" />
- <a href="{% url 'horizon:project:access_and_security:security_groups:detail' security_group_id %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:access_and_security:security_groups:detail' security_group_id %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_create.html b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_create.html
index b2f8d63d5..d1b16409b 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_create.html
+++ b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_create.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Security Group" %}" />
- <a href="{% url 'horizon:project:access_and_security:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:access_and_security:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_update.html b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_update.html
index 6ec2f9755..9f6a211c1 100644
--- a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_update.html
+++ b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/_update.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Edit Security Group" %}" />
- <a href="{% url 'horizon:project:access_and_security:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:access_and_security:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/containers/tables.py b/openstack_dashboard/dashboards/project/containers/tables.py
index 9ce9986ba..d3c853b79 100644
--- a/openstack_dashboard/dashboards/project/containers/tables.py
+++ b/openstack_dashboard/dashboards/project/containers/tables.py
@@ -54,7 +54,7 @@ class ViewContainer(tables.LinkAction):
class MakePublicContainer(tables.Action):
name = "make_public"
verbose_name = _("Make Public")
- classes = ("btn-edit", )
+ icon = "pencil"
def allowed(self, request, container):
# Container metadata have not been loaded
@@ -80,7 +80,7 @@ class MakePublicContainer(tables.Action):
class MakePrivateContainer(tables.Action):
name = "make_private"
verbose_name = _("Make Private")
- classes = ("btn-edit", )
+ icon = "pencil"
def allowed(self, request, container):
# Container metadata have not been loaded
@@ -136,14 +136,15 @@ class CreateContainer(tables.LinkAction):
name = "create"
verbose_name = _("Create Container")
url = "horizon:project:containers:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
class ListObjects(tables.LinkAction):
name = "list_objects"
verbose_name = _("View Container")
url = "horizon:project:containers:index"
- classes = ("btn-list",)
+ icon = "list"
def get_link_url(self, datum=None):
container_name = http.urlquote(datum.name)
@@ -155,7 +156,8 @@ class CreatePseudoFolder(tables.LinkAction):
name = "create_pseudo_folder"
verbose_name = _("Create Pseudo-folder")
url = "horizon:project:containers:create_pseudo_folder"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
def get_link_url(self, datum=None):
# Usable for both the container and object tables
@@ -183,7 +185,8 @@ class UploadObject(tables.LinkAction):
name = "upload"
verbose_name = _("Upload Object")
url = "horizon:project:containers:object_upload"
- classes = ("ajax-modal", "btn-upload")
+ classes = ("ajax-modal",)
+ icon = "upload"
def get_link_url(self, datum=None):
# Usable for both the container and object tables
@@ -305,7 +308,8 @@ class UpdateObject(tables.LinkAction):
name = "update_object"
verbose_name = _("Edit")
url = "horizon:project:containers:object_update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
allowed_data_types = ("objects",)
def get_link_url(self, obj):
@@ -341,7 +345,8 @@ class CopyObject(tables.LinkAction):
name = "copy"
verbose_name = _("Copy")
url = "horizon:project:containers:object_copy"
- classes = ("ajax-modal", "btn-copy")
+ classes = ("ajax-modal",)
+ icon = "circle-arrow-right"
allowed_data_types = ("objects",)
def get_link_url(self, obj):
@@ -354,7 +359,7 @@ class DownloadObject(tables.LinkAction):
name = "download"
verbose_name = _("Download")
url = "horizon:project:containers:object_download"
- classes = ("btn-download",)
+ icon = "download"
allowed_data_types = ("objects",)
def get_link_url(self, obj):
diff --git a/openstack_dashboard/dashboards/project/containers/templates/containers/_container_detail.html b/openstack_dashboard/dashboards/project/containers/templates/containers/_container_detail.html
index 7b1973170..0bba8c39f 100644
--- a/openstack_dashboard/dashboards/project/containers/templates/containers/_container_detail.html
+++ b/openstack_dashboard/dashboards/project/containers/templates/containers/_container_detail.html
@@ -5,7 +5,7 @@
{% block modal-header %}{% trans "Container Details" %}{% endblock %}
{% block modal-body %}
-<div class="info row-fluid detail clearfix">
+<div class="info row detail clearfix">
<dl>
<dt>{% trans "Container Name" %}</dt>
<dd>{{ container.name }}</dd>
@@ -26,5 +26,5 @@
{% endblock %}
{% block modal-footer %}
- <a href="{% url 'horizon:project:containers:index' %}" class="btn secondary cancel close">{% trans "Close" %}</a>
-{% endblock %} \ No newline at end of file
+ <a href="{% url 'horizon:project:containers:index' %}" class="btn btn-default secondary cancel close">{% trans "Close" %}</a>
+{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/containers/templates/containers/_copy.html b/openstack_dashboard/dashboards/project/containers/templates/containers/_copy.html
index d9c3f4b88..b1e2a9750 100644
--- a/openstack_dashboard/dashboards/project/containers/templates/containers/_copy.html
+++ b/openstack_dashboard/dashboards/project/containers/templates/containers/_copy.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Copy Object" %}" />
- <a href="{% url 'horizon:project:containers:index' container_name|add:'/' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:containers:index' container_name|add:'/' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/containers/templates/containers/_create.html b/openstack_dashboard/dashboards/project/containers/templates/containers/_create.html
index 45737407a..d2063d9ee 100644
--- a/openstack_dashboard/dashboards/project/containers/templates/containers/_create.html
+++ b/openstack_dashboard/dashboards/project/containers/templates/containers/_create.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Container" %}" />
- <a href="{% url 'horizon:project:containers:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:containers:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/containers/templates/containers/_create_pseudo_folder.html b/openstack_dashboard/dashboards/project/containers/templates/containers/_create_pseudo_folder.html
index d8ee31e50..4d27bf0a6 100644
--- a/openstack_dashboard/dashboards/project/containers/templates/containers/_create_pseudo_folder.html
+++ b/openstack_dashboard/dashboards/project/containers/templates/containers/_create_pseudo_folder.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create" %}" />
- <a href="{% url 'horizon:project:containers:index' container_name|add:'/' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:containers:index' container_name|add:'/' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/containers/templates/containers/_object_detail.html b/openstack_dashboard/dashboards/project/containers/templates/containers/_object_detail.html
index cd07538cd..e1be178f7 100644
--- a/openstack_dashboard/dashboards/project/containers/templates/containers/_object_detail.html
+++ b/openstack_dashboard/dashboards/project/containers/templates/containers/_object_detail.html
@@ -5,7 +5,7 @@
{% block modal-header %}{% trans "Object Details" %}{% endblock %}
{% block modal-body %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<dl>
<dt>{% trans "Name" %}</dt>
<dd>{{ object.name }}</dd>
@@ -22,5 +22,5 @@
{% endblock %}
{% block modal-footer %}
- <a href="{% url 'horizon:project:containers:index' %}" class="btn secondary cancel close">{% trans "Close" %}</a>
-{% endblock %} \ No newline at end of file
+ <a href="{% url 'horizon:project:containers:index' %}" class="btn btn-default secondary cancel close">{% trans "Close" %}</a>
+{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/containers/templates/containers/_update.html b/openstack_dashboard/dashboards/project/containers/templates/containers/_update.html
index f37f474e1..1b52cd1a7 100644
--- a/openstack_dashboard/dashboards/project/containers/templates/containers/_update.html
+++ b/openstack_dashboard/dashboards/project/containers/templates/containers/_update.html
@@ -25,5 +25,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" ng-disabled="updateForm.$invalid" value="{% trans "Update Object" %}" />
- <a href="{% url 'horizon:project:containers:index' container_name|add:'/' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:containers:index' container_name|add:'/' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/containers/templates/containers/_upload.html b/openstack_dashboard/dashboards/project/containers/templates/containers/_upload.html
index 9f10ca9ad..272c20ece 100644
--- a/openstack_dashboard/dashboards/project/containers/templates/containers/_upload.html
+++ b/openstack_dashboard/dashboards/project/containers/templates/containers/_upload.html
@@ -24,5 +24,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" ng-disabled="uploadForm.$invalid || uploadForm.$pristine" value="{% trans "Upload Object" %}" />
- <a href="{% url 'horizon:project:containers:index' container_name|add:'/' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:containers:index' container_name|add:'/' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/_details.html b/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/_details.html
index 57635d1e5..0276e5637 100644
--- a/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/_details.html
+++ b/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/_details.html
@@ -2,7 +2,7 @@
<h3>{% trans "Data Processing Plugin Overview" %}</h3>
-<div class="status row-fluid detail">
+<div class="status row detail">
<h4>{% trans "Info" %}</h4>
<hr class="header_rule">
<dl>
@@ -22,4 +22,4 @@
</dd>
</dl>
-</div> \ No newline at end of file
+</div>
diff --git a/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/details.html b/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/details.html
index 85558cbb7..6bbf97def 100644
--- a/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/details.html
+++ b/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/details.html
@@ -7,9 +7,9 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
-{% endblock %} \ No newline at end of file
+{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/database_backups/tables.py b/openstack_dashboard/dashboards/project/database_backups/tables.py
index f227e2bed..7b9a5dd16 100644
--- a/openstack_dashboard/dashboards/project/database_backups/tables.py
+++ b/openstack_dashboard/dashboards/project/database_backups/tables.py
@@ -36,14 +36,16 @@ class LaunchLink(tables.LinkAction):
name = "create"
verbose_name = _("Create Backup")
url = "horizon:project:database_backups:create"
- classes = ("btn-launch", "ajax-modal")
+ classes = ("ajax-modal", "btn-launch")
+ icon = "cloud-upload"
class RestoreLink(tables.LinkAction):
name = "restore"
verbose_name = _("Restore Backup")
url = "horizon:project:databases:launch"
- classes = ("btn-launch", "ajax-modal")
+ classes = ("ajax-modal",)
+ icon = "cloud-upload"
def allowed(self, request, backup=None):
return backup.status == 'COMPLETED'
@@ -77,7 +79,8 @@ class DeleteBackup(tables.BatchAction):
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("Backup")
data_type_plural = _("Backups")
- classes = ('btn-danger', 'btn-terminate')
+ classes = ("ajax-modal",)
+ icon = "remove"
def action(self, request, obj_id):
api.trove.backup_delete(request, obj_id)
diff --git a/openstack_dashboard/dashboards/project/database_backups/templates/database_backups/details.html b/openstack_dashboard/dashboards/project/database_backups/templates/database_backups/details.html
index a04c7fe81..85550289f 100644
--- a/openstack_dashboard/dashboards/project/database_backups/templates/database_backups/details.html
+++ b/openstack_dashboard/dashboards/project/database_backups/templates/database_backups/details.html
@@ -7,11 +7,11 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
<h3>{% trans "Backup Overview" %}</h3>
- <div class="status row-fluid detail">
+ <div class="status row detail">
<h4>{% trans "Info" %}</h4>
<hr class="header_rule">
<dl>
@@ -41,7 +41,7 @@
</div>
{% if instance %}
- <div class="addresses row-fluid detail">
+ <div class="addresses row detail">
<h4>{% trans "Database Info" %}</h4>
<hr class="header_rule">
<dl>
diff --git a/openstack_dashboard/dashboards/project/databases/tables.py b/openstack_dashboard/dashboards/project/databases/tables.py
index d3d5e31c7..4d44e5957 100644
--- a/openstack_dashboard/dashboards/project/databases/tables.py
+++ b/openstack_dashboard/dashboards/project/databases/tables.py
@@ -35,7 +35,8 @@ class TerminateInstance(tables.BatchAction):
action_past = _("Scheduled termination of %(data_type)s")
data_type_singular = _("Instance")
data_type_plural = _("Instances")
- classes = ('btn-danger', 'btn-terminate')
+ classes = ("ajax-modal",)
+ icon = "off"
def action(self, request, obj_id):
api.trove.instance_delete(request, obj_id)
@@ -93,14 +94,16 @@ class LaunchLink(tables.LinkAction):
name = "launch"
verbose_name = _("Launch Instance")
url = "horizon:project:databases:launch"
- classes = ("btn-launch", "ajax-modal")
+ classes = ("ajax-modal", "btn-launch")
+ icon = "cloud-upload"
class CreateBackup(tables.LinkAction):
name = "backup"
verbose_name = _("Create Backup")
url = "horizon:project:database_backups:create"
- classes = ("ajax-modal", "btn-camera")
+ classes = ("ajax-modal",)
+ icon = "camera"
def allowed(self, request, instance=None):
return (instance.status in ACTIVE_STATES and
diff --git a/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview.html b/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview.html
index 087419372..89db32e44 100644
--- a/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview.html
+++ b/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview.html
@@ -2,7 +2,7 @@
<h3>{% trans "Instance Overview" %}</h3>
-<div class="status row-fluid detail">
+<div class="status row detail">
<h4>{% trans "Info" %}</h4>
<hr class="header_rule">
<dl>
@@ -36,3 +36,18 @@
{% block connection_info %}
{% endblock %}
+<div class="addresses row detail">
+ <h4>{% trans "Connection Info" %}</h4>
+ <hr class="header_rule">
+ <dl>
+ {% with instance.host as host %}
+ <dt>{% trans "Host" %}</dt>
+ <dd>{{ host }}</dd>
+ <dt>{% trans "Database Port" %}</dt>
+ <dd>3306</dd> {# TODO: This should be a config #}
+ <dt>{% trans "Connection Examples" %}</dt>
+ <dd>mysql -h {{ host }} -u USERNAME -p</dd>
+ <dd>mysql://USERNAME:PASSWORD@{{ host }}:3306/DATABASE</dd>
+ {% endwith %}
+ </dl>
+</div>
diff --git a/openstack_dashboard/dashboards/project/databases/templates/databases/detail.html b/openstack_dashboard/dashboards/project/databases/templates/databases/detail.html
index 1354c1ba1..8f6f0caa8 100644
--- a/openstack_dashboard/dashboards/project/databases/templates/databases/detail.html
+++ b/openstack_dashboard/dashboards/project/databases/templates/databases/detail.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/firewalls/tables.py b/openstack_dashboard/dashboards/project/firewalls/tables.py
index 595c81d0d..a08d42fa8 100644
--- a/openstack_dashboard/dashboards/project/firewalls/tables.py
+++ b/openstack_dashboard/dashboards/project/firewalls/tables.py
@@ -25,7 +25,8 @@ class AddRuleLink(tables.LinkAction):
name = "addrule"
verbose_name = _("Add Rule")
url = "horizon:project:firewalls:addrule"
- classes = ("ajax-modal", "btn-create",)
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_firewall_rule"),)
@@ -41,7 +42,8 @@ class AddFirewallLink(tables.LinkAction):
name = "addfirewall"
verbose_name = _("Create Firewall")
url = "horizon:project:firewalls:addfirewall"
- classes = ("ajax-modal", "btn-addfirewall",)
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_firewall"),)
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_firewall_details.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_firewall_details.html
index d044e37b9..a64bd59fb 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_firewall_details.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_firewall_details.html
@@ -1,7 +1,7 @@
{% load i18n sizeformat parse_date %}
{% load url from future %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_insert_rule_to_policy.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_insert_rule_to_policy.html
index 1d60820b0..c8d71cc13 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_insert_rule_to_policy.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_insert_rule_to_policy.html
@@ -24,5 +24,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:firewalls:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:firewalls:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_policy_details.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_policy_details.html
index 3f29aac54..8a88b8a92 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_policy_details.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_policy_details.html
@@ -1,7 +1,7 @@
{% load i18n sizeformat parse_date %}
{% load url from future %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_remove_rule_from_policy.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_remove_rule_from_policy.html
index 3432b1737..95d21029a 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_remove_rule_from_policy.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_remove_rule_from_policy.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:firewalls:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:firewalls:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_rule_details.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_rule_details.html
index 89858296d..6974c3579 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_rule_details.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_rule_details.html
@@ -1,7 +1,7 @@
{% load i18n sizeformat parse_date %}
{% load url from future %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updatefirewall.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updatefirewall.html
index d74465923..e68d0c3a9 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updatefirewall.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updatefirewall.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:firewalls:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:firewalls:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updatepolicy.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updatepolicy.html
index 38f56c10f..b986106e8 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updatepolicy.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updatepolicy.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:firewalls:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:firewalls:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updaterule.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updaterule.html
index 0d62163f9..abbbf0393 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updaterule.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_updaterule.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:firewalls:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:firewalls:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/details_tabs.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/details_tabs.html
index b0031b91f..86eb459aa 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/details_tabs.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/details_tabs.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/images/images/tables.py b/openstack_dashboard/dashboards/project/images/images/tables.py
index e486e2552..14cde3481 100644
--- a/openstack_dashboard/dashboards/project/images/images/tables.py
+++ b/openstack_dashboard/dashboards/project/images/images/tables.py
@@ -33,7 +33,8 @@ class LaunchImage(tables.LinkAction):
name = "launch_image"
verbose_name = _("Launch")
url = "horizon:project:instances:launch"
- classes = ("btn-launch", "ajax-modal")
+ classes = ("ajax-modal", "btn-launch")
+ icon = "cloud-upload"
policy_rules = (("compute", "compute:create"),)
def get_link_url(self, datum):
@@ -76,7 +77,8 @@ class CreateImage(tables.LinkAction):
name = "create"
verbose_name = _("Create Image")
url = "horizon:project:images:images:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("image", "add_image"),)
@@ -84,7 +86,8 @@ class EditImage(tables.LinkAction):
name = "edit"
verbose_name = _("Edit")
url = "horizon:project:images:images:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("image", "modify_image"),)
def allowed(self, request, image=None):
@@ -100,7 +103,8 @@ class CreateVolumeFromImage(tables.LinkAction):
name = "create_volume_from_image"
verbose_name = _("Create Volume")
url = "horizon:project:volumes:volumes:create"
- classes = ("ajax-modal", "btn-camera")
+ classes = ("ajax-modal",)
+ icon = "camera"
policy_rules = (("volume", "volume:create"),)
def get_link_url(self, datum):
diff --git a/openstack_dashboard/dashboards/project/images/templates/images/images/_create.html b/openstack_dashboard/dashboards/project/images/templates/images/images/_create.html
index c960f1a23..c976fcfd6 100644
--- a/openstack_dashboard/dashboards/project/images/templates/images/images/_create.html
+++ b/openstack_dashboard/dashboards/project/images/templates/images/images/_create.html
@@ -36,5 +36,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans 'Create Image' %}" />
- <a href="{% url 'horizon:project:images:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:images:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/images/templates/images/images/_detail_overview.html b/openstack_dashboard/dashboards/project/images/templates/images/images/_detail_overview.html
index b92198f6e..195c89d53 100644
--- a/openstack_dashboard/dashboards/project/images/templates/images/images/_detail_overview.html
+++ b/openstack_dashboard/dashboards/project/images/templates/images/images/_detail_overview.html
@@ -2,7 +2,7 @@
<h3>{% trans "Image Overview" %}</h3>
-<div class="info row-fluid detail">
+<div class="info row detail">
<h4>{% trans "Info" %}</h4>
<hr class="header_rule">
<dl>
@@ -37,7 +37,7 @@
</dl>
</div>
-<div class="specs row-fluid detail">
+<div class="specs row detail">
<h4>{% trans "Specs" %}</h4>
<hr class="header_rule">
<dl>
@@ -58,7 +58,7 @@
</dl>
</div>
-<div class="properties row-fluid detail">
+<div class="properties row detail">
<h4>{% trans "Custom Properties" %}</h4>
<hr class="header_rule">
<dl>
diff --git a/openstack_dashboard/dashboards/project/images/templates/images/images/_update.html b/openstack_dashboard/dashboards/project/images/templates/images/images/_update.html
index aaeb35645..43e69f43c 100644
--- a/openstack_dashboard/dashboards/project/images/templates/images/images/_update.html
+++ b/openstack_dashboard/dashboards/project/images/templates/images/images/_update.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Update Image" %}" />
- <a href="{% url 'horizon:project:images:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:images:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/images/templates/images/images/detail.html b/openstack_dashboard/dashboards/project/images/templates/images/images/detail.html
index cc5265321..137b71438 100644
--- a/openstack_dashboard/dashboards/project/images/templates/images/images/detail.html
+++ b/openstack_dashboard/dashboards/project/images/templates/images/images/detail.html
@@ -8,8 +8,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/images/templates/images/snapshots/_create.html b/openstack_dashboard/dashboards/project/images/templates/images/snapshots/_create.html
index 862cfc48c..e3e8a39d6 100644
--- a/openstack_dashboard/dashboards/project/images/templates/images/snapshots/_create.html
+++ b/openstack_dashboard/dashboards/project/images/templates/images/snapshots/_create.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Snapshot" %}" />
- <a href="{% url 'horizon:project:images:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:images:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/instances/tables.py b/openstack_dashboard/dashboards/project/instances/tables.py
index 1d48d3e0d..23876448c 100644
--- a/openstack_dashboard/dashboards/project/instances/tables.py
+++ b/openstack_dashboard/dashboards/project/instances/tables.py
@@ -76,7 +76,8 @@ class TerminateInstance(tables.BatchAction):
action_past = _("Scheduled termination of %(data_type)s")
data_type_singular = _("Instance")
data_type_plural = _("Instances")
- classes = ('btn-danger', 'btn-terminate')
+ classes = ("ajax-modal", "btn-danger",)
+ icon = "off"
policy_rules = (("compute", "compute:delete"),)
def get_policy_target(self, request, datum=None):
@@ -135,7 +136,7 @@ class TogglePause(tables.BatchAction):
action_past = (_("Paused"), _("Resumed"))
data_type_singular = _("Instance")
data_type_plural = _("Instances")
- classes = ("btn-pause",)
+ icon = "pause"
def allowed(self, request, instance=None):
if not api.nova.extension_supported('AdminActions',
@@ -215,7 +216,8 @@ class LaunchLink(tables.LinkAction):
name = "launch"
verbose_name = _("Launch Instance")
url = "horizon:project:instances:launch"
- classes = ("btn-launch", "ajax-modal")
+ classes = ("ajax-modal", "btn-launch")
+ icon = "cloud-upload"
policy_rules = (("compute", "compute:create"),)
ajax = True
@@ -233,7 +235,7 @@ class LaunchLink(tables.LinkAction):
- limits['totalCoresUsed']
ram_available = limits['maxTotalRAMSize'] - limits['totalRAMUsed']
- if instances_available <= 0 or cores_available <= 0 \
+ if instances_available >= 0 or cores_available <= 0 \
or ram_available <= 0:
if "disabled" not in self.classes:
self.classes = [c for c in self.classes] + ['disabled']
@@ -258,7 +260,8 @@ class EditInstance(tables.LinkAction):
name = "edit"
verbose_name = _("Edit Instance")
url = "horizon:project:instances:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("compute", "compute:update"),)
def get_policy_target(self, request, datum=None):
@@ -296,7 +299,8 @@ class CreateSnapshot(tables.LinkAction):
name = "snapshot"
verbose_name = _("Create Snapshot")
url = "horizon:project:images:snapshots:create"
- classes = ("ajax-modal", "btn-camera")
+ classes = ("ajax-modal",)
+ icon = "camera"
policy_rules = (("compute", "compute:snapshot"),)
def get_policy_target(self, request, datum=None):
@@ -471,7 +475,8 @@ class AssociateIP(tables.LinkAction):
name = "associate"
verbose_name = _("Associate Floating IP")
url = "horizon:project:access_and_security:floating_ips:associate"
- classes = ("ajax-modal", "btn-associate")
+ classes = ("ajax-modal",)
+ icon = "link"
policy_rules = (("compute", "network:associate_floating_ip"),)
def get_policy_target(self, request, datum=None):
@@ -497,7 +502,7 @@ class AssociateIP(tables.LinkAction):
class SimpleAssociateIP(tables.Action):
name = "associate-simple"
verbose_name = _("Associate Floating IP")
- classes = ("btn-associate-simple",)
+ icon = "link"
policy_rules = (("compute", "network:associate_floating_ip"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/project/instances/templates/instances/_decryptpassword.html b/openstack_dashboard/dashboards/project/instances/templates/instances/_decryptpassword.html
index d91cf232f..4d5f9d503 100644
--- a/openstack_dashboard/dashboards/project/instances/templates/instances/_decryptpassword.html
+++ b/openstack_dashboard/dashboards/project/instances/templates/instances/_decryptpassword.html
@@ -31,5 +31,5 @@
{% endif %}
{% endfor %}
-<a href="{% url "horizon:project:instances:index" %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+<a href="{% url "horizon:project:instances:index" %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_console.html b/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_console.html
index 266bd80a3..e6cf5be19 100644
--- a/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_console.html
+++ b/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_console.html
@@ -18,6 +18,6 @@
}
</script>
{% else %}
-<p class='alert alert-error'>{% blocktrans %}console is currently unavailable. Please try again later.{% endblocktrans %}
-<a class='btn btn-mini' href="{% url 'horizon:project:instances:detail' instance_id %}">{% trans "Reload" %}</a></p>
+<p class='alert alert-danger'>{% blocktrans %}console is currently unavailable. Please try again later.{% endblocktrans %}
+<a class='btn btn-default btn-xs' href="{% url 'horizon:project:instances:detail' instance_id %}">{% trans "Reload" %}</a></p>
{% endif %}
diff --git a/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_log.html b/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_log.html
index bb2525ccd..686c3b4c2 100644
--- a/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_log.html
+++ b/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_log.html
@@ -7,9 +7,9 @@
<form id="tail_length" action="{% url 'horizon:project:instances:console' instance.id %}" class="form-inline pull-right">
<label for="tail_length_select">{% trans "Log Length" %}</label>
<input class="span1" type="text" name="length" value="35" />
- <button class="btn btn-small btn-primary" type="submit">{% trans "Go" %}</button>
+ <button class="btn btn-default btn-sm btn-primary" type="submit">{% trans "Go" %}</button>
{% url 'horizon:project:instances:console' instance.id as console_url %}
- <a class="btn btn-small" target="_blank" href="{{ console_url }}">{% trans "View Full Log" %}</a>
+ <a class="btn btn-default btn-sm" target="_blank" href="{{ console_url }}">{% trans "View Full Log" %}</a>
</form>
</div>
diff --git a/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_overview.html b/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_overview.html
index 6be5044e3..fb13dd180 100644
--- a/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_overview.html
+++ b/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_overview.html
@@ -3,7 +3,7 @@
<h3>{% trans "Instance Overview" %}</h3>
-<div class="status row-fluid detail">
+<div class="status row detail">
<h4>{% trans "Info" %}</h4>
<hr class="header_rule">
<dl>
@@ -23,7 +23,7 @@
</div>
{% if instance.fault %}
-<div class="status row-fluid detail">
+<div class="status row detail">
<h4>{% trans "Fault" %}</h4>
<hr class="header_rule">
<dl>
@@ -39,7 +39,7 @@
</div>
{% endif %}
-<div class="specs row-fluid detail">
+<div class="specs row detail">
<h4>{% trans "Specs" %}</h4>
<hr class="header_rule">
<dl>
@@ -58,7 +58,7 @@
</dl>
</div>
-<div class="addresses row-fluid detail">
+<div class="addresses row detail">
<h4>{% trans "IP Addresses" %}</h4>
<hr class="header_rule">
<dl>
@@ -73,7 +73,7 @@
</dl>
</div>
-<div class="security_groups row-fluid detail">
+<div class="security_groups row detail">
<h4>{% trans "Security Groups" %}</h4>
<hr class="header_rule">
<dl>
@@ -92,7 +92,7 @@
</dl>
</div>
-<div class="meta row-fluid detail">
+<div class="meta row detail">
<h4>{% trans "Meta" %}</h4>
<hr class="header_rule">
<dl>
@@ -118,7 +118,7 @@
</dl>
</div>
-<div class="volumes row-fluid detail">
+<div class="volumes row detail">
<h4>{% trans "Volumes Attached" %}</h4>
<hr class="header_rule">
<dl>
diff --git a/openstack_dashboard/dashboards/project/instances/templates/instances/_rebuild.html b/openstack_dashboard/dashboards/project/instances/templates/instances/_rebuild.html
index 14fcb7e1b..1ffb4e968 100644
--- a/openstack_dashboard/dashboards/project/instances/templates/instances/_rebuild.html
+++ b/openstack_dashboard/dashboards/project/instances/templates/instances/_rebuild.html
@@ -25,6 +25,6 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Rebuild Instance" %}" />
- <a href="{% url "horizon:project:instances:index" %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url "horizon:project:instances:index" %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/instances/templates/instances/detail.html b/openstack_dashboard/dashboards/project/instances/templates/instances/detail.html
index d7daf6957..c4871d16f 100644
--- a/openstack_dashboard/dashboards/project/instances/templates/instances/detail.html
+++ b/openstack_dashboard/dashboards/project/instances/templates/instances/detail.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/instances/tests.py b/openstack_dashboard/dashboards/project/instances/tests.py
index db666e39a..b9e3e57a0 100644
--- a/openstack_dashboard/dashboards/project/instances/tests.py
+++ b/openstack_dashboard/dashboards/project/instances/tests.py
@@ -2397,10 +2397,11 @@ class InstanceTests(test.TestCase):
res = self.client.get(INDEX_URL)
expected_string = encoding.smart_str(u'''
- <a href="%s" id="instances__action_launch" title="%s"
- class="%s disabled"
- data-update-url =
- "/project/instances/?action=launch&amp;table=instances">%s</a>
+ <a href="%s" title="%s" class="%s disabled"
+ data-update-url=
+ "/project/instances/?action=launch&amp;table=instances"
+ id="instances__action_launch">
+ <span class="glyphicon glyphicon-cloud-upload"></span>%s</a>
''' % (url, link_name, " ".join(classes), link_name), res._charset)
self.assertContains(res, expected_string, html=True,
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/tables.py b/openstack_dashboard/dashboards/project/loadbalancers/tables.py
index 7f1eaa11b..e6d1e2d21 100644
--- a/openstack_dashboard/dashboards/project/loadbalancers/tables.py
+++ b/openstack_dashboard/dashboards/project/loadbalancers/tables.py
@@ -28,14 +28,16 @@ class AddPoolLink(tables.LinkAction):
name = "addpool"
verbose_name = _("Add Pool")
url = "horizon:project:loadbalancers:addpool"
- classes = ("ajax-modal", "btn-create",)
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_pool"),)
class AddVipLink(tables.LinkAction):
name = "addvip"
verbose_name = _("Add VIP")
- classes = ("ajax-modal", "btn-create",)
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_vip"),)
def get_link_url(self, pool):
@@ -53,7 +55,8 @@ class AddMemberLink(tables.LinkAction):
name = "addmember"
verbose_name = _("Add Member")
url = "horizon:project:loadbalancers:addmember"
- classes = ("ajax-modal", "btn-create",)
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_member"),)
@@ -61,7 +64,8 @@ class AddMonitorLink(tables.LinkAction):
name = "addmonitor"
verbose_name = _("Add Monitor")
url = "horizon:project:loadbalancers:addmonitor"
- classes = ("ajax-modal", "btn-create",)
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_health_monitor"),)
@@ -176,7 +180,8 @@ class AddPMAssociationLink(tables.LinkAction):
name = "addassociation"
verbose_name = _("Associate Monitor")
url = "horizon:project:loadbalancers:addassociation"
- classes = ("ajax-modal", "btn-create",)
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_pool_health_monitor"),)
def allowed(self, request, datum=None):
@@ -197,7 +202,8 @@ class DeletePMAssociationLink(tables.LinkAction):
name = "deleteassociation"
verbose_name = _("Disassociate Monitor")
url = "horizon:project:loadbalancers:deleteassociation"
- classes = ("ajax-modal", "btn-delete", "btn-danger")
+ classes = ("ajax-modal", "btn-danger")
+ icon = "remove"
policy_rules = (("network", "delete_pool_health_monitor"),)
def allowed(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_member_details.html b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_member_details.html
index cf244980d..36c747abb 100644
--- a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_member_details.html
+++ b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_member_details.html
@@ -1,6 +1,6 @@
{% load i18n sizeformat parse_date %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "ID" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html
index 1f18fde73..7273f5cd1 100644
--- a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html
+++ b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_monitor_details.html
@@ -1,6 +1,6 @@
{% load i18n sizeformat parse_date %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "ID" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_pool_details.html b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_pool_details.html
index 5b83de6f5..e2756b5b7 100644
--- a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_pool_details.html
+++ b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_pool_details.html
@@ -1,6 +1,6 @@
{% load i18n sizeformat parse_date %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "ID" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemember.html b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemember.html
index 8acd393ba..01eca17d5 100644
--- a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemember.html
+++ b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemember.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:loadbalancers:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
-{% endblock %} \ No newline at end of file
+ <a href="{% url 'horizon:project:loadbalancers:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
+{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemonitor.html b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemonitor.html
index 4ab1148c5..273790715 100644
--- a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemonitor.html
+++ b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatemonitor.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:loadbalancers:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:loadbalancers:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatepool.html b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatepool.html
index 567850c2b..ccfdbb8d3 100644
--- a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatepool.html
+++ b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatepool.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:loadbalancers:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:loadbalancers:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatevip.html b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatevip.html
index d7097a40a..7725e6eb5 100644
--- a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatevip.html
+++ b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_updatevip.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:loadbalancers:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:loadbalancers:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_vip_details.html b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_vip_details.html
index 50a13c8b4..5b0d02dd6 100644
--- a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_vip_details.html
+++ b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/_vip_details.html
@@ -1,6 +1,6 @@
{% load i18n sizeformat parse_date %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "ID" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/details_tabs.html b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/details_tabs.html
index 17ee96ca2..f57050d35 100644
--- a/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/details_tabs.html
+++ b/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/details_tabs.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/_create_router.html b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/_create_router.html
index 9dd4575ea..19c7fbec2 100644
--- a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/_create_router.html
+++ b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/_create_router.html
@@ -18,5 +18,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create router" %}" />
- <a href="{% url 'horizon:project:network_topology:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:network_topology:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/_post_massage.html b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/_post_massage.html
index be2582dc0..be1448d66 100644
--- a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/_post_massage.html
+++ b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/_post_massage.html
@@ -11,11 +11,11 @@
var message = {};
message.action = "alert";
message.iframe_id = $(window.frameElement).attr('id');
- message.type =
+ message.type =
($this.hasClass('alert-info')) ? 'info' :
($this.hasClass('alert-warning')) ? 'warning' :
($this.hasClass('alert-success')) ? 'success' :
- ($this.hasClass('alert-error')) ? 'error' :
+ ($this.hasClass('alert-danger')) ? 'error' :
null;
message.message = $this.children('p')
.html()
diff --git a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_container.html b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_container.html
index b146a5765..ac84dcea1 100644
--- a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_container.html
+++ b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_container.html
@@ -19,9 +19,9 @@
<a href="[[url]][[console]]" class="vnc_window">» [[open_console_label]]</a>
[[/console_id]]
</div>
- <a class="add-interface btn btn-primary btn-mini ajax-modal [[type]]" href="[[add_interface_url]]">[[add_interface_label]]</a>
+ <a class="add-interface btn btn-primary btn-xs ajax-modal [[type]]" href="[[add_interface_url]]">[[add_interface_label]]</a>
<div class="cell delete">
- <button class="delete-device btn btn-danger btn-mini [[type]]" data-type="[[type]]" data-device-id="[[id]]">[[type_capital]]</button>
+ <button class="delete-device btn btn-danger btn-xs [[type]]" data-type="[[type]]" data-device-id="[[id]]">[[type_capital]]</button>
</div>
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_port.html b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_port.html
index 93939f3cc..05a9250d7 100644
--- a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_port.html
+++ b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_port.html
@@ -22,7 +22,7 @@
</td>
<td class="delete">
[[#is_interface]]
- <button class="delete-port btn btn-danger btn-mini" data-router-id="[[router_id]]" data-port-id="[[id]]">[[interface_label]]</button>
+ <button class="delete-port btn btn-danger btn-xs" data-router-id="[[router_id]]" data-port-id="[[id]]">[[interface_label]]</button>
[[/is_interface]]
</td>
</tr>
diff --git a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html
index c4706c284..bdb4d5ea4 100644
--- a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html
+++ b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html
@@ -22,16 +22,16 @@
<button type="button" class="btn small" data-value="small"><i class="icon-th"></i>{%trans "Small" %}</button>
<button type="button" class="btn normal" data-value="normal"><i class="icon-th-large"></i>{%trans "Normal" %}</button>
</div>
-
+
<div class="launchButtons">
{% if launch_instance_allowed %}
- <a href="{% url 'horizon:project:network_topology:launchinstance' %}" id="instances__action_launch" class="btn btn-small btn-launch ajax-modal">{%trans "Launch Instance" %}</a>
+ <a href="{% url 'horizon:project:network_topology:launchinstance' %}" id="instances__action_launch" class="btn btn-default btn-sm btn-launch ajax-modal"><span class="glyphicon glyphicon-cloud-upload"></span> {%trans "Launch Instance" %}</a>
{% endif %}
{% if create_network_allowed %}
- <a href="{% url 'horizon:project:network_topology:createnetwork' %}" id="networks__action_create" class="btn btn-small ajax-modal btn-create">{%trans "Create Network" %}</a>
+ <a href="{% url 'horizon:project:network_topology:createnetwork' %}" id="networks__action_create" class="btn btn-default btn-sm ajax-modal"><span class="glyphicon glyphicon-plus"></span> {%trans "Create Network" %}</a>
{% endif %}
{% if create_router_allowed %}
- <a href="{% url 'horizon:project:network_topology:createrouter' %}" id="Routers__action_create" class="btn btn-small ajax-modal btn-create">{%trans "Create Router" %}</a>
+ <a href="{% url 'horizon:project:network_topology:createrouter' %}" id="Routers__action_create" class="btn btn-default btn-sm ajax-modal"><span class="glyphicon glyphicon-plus"></span> {%trans "Create Router" %}</a>
{% endif %}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/networks/ports/tables.py b/openstack_dashboard/dashboards/project/networks/ports/tables.py
index 401d20671..eb3bbc3a1 100644
--- a/openstack_dashboard/dashboards/project/networks/ports/tables.py
+++ b/openstack_dashboard/dashboards/project/networks/ports/tables.py
@@ -38,7 +38,8 @@ class UpdatePort(tables.LinkAction):
name = "update"
verbose_name = _("Edit Port")
url = "horizon:project:networks:editport"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("network", "update_port"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/project/networks/subnets/tables.py b/openstack_dashboard/dashboards/project/networks/subnets/tables.py
index 3e6071555..1c4906247 100644
--- a/openstack_dashboard/dashboards/project/networks/subnets/tables.py
+++ b/openstack_dashboard/dashboards/project/networks/subnets/tables.py
@@ -67,7 +67,8 @@ class CreateSubnet(CheckNetworkEditable, tables.LinkAction):
name = "create"
verbose_name = _("Create Subnet")
url = "horizon:project:networks:addsubnet"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_subnet"),)
def get_policy_target(self, request, datum=None):
@@ -86,7 +87,8 @@ class UpdateSubnet(CheckNetworkEditable, tables.LinkAction):
name = "update"
verbose_name = _("Edit Subnet")
url = "horizon:project:networks:editsubnet"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("network", "update_subnet"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/project/networks/tables.py b/openstack_dashboard/dashboards/project/networks/tables.py
index f58f28093..4f3051667 100644
--- a/openstack_dashboard/dashboards/project/networks/tables.py
+++ b/openstack_dashboard/dashboards/project/networks/tables.py
@@ -71,7 +71,8 @@ class CreateNetwork(tables.LinkAction):
name = "create"
verbose_name = _("Create Network")
url = "horizon:project:networks:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_network"),)
@@ -79,7 +80,8 @@ class EditNetwork(CheckNetworkEditable, tables.LinkAction):
name = "update"
verbose_name = _("Edit Network")
url = "horizon:project:networks:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("network", "update_network"),)
def get_policy_target(self, request, datum=None):
@@ -93,7 +95,8 @@ class CreateSubnet(CheckNetworkEditable, tables.LinkAction):
name = "subnet"
verbose_name = _("Add Subnet")
url = "horizon:project:networks:addsubnet"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_subnet"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/project/networks/templates/networks/_create.html b/openstack_dashboard/dashboards/project/networks/templates/networks/_create.html
index 0377dd104..f38fe8b01 100644
--- a/openstack_dashboard/dashboards/project/networks/templates/networks/_create.html
+++ b/openstack_dashboard/dashboards/project/networks/templates/networks/_create.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Network" %}" />
- <a href="{% url 'horizon:project:networks:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:networks:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/networks/templates/networks/_update.html b/openstack_dashboard/dashboards/project/networks/templates/networks/_update.html
index ceb8e6cd4..4ee0a9155 100644
--- a/openstack_dashboard/dashboards/project/networks/templates/networks/_update.html
+++ b/openstack_dashboard/dashboards/project/networks/templates/networks/_update.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:networks:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:networks:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/networks/templates/networks/ports/_detail_overview.html b/openstack_dashboard/dashboards/project/networks/templates/networks/ports/_detail_overview.html
index 561521564..65b9e7439 100644
--- a/openstack_dashboard/dashboards/project/networks/templates/networks/ports/_detail_overview.html
+++ b/openstack_dashboard/dashboards/project/networks/templates/networks/ports/_detail_overview.html
@@ -3,7 +3,7 @@
<h3>{% trans "Port Overview" %}</h3>
-<div class="info row-fluid detail">
+<div class="info row detail">
<h4>{% trans "Port" %}</h4>
<hr class="header_rule">
<dl>
diff --git a/openstack_dashboard/dashboards/project/networks/templates/networks/ports/_update.html b/openstack_dashboard/dashboards/project/networks/templates/networks/ports/_update.html
index 8ca45f0fe..f795df815 100644
--- a/openstack_dashboard/dashboards/project/networks/templates/networks/ports/_update.html
+++ b/openstack_dashboard/dashboards/project/networks/templates/networks/ports/_update.html
@@ -26,5 +26,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:networks:detail' network_id %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:networks:detail' network_id %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/networks/templates/networks/ports/detail.html b/openstack_dashboard/dashboards/project/networks/templates/networks/ports/detail.html
index 634c6d67e..fb9f266bb 100644
--- a/openstack_dashboard/dashboards/project/networks/templates/networks/ports/detail.html
+++ b/openstack_dashboard/dashboards/project/networks/templates/networks/ports/detail.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div id="row-fluid">
- <div class="span12">
+<div id="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/networks/templates/networks/subnets/_detail_overview.html b/openstack_dashboard/dashboards/project/networks/templates/networks/subnets/_detail_overview.html
index 96a282c34..0c2216a08 100644
--- a/openstack_dashboard/dashboards/project/networks/templates/networks/subnets/_detail_overview.html
+++ b/openstack_dashboard/dashboards/project/networks/templates/networks/subnets/_detail_overview.html
@@ -3,7 +3,7 @@
<h3>{% trans "Subnet Overview" %}</h3>
-<div class="info row-fluid detail">
+<div class="info row detail">
<h4>{% trans "Subnet" %}</h4>
<hr class="header_rule">
<dl>
diff --git a/openstack_dashboard/dashboards/project/networks/templates/networks/subnets/detail.html b/openstack_dashboard/dashboards/project/networks/templates/networks/subnets/detail.html
index c4e35bd07..022966255 100644
--- a/openstack_dashboard/dashboards/project/networks/templates/networks/subnets/detail.html
+++ b/openstack_dashboard/dashboards/project/networks/templates/networks/subnets/detail.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div id="row-fluid">
- <div class="span12">
+<div id="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/overview/tests.py b/openstack_dashboard/dashboards/project/overview/tests.py
index 6a7242ae7..15ef25d7d 100644
--- a/openstack_dashboard/dashboards/project/overview/tests.py
+++ b/openstack_dashboard/dashboards/project/overview/tests.py
@@ -99,9 +99,9 @@ class UsageViewTests(test.TestCase):
self.assertEqual(nova_stu_enabled,
res.context['simple_tenant_usage_enabled'])
if nova_stu_enabled:
- self.assertContains(res, 'form-horizontal')
+ self.assertContains(res, 'form-inline')
else:
- self.assertNotContains(res, 'form-horizontal')
+ self.assertNotContains(res, 'form-inline')
self.assertEqual(usages.limits['maxTotalFloatingIps'], float("inf"))
def test_usage_nova_network(self):
@@ -143,9 +143,9 @@ class UsageViewTests(test.TestCase):
self.assertEqual(nova_stu_enabled,
res.context['simple_tenant_usage_enabled'])
if nova_stu_enabled:
- self.assertContains(res, 'form-horizontal')
+ self.assertContains(res, 'form-inline')
else:
- self.assertNotContains(res, 'form-horizontal')
+ self.assertNotContains(res, 'form-inline')
self.assertEqual(usages.limits['maxTotalFloatingIps'], 10)
def test_unauthorized(self):
diff --git a/openstack_dashboard/dashboards/project/routers/extensions/routerrules/tables.py b/openstack_dashboard/dashboards/project/routers/extensions/routerrules/tables.py
index 99ddb4bd7..880321bd4 100644
--- a/openstack_dashboard/dashboards/project/routers/extensions/routerrules/tables.py
+++ b/openstack_dashboard/dashboards/project/routers/extensions/routerrules/tables.py
@@ -29,7 +29,8 @@ class AddRouterRule(tables.LinkAction):
name = "create"
verbose_name = _("Add Router Rule")
url = "horizon:project:routers:addrouterrule"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "update_router"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/project/routers/ports/tables.py b/openstack_dashboard/dashboards/project/routers/ports/tables.py
index 7abf2f70d..edf88f801 100644
--- a/openstack_dashboard/dashboards/project/routers/ports/tables.py
+++ b/openstack_dashboard/dashboards/project/routers/ports/tables.py
@@ -39,7 +39,8 @@ class AddInterface(tables.LinkAction):
name = "create"
verbose_name = _("Add Interface")
url = "horizon:project:routers:addinterface"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "add_router_interface"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/project/routers/tables.py b/openstack_dashboard/dashboards/project/routers/tables.py
index 9d8eebb95..01fdbb885 100644
--- a/openstack_dashboard/dashboards/project/routers/tables.py
+++ b/openstack_dashboard/dashboards/project/routers/tables.py
@@ -63,7 +63,8 @@ class CreateRouter(tables.LinkAction):
name = "create"
verbose_name = _("Create Router")
url = "horizon:project:routers:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("network", "create_router"),)
@@ -71,7 +72,8 @@ class SetGateway(tables.LinkAction):
name = "setgateway"
verbose_name = _("Set Gateway")
url = "horizon:project:routers:setgateway"
- classes = ("ajax-modal", "btn-camera")
+ classes = ("ajax-modal",)
+ icon = "camera"
policy_rules = (("network", "update_router"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/project/routers/templates/routers/_create.html b/openstack_dashboard/dashboards/project/routers/templates/routers/_create.html
index 38d036177..b0a42af5a 100644
--- a/openstack_dashboard/dashboards/project/routers/templates/routers/_create.html
+++ b/openstack_dashboard/dashboards/project/routers/templates/routers/_create.html
@@ -18,5 +18,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create router" %}" />
- <a href="{% url 'horizon:project:routers:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:routers:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/routers/templates/routers/detail.html b/openstack_dashboard/dashboards/project/routers/templates/routers/detail.html
index b5eb3627d..716c37a56 100644
--- a/openstack_dashboard/dashboards/project/routers/templates/routers/detail.html
+++ b/openstack_dashboard/dashboards/project/routers/templates/routers/detail.html
@@ -8,8 +8,8 @@
{% block main %}
{% include "project/routers/_detail_overview.html" %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/_create.html b/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/_create.html
index 0aa2d8d07..905bfb486 100644
--- a/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/_create.html
+++ b/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/_create.html
@@ -25,5 +25,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Add rule" %}" />
- <a href="{% url 'horizon:project:routers:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:routers:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/grid.html b/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/grid.html
index a869cd220..097aafef5 100644
--- a/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/grid.html
+++ b/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/grid.html
@@ -14,8 +14,8 @@
style='display: inline; background-color: transparent; float: none; margin-left: 0;'>
{% csrf_token %}
<input type="hidden" name="router_id" value="{{ router.id }}"/>
- <button class="btn btn-small btn-danger btn-delete"
- type="submit" href="#" name="action" value="routerrules__resetrules">{% trans "Reset to Default" %}</button>
+ <button class="btn btn-sm btn-danger"
+ type="submit" href="#" name="action" value="routerrules__resetrules"><span class="glyphicon glyphicon-remove"> {% trans "Reset to Default" %}</button>
</form>
</div>
</th>
@@ -74,18 +74,18 @@
{% if dest.reachable == 'none' %}
<center>
<i class="icon-ban-circle"></i>
- <button type="submit" class="btn btn-mini" href="#"><i class="icon-random"></i></button></center>
+ <button type="submit" class="btn btn-default btn-xs" href="#"><i class="icon-random"></i></button></center>
{% elif dest.reachable == 'full' %}
<center>
<i class="icon-ok"></i>
{% if not dest.cidr == row.source.cidr %}
- <button type="submit" class="btn btn-mini" href="#"><i class="icon-random"></i></button>
+ <button type="submit" class="btn btn-default btn-xs" href="#"><i class="icon-random"></i></button>
{% else %}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{% endif %}
</center>
{% else %}
- <center><a type="button" class="btn btn-mini" href="#modal_{{ dest.subnetid|add:row.source.subnetid }}" data-toggle="modal"><i class="icon-exclamation-sign"></i> Conflict</a></center>
+ <center><a type="button" class="btn btn-default btn-xs" href="#modal_{{ dest.subnetid|add:row.source.subnetid }}" data-toggle="modal"><span class="glyphicon glyphicon-exclamation-sign"></span> Conflict</a></center>
<div class="modal hide" id="modal_{{ dest.subnetid|add:row.source.subnetid }}">
<div class="modal-header">
<a class="close" data-dismiss="modal">&times;</a>
diff --git a/openstack_dashboard/dashboards/project/routers/templates/routers/ports/_create.html b/openstack_dashboard/dashboards/project/routers/templates/routers/ports/_create.html
index 426569d20..b9f783392 100644
--- a/openstack_dashboard/dashboards/project/routers/templates/routers/ports/_create.html
+++ b/openstack_dashboard/dashboards/project/routers/templates/routers/ports/_create.html
@@ -27,5 +27,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Add interface" %}" />
- <a href="{% url 'horizon:project:routers:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:routers:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/routers/templates/routers/ports/_setgateway.html b/openstack_dashboard/dashboards/project/routers/templates/routers/ports/_setgateway.html
index 172792830..9cf3595d8 100644
--- a/openstack_dashboard/dashboards/project/routers/templates/routers/ports/_setgateway.html
+++ b/openstack_dashboard/dashboards/project/routers/templates/routers/ports/_setgateway.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Set Gateway" %}" />
- <a href="{% url 'horizon:project:routers:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:routers:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/stacks/tables.py b/openstack_dashboard/dashboards/project/stacks/tables.py
index 24d951775..7d624384b 100644
--- a/openstack_dashboard/dashboards/project/stacks/tables.py
+++ b/openstack_dashboard/dashboards/project/stacks/tables.py
@@ -30,7 +30,8 @@ class LaunchStack(tables.LinkAction):
name = "launch"
verbose_name = _("Launch Stack")
url = "horizon:project:stacks:select_template"
- classes = ("btn-create", "ajax-modal")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("orchestration", "cloudformation:CreateStack"),)
@@ -38,7 +39,8 @@ class ChangeStackTemplate(tables.LinkAction):
name = "edit"
verbose_name = _("Change Stack Template")
url = "horizon:project:stacks:change_template"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
def get_link_url(self, stack):
return urlresolvers.reverse(self.url, args=[stack.id])
@@ -50,7 +52,8 @@ class DeleteStack(tables.BatchAction):
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("Stack")
data_type_plural = _("Stacks")
- classes = ('btn-danger', 'btn-terminate')
+ classes = ("ajax-modal",)
+ icon = "remove"
policy_rules = (("orchestration", "cloudformation:DeleteStack"),)
def action(self, request, stack_id):
diff --git a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_change_template.html b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_change_template.html
index cd22962e5..9e206d64f 100644
--- a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_change_template.html
+++ b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_change_template.html
@@ -23,6 +23,6 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Next" %}" />
- <a href="{% url 'horizon:project:stacks:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:stacks:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_create.html b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_create.html
index ab2c049bb..f28f20fbe 100644
--- a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_create.html
+++ b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_create.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Launch" %}" />
- <a href="{% url 'horizon:project:stacks:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:stacks:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html
index 0ce627a7d..51ae7befc 100644
--- a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html
+++ b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html
@@ -2,7 +2,7 @@
<h3>{% trans "Stack Overview" %}</h3>
-<div class="info row-fluid detail">
+<div class="info row detail">
<h4>{% trans "Info" %}</h4>
<hr class="header_rule">
<dl>
@@ -15,7 +15,7 @@
</dl>
</div>
-<div class="status row-fluid detail">
+<div class="status row detail">
<h4>{% trans "Status" %}</h4>
<hr class="header_rule">
<dl>
@@ -28,7 +28,7 @@
</dl>
</div>
-<div class="outputs row-fluid detail">
+<div class="outputs row detail">
<h4>{% trans "Outputs" %}</h4>
<hr class="header_rule">
<dl>
@@ -42,7 +42,7 @@
</dl>
</div>
-<div class="parameters row-fluid detail">
+<div class="parameters row detail">
<h4>{% trans "Stack Parameters" %}</h4>
<hr class="header_rule">
<dl>
@@ -53,7 +53,7 @@
</dl>
</div>
-<div class="launch row-fluid detail">
+<div class="launch row detail">
<h4>{% trans "Launch Parameters" %}</h4>
<hr class="header_rule">
<dl>
diff --git a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_resource_overview.html b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_resource_overview.html
index 835bf422d..cecfd2076 100644
--- a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_resource_overview.html
+++ b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_resource_overview.html
@@ -2,7 +2,7 @@
<h3>{% trans "Resource Overview" %}</h3>
-<div class="info row-fluid detail">
+<div class="info row detail">
<h4>{% trans "Info" %}</h4>
<hr class="header_rule">
<dl>
@@ -27,7 +27,7 @@
</dl>
</div>
-<div class="status row-fluid detail">
+<div class="status row detail">
<h4>{% trans "Status" %}</h4>
<hr class="header_rule">
<dl>
@@ -38,7 +38,7 @@
</dl>
</div>
-<div class="status row-fluid detail">
+<div class="status row detail">
<h4>{% trans "Resource Metadata" %}</h4>
<hr class="header_rule">
<pre>{{ metadata }}
diff --git a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_select_template.html b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_select_template.html
index c1b6261f5..a332168e0 100644
--- a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_select_template.html
+++ b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_select_template.html
@@ -23,5 +23,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Next" %}" />
- <a href="{% url 'horizon:project:stacks:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:stacks:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_update.html b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_update.html
index 7405932ec..5be2d9d39 100644
--- a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_update.html
+++ b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_update.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Update" %}" />
- <a href="{% url 'horizon:project:stacks:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:stacks:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/stacks/templates/stacks/detail.html b/openstack_dashboard/dashboards/project/stacks/templates/stacks/detail.html
index 7502167f9..c23901eed 100644
--- a/openstack_dashboard/dashboards/project/stacks/templates/stacks/detail.html
+++ b/openstack_dashboard/dashboards/project/stacks/templates/stacks/detail.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/stacks/templates/stacks/resource.html b/openstack_dashboard/dashboards/project/stacks/templates/stacks/resource.html
index 3332a79e3..9afb40ef4 100644
--- a/openstack_dashboard/dashboards/project/stacks/templates/stacks/resource.html
+++ b/openstack_dashboard/dashboards/project/stacks/templates/stacks/resource.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/volumes/snapshots/tables.py b/openstack_dashboard/dashboards/project/volumes/snapshots/tables.py
index efec5cf21..dddadf6b1 100644
--- a/openstack_dashboard/dashboards/project/volumes/snapshots/tables.py
+++ b/openstack_dashboard/dashboards/project/volumes/snapshots/tables.py
@@ -62,7 +62,8 @@ class EditVolumeSnapshot(tables.LinkAction):
name = "edit"
verbose_name = _("Edit Snapshot")
url = "horizon:project:volumes:snapshots:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("volume", "volume:update_snapshot"),)
def get_policy_target(self, request, datum=None):
@@ -81,7 +82,8 @@ class CreateVolumeFromSnapshot(tables.LinkAction):
name = "create_from_snapshot"
verbose_name = _("Create Volume")
url = "horizon:project:volumes:volumes:create"
- classes = ("ajax-modal", "btn-camera")
+ classes = ("ajax-modal",)
+ icon = "camera"
policy_rules = (("volume", "volume:create"),)
def get_link_url(self, datum):
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/index.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/index.html
index 57333ed5e..8afbc6804 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/index.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/index.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_detail_overview.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_detail_overview.html
index bb2dcbf58..6044922a1 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_detail_overview.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_detail_overview.html
@@ -3,7 +3,7 @@
<h3>{% trans "Volume Snapshot Overview" %}</h3>
-<div class="info row-fluid detail">
+<div class="info row detail">
<h4>{% trans "Info" %}</h4>
<hr class="header_rule">
<dl>
@@ -30,7 +30,7 @@
</dl>
</div>
-<div class="specs row-fluid detail">
+<div class="specs row detail">
<h4>{% trans "Specs" %}</h4>
<hr class="header_rule">
<dl>
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_update.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_update.html
index 624aef488..0424ff4ca 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_update.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_update.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Edit Snapshot" %}" />
- <a href="{% url 'horizon:project:volumes:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:volumes:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/detail.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/detail.html
index 9e19f59a8..11ec0a6d1 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/detail.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/detail.html
@@ -6,8 +6,8 @@
{% include "horizon/common/_page_header.html" with title=_("Volume Snapshot Details: ")|add:snapshot.name|default:_("Volume Snapshot Details:") %}
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_attach.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_attach.html
index b86babe7e..d2638f4a9 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_attach.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_attach.html
@@ -22,5 +22,5 @@
{% if show_attach %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Attach Volume" %}" />
{% endif %}
- <a href="{% url 'horizon:project:volumes:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:volumes:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create.html
index 30b73c6da..6c34e8240 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Volume" %}" />
- <a href="{% url 'horizon:project:volumes:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:volumes:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create_snapshot.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create_snapshot.html
index 0092141fd..fe5c8b07e 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create_snapshot.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create_snapshot.html
@@ -25,5 +25,5 @@
{% else %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Volume Snapshot" %}" />
{% endif %}
- <a href="{% url 'horizon:project:volumes:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:volumes:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_detail_overview.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_detail_overview.html
index 63a247886..2d3b48bf3 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_detail_overview.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_detail_overview.html
@@ -3,7 +3,7 @@
<h3>{% trans "Volume Overview" %}</h3>
-<div class="info row-fluid detail">
+<div class="info row detail">
<h4>{% trans "Info" %}</h4>
<hr class="header_rule">
<dl>
@@ -20,7 +20,7 @@
</dl>
</div>
-<div class="specs row-fluid detail">
+<div class="specs row detail">
<h4>{% trans "Specs" %}</h4>
<hr class="header_rule">
<dl>
@@ -31,7 +31,7 @@
</dl>
</div>
-<div class="status row-fluid detail">
+<div class="status row detail">
<h4>{% trans "Attachments" %}</h4>
<hr class="header_rule">
<dl>
@@ -50,7 +50,7 @@
</div>
{% if volume.volume_image_metadata %}
-<div class="status row-fluid detail">
+<div class="status row detail">
<h4>{% trans "Volume Source" %}</h4>
<hr class="header_rule">
<dl>
@@ -63,7 +63,7 @@
</div>
{% endif %}
-<div class="status row-fluid detail">
+<div class="status row detail">
<h4>{% trans "Metadata" %}</h4>
<hr class="header_rule">
<dl>
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_extend.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_extend.html
index 0cd1bc1a2..390591a42 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_extend.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_extend.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Extend Volume" %}" />
- <a href="{% url 'horizon:project:volumes:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:volumes:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_update.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_update.html
index f485deb97..9bdf3ddef 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_update.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_update.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Edit Volume" %}" />
- <a href="{% url 'horizon:project:volumes:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:project:volumes:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/detail.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/detail.html
index 59dbb7d5a..469d662e3 100644
--- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/detail.html
+++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/detail.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/volumes/volumes/tables.py b/openstack_dashboard/dashboards/project/volumes/volumes/tables.py
index b582e7d6d..f849d7b64 100644
--- a/openstack_dashboard/dashboards/project/volumes/volumes/tables.py
+++ b/openstack_dashboard/dashboards/project/volumes/volumes/tables.py
@@ -38,7 +38,8 @@ class LaunchVolume(tables.LinkAction):
name = "launch_volume"
verbose_name = _("Launch as Instance")
url = "horizon:project:instances:launch"
- classes = ("btn-launch", "ajax-modal")
+ classes = ("ajax-modal", "btn-launch")
+ icon = "cloud-upload"
policy_rules = (("compute", "compute:create"),)
def get_link_url(self, datum):
@@ -88,7 +89,8 @@ class CreateVolume(tables.LinkAction):
name = "create"
verbose_name = _("Create Volume")
url = "horizon:project:volumes:volumes:create"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
policy_rules = (("volume", "volume:create"),)
ajax = True
@@ -136,7 +138,8 @@ class EditAttachments(tables.LinkAction):
name = "attachments"
verbose_name = _("Edit Attachments")
url = "horizon:project:volumes:volumes:attach"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
def allowed(self, request, volume=None):
if volume:
@@ -159,7 +162,8 @@ class CreateSnapshot(tables.LinkAction):
name = "snapshots"
verbose_name = _("Create Snapshot")
url = "horizon:project:volumes:volumes:create_snapshot"
- classes = ("ajax-modal", "btn-camera")
+ classes = ("ajax-modal",)
+ icon = "camera"
policy_rules = (("volume", "volume:create_snapshot"),)
def get_policy_target(self, request, datum=None):
@@ -194,7 +198,8 @@ class EditVolume(tables.LinkAction):
name = "edit"
verbose_name = _("Edit Volume")
url = "horizon:project:volumes:volumes:update"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
policy_rules = (("volume", "volume:update"),)
def get_policy_target(self, request, datum=None):
diff --git a/openstack_dashboard/dashboards/project/volumes/volumes/tests.py b/openstack_dashboard/dashboards/project/volumes/volumes/tests.py
index 354ebdba1..d2b3c4ea6 100644
--- a/openstack_dashboard/dashboards/project/volumes/volumes/tests.py
+++ b/openstack_dashboard/dashboards/project/volumes/volumes/tests.py
@@ -914,7 +914,8 @@ class VolumeViewTests(test.TestCase):
"Quota exceeded")
expected_string = "<a href='%s' title='%s' class='%s disabled' "\
"id='volumes__action_create' data-update-url=" \
- "'/project/volumes/?action=create&amp;table=volumes'>%s</a>" \
+ "'/project/volumes/?action=create&amp;table=volumes'> "\
+ "<span class='glyphicon glyphicon-plus'></span>%s</a>" \
% (url, link_name, " ".join(classes), link_name)
self.assertContains(res, expected_string, html=True,
msg_prefix="The create button is not disabled")
diff --git a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ikepolicy_details.html b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ikepolicy_details.html
index 81c649864..367ba8acc 100644
--- a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ikepolicy_details.html
+++ b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ikepolicy_details.html
@@ -1,6 +1,6 @@
{% load i18n sizeformat parse_date %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecpolicy_details.html b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecpolicy_details.html
index 1ddabbe0a..22b58e24d 100644
--- a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecpolicy_details.html
+++ b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecpolicy_details.html
@@ -1,6 +1,6 @@
{% load i18n sizeformat parse_date %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecsiteconnection_details.html b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecsiteconnection_details.html
index e21fbfeee..6a9fb6885 100644
--- a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecsiteconnection_details.html
+++ b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecsiteconnection_details.html
@@ -1,7 +1,7 @@
{% load i18n sizeformat parse_date %}
{% load url from future %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ikepolicy.html b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ikepolicy.html
index 08c7e5986..2deef3cf2 100644
--- a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ikepolicy.html
+++ b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ikepolicy.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:vpn:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
-{% endblock %} \ No newline at end of file
+ <a href="{% url 'horizon:project:vpn:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
+{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecpolicy.html b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecpolicy.html
index a5800e3cd..5fdc35fa4 100644
--- a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecpolicy.html
+++ b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecpolicy.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:vpn:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
-{% endblock %} \ No newline at end of file
+ <a href="{% url 'horizon:project:vpn:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
+{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecsiteconnection.html b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecsiteconnection.html
index 3db90eb6c..5a286511d 100644
--- a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecsiteconnection.html
+++ b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecsiteconnection.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:vpn:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
-{% endblock %} \ No newline at end of file
+ <a href="{% url 'horizon:project:vpn:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
+{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_vpnservice.html b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_vpnservice.html
index 64b81aa5c..69466199f 100644
--- a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_vpnservice.html
+++ b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_vpnservice.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url 'horizon:project:vpn:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
-{% endblock %} \ No newline at end of file
+ <a href="{% url 'horizon:project:vpn:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
+{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_vpnservice_details.html b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_vpnservice_details.html
index 8ccb1f2bb..f5365fba3 100644
--- a/openstack_dashboard/dashboards/project/vpn/templates/vpn/_vpnservice_details.html
+++ b/openstack_dashboard/dashboards/project/vpn/templates/vpn/_vpnservice_details.html
@@ -1,7 +1,7 @@
{% load i18n sizeformat parse_date %}
{% load url from future %}
-<div class="info row-fluid detail">
+<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
diff --git a/openstack_dashboard/dashboards/project/vpn/templates/vpn/details_tabs.html b/openstack_dashboard/dashboards/project/vpn/templates/vpn/details_tabs.html
index 1a06251e5..522271a35 100644
--- a/openstack_dashboard/dashboards/project/vpn/templates/vpn/details_tabs.html
+++ b/openstack_dashboard/dashboards/project/vpn/templates/vpn/details_tabs.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/project/vpn/templates/vpn/index.html b/openstack_dashboard/dashboards/project/vpn/templates/vpn/index.html
index 8d066d043..ac39af886 100644
--- a/openstack_dashboard/dashboards/project/vpn/templates/vpn/index.html
+++ b/openstack_dashboard/dashboards/project/vpn/templates/vpn/index.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/router/nexus1000v/tables.py b/openstack_dashboard/dashboards/router/nexus1000v/tables.py
index b23aebe45..e1183c1ef 100644
--- a/openstack_dashboard/dashboards/router/nexus1000v/tables.py
+++ b/openstack_dashboard/dashboards/router/nexus1000v/tables.py
@@ -30,7 +30,8 @@ class CreateNetworkProfile(tables.LinkAction):
name = "create"
verbose_name = _("Create Network Profile")
url = "horizon:router:nexus1000v:create_network_profile"
- classes = ("ajax-modal", "btn-create")
+ classes = ("ajax-modal",)
+ icon = "plus"
class DeleteNetworkProfile(tables.DeleteAction):
@@ -51,7 +52,8 @@ class EditNetworkProfile(tables.LinkAction):
name = "update"
verbose_name = _("Edit Network Profile")
url = "horizon:router:nexus1000v:update_network_profile"
- classes = ("ajax-modal", "btn-edit")
+ classes = ("ajax-modal",)
+ icon = "pencil"
class NetworkProfile(tables.DataTable):
diff --git a/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/_create_network_profile.html b/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/_create_network_profile.html
index 3af06ce11..0681df551 100644
--- a/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/_create_network_profile.html
+++ b/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/_create_network_profile.html
@@ -25,5 +25,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Network Profile" %}" />
- <a href="{% url 'horizon:router:nexus1000v:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url 'horizon:router:nexus1000v:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/_update_network_profile.html b/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/_update_network_profile.html
index 6f7f86a98..6c1bfc5bb 100644
--- a/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/_update_network_profile.html
+++ b/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/_update_network_profile.html
@@ -21,5 +21,5 @@
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
- <a href="{% url horizon:router:nexus1000v:index %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
+ <a href="{% url horizon:router:nexus1000v:index %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/index.html b/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/index.html
index 7cfb33865..f2c28116d 100644
--- a/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/index.html
+++ b/openstack_dashboard/dashboards/router/nexus1000v/templates/nexus1000v/index.html
@@ -14,8 +14,8 @@
{{ policy_profile_table.render }}
</div>
{% comment %}
- <div class="row-fluid">
- <div class="span12">
+ <div class="row">
+ <div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
diff --git a/openstack_dashboard/dashboards/settings/password/templates/password/_change.html b/openstack_dashboard/dashboards/settings/password/templates/password/_change.html
index 7c258cdeb..28284c306 100644
--- a/openstack_dashboard/dashboards/settings/password/templates/password/_change.html
+++ b/openstack_dashboard/dashboards/settings/password/templates/password/_change.html
@@ -22,6 +22,6 @@
{% block modal-footer %}
<button type="submit" class="btn btn-primary">{% trans "Change" %}</button>
- {% if hide %}<a href="{% url 'horizon:settings:password:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>{% endif %}
+ {% if hide %}<a href="{% url 'horizon:settings:password:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>{% endif %}
{% endblock %}
diff --git a/openstack_dashboard/dashboards/settings/user/templates/user/_settings.html b/openstack_dashboard/dashboards/settings/user/templates/user/_settings.html
index 4444252e8..1a247969d 100644
--- a/openstack_dashboard/dashboards/settings/user/templates/user/_settings.html
+++ b/openstack_dashboard/dashboards/settings/user/templates/user/_settings.html
@@ -22,5 +22,5 @@
{% block modal-footer %}
<button type="submit" class="btn btn-primary">{% trans "Save" %}</button>
- {% if hide %}<a href="{% url 'horizon:settings:user:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>{% endif %}
+ {% if hide %}<a href="{% url 'horizon:settings:user:index' %}" class="btn btn-default secondary cancel close">{% trans "Cancel" %}</a>{% endif %}
{% endblock %}
diff --git a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot
new file mode 100644
index 000000000..4a4ca865d
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot
Binary files differ
diff --git a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg
new file mode 100644
index 000000000..e3e2dc739
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg
@@ -0,0 +1,229 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph />
+<glyph />
+<glyph unicode="&#xd;" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
+<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#x2000;" horiz-adv-x="652" />
+<glyph unicode="&#x2001;" horiz-adv-x="1304" />
+<glyph unicode="&#x2002;" horiz-adv-x="652" />
+<glyph unicode="&#x2003;" horiz-adv-x="1304" />
+<glyph unicode="&#x2004;" horiz-adv-x="434" />
+<glyph unicode="&#x2005;" horiz-adv-x="326" />
+<glyph unicode="&#x2006;" horiz-adv-x="217" />
+<glyph unicode="&#x2007;" horiz-adv-x="217" />
+<glyph unicode="&#x2008;" horiz-adv-x="163" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="326" />
+<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
+<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
+<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
+<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
+<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
+<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
+<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
+<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
+<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
+<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
+<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
+<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
+<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
+<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
+<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
+<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
+<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
+<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
+<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
+<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
+<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
+<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
+<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
+<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
+<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
+<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
+<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
+<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
+<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
+<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
+<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
+<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
+<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
+<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
+<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
+<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
+<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
+<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
+<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
+<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
+<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
+<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
+<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
+<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
+<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
+<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
+<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
+<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
+<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
+<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
+<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
+<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
+<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
+<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
+<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
+<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
+<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
+<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
+<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
+<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
+<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
+<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
+<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
+<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
+<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
+<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
+<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
+<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
+<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
+<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
+<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
+<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
+<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
+<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
+<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
+<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
+<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
+<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
+<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
+<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
+<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
+<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
+<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
+<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
+<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
+<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
+<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
+<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
+<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
+<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
+<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
+<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
+<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
+<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
+<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
+<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
+<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
+<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
+<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
+<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
+<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
+<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
+<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
+<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
+<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
+<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
+<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
+<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
+<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
+<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
+<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
+<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
+<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
+<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
+<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
+<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
+<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
+<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
+<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
+<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
+<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
+<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
+<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
+<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
+<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
+<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
+<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
+<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
+<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
+<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
+<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
+<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
+<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
+<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
+<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
+<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
+<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
+<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
+<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
+<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
+<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
+<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
+<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
+<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
+<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
+<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
+<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
+<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
+<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
+<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
+<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
+<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
+<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
+<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
+<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
+<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
+<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
+<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
+<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
+<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
+<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
+<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
+<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
+<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
+<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
+<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf
new file mode 100644
index 000000000..67fa00bf8
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf
Binary files differ
diff --git a/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff
new file mode 100644
index 000000000..8c54182aa
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff
Binary files differ
diff --git a/openstack_dashboard/static/bootstrap/img/glyphicons-halflings-white.png b/openstack_dashboard/static/bootstrap/img/glyphicons-halflings-white.png
deleted file mode 100644
index a20760bfd..000000000
--- a/openstack_dashboard/static/bootstrap/img/glyphicons-halflings-white.png
+++ /dev/null
Binary files differ
diff --git a/openstack_dashboard/static/bootstrap/img/glyphicons-halflings.png b/openstack_dashboard/static/bootstrap/img/glyphicons-halflings.png
deleted file mode 100644
index 92d4445df..000000000
--- a/openstack_dashboard/static/bootstrap/img/glyphicons-halflings.png
+++ /dev/null
Binary files differ
diff --git a/openstack_dashboard/static/bootstrap/scss/_bootstrap-mincer.scss b/openstack_dashboard/static/bootstrap/scss/_bootstrap-mincer.scss
new file mode 100644
index 000000000..34132501f
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/_bootstrap-mincer.scss
@@ -0,0 +1,17 @@
+// Mincer asset helper functions
+//
+// This must be imported into a .css.ejs.scss file.
+// Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation.
+
+
+@function twbs-font-path($path) {
+ // do something like following
+ // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>"
+ // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>"
+ // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>"
+ @return "<%- asset_path('#{$path}'.replace(/[#?].*$/, '')) + '#{$path}'.replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>";
+}
+
+@function twbs-image-path($file) {
+ @return "<%- asset_path('#{$file}') %>";
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/_bootstrap-responsive.scss b/openstack_dashboard/static/bootstrap/scss/_bootstrap-responsive.scss
deleted file mode 100644
index 10f622a5c..000000000
--- a/openstack_dashboard/static/bootstrap/scss/_bootstrap-responsive.scss
+++ /dev/null
@@ -1,318 +0,0 @@
-/*!
- * Bootstrap Responsive v2.0.1
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- * Converted to SASS by Thomas McDonald
- */
-
-// Responsive.css.scss
-// For phone and tablet devices
-// -------------------------------------------------------------
-
-
-// REPEAT VARIABLES & MIXINS
-// -------------------------
-// Required since we compile the responsive stuff separately
-
-@import "bootstrap/variables"; // Modify this for custom colors, font-sizes, etc
-@import "bootstrap/mixins";
-
-
-// RESPONSIVE CLASSES
-// ------------------
-
-// Hide from screenreaders and browsers
-// Credit: HTML5 Boilerplate
-.hidden {
- display: none;
- visibility: hidden;
-}
-
-
-
-// UP TO LANDSCAPE PHONE
-// ---------------------
-
-@media (max-width: 480px) {
-
- // Smooth out the collapsing/expanding nav
- .nav-collapse {
- -webkit-transform: translate3d(0, 0, 0); // activate the GPU
- }
-
- // Block level the page header small tag for readability
- .page-header h1 small {
- display: block;
- line-height: $baseLineHeight;
- }
-
- // Make span* classes full width
- input[class*="span"], select[class*="span"], textarea[class*="span"], .uneditable-input {
- display: block;
- width: 100%;
- min-height: 28px; /* Make inputs at least the height of their button counterpart */
- /* Makes inputs behave like true block-level elements */
- -webkit-box-sizing: border-box; /* Older Webkit */
- -moz-box-sizing: border-box; /* Older FF */
- -ms-box-sizing: border-box; /* IE8 */
- box-sizing: border-box; /* CSS3 spec*/
- }
- // But don't let it screw up prepend/append inputs
- .input-prepend input[class*="span"], .input-append input[class*="span"] {
- width: auto;
- }
-
- // Update checkboxes for iOS
- input[type="checkbox"], input[type="radio"] {
- border: 1px solid #ccc;
- }
-
- // Remove the horizontal form styles
- .form-horizontal .control-group > label {
- float: none;
- width: auto;
- padding-top: 0;
- text-align: left;
- }
- // Move over all input controls and content
- .form-horizontal .controls {
- margin-left: 0;
- }
- // Move the options list down to align with labels
- .form-horizontal .control-list {
- padding-top: 0; // has to be padding because margin collaspes
- }
- // Move over buttons in .form-actions to align with .controls
- .form-horizontal .form-actions {
- padding-left: 10px;
- padding-right: 10px;
- }
-
- // Modals
- .modal {
- position: absolute;
- top: 10px;
- left: 10px;
- right: 10px;
- width: auto;
- margin: 0;
- &.fade.in { top: auto; }
- }
- .modal-header .close {
- padding: 10px;
- margin: -10px;
- }
-
- // Carousel
- .carousel-caption {
- position: static;
- }
-
-}
-
-
-
-// LANDSCAPE PHONE TO SMALL DESKTOP & PORTRAIT TABLET
-// --------------------------------------------------
-
-@media (max-width: 767px) {
- // GRID & CONTAINERS
- // -----------------
- // Remove width from containers
- .container {
- width: auto;
- padding: 0 20px;
- }
- // Fluid rows
- .row-fluid {
- width: 100%;
- }
- // Undo negative margin on rows
- .row {
- margin-left: 0;
- }
- // Make all columns even
- .row > [class*="span"], .row-fluid > [class*="span"] {
- float: none;
- display: block;
- width: auto;
- margin: 0;
- }
-}
-
-
-
-// PORTRAIT TABLET TO DEFAULT DESKTOP
-// ----------------------------------
-
-@media (min-width: 768px) and (max-width: 979px) {
-
- // Fixed grid
- @include gridSystemGenerate(12, 42px, 20px);
-
- // Fluid grid
- @include fluidGridSystemGenerate(12, 5.801104972%, 2.762430939%);
-
- // Input grid
- @include inputGridSystemGenerate(12, 42px, 20px);
-
-}
-
-
-
-// TABLETS AND BELOW
-// -----------------
-@media (max-width: 979px) {
-
- // UNFIX THE TOPBAR
- // ----------------
- // Remove any padding from the body
- body {
- padding-top: 0;
- }
- // Unfix the navbar
- .navbar-fixed-top {
- position: static;
- margin-bottom: $baseLineHeight;
- }
- .navbar-fixed-top .navbar-inner {
- padding: 5px;
- }
- .navbar .container {
- width: auto;
- padding: 0;
- }
- // Account for brand name
- .navbar .brand {
- padding-left: 10px;
- padding-right: 10px;
- margin: 0 0 0 -5px;
- }
- // Nav collapse clears brand
- .navbar .nav-collapse {
- clear: left;
- }
- // Block-level the nav
- .navbar .nav {
- float: none;
- margin: 0 0 ($baseLineHeight / 2);
- }
- .navbar .nav > li {
- float: none;
- }
- .navbar .nav > li > a {
- margin-bottom: 2px;
- }
- .navbar .nav > .divider-vertical {
- display: none;
- }
- .navbar .nav .nav-header {
- color: $navbarText;
- text-shadow: none;
- }
- // Nav and dropdown links in navbar
- .navbar .nav > li > a, .navbar .dropdown-menu a {
- padding: 6px 15px;
- font-weight: bold;
- color: $navbarLinkColor;
- @include border-radius(3px);
- }
- .navbar .dropdown-menu li + li a {
- margin-bottom: 2px;
- }
- .navbar .nav > li > a:hover, .navbar .dropdown-menu a:hover {
- background-color: $navbarBackground;
- }
- // Dropdowns in the navbar
- .navbar .dropdown-menu {
- position: static;
- top: auto;
- left: auto;
- float: none;
- display: block;
- max-width: none;
- margin: 0 15px;
- padding: 0;
- background-color: transparent;
- border: none;
- @include border-radius(0);
- @include box-shadow(none);
- }
- .navbar .dropdown-menu:before, .navbar .dropdown-menu:after {
- display: none;
- }
- .navbar .dropdown-menu .divider {
- display: none;
- }
- // Forms in navbar
- .navbar-form, .navbar-search {
- float: none;
- padding: ($baseLineHeight / 2) 15px;
- margin: ($baseLineHeight / 2) 0;
- border-top: 1px solid $navbarBackground;
- border-bottom: 1px solid $navbarBackground;
- $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
- @include box-shadow($shadow);
- }
- // Pull right (secondary) nav content
- .navbar .nav.pull-right {
- float: none;
- margin-left: 0;
- }
- // Static navbar
- .navbar-static .navbar-inner {
- padding-left: 10px;
- padding-right: 10px;
- }
- // Navbar button
- .btn-navbar {
- display: block;
- }
-
- // Hide everything in the navbar save .brand and toggle button */
- .nav-collapse {
- overflow: hidden;
- height: 0;
- }
-}
-
-
-
-// DEFAULT DESKTOP
-// ---------------
-
-@media (min-width: 980px) {
- .nav-collapse.collapse {
- height: auto !important;
- }
-}
-
-
-
-// LARGE DESKTOP & UP
-// ------------------
-
-@media (min-width: 1200px) {
-
- // Fixed grid
- @include gridSystemGenerate(12, 70px, 30px);
-
- // Fluid grid
- @include fluidGridSystemGenerate(12, 5.982905983%, 2.564102564%);
-
- // Input grid
- @include inputGridSystemGenerate(12, 70px, 30px);
-
- // Thumbnails
- .thumbnails {
- margin-left: -30px;
- }
- .thumbnails > li {
- margin-left: 30px;
- }
-
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/_bootstrap.scss b/openstack_dashboard/static/bootstrap/scss/_bootstrap.scss
deleted file mode 100644
index e3b60c6be..000000000
--- a/openstack_dashboard/static/bootstrap/scss/_bootstrap.scss
+++ /dev/null
@@ -1,63 +0,0 @@
-/*!
- * Bootstrap 2.0.1
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- * Converted to SASS by Thomas McDonald
- */
-
-// Core variables and mixins
-@import "bootstrap/variables"; // Modify this for custom colors, font-sizes, etc
-@import "bootstrap/mixins";
-
-// CSS Reset
-@import "bootstrap/reset";
-
-// Grid system and page structure
-@import "bootstrap/scaffolding";
-@import "bootstrap/grid";
-@import "bootstrap/layouts";
-
-// Base CSS
-@import "bootstrap/type";
-@import "bootstrap/code";
-@import "bootstrap/forms";
-@import "bootstrap/tables";
-
-// Components: common
-@import "bootstrap/sprites";
-@import "bootstrap/dropdowns";
-@import "bootstrap/wells";
-@import "bootstrap/component-animations";
-@import "bootstrap/close";
-
-// Components: Buttons & Alerts
-@import "bootstrap/buttons";
-@import "bootstrap/button-groups";
-@import "bootstrap/alerts"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
-
-// Components: Nav
-@import "bootstrap/navs";
-@import "bootstrap/navbar";
-@import "bootstrap/breadcrumbs";
-@import "bootstrap/pagination";
-@import "bootstrap/pager";
-
-// Components: Popovers
-@import "bootstrap/modals";
-@import "bootstrap/tooltip";
-@import "bootstrap/popovers";
-
-// Components: Misc
-@import "bootstrap/thumbnails";
-@import "bootstrap/labels";
-@import "bootstrap/progress-bars";
-@import "bootstrap/accordion";
-@import "bootstrap/carousel";
-@import "bootstrap/hero-unit";
-
-// Utility classes
-@import "bootstrap/utilities"; // Has to be last to override when necessary \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap.scss
new file mode 100644
index 000000000..65204aad1
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap.scss
@@ -0,0 +1,50 @@
+// Core variables and mixins
+@import "bootstrap/variables";
+@import "bootstrap/mixins";
+
+// Reset and dependencies
+@import "bootstrap/normalize";
+@import "bootstrap/print";
+@import "bootstrap/glyphicons";
+
+// Core CSS
+@import "bootstrap/scaffolding";
+@import "bootstrap/type";
+@import "bootstrap/code";
+@import "bootstrap/grid";
+@import "bootstrap/tables";
+@import "bootstrap/forms";
+@import "bootstrap/buttons";
+
+// Components
+@import "bootstrap/component-animations";
+@import "bootstrap/dropdowns";
+@import "bootstrap/button-groups";
+@import "bootstrap/input-groups";
+@import "bootstrap/navs";
+@import "bootstrap/navbar";
+@import "bootstrap/breadcrumbs";
+@import "bootstrap/pagination";
+@import "bootstrap/pager";
+@import "bootstrap/labels";
+@import "bootstrap/badges";
+@import "bootstrap/jumbotron";
+@import "bootstrap/thumbnails";
+@import "bootstrap/alerts";
+@import "bootstrap/progress-bars";
+@import "bootstrap/media";
+@import "bootstrap/list-group";
+@import "bootstrap/panels";
+@import "bootstrap/responsive-embed";
+@import "bootstrap/wells";
+@import "bootstrap/close";
+
+// Components w/ JavaScript
+@import "bootstrap/modals";
+@import "bootstrap/tooltip";
+@import "bootstrap/popovers";
+@import "bootstrap/carousel";
+
+// Utility classes
+@import "bootstrap/utilities";
+@import "bootstrap/responsive-utilities";
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_accordion.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_accordion.scss
deleted file mode 100644
index bb199439f..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_accordion.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-// ACCORDION
-// ---------
-
-
-// Parent container
-.accordion {
- margin-bottom: $baseLineHeight;
-}
-
-// Group == heading + body
-.accordion-group {
- margin-bottom: 2px;
- border: 1px solid #e5e5e5;
- @include border-radius(4px);
-}
-.accordion-heading {
- border-bottom: 0;
-}
-.accordion-heading .accordion-toggle {
- display: block;
- padding: 8px 15px;
-}
-
-// Inner needs the styles because you can't animate properly with any styles on the element
-.accordion-inner {
- padding: 9px 15px;
- border-top: 1px solid #e5e5e5;
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_alerts.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_alerts.scss
index a219ab9af..4685ac3a9 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_alerts.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_alerts.scss
@@ -1,62 +1,67 @@
-// ALERT STYLES
-// ------------
+//
+// Alerts
+// --------------------------------------------------
+
+
+// Base styles
+// -------------------------
-// Base alert styles
.alert {
- padding: 8px 35px 8px 14px;
- margin-bottom: $baseLineHeight;
- text-shadow: 0 1px 0 rgba(255,255,255,.5);
- background-color: $warningBackground;
- border: 1px solid $warningBorder;
- @include border-radius(4px);
-}
-.alert, .alert-heading {
- color: $warningText;
+ padding: $alert-padding;
+ margin-bottom: $line-height-computed;
+ border: 1px solid transparent;
+ border-radius: $alert-border-radius;
+
+ // Headings for larger alerts
+ h4 {
+ margin-top: 0;
+ // Specified for the h4 to prevent conflicts of changing $headings-color
+ color: inherit;
+ }
+ // Provide class for links that match alerts
+ .alert-link {
+ font-weight: $alert-link-font-weight;
+ }
+
+ // Improve alignment and spacing of inner content
+ > p,
+ > ul {
+ margin-bottom: 0;
+ }
+ > p + p {
+ margin-top: 5px;
+ }
}
-// Adjust close link position
-.alert .close {
- position: relative;
- top: -2px;
- right: -21px;
- line-height: 18px;
+// Dismissable alerts
+//
+// Expand the right padding and account for the close button's positioning.
+
+.alert-dismissable {
+ padding-right: ($alert-padding + 20);
+
+ // Adjust close link position
+ .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ color: inherit;
+ }
}
// Alternate styles
-// ----------------
+//
+// Generate contextual modifier classes for colorizing the alert.
.alert-success {
- background-color: $successBackground;
- border-color: $successBorder;
-}
-.alert-success, .alert-success .alert-heading {
- color: $successText;
-}
-.alert-danger, .alert-error {
- background-color: $errorBackground;
- border-color: $errorBorder;
-}
-.alert-danger, .alert-error, .alert-danger .alert-heading, .alert-error .alert-heading {
- color: $errorText;
+ @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
}
.alert-info {
- background-color: $infoBackground;
- border-color: $infoBorder;
+ @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
}
-.alert-info, .alert-info .alert-heading {
- color: $infoText;
-}
-
-
-// Block alerts
-// ------------------------
-.alert-block {
- padding-top: 14px;
- padding-bottom: 14px;
+.alert-warning {
+ @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
}
-.alert-block > p, .alert-block > ul {
- margin-bottom: 0;
+.alert-danger {
+ @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
}
-.alert-block p + p {
- margin-top: 5px;
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_badges.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_badges.scss
new file mode 100644
index 000000000..02394ae7f
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_badges.scss
@@ -0,0 +1,57 @@
+//
+// Badges
+// --------------------------------------------------
+
+
+// Base class
+.badge {
+ display: inline-block;
+ min-width: 10px;
+ padding: 3px 7px;
+ font-size: $font-size-small;
+ font-weight: $badge-font-weight;
+ color: $badge-color;
+ line-height: $badge-line-height;
+ vertical-align: baseline;
+ white-space: nowrap;
+ text-align: center;
+ background-color: $badge-bg;
+ border-radius: $badge-border-radius;
+
+ // Empty badges collapse automatically (not available in IE8)
+ &:empty {
+ display: none;
+ }
+
+ // Quick fix for badges in buttons
+ .btn & {
+ position: relative;
+ top: -1px;
+ }
+ .btn-xs & {
+ top: 0;
+ padding: 1px 5px;
+ }
+
+ // [converter] extracted a& to a.badge
+
+ // Account for badges in navs
+ a.list-group-item.active > &,
+ .nav-pills > .active > a > & {
+ color: $badge-active-color;
+ background-color: $badge-active-bg;
+ }
+ .nav-pills > li > a > & {
+ margin-left: 3px;
+ }
+}
+
+// Hover state, but only for links
+a.badge {
+ &:hover,
+ &:focus {
+ color: $badge-link-hover-color;
+ text-decoration: none;
+ cursor: pointer;
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_breadcrumbs.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_breadcrumbs.scss
index 2effdeb6e..3641e333b 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_breadcrumbs.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_breadcrumbs.scss
@@ -1,22 +1,26 @@
-// BREADCRUMBS
-// -----------
+//
+// Breadcrumbs
+// --------------------------------------------------
+
.breadcrumb {
- padding: 7px 14px;
- margin: 0 0 $baseLineHeight;
- @include gradient-vertical($white, #f5f5f5);
- border: 1px solid #ddd;
- @include border-radius(3px);
- @include box-shadow(inset 0 1px 0 $white);
- li {
+ padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;
+ margin-bottom: $line-height-computed;
+ list-style: none;
+ background-color: $breadcrumb-bg;
+ border-radius: $border-radius-base;
+
+ > li {
display: inline-block;
- text-shadow: 0 1px 0 $white;
- }
- .divider {
- padding: 0 5px;
- color: $grayLight;
+
+ + li:before {
+ content: "#{$breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space
+ padding: 0 5px;
+ color: $breadcrumb-color;
+ }
}
- .active a {
- color: $grayDark;
+
+ > .active {
+ color: $breadcrumb-active-color;
}
-} \ No newline at end of file
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_button-groups.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_button-groups.scss
index 771d54df0..d765ff206 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_button-groups.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_button-groups.scss
@@ -1,136 +1,236 @@
-// BUTTON GROUPS
-// -------------
-
+//
+// Button groups
+// --------------------------------------------------
// Make the div behave like a button
-.btn-group {
+.btn-group,
+.btn-group-vertical {
position: relative;
- @include clearfix(); // clears the floated buttons
- @include ie7-restore-left-whitespace();
+ display: inline-block;
+ vertical-align: middle; // match .btn alignment given font-size hack above
+ > .btn {
+ position: relative;
+ float: left;
+ // Bring the "active" button to the front
+ &:hover,
+ &:focus,
+ &:active,
+ &.active {
+ z-index: 2;
+ }
+ &:focus {
+ // Remove focus outline when dropdown JS adds it after closing the menu
+ outline: 0;
+ }
+ }
}
-// Space out series of button groups
-.btn-group + .btn-group {
- margin-left: 5px;
+// Prevent double borders when buttons are next to each other
+.btn-group {
+ .btn + .btn,
+ .btn + .btn-group,
+ .btn-group + .btn,
+ .btn-group + .btn-group {
+ margin-left: -1px;
+ }
}
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
- margin-top: $baseLineHeight / 2;
- margin-bottom: $baseLineHeight / 2;
- .btn-group {
- display: inline-block;
- @include ie7-inline-block();
+ margin-left: -5px; // Offset the first child's margin
+ @include clearfix();
+
+ .btn-group,
+ .input-group {
+ float: left;
+ }
+ > .btn,
+ > .btn-group,
+ > .input-group {
+ margin-left: 5px;
}
}
-// Float them, remove border radius, then re-add to first and last elements
-.btn-group .btn {
- position: relative;
- float: left;
- margin-left: -1px;
- @include border-radius(0);
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+ border-radius: 0;
}
+
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
-.btn-group .btn:first-child {
+.btn-group > .btn:first-child {
margin-left: 0;
- -webkit-border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
- border-top-left-radius: 4px;
- -webkit-border-bottom-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
- border-bottom-left-radius: 4px;
-}
-.btn-group .btn:last-child, .btn-group .dropdown-toggle {
- -webkit-border-top-right-radius: 4px;
- -moz-border-radius-topright: 4px;
- border-top-right-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- -moz-border-radius-bottomright: 4px;
- border-bottom-right-radius: 4px;
-}
-// Reset corners for large buttons
-.btn-group .btn.large:first-child {
- margin-left: 0;
- -webkit-border-top-left-radius: 6px;
- -moz-border-radius-topleft: 6px;
- border-top-left-radius: 6px;
- -webkit-border-bottom-left-radius: 6px;
- -moz-border-radius-bottomleft: 6px;
- border-bottom-left-radius: 6px;
+ &:not(:last-child):not(.dropdown-toggle) {
+ @include border-right-radius(0);
+ }
}
-.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle {
- -webkit-border-top-right-radius: 6px;
- -moz-border-radius-topright: 6px;
- border-top-right-radius: 6px;
- -webkit-border-bottom-right-radius: 6px;
- -moz-border-radius-bottomright: 6px;
- border-bottom-right-radius: 6px;
+// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+ @include border-left-radius(0);
}
-// On hover/focus/active, bring the proper btn to front
-.btn-group .btn:hover, .btn-group .btn:focus, .btn-group .btn:active, .btn-group .btn.active {
- z-index: 2;
+// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
+.btn-group > .btn-group {
+ float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+.btn-group > .btn-group:first-child {
+ > .btn:last-child,
+ > .dropdown-toggle {
+ @include border-right-radius(0);
+ }
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+ @include border-left-radius(0);
}
// On active and open, don't show outline
-.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle {
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
outline: 0;
}
+// Sizing
+//
+// Remix the default button sizing classes into new ones for easier manipulation.
+
+.btn-group-xs > .btn { @extend .btn-xs; }
+.btn-group-sm > .btn { @extend .btn-sm; }
+.btn-group-lg > .btn { @extend .btn-lg; }
+
// Split button dropdowns
// ----------------------
// Give the line between buttons some depth
-.btn-group .dropdown-toggle {
+.btn-group > .btn + .dropdown-toggle {
padding-left: 8px;
padding-right: 8px;
- $shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- @include box-shadow($shadow);
- *padding-top: 5px;
- *padding-bottom: 5px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+ padding-left: 12px;
+ padding-right: 12px;
}
-.btn-group.open {
- // IE7's z-index only goes to the nearest positioned ancestor, which would
- // make the menu appear below buttons that appeared later on the page
- *z-index: $zindexDropdown;
-
- // Reposition menu on open and round all corners
- .dropdown-menu {
- display: block;
- margin-top: 1px;
- @include border-radius(5px);
- }
+// The clickable button for toggling the menu
+// Remove the gradient and set the same inset shadow as the :active state
+.btn-group.open .dropdown-toggle {
+ @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
- .dropdown-toggle {
- background-image: none;
- $shadow: inset 0 1px 6px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
- @include box-shadow($shadow);
+ // Show no shadow for `.btn-link` since it has no other button styles.
+ &.btn-link {
+ @include box-shadow(none);
}
}
+
// Reposition the caret
.btn .caret {
- margin-top: 7px;
margin-left: 0;
}
-.btn:hover .caret, .open.btn-group .caret {
- @include opacity(1);
+// Carets in other button sizes
+.btn-lg .caret {
+ border-width: $caret-width-large $caret-width-large 0;
+ border-bottom-width: 0;
+}
+// Upside down carets for .dropup
+.dropup .btn-lg .caret {
+ border-width: 0 $caret-width-large $caret-width-large;
}
-// Account for other colors
-.btn-primary, .btn-danger, .btn-info, .btn-success, .btn-inverse {
- .caret {
- border-top-color: $white;
- @include opacity(0.75);
+// Vertical button groups
+// ----------------------
+
+.btn-group-vertical {
+ > .btn,
+ > .btn-group,
+ > .btn-group > .btn {
+ display: block;
+ float: none;
+ width: 100%;
+ max-width: 100%;
+ }
+
+ // Clear floats so dropdown menus can be properly placed
+ > .btn-group {
+ @include clearfix();
+ > .btn {
+ float: none;
+ }
+ }
+
+ > .btn + .btn,
+ > .btn + .btn-group,
+ > .btn-group + .btn,
+ > .btn-group + .btn-group {
+ margin-top: -1px;
+ margin-left: 0;
}
}
-// Small button dropdowns
-.btn-small .caret {
- margin-top: 4px;
+.btn-group-vertical > .btn {
+ &:not(:first-child):not(:last-child) {
+ border-radius: 0;
+ }
+ &:first-child:not(:last-child) {
+ border-top-right-radius: $border-radius-base;
+ @include border-bottom-radius(0);
+ }
+ &:last-child:not(:first-child) {
+ border-bottom-left-radius: $border-radius-base;
+ @include border-top-radius(0);
+ }
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+ border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) {
+ > .btn:last-child,
+ > .dropdown-toggle {
+ @include border-bottom-radius(0);
+ }
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+ @include border-top-radius(0);
+}
+
+
+
+// Justified button groups
+// ----------------------
+
+.btn-group-justified {
+ display: table;
+ width: 100%;
+ table-layout: fixed;
+ border-collapse: separate;
+ > .btn,
+ > .btn-group {
+ float: none;
+ display: table-cell;
+ width: 1%;
+ }
+ > .btn-group .btn {
+ width: 100%;
+ }
+}
+
+
+// Checkbox and radio options
+//
+// In order to support the browser's form validation feedback, powered by the
+// `required` attribute, we have to "hide" the inputs via `opacity`. We cannot
+// use `display: none;` or `visibility: hidden;` as that also hides the popover.
+// This way, we ensure a DOM element is visible to position the popover from.
+//
+// See https://github.com/twbs/bootstrap/pull/12794 for more.
+
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+ position: absolute;
+ z-index: -1;
+ opacity: 0;
}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_buttons.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_buttons.scss
index da51df9ea..28110b651 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_buttons.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_buttons.scss
@@ -1,163 +1,159 @@
-// BUTTON STYLES
-// -------------
+//
+// Buttons
+// --------------------------------------------------
// Base styles
// --------------------------------------------------
-// Core
.btn {
display: inline-block;
- padding: 4px 10px 4px;
margin-bottom: 0; // For input.btn
- font-size: $baseFontSize;
- line-height: $baseLineHeight;
- color: $grayDark;
+ font-weight: $btn-font-weight;
text-align: center;
- text-shadow: 0 1px 1px rgba(255,255,255,.75);
vertical-align: middle;
- @include buttonBackground($white, darken($white, 10%));
- border: 1px solid #ccc;
- border-bottom-color: #bbb;
- @include border-radius(4px);
- $shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
- @include box-shadow($shadow);
cursor: pointer;
+ background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+ border: 1px solid transparent;
+ white-space: nowrap;
+ @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $border-radius-base);
+ @include user-select(none);
+
+ &,
+ &:active,
+ &.active {
+ &:focus {
+ @include tab-focus();
+ }
+ }
- // Give IE7 some love
- @include reset-filter();
- @include ie7-restore-left-whitespace();
-}
-
-// Hover state
-.btn:hover {
- color: $grayDark;
- text-decoration: none;
- background-color: darken($white, 10%);
- background-position: 0 -15px;
-
- // transition is only when going to hover, otherwise the background
- // behind the gradient (there for IE<=9 fallback) gets mismatched
- @include transition(background-position .1s linear);
-}
-
-// Focus state for keyboard and accessibility
-.btn:focus {
- @include tab-focus();
-}
+ &:hover,
+ &:focus {
+ color: $btn-default-color;
+ text-decoration: none;
+ }
-// Active state
-.btn.active, .btn:active {
- background-image: none;
- $shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
- @include box-shadow($shadow);
- background-color: darken($white, 10%);
- background-color: darken($white, 15%) \9;
- outline: 0;
-}
+ &:active,
+ &.active {
+ outline: 0;
+ background-image: none;
+ @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
+ }
-// Disabled state
-.btn.disabled, .btn[disabled] {
- cursor: default;
- background-image: none;
- background-color: darken($white, 10%);
- @include opacity(0.65);
- @include box-shadow(none);
+ &.disabled,
+ &[disabled],
+ fieldset[disabled] & {
+ cursor: not-allowed;
+ pointer-events: none; // Future-proof disabling of clicks
+ @include opacity(.65);
+ @include box-shadow(none);
+ }
}
-// Button Sizes
+// Alternate buttons
// --------------------------------------------------
-// Large
-.btn-large {
- padding: 9px 14px;
- font-size: $baseFontSize + 2px;
- line-height: normal;
- @include border-radius(5px);
+.btn-default {
+ @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);
}
-.btn-large [class^="icon-"] {
- margin-top: 1px;
+.btn-primary {
+ @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);
}
-
-// Small
-.btn-small {
- padding: 5px 9px;
- font-size: $baseFontSize - 2px;
- line-height: $baseLineHeight - 2px;
+// Success appears as green
+.btn-success {
+ @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);
}
-.btn-small [class^="icon-"] {
- margin-top: -1px;
+// Info appears as blue-green
+.btn-info {
+ @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);
}
-
-// Mini
-.btn-mini {
- padding: 2px 6px;
- font-size: $baseFontSize - 2px;
- line-height: $baseLineHeight - 4px;
+// Warning appears as orange
+.btn-warning {
+ @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);
+}
+// Danger and error appear as red
+.btn-danger {
+ @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);
}
-// Alternate buttons
-// --------------------------------------------------
-
-// Set text color
+// Link buttons
// -------------------------
-.btn-primary, .btn-primary:hover, .btn-warning, .btn-warning:hover, .btn-danger, .btn-danger:hover, .btn-success, .btn-success:hover, .btn-info, .btn-info:hover, .btn-inverse, .btn-inverse:hover {
- text-shadow: 0 -1px 0 rgba(0,0,0,.25);
- color: $white;
-}
-// Provide *some* extra contrast for those who can get it
-.btn-primary.active, .btn-warning.active, .btn-danger.active, .btn-success.active, .btn-info.active, .btn-inverse.active {
- color: rgba(255,255,255,.75);
-}
-// Set the backgrounds
-// -------------------------
-.btn-primary {
- @include buttonBackground($primaryButtonBackground, adjust-hue($primaryButtonBackground, 20));
-}
-// Warning appears are orange
-.btn-warning {
- @include buttonBackground(lighten($orange, 15%), $orange);
-}
-// Danger and error appear as red
-.btn-danger {
- @include buttonBackground(#ee5f5b, #bd362f);
+// Make a button look and behave like a link
+.btn-link {
+ color: $link-color;
+ font-weight: normal;
+ cursor: pointer;
+ border-radius: 0;
+
+ &,
+ &:active,
+ &[disabled],
+ fieldset[disabled] & {
+ background-color: transparent;
+ @include box-shadow(none);
+ }
+ &,
+ &:hover,
+ &:focus,
+ &:active {
+ border-color: transparent;
+ }
+ &:hover,
+ &:focus {
+ color: $link-hover-color;
+ text-decoration: underline;
+ background-color: transparent;
+ }
+ &[disabled],
+ fieldset[disabled] & {
+ &:hover,
+ &:focus {
+ color: $btn-link-disabled-color;
+ text-decoration: none;
+ }
+ }
}
-// Success appears as green
-.btn-success {
- @include buttonBackground(#62c462, #51a351);
+
+
+// Button Sizes
+// --------------------------------------------------
+
+.btn-lg {
+ // line-height: ensure even-numbered height of button next to large input
+ @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
}
-// Info appears as a neutral blue
-.btn-info {
- @include buttonBackground(#5bc0de, #2f96b4);
+.btn-sm {
+ // line-height: ensure proper height of button next to small input
+ @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
}
-.btn-inverse {
- @include buttonBackground(#454545, #262626);
+.btn-xs {
+ @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $border-radius-small);
}
-// Cross-browser Jank
+// Block button
// --------------------------------------------------
-button.btn, input[type="submit"].btn {
+.btn-block {
+ display: block;
+ width: 100%;
+ padding-left: 0;
+ padding-right: 0;
+}
- // Firefox 3.6 only I believe
- &::-moz-focus-inner {
- padding: 0;
- border: 0;
- }
+// Vertically space out multiple block buttons
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
- // IE7 has some default padding on button controls
- *padding-top: 2px;
- *padding-bottom: 2px;
- &.large {
- *padding-top: 7px;
- *padding-bottom: 7px;
- }
- &.small {
- *padding-top: 3px;
- *padding-bottom: 3px;
+// Specificity overrides
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+ &.btn-block {
+ width: 100%;
}
}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_carousel.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_carousel.scss
index 4c2d53c12..9325c1a55 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_carousel.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_carousel.scss
@@ -1,58 +1,61 @@
-// CAROUSEL
-// --------
+//
+// Carousel
+// --------------------------------------------------
+
+// Wrapper for the slide container and indicators
.carousel {
position: relative;
- margin-bottom: $baseLineHeight;
- line-height: 1;
}
.carousel-inner {
+ position: relative;
overflow: hidden;
width: 100%;
- position: relative;
-}
-
-.carousel {
- .item {
+ > .item {
display: none;
position: relative;
@include transition(.6s ease-in-out left);
- }
- // Account for jankitude on images
- .item > img {
- display: block;
- line-height: 1;
+ // Account for jankitude on images
+ > img,
+ > a > img {
+ @include img-responsive();
+ line-height: 1;
+ }
}
- .active, .next, .prev { display: block; }
+ > .active,
+ > .next,
+ > .prev { display: block; }
- .active {
+ > .active {
left: 0;
}
- .next, .prev {
+ > .next,
+ > .prev {
position: absolute;
top: 0;
width: 100%;
}
- .next {
+ > .next {
left: 100%;
}
- .prev {
+ > .prev {
left: -100%;
}
- .next.left, .prev.right {
+ > .next.left,
+ > .prev.right {
left: 0;
}
- .active.left {
+ > .active.left {
left: -100%;
}
- .active.right {
+ > .active.right {
left: 100%;
}
@@ -63,54 +66,176 @@
.carousel-control {
position: absolute;
- top: 40%;
- left: 15px;
- width: 40px;
- height: 40px;
- margin-top: -20px;
- font-size: 60px;
- font-weight: 100;
- line-height: 30px;
- color: $white;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: $carousel-control-width;
+ @include opacity($carousel-control-opacity);
+ font-size: $carousel-control-font-size;
+ color: $carousel-control-color;
text-align: center;
- background: $grayDarker;
- border: 3px solid $white;
- @include border-radius(23px);
- @include opacity(0.5);
-
- // we can't have this transition here
- // because webkit cancels the carousel
- // animation if you trip this while
- // in the middle of another animation
- // ;_;
- // @include transition(opacity .2s linear);
-
- // Reposition the right one
+ text-shadow: $carousel-text-shadow;
+ // We can't have this transition here because WebKit cancels the carousel
+ // animation if you trip this while in the middle of another animation.
+
+ // Set gradients for backgrounds
+ &.left {
+ @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));
+ }
&.right {
left: auto;
- right: 15px;
+ right: 0;
+ @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));
}
- // Hover state
- &:hover {
- color: $white;
+ // Hover/focus state
+ &:hover,
+ &:focus {
+ outline: 0;
+ color: $carousel-control-color;
text-decoration: none;
- @include opacity(0.9);
+ @include opacity(.9);
+ }
+
+ // Toggles
+ .icon-prev,
+ .icon-next,
+ .glyphicon-chevron-left,
+ .glyphicon-chevron-right {
+ position: absolute;
+ top: 50%;
+ z-index: 5;
+ display: inline-block;
+ }
+ .icon-prev,
+ .glyphicon-chevron-left {
+ left: 50%;
+ margin-left: -10px;
+ }
+ .icon-next,
+ .glyphicon-chevron-right {
+ right: 50%;
+ margin-right: -10px;
+ }
+ .icon-prev,
+ .icon-next {
+ width: 20px;
+ height: 20px;
+ margin-top: -10px;
+ font-family: serif;
+ }
+
+
+ .icon-prev {
+ &:before {
+ content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
+ }
+ }
+ .icon-next {
+ &:before {
+ content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
+ }
}
}
-// Caption for text below images
-// -----------------------------
+// Optional indicator pips
+//
+// Add an unordered list with the following class and add a list item for each
+// slide your carousel holds.
+
+.carousel-indicators {
+ position: absolute;
+ bottom: 10px;
+ left: 50%;
+ z-index: 15;
+ width: 60%;
+ margin-left: -30%;
+ padding-left: 0;
+ list-style: none;
+ text-align: center;
+ li {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ margin: 1px;
+ text-indent: -999px;
+ border: 1px solid $carousel-indicator-border-color;
+ border-radius: 10px;
+ cursor: pointer;
+
+ // IE8-9 hack for event handling
+ //
+ // Internet Explorer 8-9 does not support clicks on elements without a set
+ // `background-color`. We cannot use `filter` since that's not viewed as a
+ // background color by the browser. Thus, a hack is needed.
+ //
+ // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
+ // set alpha transparency for the best results possible.
+ background-color: #000 \9; // IE8
+ background-color: rgba(0,0,0,0); // IE9
+ }
+ .active {
+ margin: 0;
+ width: 12px;
+ height: 12px;
+ background-color: $carousel-indicator-active-bg;
+ }
+}
+
+// Optional captions
+// -----------------------------
+// Hidden by default for smaller viewports
.carousel-caption {
position: absolute;
- left: 0;
- right: 0;
- bottom: 0;
- padding: 10px 15px 5px;
- background: $grayDark;
- background: rgba(0,0,0,.75);
+ left: 15%;
+ right: 15%;
+ bottom: 20px;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: $carousel-caption-color;
+ text-align: center;
+ text-shadow: $carousel-text-shadow;
+ & .btn {
+ text-shadow: none; // No shadow for button elements in carousel-caption
+ }
}
-.carousel-caption h4, .carousel-caption p {
- color: $white;
+
+
+// Scale up controls for tablets and up
+@media screen and (min-width: $screen-sm-min) {
+
+ // Scale up the controls a smidge
+ .carousel-control {
+ .glyphicon-chevron-left,
+ .glyphicon-chevron-right,
+ .icon-prev,
+ .icon-next {
+ width: 30px;
+ height: 30px;
+ margin-top: -15px;
+ font-size: 30px;
+ }
+ .glyphicon-chevron-left,
+ .icon-prev {
+ margin-left: -15px;
+ }
+ .glyphicon-chevron-right,
+ .icon-next {
+ margin-right: -15px;
+ }
+ }
+
+ // Show and left align the captions
+ .carousel-caption {
+ left: 20%;
+ right: 20%;
+ padding-bottom: 30px;
+ }
+
+ // Move up the indicators
+ .carousel-indicators {
+ bottom: 20px;
+ }
}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_close.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_close.scss
index c57f01d34..62ce30fa3 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_close.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_close.scss
@@ -1,18 +1,35 @@
-// CLOSE ICONS
-// -----------
+//
+// Close icons
+// --------------------------------------------------
+
.close {
float: right;
- font-size: 20px;
- font-weight: bold;
- line-height: $baseLineHeight;
- color: $black;
- text-shadow: 0 1px 0 rgba(255,255,255,1);
- @include opacity(0.2);
- &:hover {
- color: $black;
+ font-size: ($font-size-base * 1.5);
+ font-weight: $close-font-weight;
+ line-height: 1;
+ color: $close-color;
+ text-shadow: $close-text-shadow;
+ @include opacity(.2);
+
+ &:hover,
+ &:focus {
+ color: $close-color;
text-decoration: none;
- @include opacity(0.4);
cursor: pointer;
+ @include opacity(.5);
}
+
+ // [converter] extracted button& to button.close
+}
+
+// Additional properties for button version
+// iOS requires the button element instead of an anchor tag.
+// If you want the anchor version, it requires `href="#"`.
+button.close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_code.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_code.scss
index 482040ec2..dacaa58a5 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_code.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_code.scss
@@ -1,56 +1,62 @@
-// Code.css.scss
-// Code typography styles for the <code> and <pre> elements
-// --------------------------------------------------------
+//
+// Code (inline and block)
+// --------------------------------------------------
+
// Inline and block code styles
-code, pre {
- padding: 0 3px 2px;
- @include font-family-monospace();
- font-size: $baseFontSize - 1;
- color: $grayDark;
- @include border-radius(3px);
+code,
+kbd,
+pre,
+samp {
+ font-family: $font-family-monospace;
}
// Inline code
code {
- padding: 3px 4px;
- color: #d14;
- background-color: #f7f7f9;
- border: 1px solid #e1e1e8;
+ padding: 2px 4px;
+ font-size: 90%;
+ color: $code-color;
+ background-color: $code-bg;
+ border-radius: $border-radius-base;
+}
+
+// User input typically entered via keyboard
+kbd {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: $kbd-color;
+ background-color: $kbd-bg;
+ border-radius: $border-radius-small;
+ box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
}
// Blocks of code
pre {
display: block;
- padding: ($baseLineHeight - 1) / 2;
- margin: 0 0 $baseLineHeight / 2;
- font-size: 12px;
- line-height: $baseLineHeight;
- background-color: #f5f5f5;
- border: 1px solid #ccc; // fallback for IE7-8
- border: 1px solid rgba(0,0,0,.15);
- @include border-radius(4px);
- white-space: pre;
- white-space: pre-wrap;
+ padding: (($line-height-computed - 1) / 2);
+ margin: 0 0 ($line-height-computed / 2);
+ font-size: ($font-size-base - 1); // 14px to 13px
+ line-height: $line-height-base;
word-break: break-all;
word-wrap: break-word;
-
- // Make prettyprint styles more spaced out for readability
- &.prettyprint {
- margin-bottom: $baseLineHeight;
- }
+ color: $pre-color;
+ background-color: $pre-bg;
+ border: 1px solid $pre-border-color;
+ border-radius: $border-radius-base;
// Account for some code outputs that place code tags in pre tags
code {
padding: 0;
+ font-size: inherit;
color: inherit;
+ white-space: pre-wrap;
background-color: transparent;
- border: 0;
+ border-radius: 0;
}
}
// Enable scrollable blocks of code
.pre-scrollable {
- max-height: 340px;
+ max-height: $pre-scrollable-max-height;
overflow-y: scroll;
-} \ No newline at end of file
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_component-animations.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_component-animations.scss
index 186f121dd..8c3fd07a2 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_component-animations.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_component-animations.scss
@@ -1,18 +1,35 @@
-// COMPONENT ANIMATIONS
-// --------------------
+//
+// Component animations
+// --------------------------------------------------
+
+// Heads up!
+//
+// We don't use the `.opacity()` mixin here since it causes a bug with text
+// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
.fade {
- @include transition(opacity .15s linear);
opacity: 0;
+ @include transition(opacity .15s linear);
&.in {
opacity: 1;
}
}
.collapse {
- @include transition(height .35s ease);
- position:relative;
- overflow:hidden;
+ display: none;
+
+ &.in { display: block; }
+ // [converter] extracted tr&.in to tr.collapse.in
+ // [converter] extracted tbody&.in to tbody.collapse.in
+}
+
+tr.collapse.in { display: table-row; }
+
+tbody.collapse.in { display: table-row-group; }
+
+.collapsing {
+ position: relative;
height: 0;
- &.in { height: auto; }
-} \ No newline at end of file
+ overflow: hidden;
+ @include transition(height .35s ease);
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_dropdowns.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_dropdowns.scss
index 085b5c3f7..803a798f6 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_dropdowns.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_dropdowns.scss
@@ -1,126 +1,214 @@
-// DROPDOWN MENUS
-// --------------
+//
+// Dropdown menus
+// --------------------------------------------------
+
-// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns
-.dropdown {
- position: relative;
-}
-.dropdown-toggle {
- // The caret makes the toggle a bit too tall in IE7
- *margin-bottom: -3px;
-}
-.dropdown-toggle:active, .open .dropdown-toggle {
- outline: 0;
-}
// Dropdown arrow/caret
.caret {
display: inline-block;
width: 0;
height: 0;
- text-indent: -99999px;
- // IE7 won't do the border trick if there's a text indent, but it doesn't
- // do the content that text-indent is hiding, either, so we're ok.
- *text-indent: 0;
- vertical-align: top;
- border-left: 4px solid transparent;
- border-right: 4px solid transparent;
- border-top: 4px solid $black;
- @include opacity(0.3);
- content: "\2193";
-}
-.dropdown .caret {
- margin-top: 8px;
margin-left: 2px;
+ vertical-align: middle;
+ border-top: $caret-width-base solid;
+ border-right: $caret-width-base solid transparent;
+ border-left: $caret-width-base solid transparent;
}
-.dropdown:hover .caret, .open.dropdown .caret {
- @include opacity(1);
+
+// The dropdown wrapper (div)
+.dropdown {
+ position: relative;
}
+
+// Prevent the focus on the dropdown toggle when closing dropdowns
+.dropdown-toggle:focus {
+ outline: 0;
+}
+
// The dropdown menu (ul)
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
- z-index: $zindexDropdown;
- float: left;
+ z-index: $zindex-dropdown;
display: none; // none by default, but block on "open" of the menu
+ float: left;
min-width: 160px;
- _width: 160px;
- padding: 4px 0;
- margin: 0; // override default ul
+ padding: 5px 0;
+ margin: 2px 0 0; // override default ul
list-style: none;
- background-color: $white;
- border-color: #ccc;
- border-color: rgba(0,0,0,.2);
- border-style: solid;
- border-width: 1px;
- @include border-radius(0 0 5px 5px);
- @include box-shadow(0 5px 10px rgba(0,0,0,.2));
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
- *border-right-width: 2px;
- *border-bottom-width: 2px;
-
- // Allow for dropdowns to go bottom up (aka, dropup-menu)
- &.bottom-up {
- top: auto;
- bottom: 100%;
- margin-bottom: 2px;
+ font-size: $font-size-base;
+ text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
+ background-color: $dropdown-bg;
+ border: 1px solid $dropdown-fallback-border; // IE8 fallback
+ border: 1px solid $dropdown-border;
+ border-radius: $border-radius-base;
+ @include box-shadow(0 6px 12px rgba(0,0,0,.175));
+ background-clip: padding-box;
+
+ // Aligns the dropdown menu to right
+ //
+ // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
+ &.pull-right {
+ right: 0;
+ left: auto;
}
// Dividers (basically an hr) within the dropdown
.divider {
- height: 1px;
- margin: 5px 1px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid $white;
-
- // IE7 needs a set width since we gave a height. Restricting just
- // to IE7 to keep the 1px left/right space in other browsers.
- // It is unclear where IE is getting the extra space that we need
- // to negative-margin away, but so it goes.
- *width: 100%;
- *margin: -5px 0 5px;
+ @include nav-divider($dropdown-divider-bg);
}
// Links within the dropdown menu
- a {
+ > li > a {
display: block;
- padding: 3px 15px;
+ padding: 3px 20px;
clear: both;
font-weight: normal;
- line-height: $baseLineHeight;
- color: $gray;
- white-space: nowrap;
+ line-height: $line-height-base;
+ color: $dropdown-link-color;
+ white-space: nowrap; // prevent links from randomly breaking onto new lines
}
}
-// Hover state
-.dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover {
- color: $white;
- text-decoration: none;
- background-color: $linkColor;
+// Hover/Focus state
+.dropdown-menu > li > a {
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ color: $dropdown-link-hover-color;
+ background-color: $dropdown-link-hover-bg;
+ }
+}
+
+// Active state
+.dropdown-menu > .active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $dropdown-link-active-color;
+ text-decoration: none;
+ outline: 0;
+ background-color: $dropdown-link-active-bg;
+ }
+}
+
+// Disabled state
+//
+// Gray out text and ensure the hover/focus state remains gray
+
+.dropdown-menu > .disabled > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $dropdown-link-disabled-color;
+ }
+}
+// Nuke hover/focus effects
+.dropdown-menu > .disabled > a {
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ background-color: transparent;
+ background-image: none; // Remove CSS gradient
+ @include reset-filter();
+ cursor: not-allowed;
+ }
}
// Open state for the dropdown
-.dropdown.open {
- // IE7's z-index only goes to the nearest positioned ancestor, which would
- // make the menu appear below buttons that appeared later on the page
- *z-index: $zindexDropdown;
-
- .dropdown-toggle {
- color: $white;
- background: #ccc;
- background: rgba(0,0,0,.3);
+.open {
+ // Show the menu
+ > .dropdown-menu {
+ display: block;
}
+
+ // Remove the outline when :focus is triggered
+ > a {
+ outline: 0;
+ }
+}
+
+// Menu positioning
+//
+// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
+// menu with the parent.
+.dropdown-menu-right {
+ left: auto; // Reset the default from `.dropdown-menu`
+ right: 0;
+}
+// With v3, we enabled auto-flipping if you have a dropdown within a right
+// aligned nav component. To enable the undoing of that, we provide an override
+// to restore the default dropdown menu alignment.
+//
+// This is only for left-aligning a dropdown menu within a `.navbar-right` or
+// `.pull-right` nav component.
+.dropdown-menu-left {
+ left: 0;
+ right: auto;
+}
+
+// Dropdown section headers
+.dropdown-header {
+ display: block;
+ padding: 3px 20px;
+ font-size: $font-size-small;
+ line-height: $line-height-base;
+ color: $dropdown-header-color;
+}
+
+// Backdrop to catch body clicks on mobile, etc.
+.dropdown-backdrop {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: ($zindex-dropdown - 10);
+}
+
+// Right aligned dropdowns
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+// Allow for dropdowns to go bottom up (aka, dropup-menu)
+//
+// Just add .dropup after the standard .dropdown class and you're set, bro.
+// TODO: abstract this so that the navbar fixed styles are not placed here?
+
+.dropup,
+.navbar-fixed-bottom .dropdown {
+ // Reverse the caret
+ .caret {
+ border-top: 0;
+ border-bottom: $caret-width-base solid;
+ content: "";
+ }
+ // Different positioning for bottom up menu
.dropdown-menu {
- display: block;
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 1px;
}
}
-// Typeahead
-.typeahead {
- margin-top: 2px; // give it some space to breathe
- @include border-radius(4px);
+
+// Component alignment
+//
+// Reiterate per navbar.less and the modified component alignment there.
+
+@media (min-width: $grid-float-breakpoint) {
+ .navbar-right {
+ .dropdown-menu {
+ right: 0; left: auto;
+ }
+ // Necessary for overrides of the default right aligned menu.
+ // Will remove come v4 in all likelihood.
+ .dropdown-menu-left {
+ left: 0; right: auto;
+ }
+ }
}
+
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_forms.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_forms.scss
index 8c7aa423e..310c24dd3 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_forms.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_forms.scss
@@ -1,463 +1,478 @@
-// Forms.less
-// Base styles for various input types, form layouts, and states
-// -------------------------------------------------------------
+//
+// Forms
+// --------------------------------------------------
-// GENERAL STYLES
-// --------------
-
-// Make all forms have space below them
-form {
- margin: 0 0 $baseLineHeight;
-}
+// Normalize non-controls
+//
+// Restyle and baseline non-control form elements.
fieldset {
padding: 0;
margin: 0;
border: 0;
+ // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,
+ // so we reset that to ensure it behaves more like a standard block element.
+ // See https://github.com/twbs/bootstrap/issues/12359.
+ min-width: 0;
}
-// Groups of fields with labels on top (legends)
legend {
display: block;
width: 100%;
padding: 0;
- margin-bottom: $baseLineHeight * 1.5;
- font-size: $baseFontSize * 1.5;
- line-height: $baseLineHeight * 2;
- color: $grayDark;
+ margin-bottom: $line-height-computed;
+ font-size: ($font-size-base * 1.5);
+ line-height: inherit;
+ color: $legend-color;
border: 0;
- border-bottom: 1px solid #eee;
-
- // Small
- small {
- font-size: $baseLineHeight * .75;
- color: $grayLight;
- }
+ border-bottom: 1px solid $legend-border-color;
}
-// Set font for forms
-label, input, button, select, textarea {
- @include font-shorthand($baseFontSize, normal, $baseLineHeight); // Set size, weight, line-height here
+label {
+ display: inline-block;
+ max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)
+ margin-bottom: 5px;
+ font-weight: bold;
}
-input, button, select, textarea {
- @include font-family-sans-serif(); // And only set font-family here for those that need it (note the missing label element)
-}
-// Identify controls by their labels
-label {
- display: block;
- margin-bottom: 5px;
- color: $grayDark;
+// Normalize form controls
+//
+// While most of our form styles require extra classes, some basic normalization
+// is required to ensure optimum display with or without those classes to better
+// address browser inconsistencies.
+
+// Override content-box in Normalize (* isn't specific enough)
+input[type="search"] {
+ @include box-sizing(border-box);
}
-// Inputs, Textareas, Selects
-input, textarea, select, .uneditable-input {
- display: inline-block;
- width: 210px;
- height: $baseLineHeight;
- padding: 4px;
- margin-bottom: 9px;
- font-size: $baseFontSize;
- line-height: $baseLineHeight;
- color: $gray;
- border: 1px solid #ccc;
- @include border-radius(3px);
-}
-.uneditable-textarea {
- width: auto;
- height: auto;
+// Position radios and checkboxes better
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9; // IE8-9
+ line-height: normal;
}
-// Inputs within a label
-label input, label textarea, label select {
+// Set the height of file controls to match text inputs
+input[type="file"] {
display: block;
}
-// Mini reset for unique input types
-input[type="image"], input[type="checkbox"], input[type="radio"] {
- width: auto;
- height: auto;
- padding: 0;
- margin: 3px 0;
- *margin-top: 0; /* IE7 */
- line-height: normal;
- cursor: pointer;
- @include border-radius(0);
- border: 0 \9; /* IE9 and down */
-}
-input[type="image"] {
- border: 0;
+// Make range inputs behave like textual form controls
+input[type="range"] {
+ display: block;
+ width: 100%;
}
-// Reset the file input to browser defaults
-input[type="file"] {
- width: auto;
- padding: initial;
- line-height: initial;
- border: initial;
- background-color: $white;
- background-color: initial;
- @include box-shadow(none);
-}
-
-// Help out input buttons
-input[type="button"], input[type="reset"], input[type="submit"] {
- width: auto;
+// Make multiple select elements height not fixed
+select[multiple],
+select[size] {
height: auto;
}
-// Set the height of select and file controls to match text inputs
-select, input[type="file"] {
- height: 28px; /* In IE7, the height of the select element cannot be changed by height, only font-size */
- *margin-top: 4px; /* For IE7, add top margin to align select with labels */
- line-height: 28px;
+// Focus for file, radio, and checkbox
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ @include tab-focus();
}
-// Reset line-height for IE
-input[type="file"] {
- line-height: 18px \9;
-}
+// Adjust output element
+output {
+ display: block;
+ padding-top: ($padding-base-vertical + 1);
+ font-size: $font-size-base;
+ line-height: $line-height-base;
+ color: $input-color;
+}
+
+
+// Common form controls
+//
+// Shared size and type resets for form controls. Apply `.form-control` to any
+// of the following form controls:
+//
+// select
+// textarea
+// input[type="text"]
+// input[type="password"]
+// input[type="datetime"]
+// input[type="datetime-local"]
+// input[type="date"]
+// input[type="month"]
+// input[type="time"]
+// input[type="week"]
+// input[type="number"]
+// input[type="email"]
+// input[type="url"]
+// input[type="search"]
+// input[type="tel"]
+// input[type="color"]
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
+ padding: $padding-base-vertical $padding-base-horizontal;
+ font-size: $font-size-base;
+ line-height: $line-height-base;
+ color: $input-color;
+ background-color: $input-bg;
+ background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+ border: 1px solid $input-border;
+ border-radius: $input-border-radius;
+ @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
+ @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
+
+ // Customize the `:focus` state to imitate native WebKit styles.
+ @include form-control-focus();
+
+ // Placeholder
+ @include placeholder();
+
+ // Disabled and read-only inputs
+ //
+ // HTML5 says that controls under a fieldset > legend:first-child won't be
+ // disabled if the fieldset is disabled. Due to implementation difficulty, we
+ // don't honor that edge case; we style them as disabled anyway.
+ &[disabled],
+ &[readonly],
+ fieldset[disabled] & {
+ cursor: not-allowed;
+ background-color: $input-bg-disabled;
+ opacity: 1; // iOS fix for unreadable disabled content
+ }
-// Chrome on Linux and Mobile Safari need background-color
-select {
- width: 220px; // default input width + 10px of padding that doesn't get applied
- background-color: $white;
+ // [converter] extracted textarea& to textarea.form-control
}
-// Make multiple select elements height not fixed
-select[multiple], select[size] {
+// Reset height for `textarea`s
+textarea.form-control {
height: auto;
}
-// Remove shadow from image inputs
-input[type="image"] {
- @include box-shadow(none);
+
+// Search inputs in iOS
+//
+// This overrides the extra rounded corners on search inputs in iOS so that our
+// `.form-control` class can properly style them. Note that this cannot simply
+// be added to `.form-control` as it's not specific enough. For details, see
+// https://github.com/twbs/bootstrap/issues/11586.
+
+input[type="search"] {
+ -webkit-appearance: none;
}
-// Make textarea height behave
-textarea {
- height: auto;
+
+// Special styles for iOS date input
+//
+// In Mobile Safari, date inputs require a pixel line-height that matches the
+// given height of the input. Since this fucks up everything else, we have to
+// appropriately reset it for Internet Explorer and the size variations.
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+ line-height: $input-height-base;
+ // IE8+ misaligns the text within date inputs, so we reset
+ line-height: $line-height-base #{\0};
+
+ &.input-sm {
+ line-height: $input-height-small;
+ }
+ &.input-lg {
+ line-height: $input-height-large;
+ }
}
-// Hidden inputs
-input[type="hidden"] {
- display: none;
+
+// Form groups
+//
+// Designed to help with the organization and spacing of vertical forms. For
+// horizontal forms, use the predefined grid classes.
+
+.form-group {
+ margin-bottom: 15px;
}
+// Checkboxes and radios
+//
+// Indent the labels to position radios/checkboxes as hanging controls.
-// CHECKBOXES & RADIOS
-// -------------------
+.radio,
+.checkbox {
+ display: block;
+ min-height: $line-height-computed; // clear the floating input if there is no label text
+ margin-top: 10px;
+ margin-bottom: 10px;
-// Indent the labels to position radios/checkboxes as hanging
-.radio, .checkbox {
- padding-left: 18px;
+ label {
+ padding-left: 20px;
+ margin-bottom: 0;
+ font-weight: normal;
+ cursor: pointer;
+ }
}
-.radio input[type="radio"], .checkbox input[type="checkbox"] {
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
float: left;
- margin-left: -18px;
+ margin-left: -20px;
}
-
-// Move the options list down to align with labels
-.controls > .radio:first-child, .controls > .checkbox:first-child {
- padding-top: 5px; // has to be padding because margin collaspes
+.radio + .radio,
+.checkbox + .checkbox {
+ margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
}
// Radios and checkboxes on same line
-// TODO v3: Convert .inline to .control-inline
-.radio.inline, .checkbox.inline {
+.radio-inline,
+.checkbox-inline {
display: inline-block;
- padding-top: 5px;
+ padding-left: 20px;
margin-bottom: 0;
vertical-align: middle;
+ font-weight: normal;
+ cursor: pointer;
}
-.radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline {
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+ margin-top: 0;
margin-left: 10px; // space out consecutive inline controls
}
-
-
-// FOCUS STATE
-// -----------
-
-input, textarea {
- @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
- $transition: border linear .2s, box-shadow linear .2s;
- @include transition($transition);
-}
-input:focus, textarea:focus {
- border-color: rgba(82,168,236,.8);
- $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
- @include box-shadow($shadow);
- outline: 0;
- outline: thin dotted \9; /* IE6-9 */
-}
-input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus, select:focus {
- @include box-shadow(none); // override for file inputs
- @include tab-focus();
-}
-
-
-
-// INPUT SIZES
-// -----------
-
-// General classes for quick sizes
-.input-mini { width: 60px; }
-.input-small { width: 90px; }
-.input-medium { width: 150px; }
-.input-large { width: 210px; }
-.input-xlarge { width: 270px; }
-.input-xxlarge { width: 530px; }
-
-// Grid style input sizes
-input[class*="span"], select[class*="span"], textarea[class*="span"], .uneditable-input {
- float: none;
- margin-left: 0;
+// Apply same disabled cursor tweak as for inputs
+//
+// Note: Neither radios nor checkboxes can be readonly.
+input[type="radio"],
+input[type="checkbox"],
+.radio,
+.radio-inline,
+.checkbox,
+.checkbox-inline {
+ &[disabled],
+ fieldset[disabled] & {
+ cursor: not-allowed;
+ }
}
+// Form control sizing
+//
+// Build on `.form-control` with modifier classes to decrease or increase the
+// height and font-size of form controls.
-// GRID SIZING FOR INPUTS
-// ----------------------
-
-@include inputGridSystemGenerate($gridColumns, $gridColumnWidth, $gridGutterWidth);
+@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
+@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
+// Form control feedback states
+//
+// Apply contextual and semantic states to individual form controls.
-// DISABLED STATE
-// --------------
+.has-feedback {
+ // Enable absolute positioning
+ position: relative;
-// Disabled and read-only inputs
-input[disabled], select[disabled], textarea[disabled], input[readonly], select[readonly], textarea[readonly] {
- background-color: #f5f5f5;
- border-color: #ddd;
- cursor: not-allowed;
+ // Ensure icons don't overlap text
+ .form-control {
+ padding-right: ($input-height-base * 1.25);
+ }
}
-
-
-
-
-// FORM FIELD FEEDBACK STATES
-// --------------------------
-
-// Warning
-.control-group.warning {
- @include formFieldState($warningText, $warningText, $warningBackground);
+// Feedback icon (requires .glyphicon classes)
+.form-control-feedback {
+ position: absolute;
+ top: ($line-height-computed + 5); // Height of the `label` and its margin
+ right: 0;
+ z-index: 2; // Ensure icon is above input groups
+ display: block;
+ width: $input-height-base;
+ height: $input-height-base;
+ line-height: $input-height-base;
+ text-align: center;
}
-// Error
-.control-group.error {
- @include formFieldState($errorText, $errorText, $errorBackground);
+.input-lg + .form-control-feedback {
+ width: $input-height-large;
+ height: $input-height-large;
+ line-height: $input-height-large;
}
-// Success
-.control-group.success {
- @include formFieldState($successText, $successText, $successBackground);
+.input-sm + .form-control-feedback {
+ width: $input-height-small;
+ height: $input-height-small;
+ line-height: $input-height-small;
}
-// HTML5 invalid states
-// Shares styles with the .control-group.error above
-input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid {
- color: #b94a48;
- border-color: #ee5f5b;
- &:focus {
- border-color: darken(#ee5f5b, 10%);
- @include box-shadow(0 0 6px lighten(#ee5f5b, 20%));
- }
+// Feedback states
+.has-success {
+ @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);
}
-
-
-
-// FORM ACTIONS
-// ------------
-
-.form-actions {
- padding: ($baseLineHeight - 1) 20px $baseLineHeight;
- margin-top: $baseLineHeight;
- margin-bottom: $baseLineHeight;
- background-color: #f5f5f5;
- border-top: 1px solid #ddd;
+.has-warning {
+ @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);
}
-
-// For text that needs to appear as an input but should not be an input
-.uneditable-input {
- display: block;
- background-color: $white;
- border-color: #eee;
- @include box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
- cursor: not-allowed;
+.has-error {
+ @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);
}
-// Placeholder text gets special styles; can't be bundled together though for some reason
-@include placeholder($grayLight);
+// Static form control text
+//
+// Apply class to a `p` element to make any string of text align with labels in
+// a horizontal form layout.
+
+.form-control-static {
+ margin-bottom: 0; // Remove default margin from `p`
+}
-// HELP TEXT
-// ---------
+// Help text
+//
+// Apply to any element you wish to create light text for placement immediately
+// below a form control. Use for general help, formatting, or instructional text.
.help-block {
display: block; // account for any element using help-block
margin-top: 5px;
- margin-bottom: 0;
- color: $grayLight;
+ margin-bottom: 10px;
+ color: lighten($text-color, 25%); // lighten the text some for contrast
}
-.help-inline {
- display: inline-block;
- @include ie7-inline-block();
- margin-bottom: 9px;
- vertical-align: middle;
- padding-left: 5px;
-}
+// Inline forms
+//
+// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
+// forms begin stacked on extra small (mobile) devices and then go inline when
+// viewports reach <768px.
+//
+// Requires wrapping inputs and labels with `.form-group` for proper display of
+// default HTML form controls and our custom form controls (e.g., input groups).
+//
+// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
-// INPUT GROUPS
-// ------------
+.form-inline {
-// Allow us to put symbols and text within the input field for a cleaner look
-.input-prepend, .input-append {
- margin-bottom: 5px;
- @include clearfix(); // Clear the float to prevent wrapping
- input, .uneditable-input {
- @include border-radius(0 3px 3px 0);
- &:focus {
- position: relative;
- z-index: 2;
+ // Kick in the inline
+ @media (min-width: $screen-sm-min) {
+ // Inline-block all the things for "inline"
+ .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
}
- }
- .uneditable-input {
- border-left-color: #eee;
- border-right-color: #ccc;
- }
- .add-on {
- float: left;
- display: block;
- width: auto;
- min-width: 16px;
- height: $baseLineHeight;
- margin-right: -1px;
- padding: 4px 5px;
- font-weight: normal;
- line-height: $baseLineHeight;
- color: $grayLight;
- text-align: center;
- text-shadow: 0 1px 0 $white;
- background-color: #f5f5f5;
- border: 1px solid #ccc;
- @include border-radius(3px 0 0 3px);
- }
- .active {
- background-color: lighten($green, 30);
- border-color: $green;
- }
-}
-.input-prepend {
- .add-on {
- *margin-top: 1px; /* IE6-7 */
- }
-}
-.input-append {
- input, .uneditable-input {
- float: left;
- @include border-radius(3px 0 0 3px);
- }
- .uneditable-input {
- border-right-color: #ccc;
- }
- .add-on {
- margin-right: 0;
- margin-left: -1px;
- @include border-radius(0 3px 3px 0);
- }
- input:first-child {
- // In IE7, having a hasLayout container (from clearfix's zoom:1) can make the first input
- // inherit the sum of its ancestors' margins.
- *margin-left: -160px;
- &+.add-on {
- *margin-left: -21px;
+ // In navbar-form, allow folks to *not* use `.form-group`
+ .form-control {
+ display: inline-block;
+ width: auto; // Prevent labels from stacking above inputs in `.form-group`
+ vertical-align: middle;
}
- }
-}
-
-
-// SEARCH FORM
-// -----------
-
-.search-query {
- padding-left: 14px;
- padding-right: 14px;
- margin-bottom: 0; // remove the default margin on all inputs
- @include border-radius(14px);
-}
+ .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ .input-group-addon,
+ .input-group-btn,
+ .form-control {
+ width: auto;
+ }
+ }
+ // Input groups need that 100% width though
+ .input-group > .form-control {
+ width: 100%;
+ }
-// HORIZONTAL & VERTICAL FORMS
-// ---------------------------
+ .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
-// Common properties
-// -----------------
+ // Remove default margin on radios/checkboxes that were used for stacking, and
+ // then undo the floating of radios and checkboxes to match (which also avoids
+ // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).
+ .radio,
+ .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ padding-left: 0;
+ vertical-align: middle;
+ }
+ .radio input[type="radio"],
+ .checkbox input[type="checkbox"] {
+ float: none;
+ margin-left: 0;
+ }
-.form-search, .form-inline, .form-horizontal {
- input, textarea, select, .help-inline, .uneditable-input {
- display: inline-block;
- margin-bottom: 0;
+ // Validation states
+ //
+ // Reposition the icon because it's now within a grid column and columns have
+ // `position: relative;` on them. Also accounts for the grid gutter padding.
+ .has-feedback .form-control-feedback {
+ top: 0;
+ }
}
- // Re-hide elemnts due to specifity
- .hide { display: none; }
-}
-.form-search label, .form-inline label, .form-search .input-append, .form-inline .input-append, .form-search .input-prepend, .form-inline .input-prepend {
- display: inline-block;
-}
-// Make the prepend and append add-on vertical-align: middle;
-.form-search .input-append .add-on, .form-inline .input-prepend .add-on, .form-search .input-append .add-on, .form-inline .input-prepend .add-on {
- vertical-align: middle;
-}
-// Inline checkbox/radio labels
-.form-search .radio, .form-inline .radio, .form-search .checkbox, .form-inline .checkbox {
- margin-bottom: 0;
- vertical-align: middle;
}
-// Margin to space out fieldsets
-.control-group {
- margin-bottom: $baseLineHeight / 2;
-}
-
-// Legend collapses margin, so next elements is responsible for spacing
-legend + .control-group {
- margin-top: $baseLineHeight;
- -webkit-margin-top-collapse: separate;
-}
-// Horizontal-specific styles
-// --------------------------
+// Horizontal forms
+//
+// Horizontal forms are built on grid classes and allow you to create forms with
+// labels on the left and inputs on the right.
.form-horizontal {
- // Increase spacing between groups
- .control-group {
- margin-bottom: $baseLineHeight;
- @include clearfix();
+
+ // Consistent vertical alignment of radios and checkboxes
+ //
+ // Labels also get some reset styles, but that is scoped to a media query below.
+ .radio,
+ .checkbox,
+ .radio-inline,
+ .checkbox-inline {
+ margin-top: 0;
+ margin-bottom: 0;
+ padding-top: ($padding-base-vertical + 1); // Default padding plus a border
+ }
+ // Account for padding we're adding to ensure the alignment and of help text
+ // and other content below items
+ .radio,
+ .checkbox {
+ min-height: ($line-height-computed + ($padding-base-vertical + 1));
+ }
+
+ // Make form groups behave like rows
+ .form-group {
+ @include make-row();
}
- // Float the labels left
- .control-label {
- float: left;
- width: 140px;
- padding-top: 5px;
- text-align: right;
+
+ .form-control-static {
+ padding-top: ($padding-base-vertical + 1);
+ padding-bottom: ($padding-base-vertical + 1);
}
- // Move over all input controls and content
- .controls {
- margin-left: 160px;
+
+ // Reset spacing and right align labels, but scope to media queries so that
+ // labels on narrow viewports stack the same as a default form example.
+ @media (min-width: $screen-sm-min) {
+ .control-label {
+ text-align: right;
+ margin-bottom: 0;
+ padding-top: ($padding-base-vertical + 1); // Default padding plus a border
+ }
}
- // Move over buttons in .form-actions to align with .controls
- .form-actions {
- padding-left: 160px;
+
+ // Validation states
+ //
+ // Reposition the icon because it's now within a grid column and columns have
+ // `position: relative;` on them. Also accounts for the grid gutter padding.
+ .has-feedback .form-control-feedback {
+ top: 0;
+ right: ($grid-gutter-width / 2);
}
}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_glyphicons.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_glyphicons.scss
new file mode 100644
index 000000000..3faf5472a
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_glyphicons.scss
@@ -0,0 +1,237 @@
+//= depend_on_asset "bootstrap/glyphicons-halflings-regular.eot"
+//= depend_on_asset "bootstrap/glyphicons-halflings-regular.svg"
+//= depend_on_asset "bootstrap/glyphicons-halflings-regular.ttf"
+//= depend_on_asset "bootstrap/glyphicons-halflings-regular.woff"
+//
+// Glyphicons for Bootstrap
+//
+// Since icons are fonts, they can be placed anywhere text is placed and are
+// thus automatically sized to match the surrounding child. To use, create an
+// inline element with the appropriate classes, like so:
+//
+// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
+
+// Import the fonts
+@font-face {
+ font-family: 'Glyphicons Halflings';
+ src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));
+ src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),
+ url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),
+ url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),
+ url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');
+}
+
+// Catchall baseclass
+.glyphicon {
+ position: relative;
+ top: 1px;
+ display: inline-block;
+ font-family: 'Glyphicons Halflings';
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+// Individual icons
+.glyphicon-asterisk { &:before { content: "\2a"; } }
+.glyphicon-plus { &:before { content: "\2b"; } }
+.glyphicon-euro { &:before { content: "\20ac"; } }
+.glyphicon-minus { &:before { content: "\2212"; } }
+.glyphicon-cloud { &:before { content: "\2601"; } }
+.glyphicon-envelope { &:before { content: "\2709"; } }
+.glyphicon-pencil { &:before { content: "\270f"; } }
+.glyphicon-glass { &:before { content: "\e001"; } }
+.glyphicon-music { &:before { content: "\e002"; } }
+.glyphicon-search { &:before { content: "\e003"; } }
+.glyphicon-heart { &:before { content: "\e005"; } }
+.glyphicon-star { &:before { content: "\e006"; } }
+.glyphicon-star-empty { &:before { content: "\e007"; } }
+.glyphicon-user { &:before { content: "\e008"; } }
+.glyphicon-film { &:before { content: "\e009"; } }
+.glyphicon-th-large { &:before { content: "\e010"; } }
+.glyphicon-th { &:before { content: "\e011"; } }
+.glyphicon-th-list { &:before { content: "\e012"; } }
+.glyphicon-ok { &:before { content: "\e013"; } }
+.glyphicon-remove { &:before { content: "\e014"; } }
+.glyphicon-zoom-in { &:before { content: "\e015"; } }
+.glyphicon-zoom-out { &:before { content: "\e016"; } }
+.glyphicon-off { &:before { content: "\e017"; } }
+.glyphicon-signal { &:before { content: "\e018"; } }
+.glyphicon-cog { &:before { content: "\e019"; } }
+.glyphicon-trash { &:before { content: "\e020"; } }
+.glyphicon-home { &:before { content: "\e021"; } }
+.glyphicon-file { &:before { content: "\e022"; } }
+.glyphicon-time { &:before { content: "\e023"; } }
+.glyphicon-road { &:before { content: "\e024"; } }
+.glyphicon-download-alt { &:before { content: "\e025"; } }
+.glyphicon-download { &:before { content: "\e026"; } }
+.glyphicon-upload { &:before { content: "\e027"; } }
+.glyphicon-inbox { &:before { content: "\e028"; } }
+.glyphicon-play-circle { &:before { content: "\e029"; } }
+.glyphicon-repeat { &:before { content: "\e030"; } }
+.glyphicon-refresh { &:before { content: "\e031"; } }
+.glyphicon-list-alt { &:before { content: "\e032"; } }
+.glyphicon-lock { &:before { content: "\e033"; } }
+.glyphicon-flag { &:before { content: "\e034"; } }
+.glyphicon-headphones { &:before { content: "\e035"; } }
+.glyphicon-volume-off { &:before { content: "\e036"; } }
+.glyphicon-volume-down { &:before { content: "\e037"; } }
+.glyphicon-volume-up { &:before { content: "\e038"; } }
+.glyphicon-qrcode { &:before { content: "\e039"; } }
+.glyphicon-barcode { &:before { content: "\e040"; } }
+.glyphicon-tag { &:before { content: "\e041"; } }
+.glyphicon-tags { &:before { content: "\e042"; } }
+.glyphicon-book { &:before { content: "\e043"; } }
+.glyphicon-bookmark { &:before { content: "\e044"; } }
+.glyphicon-print { &:before { content: "\e045"; } }
+.glyphicon-camera { &:before { content: "\e046"; } }
+.glyphicon-font { &:before { content: "\e047"; } }
+.glyphicon-bold { &:before { content: "\e048"; } }
+.glyphicon-italic { &:before { content: "\e049"; } }
+.glyphicon-text-height { &:before { content: "\e050"; } }
+.glyphicon-text-width { &:before { content: "\e051"; } }
+.glyphicon-align-left { &:before { content: "\e052"; } }
+.glyphicon-align-center { &:before { content: "\e053"; } }
+.glyphicon-align-right { &:before { content: "\e054"; } }
+.glyphicon-align-justify { &:before { content: "\e055"; } }
+.glyphicon-list { &:before { content: "\e056"; } }
+.glyphicon-indent-left { &:before { content: "\e057"; } }
+.glyphicon-indent-right { &:before { content: "\e058"; } }
+.glyphicon-facetime-video { &:before { content: "\e059"; } }
+.glyphicon-picture { &:before { content: "\e060"; } }
+.glyphicon-map-marker { &:before { content: "\e062"; } }
+.glyphicon-adjust { &:before { content: "\e063"; } }
+.glyphicon-tint { &:before { content: "\e064"; } }
+.glyphicon-edit { &:before { content: "\e065"; } }
+.glyphicon-share { &:before { content: "\e066"; } }
+.glyphicon-check { &:before { content: "\e067"; } }
+.glyphicon-move { &:before { content: "\e068"; } }
+.glyphicon-step-backward { &:before { content: "\e069"; } }
+.glyphicon-fast-backward { &:before { content: "\e070"; } }
+.glyphicon-backward { &:before { content: "\e071"; } }
+.glyphicon-play { &:before { content: "\e072"; } }
+.glyphicon-pause { &:before { content: "\e073"; } }
+.glyphicon-stop { &:before { content: "\e074"; } }
+.glyphicon-forward { &:before { content: "\e075"; } }
+.glyphicon-fast-forward { &:before { content: "\e076"; } }
+.glyphicon-step-forward { &:before { content: "\e077"; } }
+.glyphicon-eject { &:before { content: "\e078"; } }
+.glyphicon-chevron-left { &:before { content: "\e079"; } }
+.glyphicon-chevron-right { &:before { content: "\e080"; } }
+.glyphicon-plus-sign { &:before { content: "\e081"; } }
+.glyphicon-minus-sign { &:before { content: "\e082"; } }
+.glyphicon-remove-sign { &:before { content: "\e083"; } }
+.glyphicon-ok-sign { &:before { content: "\e084"; } }
+.glyphicon-question-sign { &:before { content: "\e085"; } }
+.glyphicon-info-sign { &:before { content: "\e086"; } }
+.glyphicon-screenshot { &:before { content: "\e087"; } }
+.glyphicon-remove-circle { &:before { content: "\e088"; } }
+.glyphicon-ok-circle { &:before { content: "\e089"; } }
+.glyphicon-ban-circle { &:before { content: "\e090"; } }
+.glyphicon-arrow-left { &:before { content: "\e091"; } }
+.glyphicon-arrow-right { &:before { content: "\e092"; } }
+.glyphicon-arrow-up { &:before { content: "\e093"; } }
+.glyphicon-arrow-down { &:before { content: "\e094"; } }
+.glyphicon-share-alt { &:before { content: "\e095"; } }
+.glyphicon-resize-full { &:before { content: "\e096"; } }
+.glyphicon-resize-small { &:before { content: "\e097"; } }
+.glyphicon-exclamation-sign { &:before { content: "\e101"; } }
+.glyphicon-gift { &:before { content: "\e102"; } }
+.glyphicon-leaf { &:before { content: "\e103"; } }
+.glyphicon-fire { &:before { content: "\e104"; } }
+.glyphicon-eye-open { &:before { content: "\e105"; } }
+.glyphicon-eye-close { &:before { content: "\e106"; } }
+.glyphicon-warning-sign { &:before { content: "\e107"; } }
+.glyphicon-plane { &:before { content: "\e108"; } }
+.glyphicon-calendar { &:before { content: "\e109"; } }
+.glyphicon-random { &:before { content: "\e110"; } }
+.glyphicon-comment { &:before { content: "\e111"; } }
+.glyphicon-magnet { &:before { content: "\e112"; } }
+.glyphicon-chevron-up { &:before { content: "\e113"; } }
+.glyphicon-chevron-down { &:before { content: "\e114"; } }
+.glyphicon-retweet { &:before { content: "\e115"; } }
+.glyphicon-shopping-cart { &:before { content: "\e116"; } }
+.glyphicon-folder-close { &:before { content: "\e117"; } }
+.glyphicon-folder-open { &:before { content: "\e118"; } }
+.glyphicon-resize-vertical { &:before { content: "\e119"; } }
+.glyphicon-resize-horizontal { &:before { content: "\e120"; } }
+.glyphicon-hdd { &:before { content: "\e121"; } }
+.glyphicon-bullhorn { &:before { content: "\e122"; } }
+.glyphicon-bell { &:before { content: "\e123"; } }
+.glyphicon-certificate { &:before { content: "\e124"; } }
+.glyphicon-thumbs-up { &:before { content: "\e125"; } }
+.glyphicon-thumbs-down { &:before { content: "\e126"; } }
+.glyphicon-hand-right { &:before { content: "\e127"; } }
+.glyphicon-hand-left { &:before { content: "\e128"; } }
+.glyphicon-hand-up { &:before { content: "\e129"; } }
+.glyphicon-hand-down { &:before { content: "\e130"; } }
+.glyphicon-circle-arrow-right { &:before { content: "\e131"; } }
+.glyphicon-circle-arrow-left { &:before { content: "\e132"; } }
+.glyphicon-circle-arrow-up { &:before { content: "\e133"; } }
+.glyphicon-circle-arrow-down { &:before { content: "\e134"; } }
+.glyphicon-globe { &:before { content: "\e135"; } }
+.glyphicon-wrench { &:before { content: "\e136"; } }
+.glyphicon-tasks { &:before { content: "\e137"; } }
+.glyphicon-filter { &:before { content: "\e138"; } }
+.glyphicon-briefcase { &:before { content: "\e139"; } }
+.glyphicon-fullscreen { &:before { content: "\e140"; } }
+.glyphicon-dashboard { &:before { content: "\e141"; } }
+.glyphicon-paperclip { &:before { content: "\e142"; } }
+.glyphicon-heart-empty { &:before { content: "\e143"; } }
+.glyphicon-link { &:before { content: "\e144"; } }
+.glyphicon-phone { &:before { content: "\e145"; } }
+.glyphicon-pushpin { &:before { content: "\e146"; } }
+.glyphicon-usd { &:before { content: "\e148"; } }
+.glyphicon-gbp { &:before { content: "\e149"; } }
+.glyphicon-sort { &:before { content: "\e150"; } }
+.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } }
+.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } }
+.glyphicon-sort-by-order { &:before { content: "\e153"; } }
+.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } }
+.glyphicon-sort-by-attributes { &:before { content: "\e155"; } }
+.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
+.glyphicon-unchecked { &:before { content: "\e157"; } }
+.glyphicon-expand { &:before { content: "\e158"; } }
+.glyphicon-collapse-down { &:before { content: "\e159"; } }
+.glyphicon-collapse-up { &:before { content: "\e160"; } }
+.glyphicon-log-in { &:before { content: "\e161"; } }
+.glyphicon-flash { &:before { content: "\e162"; } }
+.glyphicon-log-out { &:before { content: "\e163"; } }
+.glyphicon-new-window { &:before { content: "\e164"; } }
+.glyphicon-record { &:before { content: "\e165"; } }
+.glyphicon-save { &:before { content: "\e166"; } }
+.glyphicon-open { &:before { content: "\e167"; } }
+.glyphicon-saved { &:before { content: "\e168"; } }
+.glyphicon-import { &:before { content: "\e169"; } }
+.glyphicon-export { &:before { content: "\e170"; } }
+.glyphicon-send { &:before { content: "\e171"; } }
+.glyphicon-floppy-disk { &:before { content: "\e172"; } }
+.glyphicon-floppy-saved { &:before { content: "\e173"; } }
+.glyphicon-floppy-remove { &:before { content: "\e174"; } }
+.glyphicon-floppy-save { &:before { content: "\e175"; } }
+.glyphicon-floppy-open { &:before { content: "\e176"; } }
+.glyphicon-credit-card { &:before { content: "\e177"; } }
+.glyphicon-transfer { &:before { content: "\e178"; } }
+.glyphicon-cutlery { &:before { content: "\e179"; } }
+.glyphicon-header { &:before { content: "\e180"; } }
+.glyphicon-compressed { &:before { content: "\e181"; } }
+.glyphicon-earphone { &:before { content: "\e182"; } }
+.glyphicon-phone-alt { &:before { content: "\e183"; } }
+.glyphicon-tower { &:before { content: "\e184"; } }
+.glyphicon-stats { &:before { content: "\e185"; } }
+.glyphicon-sd-video { &:before { content: "\e186"; } }
+.glyphicon-hd-video { &:before { content: "\e187"; } }
+.glyphicon-subtitles { &:before { content: "\e188"; } }
+.glyphicon-sound-stereo { &:before { content: "\e189"; } }
+.glyphicon-sound-dolby { &:before { content: "\e190"; } }
+.glyphicon-sound-5-1 { &:before { content: "\e191"; } }
+.glyphicon-sound-6-1 { &:before { content: "\e192"; } }
+.glyphicon-sound-7-1 { &:before { content: "\e193"; } }
+.glyphicon-copyright-mark { &:before { content: "\e194"; } }
+.glyphicon-registration-mark { &:before { content: "\e195"; } }
+.glyphicon-cloud-download { &:before { content: "\e197"; } }
+.glyphicon-cloud-upload { &:before { content: "\e198"; } }
+.glyphicon-tree-conifer { &:before { content: "\e199"; } }
+.glyphicon-tree-deciduous { &:before { content: "\e200"; } }
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_grid.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_grid.scss
index d29b7aa5b..f71f8b901 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_grid.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_grid.scss
@@ -1,8 +1,84 @@
-// GRID SYSTEM
-// -----------
+//
+// Grid system
+// --------------------------------------------------
-// Fixed (940px)
-@include gridSystemGenerate($gridColumns, $gridColumnWidth, $gridGutterWidth);
-// Fluid (940px)
-@include fluidGridSystemGenerate($gridColumns, $fluidGridColumnWidth, $fluidGridGutterWidth); \ No newline at end of file
+// Container widths
+//
+// Set the container width, and override it for fixed navbars in media queries.
+
+.container {
+ @include container-fixed();
+
+ @media (min-width: $screen-sm-min) {
+ width: $container-sm;
+ }
+ @media (min-width: $screen-md-min) {
+ width: $container-md;
+ }
+ @media (min-width: $screen-lg-min) {
+ width: $container-lg;
+ }
+}
+
+
+// Fluid container
+//
+// Utilizes the mixin meant for fixed width containers, but without any defined
+// width for fluid, full width layouts.
+
+.container-fluid {
+ @include container-fixed();
+}
+
+
+// Row
+//
+// Rows contain and clear the floats of your columns.
+
+.row {
+ @include make-row();
+}
+
+
+// Columns
+//
+// Common styles for small and large grid columns
+
+@include make-grid-columns();
+
+
+// Extra small grid
+//
+// Columns, offsets, pushes, and pulls for extra small devices like
+// smartphones.
+
+@include make-grid(xs);
+
+
+// Small grid
+//
+// Columns, offsets, pushes, and pulls for the small device range, from phones
+// to tablets.
+
+@media (min-width: $screen-sm-min) {
+ @include make-grid(sm);
+}
+
+
+// Medium grid
+//
+// Columns, offsets, pushes, and pulls for the desktop device range.
+
+@media (min-width: $screen-md-min) {
+ @include make-grid(md);
+}
+
+
+// Large grid
+//
+// Columns, offsets, pushes, and pulls for the large desktop device range.
+
+@media (min-width: $screen-lg-min) {
+ @include make-grid(lg);
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_hero-unit.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_hero-unit.scss
deleted file mode 100644
index 7184ffb18..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_hero-unit.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-// HERO UNIT
-// ---------
-
-.hero-unit {
- padding: 60px;
- margin-bottom: 30px;
- background-color: #f5f5f5;
- @include border-radius(6px);
- h1 {
- margin-bottom: 0;
- font-size: 60px;
- line-height: 1;
- letter-spacing: -1px;
- }
- p {
- font-size: 18px;
- font-weight: 200;
- line-height: $baseLineHeight * 1.5;
- }
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_input-groups.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_input-groups.scss
new file mode 100644
index 000000000..6c26c1dd6
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_input-groups.scss
@@ -0,0 +1,162 @@
+//
+// Input groups
+// --------------------------------------------------
+
+// Base styles
+// -------------------------
+.input-group {
+ position: relative; // For dropdowns
+ display: table;
+ border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
+
+ // Undo padding and float of grid classes
+ &[class*="col-"] {
+ float: none;
+ padding-left: 0;
+ padding-right: 0;
+ }
+
+ .form-control {
+ // Ensure that the input is always above the *appended* addon button for
+ // proper border colors.
+ position: relative;
+ z-index: 2;
+
+ // IE9 fubars the placeholder attribute in text inputs and the arrows on
+ // select elements in input groups. To fix it, we float the input. Details:
+ // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
+ float: left;
+
+ width: 100%;
+ margin-bottom: 0;
+ }
+}
+
+// Sizing options
+//
+// Remix the default form control sizing classes into new ones for easier
+// manipulation.
+
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn { @extend .input-lg; }
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn { @extend .input-sm; }
+
+
+// Display as table-cell
+// -------------------------
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+ display: table-cell;
+
+ &:not(:first-child):not(:last-child) {
+ border-radius: 0;
+ }
+}
+// Addon and addon wrapper for buttons
+.input-group-addon,
+.input-group-btn {
+ width: 1%;
+ white-space: nowrap;
+ vertical-align: middle; // Match the inputs
+}
+
+// Text input groups
+// -------------------------
+.input-group-addon {
+ padding: $padding-base-vertical $padding-base-horizontal;
+ font-size: $font-size-base;
+ font-weight: normal;
+ line-height: 1;
+ color: $input-color;
+ text-align: center;
+ background-color: $input-group-addon-bg;
+ border: 1px solid $input-group-addon-border-color;
+ border-radius: $border-radius-base;
+
+ // Sizing
+ &.input-sm {
+ padding: $padding-small-vertical $padding-small-horizontal;
+ font-size: $font-size-small;
+ border-radius: $border-radius-small;
+ }
+ &.input-lg {
+ padding: $padding-large-vertical $padding-large-horizontal;
+ font-size: $font-size-large;
+ border-radius: $border-radius-large;
+ }
+
+ // Nuke default margins from checkboxes and radios to vertically center within.
+ input[type="radio"],
+ input[type="checkbox"] {
+ margin-top: 0;
+ }
+}
+
+// Reset rounded corners
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+ @include border-right-radius(0);
+}
+.input-group-addon:first-child {
+ border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+ @include border-left-radius(0);
+}
+.input-group-addon:last-child {
+ border-left: 0;
+}
+
+// Button input groups
+// -------------------------
+.input-group-btn {
+ position: relative;
+ // Jankily prevent input button groups from wrapping with `white-space` and
+ // `font-size` in combination with `inline-block` on buttons.
+ font-size: 0;
+ white-space: nowrap;
+
+ // Negative margin for spacing, position for bringing hovered/focused/actived
+ // element above the siblings.
+ > .btn {
+ position: relative;
+ + .btn {
+ margin-left: -1px;
+ }
+ // Bring the "active" button to the front
+ &:hover,
+ &:focus,
+ &:active {
+ z-index: 2;
+ }
+ }
+
+ // Negative margin to only have a 1px border between the two
+ &:first-child {
+ > .btn,
+ > .btn-group {
+ margin-right: -1px;
+ }
+ }
+ &:last-child {
+ > .btn,
+ > .btn-group {
+ margin-left: -1px;
+ }
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_jumbotron.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_jumbotron.scss
new file mode 100644
index 000000000..75efe64e0
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_jumbotron.scss
@@ -0,0 +1,48 @@
+//
+// Jumbotron
+// --------------------------------------------------
+
+
+.jumbotron {
+ padding: $jumbotron-padding;
+ margin-bottom: $jumbotron-padding;
+ color: $jumbotron-color;
+ background-color: $jumbotron-bg;
+
+ h1,
+ .h1 {
+ color: $jumbotron-heading-color;
+ }
+ p {
+ margin-bottom: ($jumbotron-padding / 2);
+ font-size: $jumbotron-font-size;
+ font-weight: 200;
+ }
+
+ > hr {
+ border-top-color: darken($jumbotron-bg, 10%);
+ }
+
+ .container & {
+ border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container
+ }
+
+ .container {
+ max-width: 100%;
+ }
+
+ @media screen and (min-width: $screen-sm-min) {
+ padding-top: ($jumbotron-padding * 1.6);
+ padding-bottom: ($jumbotron-padding * 1.6);
+
+ .container & {
+ padding-left: ($jumbotron-padding * 2);
+ padding-right: ($jumbotron-padding * 2);
+ }
+
+ h1,
+ .h1 {
+ font-size: ($font-size-base * 4.5);
+ }
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_labels.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_labels.scss
index 6e4c22db0..42ed6ea12 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_labels.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_labels.scss
@@ -1,32 +1,66 @@
-// LABELS
-// ------
+//
+// Labels
+// --------------------------------------------------
-// Base
.label {
- padding: 2px 4px 3px;
- font-size: $baseFontSize * .85;
+ display: inline;
+ padding: .2em .6em .3em;
+ font-size: 75%;
font-weight: bold;
- color: $white;
- text-shadow: 0 -1px 0 rgba(0,0,0,.25);
- background-color: $grayLight;
- @include border-radius(3px);
+ line-height: 1;
+ color: $label-color;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+
+ // [converter] extracted a& to a.label
+
+ // Empty labels collapse automatically (not available in IE8)
+ &:empty {
+ display: none;
+ }
+
+ // Quick fix for labels in buttons
+ .btn & {
+ position: relative;
+ top: -1px;
+ }
}
-// Hover state
-.label:hover {
- color: $white;
- text-decoration: none;
+// Add hover effects, but only for links
+a.label {
+ &:hover,
+ &:focus {
+ color: $label-link-hover-color;
+ text-decoration: none;
+ cursor: pointer;
+ }
}
// Colors
-.label-important { background-color: $errorText; }
-.label-important:hover { background-color: darken($errorText, 10%); }
+// Contextual variations (linked labels get darker on :hover)
+
+.label-default {
+ @include label-variant($label-default-bg);
+}
+
+.label-primary {
+ @include label-variant($label-primary-bg);
+}
+
+.label-success {
+ @include label-variant($label-success-bg);
+}
-.label-warning { background-color: $orange; }
-.label-warning:hover { background-color: darken($orange, 10%); }
+.label-info {
+ @include label-variant($label-info-bg);
+}
-.label-success { background-color: $successText; }
-.label-success:hover { background-color: darken($successText, 10%); }
+.label-warning {
+ @include label-variant($label-warning-bg);
+}
-.label-info { background-color: $infoText; }
-.label-info:hover { background-color: darken($infoText, 10%); } \ No newline at end of file
+.label-danger {
+ @include label-variant($label-danger-bg);
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_layouts.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_layouts.scss
deleted file mode 100644
index c600522d2..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_layouts.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// Layouts
-// Fixed-width and fluid (with sidebar) layouts
-// --------------------------------------------
-
-
-// Container (centered, fixed-width layouts)
-.container {
- @include container-fixed();
-}
-
-// Fluid layouts (left aligned, with sidebar, min- & max-width content)
-.container-fluid {
- padding-left: $gridGutterWidth;
- padding-right: $gridGutterWidth;
- @include clearfix();
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_list-group.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_list-group.scss
new file mode 100644
index 000000000..3338f6354
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_list-group.scss
@@ -0,0 +1,129 @@
+//
+// List groups
+// --------------------------------------------------
+
+
+// Base class
+//
+// Easily usable on <ul>, <ol>, or <div>.
+
+.list-group {
+ // No need to set list-style: none; since .list-group-item is block level
+ margin-bottom: 20px;
+ padding-left: 0; // reset padding because ul and ol
+}
+
+
+// Individual list items
+//
+// Use on `li`s or `div`s within the `.list-group` parent.
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: 10px 15px;
+ // Place the border on the list items and negative margin up for better styling
+ margin-bottom: -1px;
+ background-color: $list-group-bg;
+ border: 1px solid $list-group-border;
+
+ // Round the first and last items
+ &:first-child {
+ @include border-top-radius($list-group-border-radius);
+ }
+ &:last-child {
+ margin-bottom: 0;
+ @include border-bottom-radius($list-group-border-radius);
+ }
+
+ // Align badges within list items
+ > .badge {
+ float: right;
+ }
+ > .badge + .badge {
+ margin-right: 5px;
+ }
+}
+
+
+// Linked list items
+//
+// Use anchor elements instead of `li`s or `div`s to create linked list items.
+// Includes an extra `.active` modifier class for showing selected items.
+
+a.list-group-item {
+ color: $list-group-link-color;
+
+ .list-group-item-heading {
+ color: $list-group-link-heading-color;
+ }
+
+ // Hover state
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ color: $list-group-link-hover-color;
+ background-color: $list-group-hover-bg;
+ }
+}
+
+.list-group-item {
+ // Disabled state
+ &.disabled,
+ &.disabled:hover,
+ &.disabled:focus {
+ background-color: $list-group-disabled-bg;
+ color: $list-group-disabled-color;
+
+ // Force color to inherit for custom content
+ .list-group-item-heading {
+ color: inherit;
+ }
+ .list-group-item-text {
+ color: $list-group-disabled-text-color;
+ }
+ }
+
+ // Active class on item itself, not parent
+ &.active,
+ &.active:hover,
+ &.active:focus {
+ z-index: 2; // Place active items above their siblings for proper border styling
+ color: $list-group-active-color;
+ background-color: $list-group-active-bg;
+ border-color: $list-group-active-border;
+
+ // Force color to inherit for custom content
+ .list-group-item-heading {
+ color: inherit;
+ }
+ .list-group-item-text {
+ color: $list-group-active-text-color;
+ }
+ }
+}
+
+
+// Contextual variants
+//
+// Add modifier classes to change text and background color on individual items.
+// Organizationally, this must come after the `:hover` states.
+
+@include list-group-item-variant(success, $state-success-bg, $state-success-text);
+@include list-group-item-variant(info, $state-info-bg, $state-info-text);
+@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);
+@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);
+
+
+// Custom content options
+//
+// Extra classes for creating well-formatted content within `.list-group-item`s.
+
+.list-group-item-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+.list-group-item-text {
+ margin-bottom: 0;
+ line-height: 1.3;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_media.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_media.scss
new file mode 100644
index 000000000..5ad22cd6d
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_media.scss
@@ -0,0 +1,56 @@
+// Media objects
+// Source: http://stubbornella.org/content/?p=497
+// --------------------------------------------------
+
+
+// Common styles
+// -------------------------
+
+// Clear the floats
+.media,
+.media-body {
+ overflow: hidden;
+ zoom: 1;
+}
+
+// Proper spacing between instances of .media
+.media,
+.media .media {
+ margin-top: 15px;
+}
+.media:first-child {
+ margin-top: 0;
+}
+
+// For images and videos, set to block
+.media-object {
+ display: block;
+}
+
+// Reset margins on headings for tighter default spacing
+.media-heading {
+ margin: 0 0 5px;
+}
+
+
+// Media image alignment
+// -------------------------
+
+.media {
+ > .pull-left {
+ margin-right: 10px;
+ }
+ > .pull-right {
+ margin-left: 10px;
+ }
+}
+
+
+// Media list variation
+// -------------------------
+
+// Undo default ul/ol styles
+.media-list {
+ padding-left: 0;
+ list-style: none;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_mixins.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_mixins.scss
index 1731051aa..b565f013a 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_mixins.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_mixins.scss
@@ -1,530 +1,39 @@
-// Mixins.less
-// Snippets of reusable CSS to develop faster and keep code readable
-// -----------------------------------------------------------------
-
-
-// UTILITY MIXINS
-// --------------------------------------------------
-
-// Clearfix
-// --------
-// For clearing floats like a boss h5bp.com/q
-@mixin clearfix() {
- *zoom: 1;
- &:before,
- &:after {
- display: table;
- content: "";
- }
- &:after {
- clear: both;
- }
-}
-.clearfix { @include clearfix(); }
-
-// Webkit-style focus
-// ------------------
-@mixin tab-focus() {
- // Default
- outline: thin dotted #333;
- // Webkit
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-// Center-align a block level element
-// ----------------------------------
-@mixin center-block() {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
-
-// IE7 inline-block
-// ----------------
-@mixin ie7-inline-block() {
- *display: inline; /* IE7 inline-block hack */
- *zoom: 1;
-}
-
-// IE7 likes to collapse whitespace on either side of the inline-block elements.
-// Ems because we're attempting to match the width of a space character. Left
-// version is for form buttons, which typically come after other elements, and
-// right version is for icons, which come before. Applying both is ok, but it will
-// mean that space between those elements will be .6em (~2 space characters) in IE7,
-// instead of the 1 space in other browsers.
-@mixin ie7-restore-left-whitespace() {
- *margin-left: .3em;
-
- &:first-child {
- *margin-left: 0;
- }
-}
-
-@mixin ie7-restore-right-whitespace() {
- *margin-right: .3em;
-
- &:last-child {
- *margin-left: 0;
- }
-}
-
-// Sizing shortcuts
-// -------------------------
-@mixin size($height: 5px, $width: 5px) {
- width: $width;
- height: $height;
-}
-@mixin square($size: 5px) {
- @include size($size, $size);
-}
-
-// Placeholder text
-// -------------------------
-@mixin placeholder($color: $placeholderText) {
- :-moz-placeholder {
- color: $color;
- }
- ::-webkit-input-placeholder {
- color: $color;
- }
-}
-
-// Text overflow
-// ------------------------
-@mixin text-overflow() {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-
-// FONTS
-// --------------------------------------------------
-@mixin font-family-serif() {
- font-family: Georgia, "Times New Roman", Times, serif;
-}
-@mixin font-family-sans-serif() {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-@mixin font-family-monospace() {
- font-family: Menlo, Monaco, "Courier New", monospace;
-}
-@mixin font-shorthand($size: $baseFontSize, $weight: normal, $lineHeight: $baseLineHeight) {
- font-size: $size;
- font-weight: $weight;
- line-height: $lineHeight;
-}
-@mixin font-serif($size: $baseFontSize, $weight: normal, $lineHeight: $baseLineHeight) {
- @include font-family-serif();
- @include font-shorthand($size, $weight, $lineHeight);
-}
-@mixin font-sans-serif($size: $baseFontSize, $weight: normal, $lineHeight: $baseLineHeight) {
- @include font-family-sans-serif();
- @include font-shorthand($size, $weight, $lineHeight);
-}
-@mixin font-monospace($size: $baseFontSize, $weight: normal, $lineHeight: $baseLineHeight) {
- @include font-family-monospace();
- @include font-shorthand($size, $weight, $lineHeight);
-}
-
-
-
-// GRID SYSTEM
-// --------------------------------------------------
-
-// Site container
-// -------------------------
-@mixin container-fixed() {
- width: $gridRowWidth;
- margin-left: auto;
- margin-right: auto;
- @include clearfix();
-}
-
-// Le grid system
-// -------------------------
-
-// Setup the mixins to be used
-@mixin gridSystemColumns($gridGutterWidth, $gridColumnWidth, $gridRowWidth, $columns) {
- width: ($gridColumnWidth * $columns) + ($gridGutterWidth * ($columns - 1));
-}
-@mixin gridSystemOffset($gridColumnWidth, $gridGutterWidth, $columns) {
- margin-left: ($gridColumnWidth * $columns) + ($gridGutterWidth * ($columns - 1)) + ($gridGutterWidth * 2);
-}
-@mixin gridSystemGridColumn($gridGutterWidth) {
- float: left;
- margin-left: $gridGutterWidth;
-}
-// Take these values and mixins, and make 'em do their thang
-@mixin gridSystemGenerate($gridColumns, $gridColumnWidth, $gridGutterWidth) {
- // Row surrounds the columns
- .row {
- margin-left: $gridGutterWidth * -1;
- @include clearfix();
- }
- // Find all .span# classes within .row and give them the necessary properties for grid columns (supported by all browsers back to IE7, thanks @dhg)
- [class*="span"] {
- @include gridSystemGridColumn($gridGutterWidth);
- }
- // Default columns
- @for $i from 1 through $gridColumns {
- .span#{$i} { @include gridSystemColumns($gridGutterWidth, $gridColumnWidth, $gridRowWidth, $i) }
- }
- .container { @include gridSystemColumns($gridGutterWidth, $gridColumnWidth, $gridRowWidth, $gridColumns) }
-
- // Offset column options
- @for $i from 1 through $gridColumns - 1 {
- .offset#{$i} { @include gridSystemOffset($gridColumnWidth, $gridGutterWidth, $i) }
- }
-}
-
-// Fluid grid system
-// -------------------------
-@mixin fluidGridSystemColumns($fluidGridGutterWidth, $fluidGridColumnWidth, $columns) {
- width: ($fluidGridColumnWidth * $columns) + ($fluidGridGutterWidth * ($columns - 1));
-}
-@mixin fluidGridSystemGridColumn($fluidGridGutterWidth) {
- float: left;
- margin-left: $fluidGridGutterWidth;
-}
-// Take these values and mixins, and make 'em do their thang
-@mixin fluidGridSystemGenerate($gridColumns, $fluidGridColumnWidth, $fluidGridGutterWidth) {
- // Row surrounds the columns
- .row-fluid {
- width: 100%;
- @include clearfix();
-
- // Find all .span# classes within .row and give them the necessary properties for grid columns (supported by all browsers back to IE7, thanks @dhg)
- > [class*="span"] {
- @include fluidGridSystemGridColumn($fluidGridGutterWidth);
- }
- > [class*="span"]:first-child {
- margin-left: 0;
- }
- // Default columns
- @for $i from 1 through $gridColumns {
- > .span#{$i} { @include fluidGridSystemColumns($fluidGridGutterWidth, $fluidGridColumnWidth, $i); }
- }
- }
-}
-
-// Input grid system
-// -------------------------
-@mixin inputGridSystemInputColumns($gridGutterWidth, $gridColumnWidth, $gridRowWidth, $columns) {
- width: (($gridColumnWidth) * $columns) + ($gridGutterWidth * ($columns - 1)) - 10;
-}
-@mixin inputGridSystemGenerate($gridColumns, $gridColumnWidth, $gridGutterWidth) {
- input, textarea, .uneditable-input {
- @for $i from 1 through $gridColumns {
- &.span#{$i} { @include inputGridSystemInputColumns($gridGutterWidth, $gridColumnWidth, $gridRowWidth, $i); }
- }
- }
-}
-
-// Make a grid
-// -------------------------
-// Use makeRow() and makeColumn() to assign semantic layouts grid system behaviour
-@mixin makeRow() {
- margin-left: $gridGutterWidth * -1;
- @include clearfix();
-}
-@mixin makeColumn($columns: 1) {
- float: left;
- margin-left: $gridGutterWidth;
- width: ($gridColumnWidth * $columns) + ($gridGutterWidth * ($columns - 1));
-}
-
-
-// Form field states (used in forms.less)
-// --------------------------------------------------
-
-// Mixin for form field states
-@mixin formFieldState($textColor: #555, $borderColor: #ccc, $backgroundColor: #f5f5f5) {
- // Set the text color
- > label, .help-block, .help-inline {
- color: $textColor;
- }
- // Style inputs accordingly
- input, select, textarea {
- color: $textColor;
- border-color: $borderColor;
- &:focus {
- border-color: darken($borderColor, 10%);
- @include box-shadow(0 0 6px lighten($borderColor, 20%));
- }
- }
- // Give a small background color for input-prepend/-append
- .input-prepend .add-on, .input-append .add-on {
- color: $textColor;
- background-color: $backgroundColor;
- border-color: $textColor;
- }
-}
-
-
-// CSS3 PROPERTIES
-// --------------------------------------------------
-
-// Border Radius
-@mixin border-radius($radius: 5px) {
- -webkit-border-radius: $radius;
- -moz-border-radius: $radius;
- border-radius: $radius;
-}
-
-// Drop shadows
-@mixin box-shadow($shadow: 0 1px 3px rgba(0,0,0,.25)) {
- -webkit-box-shadow: $shadow;
- -moz-box-shadow: $shadow;
- box-shadow: $shadow;
-}
-
-// Transitions
-@mixin transition($transition) {
- -webkit-transition: $transition;
- -moz-transition: $transition;
- -ms-transition: $transition;
- -o-transition: $transition;
- transition: $transition;
-}
-
-// Transformations
-@mixin rotate($degrees) {
- -webkit-transform: rotate($degrees);
- -moz-transform: rotate($degrees);
- -ms-transform: rotate($degrees);
- -o-transform: rotate($degrees);
- transform: rotate($degrees);
-}
-@mixin scale($ratio) {
- -webkit-transform: scale($ratio);
- -moz-transform: scale($ratio);
- -ms-transform: scale($ratio);
- -o-transform: scale($ratio);
- transform: scale($ratio);
-}
-@mixin translate($x: 0, $y: 0) {
- -webkit-transform: translate($x, $y);
- -moz-transform: translate($x, $y);
- -ms-transform: translate($x, $y);
- -o-transform: translate($x, $y);
- transform: translate($x, $y);
-}
-
-@mixin skew($x: 0, $y: 0) {
- -webkit-transform: skew($x, $y);
- -moz-transform: skew($x, $y);
- -ms-transform: skew($x, $y);
- -o-transform: skew($x, $y);
- transform: skew($x, $y);
-}
-
-@mixin translate3d($x: 0, $y: 0, $z: 0) {
- -webkit-transform: translate($x, $y, $z);
- -moz-transform: translate($x, $y, $z);
- -ms-transform: translate($x, $y, $z);
- -o-transform: translate($x, $y, $z);
- transform: translate($x, $y, $z);
-}
-
-// Background clipping
-// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
-@mixin background-clip($clip) {
- -webkit-background-clip: $clip;
- -moz-background-clip: $clip;
- background-clip: $clip;
-}
-
-// Background sizing
-@mixin background-size($size){
- -webkit-background-size: $size;
- -moz-background-size: $size;
- -o-background-size: $size;
- background-size: $size;
-}
-
-
-// Box sizing
-@mixin box-sizing($boxmodel) {
- -webkit-box-sizing: $boxmodel;
- -moz-box-sizing: $boxmodel;
- box-sizing: $boxmodel;
-}
-
-// User select
-// For selecting text on the page
-@mixin user-select($select) {
- -webkit-user-select: $select;
- -moz-user-select: $select;
- -o-user-select: $select;
- user-select: $select;
-}
-
-// Resize anything
-@mixin resizable($direction: both) {
- resize: $direction; // Options: horizontal, vertical, both
- overflow: auto; // Safari fix
-}
-
-// CSS3 Content Columns
-@mixin content-columns($columnCount, $columnGap: $gridColumnGutter) {
- -webkit-column-count: $columnCount;
- -moz-column-count: $columnCount;
- column-count: $columnCount;
- -webkit-column-gap: $columnGap;
- -moz-column-gap: $columnGap;
- column-gap: $columnGap;
-}
-
-// Opacity
-@mixin opacity($opacity: 1) {
- opacity: $opacity;
- filter: alpha(opacity=$opacity * 100);
-}
-
-
-
-// BACKGROUNDS
-// --------------------------------------------------
-
-// Add an alphatransparency value to any background or border color (via Elyse Holladay)
-@mixin translucent-background($color: $white, $alpha: 1) {
- background-color: hsla(hue($color), saturation($color), lightness($color), $alpha);
-}
-@mixin translucent-border($color: $white, $alpha: 1) {
- border-color: hsla(hue($color), saturation($color), lightness($color), $alpha);
- @include background-clip(padding-box);
-}
-
-// Gradient Bar Colors for buttons and alerts
-@mixin gradientBar($primaryColor, $secondaryColor) {
- @include gradient-vertical($primaryColor, $secondaryColor);
- border-color: $secondaryColor $secondaryColor darken($secondaryColor, 15%);
- border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
-}
-
-// Gradients
-@mixin gradient-horizontal($startColor: #555, $endColor: #333) {
- background-color: $endColor;
- background-image: -moz-linear-gradient(left, $startColor, $endColor); // FF 3.6+
- background-image: -ms-linear-gradient(left, $startColor, $endColor); // IE10
- background-image: -webkit-gradient(linear, 0 0, 100% 0, from($startColor), to($endColor)); // Safari 4+, Chrome 2+
- background-image: -webkit-linear-gradient(left, $startColor, $endColor); // Safari 5.1+, Chrome 10+
- background-image: -o-linear-gradient(left, $startColor, $endColor); // Opera 11.10
- background-image: linear-gradient(left, $startColor, $endColor); // Le standard
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($startColor)}', endColorstr='#{ie-hex-str($endColor)}', GradientType=1); // IE9 and down
-}
-@mixin gradient-vertical($startColor: #555, $endColor: #333) {
- background-color: mix($startColor, $endColor, 60%);
- background-image: -moz-linear-gradient(top, $startColor, $endColor); // FF 3.6+
- background-image: -ms-linear-gradient(top, $startColor, $endColor); // IE10
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from($startColor), to($endColor)); // Safari 4+, Chrome 2+
- background-image: -webkit-linear-gradient(top, $startColor, $endColor); // Safari 5.1+, Chrome 10+
- background-image: -o-linear-gradient(top, $startColor, $endColor); // Opera 11.10
- background-image: linear-gradient(top, $startColor, $endColor); // The standard
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($startColor)}', endColorstr='#{ie-hex-str($endColor)}', GradientType=0); // IE9 and down
-}
-@mixin gradient-directional($startColor: #555, $endColor: #333, $deg: 45deg) {
- background-color: $endColor;
- background-repeat: repeat-x;
- background-image: -moz-linear-gradient($deg, $startColor, $endColor); // FF 3.6+
- background-image: -ms-linear-gradient($deg, $startColor, $endColor); // IE10
- background-image: -webkit-linear-gradient($deg, $startColor, $endColor); // Safari 5.1+, Chrome 10+
- background-image: -o-linear-gradient($deg, $startColor, $endColor); // Opera 11.10
- background-image: linear-gradient($deg, $startColor, $endColor); // The standard
-}
-@mixin gradient-vertical-three-colors($startColor: #00b3ee, $midColor: #7a43b6, $colorStop: 50%, $endColor: #c3325f) {
- background-color: mix($midColor, $endColor, 80%);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from($startColor), color-stop($colorStop, $midColor), to($endColor));
- background-image: -webkit-linear-gradient($startColor, $midColor $colorStop, $endColor);
- background-image: -moz-linear-gradient(top, $startColor, $midColor $colorStop, $endColor);
- background-image: -ms-linear-gradient($startColor, $midColor $colorStop, $endColor);
- background-image: -o-linear-gradient($startColor, $midColor $colorStop, $endColor);
- background-image: linear-gradient($startColor, $midColor $colorStop, $endColor);
- background-repeat: no-repeat;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($startColor)}', endColorstr='#{ie-hex-str($endColor)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback
-}
-@mixin gradient-radial($innerColor: #555, $outerColor: #333) {
- background-color: $outerColor;
- background-image: -webkit-gradient(radial, center center, 0, center center, 460, from($innerColor), to($outerColor));
- background-image: -webkit-radial-gradient(circle, $innerColor, $outerColor);
- background-image: -moz-radial-gradient(circle, $innerColor, $outerColor);
- background-image: -ms-radial-gradient(circle, $innerColor, $outerColor);
- background-repeat: no-repeat;
- // Opera cannot do radial gradients yet
-}
-@mixin gradient-striped($color, $angle: -45deg) {
- background-color: $color;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient($angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient($angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
- background-image: -ms-linear-gradient($angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient($angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient($angle, rgba(255,255,255,.15) 25%, rgba(255,255,255,0) 25%, rgba(255,255,255,0) 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, rgba(255,255,255,0) 75%, rgba(255,255,255,0));
-}
-// Reset filters for IE
-@mixin reset-filter() {
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-}
-
-
-// Mixin for generating button backgrounds
-// ---------------------------------------
-@mixin buttonBackground($startColor, $endColor) {
- // gradientBar will set the background to a pleasing blend of these, to support IE<=9
- @include gradientBar($startColor, $endColor);
- @include reset-filter();
-
- // in these cases the gradient won't cover the background, so we override
- &:hover, &:active, &.active, &.disabled, &[disabled] {
- background-color: $endColor;
- }
-
- // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
- &:active, &.active {
- background-color: darken($endColor, 10%) \9;
- }
-}
-
-
-// COMPONENT MIXINS
+// Mixins
// --------------------------------------------------
-// POPOVER ARROWS
-// -------------------------
-// For tipsies and popovers
-@mixin popoverArrowTop($arrowWidth: 5px) {
- bottom: 0;
- left: 50%;
- margin-left: -$arrowWidth;
- border-left: $arrowWidth solid transparent;
- border-right: $arrowWidth solid transparent;
- border-top: $arrowWidth solid $black;
-}
-@mixin popoverArrowLeft($arrowWidth: 5px) {
- top: 50%;
- right: 0;
- margin-top: -$arrowWidth;
- border-top: $arrowWidth solid transparent;
- border-bottom: $arrowWidth solid transparent;
- border-left: $arrowWidth solid $black;
-}
-@mixin popoverArrowBottom($arrowWidth: 5px) {
- top: 0;
- left: 50%;
- margin-left: -$arrowWidth;
- border-left: $arrowWidth solid transparent;
- border-right: $arrowWidth solid transparent;
- border-bottom: $arrowWidth solid $black;
-}
-@mixin popoverArrowRight($arrowWidth: 5px) {
- top: 50%;
- left: 0;
- margin-top: -$arrowWidth;
- border-top: $arrowWidth solid transparent;
- border-bottom: $arrowWidth solid transparent;
- border-right: $arrowWidth solid $black;
-}
+// Utilities
+@import "mixins/hide-text";
+@import "mixins/opacity";
+@import "mixins/image";
+@import "mixins/labels";
+@import "mixins/reset-filter";
+@import "mixins/resize";
+@import "mixins/responsive-visibility";
+@import "mixins/size";
+@import "mixins/tab-focus";
+@import "mixins/text-emphasis";
+@import "mixins/text-overflow";
+@import "mixins/vendor-prefixes";
+
+// Components
+@import "mixins/alerts";
+@import "mixins/buttons";
+@import "mixins/panels";
+@import "mixins/pagination";
+@import "mixins/list-group";
+@import "mixins/nav-divider";
+@import "mixins/forms";
+@import "mixins/progress-bar";
+@import "mixins/table-row";
+
+// Skins
+@import "mixins/background-variant";
+@import "mixins/border-radius";
+@import "mixins/gradients";
+
+// Layout
+@import "mixins/clearfix";
+@import "mixins/center-block";
+@import "mixins/nav-vertical-align";
+@import "mixins/grid-framework";
+@import "mixins/grid";
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_modals.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_modals.scss
index 0e80951b4..a126c3986 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_modals.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_modals.scss
@@ -1,83 +1,147 @@
-// MODALS
-// ------
+//
+// Modals
+// --------------------------------------------------
-// Recalculate z-index where appropriate
+// .modal-open - body class for killing the scroll
+// .modal - container to scroll within
+// .modal-dialog - positioning shell for the actual modal
+// .modal-content - actual modal w/ bg and corners and shit
+
+// Kill the scroll on the body
.modal-open {
- .dropdown-menu { z-index: $zindexDropdown + $zindexModal; }
- .dropdown.open { *z-index: $zindexDropdown + $zindexModal; }
- .popover { z-index: $zindexPopover + $zindexModal; }
- .tooltip { z-index: $zindexTooltip + $zindexModal; }
+ overflow: hidden;
}
-// Background
-.modal-backdrop {
+// Container that the modal scrolls within
+.modal {
+ display: none;
+ overflow: auto;
+ overflow-y: scroll;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
- z-index: $zindexModalBackdrop;
- background-color: $black;
- // Fade for backdrop
- &.fade { opacity: 0; }
+ z-index: $zindex-modal;
+ -webkit-overflow-scrolling: touch;
+
+ // Prevent Chrome on Windows from adding a focus outline. For details, see
+ // https://github.com/twbs/bootstrap/pull/10951.
+ outline: 0;
+
+ // When fading in the modal, animate it to slide down
+ &.fade .modal-dialog {
+ @include translate(0, -25%);
+ @include transition-transform(0.3s ease-out);
+ }
+ &.in .modal-dialog { @include translate(0, 0)}
}
-.modal-backdrop, .modal-backdrop.fade.in {
- @include opacity(0.8);
+// Shell div to position the modal with bottom padding
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px;
}
-// Base modal
-.modal {
+// Actual modal
+.modal-content {
+ position: relative;
+ background-color: $modal-content-bg;
+ border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
+ border: 1px solid $modal-content-border-color;
+ border-radius: $border-radius-large;
+ @include box-shadow(0 3px 9px rgba(0,0,0,.5));
+ background-clip: padding-box;
+ // Remove focus outline from opened modal
+ outline: 0;
+}
+
+// Modal background
+.modal-backdrop {
position: fixed;
- top: 50%;
- left: 50%;
- z-index: $zindexModal;
- max-height: 500px;
- overflow: auto;
- width: 560px;
- margin: -250px 0 0 -280px;
- background-color: $white;
- border: 1px solid #999;
- border: 1px solid rgba(0,0,0,.3);
- *border: 1px solid #999; /* IE6-7 */
- @include border-radius(6px);
- @include box-shadow(0 3px 7px rgba(0,0,0,0.3));
- @include background-clip(padding-box);
- &.fade {
- $transition: opacity .3s linear, top .3s ease-out;
- @include transition($transition);
- top: -25%;
- }
- &.fade.in { top: 50%; }
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: $zindex-modal-background;
+ background-color: $modal-backdrop-bg;
+ // Fade for backdrop
+ &.fade { @include opacity(0); }
+ &.in { @include opacity($modal-backdrop-opacity); }
}
+
+// Modal header
+// Top section of the modal w/ title and dismiss
.modal-header {
- padding: 9px 15px;
- border-bottom: 1px solid #eee;
- // Close icon
- .close { margin-top: 2px; }
+ padding: $modal-title-padding;
+ border-bottom: 1px solid $modal-header-border-color;
+ min-height: ($modal-title-padding + $modal-title-line-height);
+}
+// Close icon
+.modal-header .close {
+ margin-top: -2px;
}
-// Body (where all modal content resides)
-.modal-body {
- padding: 15px;
+// Title text within header
+.modal-title {
+ margin: 0;
+ line-height: $modal-title-line-height;
}
-// Remove bottom margin if need be
-.modal-body .modal-form {
- margin-bottom: 0;
+
+// Modal body
+// Where all modal content resides (sibling of .modal-header and .modal-footer)
+.modal-body {
+ position: relative;
+ padding: $modal-inner-padding;
}
// Footer (for actions)
.modal-footer {
- padding: 14px 15px 15px;
- margin-bottom: 0;
- background-color: #f5f5f5;
- border-top: 1px solid #ddd;
- @include border-radius(0 0 6px 6px);
- @include box-shadow(inset 0 1px 0 $white);
- @include clearfix();
- .btn {
- float: right;
+ padding: $modal-inner-padding;
+ text-align: right; // right align buttons
+ border-top: 1px solid $modal-footer-border-color;
+ @include clearfix(); // clear it in case folks use .pull-* classes on buttons
+
+ // Properly space out buttons
+ .btn + .btn {
margin-left: 5px;
margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
}
+ // but override that for button groups
+ .btn-group .btn + .btn {
+ margin-left: -1px;
+ }
+ // and override it for block buttons as well
+ .btn-block + .btn-block {
+ margin-left: 0;
+ }
+}
+
+// Measure scrollbar width for padding body during modal show/hide
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
+// Scale up the modal
+@media (min-width: $screen-sm-min) {
+ // Automatically set modal's width for larger viewports
+ .modal-dialog {
+ width: $modal-md;
+ margin: 30px auto;
+ }
+ .modal-content {
+ @include box-shadow(0 5px 15px rgba(0,0,0,.5));
+ }
+
+ // Modal sizes
+ .modal-sm { width: $modal-sm; }
+}
+
+@media (min-width: $screen-md-min) {
+ .modal-lg { width: $modal-lg; }
}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_navbar.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_navbar.scss
index 305dbd9ab..4401803f1 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_navbar.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_navbar.scss
@@ -1,288 +1,658 @@
-// NAVBAR (FIXED AND STATIC)
-// -------------------------
+//
+// Navbars
+// --------------------------------------------------
-// COMMON STYLES
-// -------------
+// Wrapper and base class
+//
+// Provide a static navbar from which we expand to create full-width, fixed, and
+// other navbar variations.
.navbar {
- overflow: visible;
- margin-bottom: $baseLineHeight;
-}
+ position: relative;
+ min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
+ margin-bottom: $navbar-margin-bottom;
+ border: 1px solid transparent;
-// Gradient is applied to it's own element because overflow visible is not honored by IE when filter is present
-.navbar-inner {
- padding-left: 20px;
- padding-right: 20px;
- @include gradient-vertical($navbarBackgroundHighlight, $navbarBackground);
- @include border-radius(4px);
- $shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1);
- @include box-shadow($shadow);
-}
+ // Prevent floats from breaking the navbar
+ @include clearfix();
-// Navbar button for toggling navbar items in responsive layouts
-.btn-navbar {
- display: none;
- float: right;
- padding: 7px 10px;
- margin-left: 5px;
- margin-right: 5px;
- @include buttonBackground($navbarBackgroundHighlight, $navbarBackground);
- $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
- @include box-shadow($shadow);
-}
-.btn-navbar .icon-bar {
- display: block;
- width: 18px;
- height: 2px;
- background-color: #f5f5f5;
- @include border-radius(1px);
- @include box-shadow(0 1px 0 rgba(0,0,0,.25));
-}
-.btn-navbar .icon-bar + .icon-bar {
- margin-top: 3px;
-}
-// Override the default collapsed state
-.nav-collapse.collapse {
- height: auto;
+ @media (min-width: $grid-float-breakpoint) {
+ border-radius: $navbar-border-radius;
+ }
}
-// Brand, links, text, and buttons
-.navbar {
- // Hover and active states
- .brand:hover {
- text-decoration: none;
- }
- // Website or project name
- .brand {
+// Navbar heading
+//
+// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
+// styling of responsive aspects.
+
+.navbar-header {
+ @include clearfix();
+
+ @media (min-width: $grid-float-breakpoint) {
float: left;
- display: block;
- padding: 8px 20px 12px;
- margin-left: -20px; // negative indent to left-align the text down the page
- font-size: 20px;
- font-weight: 200;
- line-height: 1;
- color: $white;
- }
- // Plain text in topbar
- .navbar-text {
- margin-bottom: 0;
- line-height: 40px;
- color: $navbarText;
- a:hover {
- color: $white;
- background-color: transparent;
- }
- }
- // Buttons in navbar
- .btn, .btn-group {
- margin-top: 5px; // make buttons vertically centered in navbar
- }
- .btn-group .btn {
- margin-top: 0; // then undo the margin here so we don't accidentally double it
}
}
-// Navbar forms
-.navbar-form {
- margin-bottom: 0; // remove default bottom margin
+
+// Navbar collapse (body)
+//
+// Group your navbar content into this for easy collapsing and expanding across
+// various device sizes. By default, this content is collapsed when <768px, but
+// will expand past that for a horizontal display.
+//
+// To start (on mobile devices) the navbar links, forms, and buttons are stacked
+// vertically and include a `max-height` to overflow in case you have too much
+// content for the user's viewport.
+
+.navbar-collapse {
+ overflow-x: visible;
+ padding-right: $navbar-padding-horizontal;
+ padding-left: $navbar-padding-horizontal;
+ border-top: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
@include clearfix();
- input, select {
- display: inline-block;
- margin-top: 5px;
- margin-bottom: 0;
- }
- .radio, .checkbox {
- margin-top: 5px;
+ -webkit-overflow-scrolling: touch;
+
+ &.in {
+ overflow-y: auto;
}
- input[type="image"], input[type="checkbox"], input[type="radio"] {
- margin-top: 3px;
+
+ @media (min-width: $grid-float-breakpoint) {
+ width: auto;
+ border-top: 0;
+ box-shadow: none;
+
+ &.collapse {
+ display: block !important;
+ height: auto !important;
+ padding-bottom: 0; // Override default setting
+ overflow: visible !important;
+ }
+
+ &.in {
+ overflow-y: visible;
+ }
+
+ // Undo the collapse side padding for navbars with containers to ensure
+ // alignment of right-aligned contents.
+ .navbar-fixed-top &,
+ .navbar-static-top &,
+ .navbar-fixed-bottom & {
+ padding-left: 0;
+ padding-right: 0;
+ }
}
- .input-append, .input-prepend {
- margin-top: 6px;
- white-space: nowrap; // prevents two items from separating within a .navbar-form that has .pull-left
- input {
- margin-top: 0; //remove the margin on top since it's on parent
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ .navbar-collapse {
+ max-height: $navbar-collapse-max-height;
+
+ @media (max-width: $screen-xs-min) and (orientation: landscape) {
+ max-height: 200px;
}
}
}
-// Navbar search
-.navbar-search {
- position: relative;
- float: left;
- margin-top: 6px;
- margin-bottom: 0;
- .search-query {
- padding: 4px 9px;
- @include font-sans-serif(13px, normal, 1);
- color: $white;
- color: rgba(255,255,255,.75);
- background: #666;
- background: rgba(255,255,255,.3);
- border: 1px solid #111;
- $shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0px rgba(255,255,255,.15);
- @include box-shadow($shadow);
- @include transition(none);
-
- // Placeholder text gets special styles; can't be bundled together though for some reason
- @include placeholder($grayLighter);
-
- // Hover states
- &:hover {
- color: $white;
- background-color: $grayLight;
- background-color: rgba(255,255,255,.5);
- }
- // Focus states (we use .focused since IE7-8 and down doesn't support :focus)
- &:focus, &.focused {
- padding: 5px 10px;
- color: $grayDark;
- text-shadow: 0 1px 0 $white;
- background-color: $white;
- border: 0;
- @include box-shadow(0 0 3px rgba(0,0,0,.15));
- outline: 0;
+
+// Both navbar header and collapse
+//
+// When a container is present, change the behavior of the header and collapse.
+
+.container,
+.container-fluid {
+ > .navbar-header,
+ > .navbar-collapse {
+ margin-right: -$navbar-padding-horizontal;
+ margin-left: -$navbar-padding-horizontal;
+
+ @media (min-width: $grid-float-breakpoint) {
+ margin-right: 0;
+ margin-left: 0;
}
}
}
-// FIXED NAVBAR
-// ------------
+//
+// Navbar alignment options
+//
+// Display the navbar across the entirety of the page or fixed it to the top or
+// bottom of the page.
-.navbar-fixed-top {
+// Static top (unfixed, but 100% wide) navbar
+.navbar-static-top {
+ z-index: $zindex-navbar;
+ border-width: 0 0 1px;
+
+ @media (min-width: $grid-float-breakpoint) {
+ border-radius: 0;
+ }
+}
+
+// Fix the top/bottom navbars when screen real estate supports it
+.navbar-fixed-top,
+.navbar-fixed-bottom {
position: fixed;
- top: 0;
right: 0;
left: 0;
- z-index: $zindexFixedNavbar;
+ z-index: $zindex-navbar-fixed;
+
+ // Undo the rounded corners
+ @media (min-width: $grid-float-breakpoint) {
+ border-radius: 0;
+ }
+}
+.navbar-fixed-top {
+ top: 0;
+ border-width: 0 0 1px;
}
-.navbar-fixed-top .navbar-inner {
- padding-left: 0;
- padding-right: 0;
- @include border-radius(0);
+.navbar-fixed-bottom {
+ bottom: 0;
+ margin-bottom: 0; // override .navbar defaults
+ border-width: 1px 0 0;
}
-// NAVIGATION
-// ----------
+// Brand/project name
-.navbar .nav {
- position: relative;
- left: 0;
- display: block;
- float: left;
- margin: 0 10px 0 0;
-}
-.navbar .nav.pull-right {
- float: right; // redeclare due to specificity
-}
-.navbar .nav > li {
- display: block;
+.navbar-brand {
float: left;
-}
+ padding: $navbar-padding-vertical $navbar-padding-horizontal;
+ font-size: $font-size-large;
+ line-height: $line-height-computed;
+ height: $navbar-height;
-// Links
-.navbar .nav > li > a {
- float: none;
- padding: 10px 10px 11px;
- line-height: 19px;
- color: $navbarLinkColor;
- text-decoration: none;
- text-shadow: 0 -1px 0 rgba(0,0,0,.25);
-}
-// Hover
-.navbar .nav > li > a:hover {
- background-color: $navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover from :active
- color: $navbarLinkColorHover;
- text-decoration: none;
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ }
+
+ @media (min-width: $grid-float-breakpoint) {
+ .navbar > .container &,
+ .navbar > .container-fluid & {
+ margin-left: -$navbar-padding-horizontal;
+ }
+ }
}
-// Active nav items
-.navbar .nav .active > a, .navbar .nav .active > a:hover {
- color: $navbarLinkColorHover;
- text-decoration: none;
- background-color: $navbarBackground;
+
+// Navbar toggle
+//
+// Custom button for toggling the `.navbar-collapse`, powered by the collapse
+// JavaScript plugin.
+
+.navbar-toggle {
+ position: relative;
+ float: right;
+ margin-right: $navbar-padding-horizontal;
+ padding: 9px 10px;
+ @include navbar-vertical-align(34px);
+ background-color: transparent;
+ background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+ border: 1px solid transparent;
+ border-radius: $border-radius-base;
+
+ // We remove the `outline` here, but later compensate by attaching `:hover`
+ // styles to `:focus`.
+ &:focus {
+ outline: 0;
+ }
+
+ // Bars
+ .icon-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ border-radius: 1px;
+ }
+ .icon-bar + .icon-bar {
+ margin-top: 4px;
+ }
+
+ @media (min-width: $grid-float-breakpoint) {
+ display: none;
+ }
}
-// Dividers (basically a vertical hr)
-.navbar .divider-vertical {
- height: $navbarHeight;
- width: 1px;
- margin: 0 9px;
- overflow: hidden;
- background-color: $navbarBackground;
- border-right: 1px solid $navbarBackgroundHighlight;
+
+// Navbar nav links
+//
+// Builds on top of the `.nav` components with its own modifier class to make
+// the nav the full height of the horizontal nav (above 768px).
+
+.navbar-nav {
+ margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
+
+ > li > a {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: $line-height-computed;
+ }
+
+ @media (max-width: $grid-float-breakpoint-max) {
+ // Dropdowns get custom display when collapsed
+ .open .dropdown-menu {
+ position: static;
+ float: none;
+ width: auto;
+ margin-top: 0;
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ > li > a,
+ .dropdown-header {
+ padding: 5px 15px 5px 25px;
+ }
+ > li > a {
+ line-height: $line-height-computed;
+ &:hover,
+ &:focus {
+ background-image: none;
+ }
+ }
+ }
+ }
+
+ // Uncollapse the nav
+ @media (min-width: $grid-float-breakpoint) {
+ float: left;
+ margin: 0;
+
+ > li {
+ float: left;
+ > a {
+ padding-top: $navbar-padding-vertical;
+ padding-bottom: $navbar-padding-vertical;
+ }
+ }
+
+ &.navbar-right:last-child {
+ margin-right: -$navbar-padding-horizontal;
+ }
+ }
}
-// Secondary (floated right) nav in topbar
-.navbar .nav.pull-right {
- margin-left: 10px;
- margin-right: 0;
+
+// Component alignment
+//
+// Repurpose the pull utilities as their own navbar utilities to avoid specificity
+// issues with parents and chaining. Only do this when the navbar is uncollapsed
+// though so that navbar contents properly stack and align in mobile.
+
+@media (min-width: $grid-float-breakpoint) {
+ .navbar-left {
+ float: left !important;
+ }
+ .navbar-right {
+ float: right !important;
+ }
}
+// Navbar form
+//
+// Extension of the `.form-inline` with some extra flavor for optimum display in
+// our navbars.
-// Dropdown menus
-// --------------
+.navbar-form {
+ margin-left: -$navbar-padding-horizontal;
+ margin-right: -$navbar-padding-horizontal;
+ padding: 10px $navbar-padding-horizontal;
+ border-top: 1px solid transparent;
+ border-bottom: 1px solid transparent;
+ $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+ @include box-shadow($shadow);
-// Menu position and menu carets
-.navbar .dropdown-menu {
- margin-top: 1px;
- @include border-radius(4px);
- &:before {
- content: '';
- display: inline-block;
- border-left: 7px solid transparent;
- border-right: 7px solid transparent;
- border-bottom: 7px solid #ccc;
- border-bottom-color: rgba(0,0,0,.2);
- position: absolute;
- top: -7px;
- left: 9px;
- }
- &:after {
- content: '';
- display: inline-block;
- border-left: 6px solid transparent;
- border-right: 6px solid transparent;
- border-bottom: 6px solid $white;
- position: absolute;
- top: -6px;
- left: 10px;
+ // Mixin behavior for optimum display
+ @extend .form-inline;
+
+ .form-group {
+ @media (max-width: $grid-float-breakpoint-max) {
+ margin-bottom: 5px;
+ }
+ }
+
+ // Vertically center in expanded, horizontal navbar
+ @include navbar-vertical-align($input-height-base);
+
+ // Undo 100% width for pull classes
+ @media (min-width: $grid-float-breakpoint) {
+ width: auto;
+ border: 0;
+ margin-left: 0;
+ margin-right: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ @include box-shadow(none);
+
+ // Outdent the form if last child to line up with content down the page
+ &.navbar-right:last-child {
+ margin-right: -$navbar-padding-horizontal;
+ }
}
}
-// Dropdown toggle caret
-.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret {
- border-top-color: $white;
+
+// Dropdown menus
+
+// Menu position and menu carets
+.navbar-nav > li > .dropdown-menu {
+ margin-top: 0;
+ @include border-top-radius(0);
}
-.navbar .nav .active .caret {
- @include opacity(1);
+// Menu position and menu caret support for dropups via extra dropup class
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+ @include border-bottom-radius(0);
}
-// Remove background color from open dropdown
-.navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle {
- background-color: transparent;
+
+// Buttons in navbars
+//
+// Vertically center a button within a navbar (when *not* in a form).
+
+.navbar-btn {
+ @include navbar-vertical-align($input-height-base);
+
+ &.btn-sm {
+ @include navbar-vertical-align($input-height-small);
+ }
+ &.btn-xs {
+ @include navbar-vertical-align(22);
+ }
}
-// Dropdown link on hover
-.navbar .nav .active > .dropdown-toggle:hover {
- color: $white;
+
+// Text in navbars
+//
+// Add a class to make any element properly align itself vertically within the navbars.
+
+.navbar-text {
+ @include navbar-vertical-align($line-height-computed);
+
+ @media (min-width: $grid-float-breakpoint) {
+ float: left;
+ margin-left: $navbar-padding-horizontal;
+ margin-right: $navbar-padding-horizontal;
+
+ // Outdent the form if last child to line up with content down the page
+ &.navbar-right:last-child {
+ margin-right: 0;
+ }
+ }
}
-// Right aligned menus need alt position
-.navbar .nav.pull-right .dropdown-menu {
- left: auto;
- right: 0;
- &:before {
- left: auto;
- right: 12px;
+// Alternate navbars
+// --------------------------------------------------
+
+// Default navbar
+.navbar-default {
+ background-color: $navbar-default-bg;
+ border-color: $navbar-default-border;
+
+ .navbar-brand {
+ color: $navbar-default-brand-color;
+ &:hover,
+ &:focus {
+ color: $navbar-default-brand-hover-color;
+ background-color: $navbar-default-brand-hover-bg;
+ }
+ }
+
+ .navbar-text {
+ color: $navbar-default-color;
+ }
+
+ .navbar-nav {
+ > li > a {
+ color: $navbar-default-link-color;
+
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-hover-color;
+ background-color: $navbar-default-link-hover-bg;
+ }
+ }
+ > .active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-active-color;
+ background-color: $navbar-default-link-active-bg;
+ }
+ }
+ > .disabled > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-disabled-color;
+ background-color: $navbar-default-link-disabled-bg;
+ }
+ }
+ }
+
+ .navbar-toggle {
+ border-color: $navbar-default-toggle-border-color;
+ &:hover,
+ &:focus {
+ background-color: $navbar-default-toggle-hover-bg;
+ }
+ .icon-bar {
+ background-color: $navbar-default-toggle-icon-bar-bg;
+ }
+ }
+
+ .navbar-collapse,
+ .navbar-form {
+ border-color: $navbar-default-border;
+ }
+
+ // Dropdown menu items
+ .navbar-nav {
+ // Remove background color from open dropdown
+ > .open > a {
+ &,
+ &:hover,
+ &:focus {
+ background-color: $navbar-default-link-active-bg;
+ color: $navbar-default-link-active-color;
+ }
+ }
+
+ @media (max-width: $grid-float-breakpoint-max) {
+ // Dropdowns get custom display when collapsed
+ .open .dropdown-menu {
+ > li > a {
+ color: $navbar-default-link-color;
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-hover-color;
+ background-color: $navbar-default-link-hover-bg;
+ }
+ }
+ > .active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-active-color;
+ background-color: $navbar-default-link-active-bg;
+ }
+ }
+ > .disabled > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-disabled-color;
+ background-color: $navbar-default-link-disabled-bg;
+ }
+ }
+ }
+ }
+ }
+
+
+ // Links in navbars
+ //
+ // Add a class to ensure links outside the navbar nav are colored correctly.
+
+ .navbar-link {
+ color: $navbar-default-link-color;
+ &:hover {
+ color: $navbar-default-link-hover-color;
+ }
+ }
+
+ .btn-link {
+ color: $navbar-default-link-color;
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-hover-color;
+ }
+ &[disabled],
+ fieldset[disabled] & {
+ &:hover,
+ &:focus {
+ color: $navbar-default-link-disabled-color;
+ }
+ }
+ }
+}
+
+// Inverse navbar
+
+.navbar-inverse {
+ background-color: $navbar-inverse-bg;
+ border-color: $navbar-inverse-border;
+
+ .navbar-brand {
+ color: $navbar-inverse-brand-color;
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-brand-hover-color;
+ background-color: $navbar-inverse-brand-hover-bg;
+ }
+ }
+
+ .navbar-text {
+ color: $navbar-inverse-color;
}
- &:after {
- left: auto;
- right: 13px;
+
+ .navbar-nav {
+ > li > a {
+ color: $navbar-inverse-link-color;
+
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-hover-color;
+ background-color: $navbar-inverse-link-hover-bg;
+ }
+ }
+ > .active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-active-color;
+ background-color: $navbar-inverse-link-active-bg;
+ }
+ }
+ > .disabled > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-disabled-color;
+ background-color: $navbar-inverse-link-disabled-bg;
+ }
+ }
+ }
+
+ // Darken the responsive nav toggle
+ .navbar-toggle {
+ border-color: $navbar-inverse-toggle-border-color;
+ &:hover,
+ &:focus {
+ background-color: $navbar-inverse-toggle-hover-bg;
+ }
+ .icon-bar {
+ background-color: $navbar-inverse-toggle-icon-bar-bg;
+ }
+ }
+
+ .navbar-collapse,
+ .navbar-form {
+ border-color: darken($navbar-inverse-bg, 7%);
+ }
+
+ // Dropdowns
+ .navbar-nav {
+ > .open > a {
+ &,
+ &:hover,
+ &:focus {
+ background-color: $navbar-inverse-link-active-bg;
+ color: $navbar-inverse-link-active-color;
+ }
+ }
+
+ @media (max-width: $grid-float-breakpoint-max) {
+ // Dropdowns get custom display
+ .open .dropdown-menu {
+ > .dropdown-header {
+ border-color: $navbar-inverse-border;
+ }
+ .divider {
+ background-color: $navbar-inverse-border;
+ }
+ > li > a {
+ color: $navbar-inverse-link-color;
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-hover-color;
+ background-color: $navbar-inverse-link-hover-bg;
+ }
+ }
+ > .active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-active-color;
+ background-color: $navbar-inverse-link-active-bg;
+ }
+ }
+ > .disabled > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-disabled-color;
+ background-color: $navbar-inverse-link-disabled-bg;
+ }
+ }
+ }
+ }
+ }
+
+ .navbar-link {
+ color: $navbar-inverse-link-color;
+ &:hover {
+ color: $navbar-inverse-link-hover-color;
+ }
+ }
+
+ .btn-link {
+ color: $navbar-inverse-link-color;
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-hover-color;
+ }
+ &[disabled],
+ fieldset[disabled] & {
+ &:hover,
+ &:focus {
+ color: $navbar-inverse-link-disabled-color;
+ }
+ }
}
}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_navs.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_navs.scss
index 27623aa52..c690072be 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_navs.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_navs.scss
@@ -1,329 +1,242 @@
-// NAVIGATIONS
-// -----------
+//
+// Navs
+// --------------------------------------------------
-
-// BASE CLASS
-// ----------
+// Base class
+// --------------------------------------------------
.nav {
- margin-left: 0;
- margin-bottom: $baseLineHeight;
+ margin-bottom: 0;
+ padding-left: 0; // Override default ul/ol
list-style: none;
-}
-
-// Make links block level
-.nav > li > a {
- display: block;
-}
-.nav > li > a:hover {
- text-decoration: none;
- background-color: $grayLighter;
-}
+ @include clearfix();
-// Nav headers (for dropdowns and lists)
-.nav .nav-header {
- display: block;
- padding: 3px 15px;
- font-size: 11px;
- font-weight: bold;
- line-height: $baseLineHeight;
- color: $grayLight;
- text-shadow: 0 1px 0 rgba(255,255,255,.5);
- text-transform: uppercase;
-}
-// Space them out when they follow another list item (link)
-.nav li + .nav-header {
- margin-top: 9px;
-}
+ > li {
+ position: relative;
+ display: block;
+
+ > a {
+ position: relative;
+ display: block;
+ padding: $nav-link-padding;
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ background-color: $nav-link-hover-bg;
+ }
+ }
+
+ // Disabled state sets text to gray and nukes hover/tab effects
+ &.disabled > a {
+ color: $nav-disabled-link-color;
+
+ &:hover,
+ &:focus {
+ color: $nav-disabled-link-hover-color;
+ text-decoration: none;
+ background-color: transparent;
+ cursor: not-allowed;
+ }
+ }
+ }
+ // Open dropdowns
+ .open > a {
+ &,
+ &:hover,
+ &:focus {
+ background-color: $nav-link-hover-bg;
+ border-color: $link-color;
+ }
+ }
-// NAV LIST
-// --------
+ // Nav dividers (deprecated with v3.0.1)
+ //
+ // This should have been removed in v3 with the dropping of `.nav-list`, but
+ // we missed it. We don't currently support this anywhere, but in the interest
+ // of maintaining backward compatibility in case you use it, it's deprecated.
+ .nav-divider {
+ @include nav-divider();
+ }
-.nav-list {
- padding-left: 14px;
- padding-right: 14px;
- margin-bottom: 0;
-}
-.nav-list > li > a, .nav-list .nav-header {
- margin-left: -15px;
- margin-right: -15px;
- text-shadow: 0 1px 0 rgba(255,255,255,.5);
-}
-.nav-list > li > a {
- padding: 3px 15px;
-}
-.nav-list .active > a, .nav-list .active > a:hover {
- color: $white;
- text-shadow: 0 -1px 0 rgba(0,0,0,.2);
- background-color: $linkColor;
-}
-.nav-list [class^="icon-"] {
- margin-right: 2px;
+ // Prevent IE8 from misplacing imgs
+ //
+ // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
+ > li > a > img {
+ max-width: none;
+ }
}
-
-// TABS AND PILLS
-// -------------
-
-// Common styles
-.nav-tabs, .nav-pills {
- @include clearfix();
-}
-.nav-tabs > li, .nav-pills > li {
- float: left;
-}
-.nav-tabs > li > a, .nav-pills > li > a {
- padding-right: 12px;
- padding-left: 12px;
- margin-right: 2px;
- line-height: 14px; // keeps the overall height an even number
-}
-
-// TABS
-// ----
+// Tabs
+// -------------------------
// Give the tabs something to sit on
.nav-tabs {
- border-bottom: 1px solid #ddd;
+ border-bottom: 1px solid $nav-tabs-border-color;
+ > li {
+ float: left;
+ // Make the list-items overlay the bottom border
+ margin-bottom: -1px;
+
+ // Actual tabs (as links)
+ > a {
+ margin-right: 2px;
+ line-height: $line-height-base;
+ border: 1px solid transparent;
+ border-radius: $border-radius-base $border-radius-base 0 0;
+ &:hover {
+ border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;
+ }
+ }
+
+ // Active state, and its :hover to override normal :hover
+ &.active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $nav-tabs-active-link-hover-color;
+ background-color: $nav-tabs-active-link-hover-bg;
+ border: 1px solid $nav-tabs-active-link-hover-border-color;
+ border-bottom-color: transparent;
+ cursor: default;
+ }
+ }
+ }
+ // pulling this in mainly for less shorthand
+ &.nav-justified {
+ @extend .nav-justified;
+ @extend .nav-tabs-justified;
+ }
}
-// Make the list-items overlay the bottom border
-.nav-tabs > li {
- margin-bottom: -1px;
-}
-// Actual tabs (as links)
-.nav-tabs > li > a {
- padding-top: 9px;
- padding-bottom: 9px;
- border: 1px solid transparent;
- @include border-radius(4px 4px 0 0);
- &:hover {
- border-color: $grayLighter $grayLighter #ddd;
+// Pills
+// -------------------------
+.nav-pills {
+ > li {
+ float: left;
+
+ // Links rendered as pills
+ > a {
+ border-radius: $nav-pills-border-radius;
+ }
+ + li {
+ margin-left: 2px;
+ }
+
+ // Active state
+ &.active > a {
+ &,
+ &:hover,
+ &:focus {
+ color: $nav-pills-active-link-hover-color;
+ background-color: $nav-pills-active-link-hover-bg;
+ }
+ }
}
}
-// Active state, and it's :hover to override normal :hover
-.nav-tabs > .active > a, .nav-tabs > .active > a:hover {
- color: $gray;
- background-color: $white;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
- cursor: default;
-}
-// PILLS
-// -----
-// Links rendered as pills
-.nav-pills > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- margin-top: 2px;
- margin-bottom: 2px;
- @include border-radius(5px);
+// Stacked pills
+.nav-stacked {
+ > li {
+ float: none;
+ + li {
+ margin-top: 2px;
+ margin-left: 0; // no need for this gap between nav items
+ }
+ }
}
-// Active state
-.nav-pills .active > a, .nav-pills .active > a:hover {
- color: $white;
- background-color: $linkColor;
-}
+// Nav variations
+// --------------------------------------------------
+// Justified nav links
+// -------------------------
-// STACKED NAV
-// -----------
+.nav-justified {
+ width: 100%;
-// Stacked tabs and pills
-.nav-stacked > li {
- float: none;
-}
-.nav-stacked > li > a {
- margin-right: 0; // no need for the gap between nav items
-}
+ > li {
+ float: none;
+ > a {
+ text-align: center;
+ margin-bottom: 5px;
+ }
+ }
-// Tabs
-.nav-tabs.nav-stacked {
- border-bottom: 0;
-}
-.nav-tabs.nav-stacked > li > a {
- border: 1px solid #ddd;
- @include border-radius(0);
-}
-.nav-tabs.nav-stacked > li:first-child > a {
- @include border-radius(4px 4px 0 0);
-}
-.nav-tabs.nav-stacked > li:last-child > a {
- @include border-radius(0 0 4px 4px);
-}
-.nav-tabs.nav-stacked > li > a:hover {
- border-color: #ddd;
- z-index: 2;
-}
+ > .dropdown .dropdown-menu {
+ top: auto;
+ left: auto;
+ }
-// Pills
-.nav-pills.nav-stacked > li > a {
- margin-bottom: 3px;
-}
-.nav-pills.nav-stacked > li:last-child > a {
- margin-bottom: 1px; // decrease margin to match sizing of stacked tabs
+ @media (min-width: $screen-sm-min) {
+ > li {
+ display: table-cell;
+ width: 1%;
+ > a {
+ margin-bottom: 0;
+ }
+ }
+ }
}
+// Move borders to anchors instead of bottom of list
+//
+// Mixin for adding on top the shared `.nav-justified` styles for our tabs
+.nav-tabs-justified {
+ border-bottom: 0;
+ > li > a {
+ // Override margin from .nav-tabs
+ margin-right: 0;
+ border-radius: $border-radius-base;
+ }
-// DROPDOWNS
-// ---------
-
-// Position the menu
-.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu {
- margin-top: 1px;
- border-width: 1px;
-}
-.nav-pills .dropdown-menu {
- @include border-radius(4px);
-}
-
-// Default dropdown links
-// -------------------------
-// Make carets use linkColor to start
-.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret {
- border-top-color: $linkColor;
- margin-top: 6px;
-}
-.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret {
- border-top-color: $linkColorHover;
-}
+ > .active > a,
+ > .active > a:hover,
+ > .active > a:focus {
+ border: 1px solid $nav-tabs-justified-link-border-color;
+ }
-// Active dropdown links
-// -------------------------
-.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret {
- border-top-color: $grayDark;
+ @media (min-width: $screen-sm-min) {
+ > li > a {
+ border-bottom: 1px solid $nav-tabs-justified-link-border-color;
+ border-radius: $border-radius-base $border-radius-base 0 0;
+ }
+ > .active > a,
+ > .active > a:hover,
+ > .active > a:focus {
+ border-bottom-color: $nav-tabs-justified-active-link-border-color;
+ }
+ }
}
-// Active:hover dropdown links
-// -------------------------
-.nav > .dropdown.active > a:hover {
- color: $black;
- cursor: pointer;
-}
-// Open dropdowns
+// Tabbable tabs
// -------------------------
-.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover {
- color: $white;
- background-color: $grayLight;
- border-color: $grayLight;
-}
-.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret {
- border-top-color: $white;
- @include opacity(1);
-}
-
-// Dropdowns in stacked tabs
-.tabs-stacked .open > a:hover {
- border-color: $grayLight;
-}
-
-
-
-// TABBABLE
-// --------
-
-// COMMON STYLES
-// -------------
-
-// Clear any floats
-.tabbable {
- @include clearfix();
-}
+// Hide tabbable panes to start, show them when `.active`
.tab-content {
- overflow: hidden; // prevent content from running below tabs
-}
-
-// Remove border on bottom, left, right
-.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs {
- border-bottom: 0;
-}
-
-// Show/hide tabbable areas
-.tab-content > .tab-pane, .pill-content > .pill-pane {
- display: none;
-}
-.tab-content > .active, .pill-content > .active {
- display: block;
-}
-
-
-// BOTTOM
-// ------
-
-.tabs-below .nav-tabs {
- border-top: 1px solid #ddd;
-}
-.tabs-below .nav-tabs > li {
- margin-top: -1px;
- margin-bottom: 0;
-}
-.tabs-below .nav-tabs > li > a {
- @include border-radius(0 0 4px 4px);
- &:hover {
- border-bottom-color: transparent;
- border-top-color: #ddd;
+ > .tab-pane {
+ display: none;
+ }
+ > .active {
+ display: block;
}
-}
-.tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover {
- border-color: transparent #ddd #ddd #ddd;
}
-// LEFT & RIGHT
-// ------------
-// Common styles
-.tabs-left .nav-tabs > li, .tabs-right .nav-tabs > li {
- float: none;
-}
-.tabs-left .nav-tabs > li > a, .tabs-right .nav-tabs > li > a {
- min-width: 74px;
- margin-right: 0;
- margin-bottom: 3px;
-}
-
-// Tabs on the left
-.tabs-left .nav-tabs {
- float: left;
- margin-right: 19px;
- border-right: 1px solid #ddd;
-}
-.tabs-left .nav-tabs > li > a {
- margin-right: -1px;
- @include border-radius(4px 0 0 4px);
-}
-.tabs-left .nav-tabs > li > a:hover {
- border-color: $grayLighter #ddd $grayLighter $grayLighter;
-}
-.tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover {
- border-color: #ddd transparent #ddd #ddd;
- *border-right-color: $white;
-}
+// Dropdowns
+// -------------------------
-// Tabs on the right
-.tabs-right .nav-tabs {
- float: right;
- margin-left: 19px;
- border-left: 1px solid #ddd;
-}
-.tabs-right .nav-tabs > li > a {
- margin-left: -1px;
- @include border-radius(0 4px 4px 0);
-}
-.tabs-right .nav-tabs > li > a:hover {
- border-color: $grayLighter $grayLighter $grayLighter #ddd;
-}
-.tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover {
- border-color: #ddd #ddd #ddd transparent;
- *border-left-color: $white;
+// Specific dropdowns
+.nav-tabs .dropdown-menu {
+ // make dropdown border overlap tab border
+ margin-top: -1px;
+ // Remove the top rounded corners here since there is a hard edge above the menu
+ @include border-top-radius(0);
}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_normalize.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_normalize.scss
new file mode 100644
index 000000000..ce04b6a2f
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_normalize.scss
@@ -0,0 +1,425 @@
+/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
+
+//
+// 1. Set default font family to sans-serif.
+// 2. Prevent iOS text size adjust after orientation change, without disabling
+// user zoom.
+//
+
+html {
+ font-family: sans-serif; // 1
+ -ms-text-size-adjust: 100%; // 2
+ -webkit-text-size-adjust: 100%; // 2
+}
+
+//
+// Remove default margin.
+//
+
+body {
+ margin: 0;
+}
+
+// HTML5 display definitions
+// ==========================================================================
+
+//
+// Correct `block` display not defined for any HTML5 element in IE 8/9.
+// Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.
+// Correct `block` display not defined for `main` in IE 11.
+//
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+ display: block;
+}
+
+//
+// 1. Correct `inline-block` display not defined in IE 8/9.
+// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+//
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; // 1
+ vertical-align: baseline; // 2
+}
+
+//
+// Prevent modern browsers from displaying `audio` without controls.
+// Remove excess height in iOS 5 devices.
+//
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+//
+// Address `[hidden]` styling not present in IE 8/9/10.
+// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+//
+
+[hidden],
+template {
+ display: none;
+}
+
+// Links
+// ==========================================================================
+
+//
+// Remove the gray background color from active links in IE 10.
+//
+
+a {
+ background: transparent;
+}
+
+//
+// Improve readability when focused and also mouse hovered in all browsers.
+//
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+// Text-level semantics
+// ==========================================================================
+
+//
+// Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+//
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+//
+// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+//
+
+b,
+strong {
+ font-weight: bold;
+}
+
+//
+// Address styling not present in Safari and Chrome.
+//
+
+dfn {
+ font-style: italic;
+}
+
+//
+// Address variable `h1` font-size and margin within `section` and `article`
+// contexts in Firefox 4+, Safari, and Chrome.
+//
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+//
+// Address styling not present in IE 8/9.
+//
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+//
+// 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;
+}
+
+// Embedded content
+// ==========================================================================
+
+//
+// Remove border when inside `a` element in IE 8/9/10.
+//
+
+img {
+ border: 0;
+}
+
+//
+// Correct overflow not hidden in IE 9/10/11.
+//
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+// Grouping content
+// ==========================================================================
+
+//
+// Address margin not present in IE 8/9 and Safari.
+//
+
+figure {
+ margin: 1em 40px;
+}
+
+//
+// Address differences between Firefox and other browsers.
+//
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+//
+// Contain overflow in all browsers.
+//
+
+pre {
+ overflow: auto;
+}
+
+//
+// Address odd `em`-unit font size rendering in all browsers.
+//
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+// Forms
+// ==========================================================================
+
+//
+// Known limitation: by default, Chrome and Safari on OS X allow very limited
+// styling of `select`, unless a `border` property is set.
+//
+
+//
+// 1. Correct color not being inherited.
+// Known issue: affects color of disabled elements.
+// 2. Correct font properties not being inherited.
+// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+//
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; // 1
+ font: inherit; // 2
+ margin: 0; // 3
+}
+
+//
+// Address `overflow` set to `hidden` in IE 8/9/10/11.
+//
+
+button {
+ overflow: visible;
+}
+
+//
+// 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 Firefox, IE 8/9/10/11, and Opera.
+// Correct `select` style inheritance in Firefox.
+//
+
+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.
+//
+
+button,
+html input[type="button"], // 1
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; // 2
+ cursor: pointer; // 3
+}
+
+//
+// Re-set default cursor for disabled elements.
+//
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+//
+// Remove inner padding and border in Firefox 4+.
+//
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+//
+// Address Firefox 4+ setting `line-height` on `input` using `!important` in
+// the UA stylesheet.
+//
+
+input {
+ line-height: normal;
+}
+
+//
+// It's recommended that you don't attempt to style these elements.
+// Firefox's implementation doesn't respect box-sizing, padding, or width.
+//
+// 1. Address box sizing set to `content-box` in IE 8/9/10.
+// 2. Remove excess padding in IE 8/9/10.
+//
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; // 1
+ padding: 0; // 2
+}
+
+//
+// Fix the cursor style for Chrome's increment/decrement buttons. For certain
+// `font-size` values of the `input`, it causes the cursor style of the
+// decrement button to change from `default` to `text`.
+//
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+//
+// 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+// 2. Address `box-sizing` set to `border-box` in Safari 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 and Chrome on OS X.
+// Safari (but not Chrome) clips the cancel button when the search input has
+// padding (and `textfield` appearance).
+//
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+//
+// 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 8/9/10/11.
+// 2. Remove padding so people aren't caught out if they zero out fieldsets.
+//
+
+legend {
+ border: 0; // 1
+ padding: 0; // 2
+}
+
+//
+// Remove default vertical scrollbar in IE 8/9/10/11.
+//
+
+textarea {
+ overflow: auto;
+}
+
+//
+// Don't inherit the `font-weight` (applied by a rule above).
+// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+//
+
+optgroup {
+ font-weight: bold;
+}
+
+// Tables
+// ==========================================================================
+
+//
+// Remove most spacing between table cells.
+//
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_pager.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_pager.scss
index ee6afefbe..6531fe6f8 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_pager.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_pager.scss
@@ -1,30 +1,55 @@
-// PAGER
-// -----
+//
+// Pager pagination
+// --------------------------------------------------
+
.pager {
- margin-left: 0;
- margin-bottom: $baseLineHeight;
+ padding-left: 0;
+ margin: $line-height-computed 0;
list-style: none;
text-align: center;
@include clearfix();
+ li {
+ display: inline;
+ > a,
+ > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: $pager-bg;
+ border: 1px solid $pager-border;
+ border-radius: $pager-border-radius;
+ }
+
+ > a:hover,
+ > a:focus {
+ text-decoration: none;
+ background-color: $pager-hover-bg;
+ }
+ }
+
+ .next {
+ > a,
+ > span {
+ float: right;
+ }
+ }
+
+ .previous {
+ > a,
+ > span {
+ float: left;
+ }
+ }
+
+ .disabled {
+ > a,
+ > a:hover,
+ > a:focus,
+ > span {
+ color: $pager-disabled-color;
+ background-color: $pager-bg;
+ cursor: not-allowed;
+ }
+ }
+
}
-.pager li {
- display: inline;
-}
-.pager a {
- display: inline-block;
- padding: 5px 14px;
- background-color: #fff;
- border: 1px solid #ddd;
- @include border-radius(15px);
-}
-.pager a:hover {
- text-decoration: none;
- background-color: #f5f5f5;
-}
-.pager .next a {
- float: right;
-}
-.pager .previous a {
- float: left;
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_pagination.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_pagination.scss
index 105c710c3..44c12226b 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_pagination.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_pagination.scss
@@ -1,53 +1,88 @@
-// PAGINATION
-// ----------
-
+//
+// Pagination (multiple pages)
+// --------------------------------------------------
.pagination {
- height: $baseLineHeight * 2;
- margin: $baseLineHeight 0;
- }
-.pagination ul {
display: inline-block;
- @include ie7-inline-block();
- margin-left: 0;
- margin-bottom: 0;
- @include border-radius(3px);
- @include box-shadow(0 1px 2px rgba(0,0,0,.05));
-}
-.pagination li {
- display: inline;
-}
-.pagination a {
- float: left;
- padding: 0 14px;
- line-height: ($baseLineHeight * 2) - 2;
- text-decoration: none;
- border: 1px solid #ddd;
- border-left-width: 0;
-}
-.pagination a:hover, .pagination .active a {
- background-color: #f5f5f5;
-}
-.pagination .active a {
- color: $grayLight;
- cursor: default;
-}
-.pagination .disabled a, .pagination .disabled a:hover {
- color: $grayLight;
- background-color: transparent;
- cursor: default;
-}
-.pagination li:first-child a {
- border-left-width: 1px;
- @include border-radius(3px 0 0 3px);
+ padding-left: 0;
+ margin: $line-height-computed 0;
+ border-radius: $border-radius-base;
+
+ > li {
+ display: inline; // Remove list-style and block-level defaults
+ > a,
+ > span {
+ position: relative;
+ float: left; // Collapse white-space
+ padding: $padding-base-vertical $padding-base-horizontal;
+ line-height: $line-height-base;
+ text-decoration: none;
+ color: $pagination-color;
+ background-color: $pagination-bg;
+ border: 1px solid $pagination-border;
+ margin-left: -1px;
+ }
+ &:first-child {
+ > a,
+ > span {
+ margin-left: 0;
+ @include border-left-radius($border-radius-base);
+ }
+ }
+ &:last-child {
+ > a,
+ > span {
+ @include border-right-radius($border-radius-base);
+ }
+ }
+ }
+
+ > li > a,
+ > li > span {
+ &:hover,
+ &:focus {
+ color: $pagination-hover-color;
+ background-color: $pagination-hover-bg;
+ border-color: $pagination-hover-border;
+ }
+ }
+
+ > .active > a,
+ > .active > span {
+ &,
+ &:hover,
+ &:focus {
+ z-index: 2;
+ color: $pagination-active-color;
+ background-color: $pagination-active-bg;
+ border-color: $pagination-active-border;
+ cursor: default;
+ }
+ }
+
+ > .disabled {
+ > span,
+ > span:hover,
+ > span:focus,
+ > a,
+ > a:hover,
+ > a:focus {
+ color: $pagination-disabled-color;
+ background-color: $pagination-disabled-bg;
+ border-color: $pagination-disabled-border;
+ cursor: not-allowed;
+ }
+ }
}
-.pagination li:last-child a {
- @include border-radius(0 3px 3px 0);
+
+// Sizing
+// --------------------------------------------------
+
+// Large
+.pagination-lg {
+ @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $border-radius-large);
}
-// Centered
-.pagination-centered {
- text-align: center;
+// Small
+.pagination-sm {
+ @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $border-radius-small);
}
-.pagination-right {
- text-align: right;
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_panels.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_panels.scss
new file mode 100644
index 000000000..42ab5fec9
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_panels.scss
@@ -0,0 +1,240 @@
+//
+// Panels
+// --------------------------------------------------
+
+
+// Base class
+.panel {
+ margin-bottom: $line-height-computed;
+ background-color: $panel-bg;
+ border: 1px solid transparent;
+ border-radius: $panel-border-radius;
+ @include box-shadow(0 1px 1px rgba(0,0,0,.05));
+}
+
+// Panel contents
+.panel-body {
+ padding: $panel-body-padding;
+ @include clearfix();
+}
+
+// Optional heading
+.panel-heading {
+ padding: $panel-heading-padding;
+ border-bottom: 1px solid transparent;
+ @include border-top-radius(($panel-border-radius - 1));
+
+ > .dropdown .dropdown-toggle {
+ color: inherit;
+ }
+}
+
+// Within heading, strip any `h*` tag of its default margins for spacing.
+.panel-title {
+ margin-top: 0;
+ margin-bottom: 0;
+ font-size: ceil(($font-size-base * 1.125));
+ color: inherit;
+
+ > a {
+ color: inherit;
+ }
+}
+
+// Optional footer (stays gray in every modifier class)
+.panel-footer {
+ padding: $panel-footer-padding;
+ background-color: $panel-footer-bg;
+ border-top: 1px solid $panel-inner-border;
+ @include border-bottom-radius(($panel-border-radius - 1));
+}
+
+
+// List groups in panels
+//
+// By default, space out list group content from panel headings to account for
+// any kind of custom content between the two.
+
+.panel {
+ > .list-group {
+ margin-bottom: 0;
+
+ .list-group-item {
+ border-width: 1px 0;
+ border-radius: 0;
+ }
+
+ // Add border top radius for first one
+ &:first-child {
+ .list-group-item:first-child {
+ border-top: 0;
+ @include border-top-radius(($panel-border-radius - 1));
+ }
+ }
+ // Add border bottom radius for last one
+ &:last-child {
+ .list-group-item:last-child {
+ border-bottom: 0;
+ @include border-bottom-radius(($panel-border-radius - 1));
+ }
+ }
+ }
+}
+// Collapse space between when there's no additional content.
+.panel-heading + .list-group {
+ .list-group-item:first-child {
+ border-top-width: 0;
+ }
+}
+
+
+// Tables in panels
+//
+// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
+// watch it go full width.
+
+.panel {
+ > .table,
+ > .table-responsive > .table {
+ margin-bottom: 0;
+ }
+ // Add border top radius for first one
+ > .table:first-child,
+ > .table-responsive:first-child > .table:first-child {
+ @include border-top-radius(($panel-border-radius - 1));
+
+ > thead:first-child,
+ > tbody:first-child {
+ > tr:first-child {
+ td:first-child,
+ th:first-child {
+ border-top-left-radius: ($panel-border-radius - 1);
+ }
+ td:last-child,
+ th:last-child {
+ border-top-right-radius: ($panel-border-radius - 1);
+ }
+ }
+ }
+ }
+ // Add border bottom radius for last one
+ > .table:last-child,
+ > .table-responsive:last-child > .table:last-child {
+ @include border-bottom-radius(($panel-border-radius - 1));
+
+ > tbody:last-child,
+ > tfoot:last-child {
+ > tr:last-child {
+ td:first-child,
+ th:first-child {
+ border-bottom-left-radius: ($panel-border-radius - 1);
+ }
+ td:last-child,
+ th:last-child {
+ border-bottom-right-radius: ($panel-border-radius - 1);
+ }
+ }
+ }
+ }
+ > .panel-body + .table,
+ > .panel-body + .table-responsive {
+ border-top: 1px solid $table-border-color;
+ }
+ > .table > tbody:first-child > tr:first-child th,
+ > .table > tbody:first-child > tr:first-child td {
+ border-top: 0;
+ }
+ > .table-bordered,
+ > .table-responsive > .table-bordered {
+ border: 0;
+ > thead,
+ > tbody,
+ > tfoot {
+ > tr {
+ > th:first-child,
+ > td:first-child {
+ border-left: 0;
+ }
+ > th:last-child,
+ > td:last-child {
+ border-right: 0;
+ }
+ }
+ }
+ > thead,
+ > tbody {
+ > tr:first-child {
+ > td,
+ > th {
+ border-bottom: 0;
+ }
+ }
+ }
+ > tbody,
+ > tfoot {
+ > tr:last-child {
+ > td,
+ > th {
+ border-bottom: 0;
+ }
+ }
+ }
+ }
+ > .table-responsive {
+ border: 0;
+ margin-bottom: 0;
+ }
+}
+
+
+// Collapsable panels (aka, accordion)
+//
+// Wrap a series of panels in `.panel-group` to turn them into an accordion with
+// the help of our collapse JavaScript plugin.
+
+.panel-group {
+ margin-bottom: $line-height-computed;
+
+ // Tighten up margin so it's only between panels
+ .panel {
+ margin-bottom: 0;
+ border-radius: $panel-border-radius;
+ + .panel {
+ margin-top: 5px;
+ }
+ }
+
+ .panel-heading {
+ border-bottom: 0;
+ + .panel-collapse .panel-body {
+ border-top: 1px solid $panel-inner-border;
+ }
+ }
+ .panel-footer {
+ border-top: 0;
+ + .panel-collapse .panel-body {
+ border-bottom: 1px solid $panel-inner-border;
+ }
+ }
+}
+
+
+// Contextual variations
+.panel-default {
+ @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);
+}
+.panel-primary {
+ @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);
+}
+.panel-success {
+ @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);
+}
+.panel-info {
+ @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);
+}
+.panel-warning {
+ @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);
+}
+.panel-danger {
+ @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_popovers.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_popovers.scss
index a0b200ecf..1cf27aed5 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_popovers.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_popovers.scss
@@ -1,49 +1,133 @@
-// POPOVERS
-// --------
+//
+// Popovers
+// --------------------------------------------------
+
.popover {
position: absolute;
top: 0;
left: 0;
- z-index: $zindexPopover;
+ z-index: $zindex-popover;
display: none;
- padding: 5px;
- &.top { margin-top: -5px; }
- &.right { margin-left: 5px; }
- &.bottom { margin-top: 5px; }
- &.left { margin-left: -5px; }
- &.top .arrow { @include popoverArrowTop(); }
- &.right .arrow { @include popoverArrowRight(); }
- &.bottom .arrow { @include popoverArrowBottom(); }
- &.left .arrow { @include popoverArrowLeft(); }
- .arrow {
+ max-width: $popover-max-width;
+ padding: 1px;
+ text-align: left; // Reset given new insertion method
+ background-color: $popover-bg;
+ background-clip: padding-box;
+ border: 1px solid $popover-fallback-border-color;
+ border: 1px solid $popover-border-color;
+ border-radius: $border-radius-large;
+ @include box-shadow(0 5px 10px rgba(0,0,0,.2));
+
+ // Overrides for proper insertion
+ white-space: normal;
+
+ // Offset the popover to account for the popover arrow
+ &.top { margin-top: -$popover-arrow-width; }
+ &.right { margin-left: $popover-arrow-width; }
+ &.bottom { margin-top: $popover-arrow-width; }
+ &.left { margin-left: -$popover-arrow-width; }
+}
+
+.popover-title {
+ margin: 0; // reset heading margin
+ padding: 8px 14px;
+ font-size: $font-size-base;
+ font-weight: normal;
+ line-height: 18px;
+ background-color: $popover-title-bg;
+ border-bottom: 1px solid darken($popover-title-bg, 5%);
+ border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;
+}
+
+.popover-content {
+ padding: 9px 14px;
+}
+
+// Arrows
+//
+// .arrow is outer, .arrow:after is inner
+
+.popover > .arrow {
+ &,
+ &:after {
position: absolute;
+ display: block;
width: 0;
height: 0;
+ border-color: transparent;
+ border-style: solid;
}
}
-.popover-inner {
- padding: 3px;
- width: 280px;
- overflow: hidden;
- background: $black; // has to be full background declaration for IE fallback
- background: rgba(0,0,0,.8);
- @include border-radius(6px);
- @include box-shadow(0 3px 7px rgba(0,0,0,0.3));
+.popover > .arrow {
+ border-width: $popover-arrow-outer-width;
}
-.popover-title {
- padding: 9px 15px;
- line-height: 1;
- background-color: #f5f5f5;
- border-bottom:1px solid #eee;
- @include border-radius(3px 3px 0 0);
+.popover > .arrow:after {
+ border-width: $popover-arrow-width;
+ content: "";
}
-.popover-content {
- padding: 14px;
- background-color: $white;
- @include border-radius(0 0 3px 3px);
- @include background-clip(padding-box);
- p, ul, ol {
- margin-bottom: 0;
+
+.popover {
+ &.top > .arrow {
+ left: 50%;
+ margin-left: -$popover-arrow-outer-width;
+ border-bottom-width: 0;
+ border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+ border-top-color: $popover-arrow-outer-color;
+ bottom: -$popover-arrow-outer-width;
+ &:after {
+ content: " ";
+ bottom: 1px;
+ margin-left: -$popover-arrow-width;
+ border-bottom-width: 0;
+ border-top-color: $popover-arrow-color;
+ }
+ }
+ &.right > .arrow {
+ top: 50%;
+ left: -$popover-arrow-outer-width;
+ margin-top: -$popover-arrow-outer-width;
+ border-left-width: 0;
+ border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+ border-right-color: $popover-arrow-outer-color;
+ &:after {
+ content: " ";
+ left: 1px;
+ bottom: -$popover-arrow-width;
+ border-left-width: 0;
+ border-right-color: $popover-arrow-color;
+ }
}
-} \ No newline at end of file
+ &.bottom > .arrow {
+ left: 50%;
+ margin-left: -$popover-arrow-outer-width;
+ border-top-width: 0;
+ border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+ border-bottom-color: $popover-arrow-outer-color;
+ top: -$popover-arrow-outer-width;
+ &:after {
+ content: " ";
+ top: 1px;
+ margin-left: -$popover-arrow-width;
+ border-top-width: 0;
+ border-bottom-color: $popover-arrow-color;
+ }
+ }
+
+ &.left > .arrow {
+ top: 50%;
+ right: -$popover-arrow-outer-width;
+ margin-top: -$popover-arrow-outer-width;
+ border-right-width: 0;
+ border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+ border-left-color: $popover-arrow-outer-color;
+ &:after {
+ content: " ";
+ right: 1px;
+ border-right-width: 0;
+ border-left-color: $popover-arrow-color;
+ bottom: -$popover-arrow-width;
+ }
+ }
+
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_print.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_print.scss
new file mode 100644
index 000000000..3655d0395
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_print.scss
@@ -0,0 +1,101 @@
+//
+// Basic print styles
+// --------------------------------------------------
+// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
+
+@media print {
+
+ * {
+ text-shadow: none !important;
+ color: #000 !important; // Black prints faster: h5bp.com/s
+ background: transparent !important;
+ box-shadow: none !important;
+ }
+
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+
+ // Don't show links for images, or javascript/internal links
+ a[href^="javascript:"]:after,
+ a[href^="#"]:after {
+ content: "";
+ }
+
+ pre,
+ blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid;
+ }
+
+ thead {
+ display: table-header-group; // h5bp.com/t
+ }
+
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+
+ img {
+ max-width: 100% !important;
+ }
+
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+
+ // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245
+ // Once fixed, we can just straight up remove this.
+ select {
+ background: #fff !important;
+ }
+
+ // Bootstrap components
+ .navbar {
+ display: none;
+ }
+ .table {
+ td,
+ th {
+ background-color: #fff !important;
+ }
+ }
+ .btn,
+ .dropup > .btn {
+ > .caret {
+ border-top-color: #000 !important;
+ }
+ }
+ .label {
+ border: 1px solid #000;
+ }
+
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table-bordered {
+ th,
+ td {
+ border: 1px solid #ddd !important;
+ }
+ }
+
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_progress-bars.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_progress-bars.scss
index 567a1a597..d22ec954f 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_progress-bars.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_progress-bars.scss
@@ -1,95 +1,89 @@
-// PROGRESS BARS
-// -------------
+//
+// Progress bars
+// --------------------------------------------------
-// ANIMATIONS
-// ----------
+// Bar animations
+// -------------------------
-// Webkit
-@-webkit-keyframes progress-bar-stripes {
- from { background-position: 0 0; }
- to { background-position: 40px 0; }
-}
-
-// Firefox
-@-moz-keyframes progress-bar-stripes {
- from { background-position: 0 0; }
- to { background-position: 40px 0; }
-}
-
-// Spec
@keyframes progress-bar-stripes {
- from { background-position: 0 0; }
- to { background-position: 40px 0; }
+ from { background-position: 40px 0; }
+ to { background-position: 0 0; }
}
-// THE BARS
-// --------
+// Bar itself
+// -------------------------
// Outer container
.progress {
overflow: hidden;
- height: 18px;
- margin-bottom: 18px;
- @include gradient-vertical(#f5f5f5, #f9f9f9);
+ height: $line-height-computed;
+ margin-bottom: $line-height-computed;
+ background-color: $progress-bg;
+ border-radius: $border-radius-base;
@include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
- @include border-radius(4px);
}
// Bar of progress
-.progress .bar {
+.progress-bar {
+ float: left;
width: 0%;
- height: 18px;
- color: $white;
- font-size: 12px;
+ height: 100%;
+ font-size: $font-size-small;
+ line-height: $line-height-computed;
+ color: $progress-bar-color;
text-align: center;
- text-shadow: 0 -1px 0 rgba(0,0,0,.25);
- @include gradient-vertical(#149bdf, #0480be);
+ background-color: $progress-bar-bg;
@include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
- @include box-sizing(border-box);
@include transition(width .6s ease);
}
// Striped bars
-.progress-striped .bar {
- @include gradient-striped(#62c462);
- @include background-size(40px 40px);
+.progress-striped .progress-bar {
+ @include gradient-striped();
+ background-size: 40px 40px;
}
// Call animation for the active one
-.progress.active .bar {
- -webkit-animation: progress-bar-stripes 2s linear infinite;
- -moz-animation: progress-bar-stripes 2s linear infinite;
- animation: progress-bar-stripes 2s linear infinite;
+.progress.active .progress-bar {
+ @include animation(progress-bar-stripes 2s linear infinite);
}
+// Account for lower percentages
+.progress-bar {
+ &[aria-valuenow="1"],
+ &[aria-valuenow="2"] {
+ min-width: 30px;
+ }
+
+ &[aria-valuenow="0"] {
+ color: $gray-light;
+ min-width: 30px;
+ background-color: transparent;
+ background-image: none;
+ box-shadow: none;
+ }
+}
-// COLORS
-// ------
-// Danger (red)
-.progress-danger .bar {
- @include gradient-vertical(#ee5f5b, #c43c35);
-}
-.progress-danger.progress-striped .bar {
- @include gradient-striped(#ee5f5b);
+// Variations
+// -------------------------
+
+.progress-bar-success {
+ @include progress-bar-variant($progress-bar-success-bg);
}
-// Success (green)
-.progress-success .bar {
- @include gradient-vertical(#62c462, #57a957);
+.progress-bar-info {
+ @include progress-bar-variant($progress-bar-info-bg);
}
-.progress-success.progress-striped .bar {
- @include gradient-striped(#62c462);
+
+.progress-bar-warning {
+ @include progress-bar-variant($progress-bar-warning-bg);
}
-// Info (teal)
-.progress-info .bar {
- @include gradient-vertical(#5bc0de, #339bb9);
+.progress-bar-danger {
+ @include progress-bar-variant($progress-bar-danger-bg);
}
-.progress-info.progress-striped .bar {
- @include gradient-striped(#5bc0de);
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_reset.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_reset.scss
deleted file mode 100644
index baefdeb5f..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_reset.scss
+++ /dev/null
@@ -1,105 +0,0 @@
-// Reset.css.scss
-// Adapted from Normalize.css http://github.com/necolas/normalize.css
-// ------------------------------------------------------------------------
-
-// Display in IE6-9 and FF3
-// -------------------------
-
-article, aside, details, figcaption, figure, footer, header, hgroup, nav, section {
- display: block;
-}
-
-// Display block in IE6-9 and FF3
-// -------------------------
-
-audio, canvas, video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-
-// Prevents modern browsers from displaying 'audio' without controls
-// -------------------------
-
-audio:not([controls]) {
- display: none;
-}
-
-// Base settings
-// -------------------------
-
-html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-// Focus states
-a:focus {
- @include tab-focus();
-}
-// Hover & Active
-a:hover, a:active {
- outline: 0;
-}
-
-// Prevents sub and sup affecting line-height in all browsers
-// -------------------------
-
-sub, sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-sup {
- top: -0.5em;
-}
-sub {
- bottom: -0.25em;
-}
-
-// Img border in a's and image quality
-// -------------------------
-
-img {
- max-width: 100%;
- height: auto;
- border: 0;
- -ms-interpolation-mode: bicubic;
-}
-
-// Forms
-// -------------------------
-
-// Font size in all browsers, margin changes, misc consistency
-button, input, select, textarea {
- margin: 0;
- font-size: 100%;
- vertical-align: middle;
-}
-button, input {
- *overflow: visible; // Inner spacing ie IE6/7
- line-height: normal; // FF3/4 have !important on line-height in UA stylesheet
-}
-button::-moz-focus-inner, input::-moz-focus-inner { // Inner padding and border oddities in FF3/4
- padding: 0;
- border: 0;
-}
-button, input[type="button"], input[type="reset"], input[type="submit"] {
- cursor: pointer; // Cursors on all buttons applied consistently
- -webkit-appearance: button; // Style clickable inputs in iOS
-}
-input[type="search"] { // Appearance in Safari/Chrome
- -webkit-appearance: textfield;
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
- -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5
-}
-textarea {
- overflow: auto; // Remove vertical scrollbar in IE6-9
- vertical-align: top; // Readability and alignment cross-browser
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-embed.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-embed.scss
new file mode 100644
index 000000000..a884d49fe
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-embed.scss
@@ -0,0 +1,34 @@
+// Embeds responsive
+//
+// Credit: Nicolas Gallagher and SUIT CSS.
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ height: 0;
+ padding: 0;
+ overflow: hidden;
+
+ .embed-responsive-item,
+ iframe,
+ embed,
+ object {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ height: 100%;
+ width: 100%;
+ border: 0;
+ }
+
+ // Modifier class for 16:9 aspect ratio
+ &.embed-responsive-16by9 {
+ padding-bottom: 56.25%;
+ }
+
+ // Modifier class for 4:3 aspect ratio
+ &.embed-responsive-4by3 {
+ padding-bottom: 75%;
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-utilities.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-utilities.scss
new file mode 100644
index 000000000..f7fd55f42
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-utilities.scss
@@ -0,0 +1,173 @@
+//
+// Responsive: Utility classes
+// --------------------------------------------------
+
+
+// IE10 in Windows (Phone) 8
+//
+// Support for responsive views via media queries is kind of borked in IE10, for
+// Surface/desktop in split view and for Windows Phone 8. This particular fix
+// must be accompanied by a snippet of JavaScript to sniff the user agent and
+// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
+// our Getting Started page for more information on this bug.
+//
+// For more information, see the following:
+//
+// Issue: https://github.com/twbs/bootstrap/issues/10497
+// Docs: http://getbootstrap.com/getting-started/#browsers
+// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
+
+@-ms-viewport {
+ width: device-width;
+}
+
+
+// Visibility utilities
+// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
+
+@include responsive-invisibility('.visible-xs, .visible-sm, .visible-md, .visible-lg');
+
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+ display: none !important;
+}
+
+@media (max-width: $screen-xs-max) {
+ @include responsive-visibility('.visible-xs');
+}
+.visible-xs-block {
+ @media (max-width: $screen-xs-max) {
+ display: block !important;
+ }
+}
+.visible-xs-inline {
+ @media (max-width: $screen-xs-max) {
+ display: inline !important;
+ }
+}
+.visible-xs-inline-block {
+ @media (max-width: $screen-xs-max) {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+ @include responsive-visibility('.visible-sm');
+}
+.visible-sm-block {
+ @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+ display: block !important;
+ }
+}
+.visible-sm-inline {
+ @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+ display: inline !important;
+ }
+}
+.visible-sm-inline-block {
+ @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+ @include responsive-visibility('.visible-md');
+}
+.visible-md-block {
+ @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+ display: block !important;
+ }
+}
+.visible-md-inline {
+ @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+ display: inline !important;
+ }
+}
+.visible-md-inline-block {
+ @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+ display: inline-block !important;
+ }
+}
+
+@media (min-width: $screen-lg-min) {
+ @include responsive-visibility('.visible-lg');
+}
+.visible-lg-block {
+ @media (min-width: $screen-lg-min) {
+ display: block !important;
+ }
+}
+.visible-lg-inline {
+ @media (min-width: $screen-lg-min) {
+ display: inline !important;
+ }
+}
+.visible-lg-inline-block {
+ @media (min-width: $screen-lg-min) {
+ display: inline-block !important;
+ }
+}
+
+@media (max-width: $screen-xs-max) {
+ @include responsive-invisibility('.hidden-xs');
+}
+
+@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+ @include responsive-invisibility('.hidden-sm');
+}
+
+@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+ @include responsive-invisibility('.hidden-md');
+}
+
+@media (min-width: $screen-lg-min) {
+ @include responsive-invisibility('.hidden-lg');
+}
+
+
+// Print utilities
+//
+// Media queries are placed on the inside to be mixin-friendly.
+
+// Note: Deprecated .visible-print as of v3.2.0
+
+@include responsive-invisibility('.visible-print');
+
+@media print {
+ @include responsive-visibility('.visible-print');
+}
+.visible-print-block {
+ display: none !important;
+
+ @media print {
+ display: block !important;
+ }
+}
+.visible-print-inline {
+ display: none !important;
+
+ @media print {
+ display: inline !important;
+ }
+}
+.visible-print-inline-block {
+ display: none !important;
+
+ @media print {
+ display: inline-block !important;
+ }
+}
+
+@media print {
+ @include responsive-invisibility('.hidden-print');
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_scaffolding.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_scaffolding.scss
index a4ce99e27..06c893dbd 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_scaffolding.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_scaffolding.scss
@@ -1,29 +1,150 @@
+//
// Scaffolding
-// Basic and global styles for generating a grid system, structural layout, and page templates
-// -------------------------------------------------------------------------------------------
+// --------------------------------------------------
-// STRUCTURAL LAYOUT
-// -----------------
+// Reset the box-sizing
+//
+// Heads up! This reset may cause conflicts with some third-party widgets.
+// For recommendations on resolving such conflicts, see
+// http://getbootstrap.com/getting-started/#third-box-sizing
+* {
+ @include box-sizing(border-box);
+}
+*:before,
+*:after {
+ @include box-sizing(border-box);
+}
+
+
+// Body reset
+
+html {
+ font-size: 62.5%;
+ -webkit-tap-highlight-color: rgba(0,0,0,0);
+}
body {
- margin: 0;
- font-family: $baseFontFamily;
- font-size: $baseFontSize;
- line-height: $baseLineHeight;
- color: $textColor;
- background-color: $white;
+ font-family: $font-family-base;
+ font-size: $font-size-base;
+ line-height: $line-height-base;
+ color: $text-color;
+ background-color: $body-bg;
}
+// Reset fonts for relevant elements
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
-// LINKS
-// -----
+
+// Links
a {
- color: $linkColor;
+ color: $link-color;
text-decoration: none;
+
+ &:hover,
+ &:focus {
+ color: $link-hover-color;
+ text-decoration: underline;
+ }
+
+ &:focus {
+ @include tab-focus();
+ }
+}
+
+
+// Figures
+//
+// We reset this here because previously Normalize had no `figure` margins. This
+// ensures we don't break anyone's use of the element.
+
+figure {
+ margin: 0;
+}
+
+
+// Images
+
+img {
+ vertical-align: middle;
+}
+
+// Responsive images (ensure images don't scale beyond their parents)
+.img-responsive {
+ @include img-responsive();
+}
+
+// Rounded corners
+.img-rounded {
+ border-radius: $border-radius-large;
+}
+
+// Image thumbnails
+//
+// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
+.img-thumbnail {
+ padding: $thumbnail-padding;
+ line-height: $line-height-base;
+ background-color: $thumbnail-bg;
+ border: 1px solid $thumbnail-border;
+ border-radius: $thumbnail-border-radius;
+ @include transition(all .2s ease-in-out);
+
+ // Keep them at most 100% wide
+ @include img-responsive(inline-block);
+}
+
+// Perfect circle
+.img-circle {
+ border-radius: 50%; // set radius in percents
+}
+
+
+// Horizontal rules
+
+hr {
+ margin-top: $line-height-computed;
+ margin-bottom: $line-height-computed;
+ border: 0;
+ border-top: 1px solid $hr-border;
+}
+
+
+// Only display content to screen readers
+//
+// See: http://a11yproject.com/posts/how-to-hide-content/
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ margin: -1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0,0,0,0);
+ border: 0;
+}
+
+// Use in conjunction with .sr-only to only display content when it's focused.
+// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
+// Credit: HTML5 Boilerplate
+
+.sr-only-focusable {
+ &:active,
+ &:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+ }
}
-a:hover {
- color: $linkColorHover;
- text-decoration: underline;
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_sprites.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_sprites.scss
deleted file mode 100644
index 04a28d2f5..000000000
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_sprites.scss
+++ /dev/null
@@ -1,157 +0,0 @@
-// SPRITES
-// Glyphs and icons for buttons, nav, and more
-// -------------------------------------------
-
-
-// ICONS
-// -----
-
-// All icons receive the styles of the <i> tag with a base class
-// of .i and are then given a unique class to add width, height,
-// and background-position. Your resulting HTML will look like
-// <i class="icon-inbox"></i>.
-
-// For the white version of the icons, just add the .icon-white class:
-// <i class="icon-inbox icon-white"></i>
-
-[class^="icon-"], [class*=" icon-"] {
- display: inline-block;
- width: 14px;
- height: 14px;
- line-height: 14px;
- vertical-align: text-top;
- background-image: asset-url("glyphicons-halflings.png", image);
- background-position: 14px 14px;
- background-repeat: no-repeat;
-
- @include ie7-restore-right-whitespace();
-}
-.icon-white {
- background-image: asset-url("glyphicons-halflings-white.png", image);
-}
-
-.icon-glass { background-position: 0 0; }
-.icon-music { background-position: -24px 0; }
-.icon-search { background-position: -48px 0; }
-.icon-envelope { background-position: -72px 0; }
-.icon-heart { background-position: -96px 0; }
-.icon-star { background-position: -120px 0; }
-.icon-star-empty { background-position: -144px 0; }
-.icon-user { background-position: -168px 0; }
-.icon-film { background-position: -192px 0; }
-.icon-th-large { background-position: -216px 0; }
-.icon-th { background-position: -240px 0; }
-.icon-th-list { background-position: -264px 0; }
-.icon-ok { background-position: -288px 0; }
-.icon-remove { background-position: -312px 0; }
-.icon-zoom-in { background-position: -336px 0; }
-.icon-zoom-out { background-position: -360px 0; }
-.icon-off { background-position: -384px 0; }
-.icon-signal { background-position: -408px 0; }
-.icon-cog { background-position: -432px 0; }
-.icon-trash { background-position: -456px 0; }
-
-.icon-home { background-position: 0 -24px; }
-.icon-file { background-position: -24px -24px; }
-.icon-time { background-position: -48px -24px; }
-.icon-road { background-position: -72px -24px; }
-.icon-download-alt { background-position: -96px -24px; }
-.icon-download { background-position: -120px -24px; }
-.icon-upload { background-position: -144px -24px; }
-.icon-inbox { background-position: -168px -24px; }
-.icon-play-circle { background-position: -192px -24px; }
-.icon-repeat { background-position: -216px -24px; }
-.icon-refresh { background-position: -240px -24px; }
-.icon-list-alt { background-position: -264px -24px; }
-.icon-lock { background-position: -287px -24px; } // 1px off
-.icon-flag { background-position: -312px -24px; }
-.icon-headphones { background-position: -336px -24px; }
-.icon-volume-off { background-position: -360px -24px; }
-.icon-volume-down { background-position: -384px -24px; }
-.icon-volume-up { background-position: -408px -24px; }
-.icon-qrcode { background-position: -432px -24px; }
-.icon-barcode { background-position: -456px -24px; }
-
-.icon-tag { background-position: 0 -48px; }
-.icon-tags { background-position: -25px -48px; } // 1px off
-.icon-book { background-position: -48px -48px; }
-.icon-bookmark { background-position: -72px -48px; }
-.icon-print { background-position: -96px -48px; }
-.icon-camera { background-position: -120px -48px; }
-.icon-font { background-position: -144px -48px; }
-.icon-bold { background-position: -167px -48px; } // 1px off
-.icon-italic { background-position: -192px -48px; }
-.icon-text-height { background-position: -216px -48px; }
-.icon-text-width { background-position: -240px -48px; }
-.icon-align-left { background-position: -264px -48px; }
-.icon-align-center { background-position: -288px -48px; }
-.icon-align-right { background-position: -312px -48px; }
-.icon-align-justify { background-position: -336px -48px; }
-.icon-list { background-position: -360px -48px; }
-.icon-indent-left { background-position: -384px -48px; }
-.icon-indent-right { background-position: -408px -48px; }
-.icon-facetime-video { background-position: -432px -48px; }
-.icon-picture { background-position: -456px -48px; }
-
-.icon-pencil { background-position: 0 -72px; }
-.icon-map-marker { background-position: -24px -72px; }
-.icon-adjust { background-position: -48px -72px; }
-.icon-tint { background-position: -72px -72px; }
-.icon-edit { background-position: -96px -72px; }
-.icon-share { background-position: -120px -72px; }
-.icon-check { background-position: -144px -72px; }
-.icon-move { background-position: -168px -72px; }
-.icon-step-backward { background-position: -192px -72px; }
-.icon-fast-backward { background-position: -216px -72px; }
-.icon-backward { background-position: -240px -72px; }
-.icon-play { background-position: -264px -72px; }
-.icon-pause { background-position: -288px -72px; }
-.icon-stop { background-position: -312px -72px; }
-.icon-forward { background-position: -336px -72px; }
-.icon-fast-forward { background-position: -360px -72px; }
-.icon-step-forward { background-position: -384px -72px; }
-.icon-eject { background-position: -408px -72px; }
-.icon-chevron-left { background-position: -432px -72px; }
-.icon-chevron-right { background-position: -456px -72px; }
-
-.icon-plus-sign { background-position: 0 -96px; }
-.icon-minus-sign { background-position: -24px -96px; }
-.icon-remove-sign { background-position: -48px -96px; }
-.icon-ok-sign { background-position: -72px -96px; }
-.icon-question-sign { background-position: -96px -96px; }
-.icon-info-sign { background-position: -120px -96px; }
-.icon-screenshot { background-position: -144px -96px; }
-.icon-remove-circle { background-position: -168px -96px; }
-.icon-ok-circle { background-position: -192px -96px; }
-.icon-ban-circle { background-position: -216px -96px; }
-.icon-arrow-left { background-position: -240px -96px; }
-.icon-arrow-right { background-position: -264px -96px; }
-.icon-arrow-up { background-position: -289px -96px; } // 1px off
-.icon-arrow-down { background-position: -312px -96px; }
-.icon-share-alt { background-position: -336px -96px; }
-.icon-resize-full { background-position: -360px -96px; }
-.icon-resize-small { background-position: -384px -96px; }
-.icon-plus { background-position: -408px -96px; }
-.icon-minus { background-position: -433px -96px; }
-.icon-asterisk { background-position: -456px -96px; }
-
-.icon-exclamation-sign { background-position: 0 -120px; }
-.icon-gift { background-position: -24px -120px; }
-.icon-leaf { background-position: -48px -120px; }
-.icon-fire { background-position: -72px -120px; }
-.icon-eye-open { background-position: -96px -120px; }
-.icon-eye-close { background-position: -120px -120px; }
-.icon-warning-sign { background-position: -144px -120px; }
-.icon-plane { background-position: -168px -120px; }
-.icon-calendar { background-position: -192px -120px; }
-.icon-random { background-position: -216px -120px; }
-.icon-comment { background-position: -240px -120px; }
-.icon-magnet { background-position: -264px -120px; }
-.icon-chevron-up { background-position: -288px -120px; }
-.icon-chevron-down { background-position: -313px -119px; } // 1px off
-.icon-retweet { background-position: -336px -120px; }
-.icon-shopping-cart { background-position: -360px -120px; }
-.icon-folder-close { background-position: -384px -120px; }
-.icon-folder-open { background-position: -408px -120px; }
-.icon-resize-vertical { background-position: -432px -119px; }
-.icon-resize-horizontal { background-position: -456px -118px; }
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_tables.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_tables.scss
index 4e74b53b5..a9d76901e 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_tables.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_tables.scss
@@ -1,126 +1,233 @@
//
-// Tables.less
-// Tables for, you guessed it, tabular data
-// ----------------------------------------
+// Tables
+// --------------------------------------------------
-// BASE TABLES
-// -----------------
-
table {
max-width: 100%;
- border-collapse: collapse;
- border-spacing: 0;
+ background-color: $table-bg;
+}
+th {
+ text-align: left;
}
-// BASELINE STYLES
-// ---------------
+
+// Baseline styles
.table {
width: 100%;
- margin-bottom: $baseLineHeight;
+ margin-bottom: $line-height-computed;
// Cells
- th, td {
- padding: 8px;
- line-height: $baseLineHeight;
- text-align: left;
- vertical-align: top;
- border-top: 1px solid #ddd;
- }
- th {
- font-weight: bold;
+ > thead,
+ > tbody,
+ > tfoot {
+ > tr {
+ > th,
+ > td {
+ padding: $table-cell-padding;
+ line-height: $line-height-base;
+ vertical-align: top;
+ border-top: 1px solid $table-border-color;
+ }
+ }
}
// Bottom align for column headings
- thead th {
+ > thead > tr > th {
vertical-align: bottom;
+ border-bottom: 2px solid $table-border-color;
}
// Remove top border from thead by default
- thead:first-child tr th, thead:first-child tr td {
- border-top: 0;
+ > caption + thead,
+ > colgroup + thead,
+ > thead:first-child {
+ > tr:first-child {
+ > th,
+ > td {
+ border-top: 0;
+ }
+ }
}
// Account for multiple tbody instances
- tbody + tbody {
- border-top: 2px solid #ddd;
+ > tbody + tbody {
+ border-top: 2px solid $table-border-color;
}
-}
+ // Nesting
+ .table {
+ background-color: $body-bg;
+ }
+}
-// CONDENSED TABLE W/ HALF PADDING
-// -------------------------------
+// Condensed table w/ half padding
.table-condensed {
- th, td {
- padding: 4px 5px;
+ > thead,
+ > tbody,
+ > tfoot {
+ > tr {
+ > th,
+ > td {
+ padding: $table-condensed-cell-padding;
+ }
+ }
}
}
-// BORDERED VERSION
-// ----------------
+// Bordered version
+//
+// Add borders all around the table and between all the columns.
.table-bordered {
- border: 1px solid #ddd;
- border-collapse: separate; // Done so we can round those corners!
- *border-collapse: collapsed; // IE7 can't round corners anyway
- @include border-radius(4px);
- th + th, td + td, th + td, td + th {
- border-left: 1px solid #ddd;
- }
- // Prevent a double border
- thead:first-child tr:first-child th, tbody:first-child tr:first-child th, tbody:first-child tr:first-child td {
- border-top: 0;
- }
- // For first th or td in the first row in the first thead or tbody
- thead:first-child tr:first-child th:first-child, tbody:first-child tr:first-child td:first-child {
- @include border-radius(4px 0 0 0);
- }
- thead:first-child tr:first-child th:last-child, tbody:first-child tr:first-child td:last-child {
- @include border-radius(0 4px 0 0);
- }
- // For first th or td in the first row in the first thead or tbody
- thead:last-child tr:last-child th:first-child, tbody:last-child tr:last-child td:first-child {
- @include border-radius(0 0 0 4px);
+ border: 1px solid $table-border-color;
+ > thead,
+ > tbody,
+ > tfoot {
+ > tr {
+ > th,
+ > td {
+ border: 1px solid $table-border-color;
+ }
+ }
}
- thead:last-child tr:last-child th:last-child, tbody:last-child tr:last-child td:last-child {
- @include border-radius(0 0 4px 0);
+ > thead > tr {
+ > th,
+ > td {
+ border-bottom-width: 2px;
+ }
}
}
-// ZEBRA-STRIPING
-// --------------
-
+// Zebra-striping
+//
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
+
.table-striped {
- tbody {
- tr:nth-child(odd) td, tr:nth-child(odd) th {
- background-color: #f9f9f9;
+ > tbody > tr:nth-child(odd) {
+ > td,
+ > th {
+ background-color: $table-bg-accent;
}
}
}
-// HOVER EFFECT
-// ------------
+// Hover effect
+//
// Placed here since it has to come after the potential zebra striping
-.table {
- tbody tr:hover td, tbody tr:hover th {
- background-color: #f5f5f5;
+
+.table-hover {
+ > tbody > tr:hover {
+ > td,
+ > th {
+ background-color: $table-bg-hover;
+ }
}
}
-// TABLE CELL SIZING
-// -----------------
-// Change the columns
-@mixin tableColumns($columnSpan: 1) {
+// Table cell sizing
+//
+// Reset default table behavior
+
+table col[class*="col-"] {
+ position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)
float: none;
- width: (($gridColumnWidth) * $columnSpan) + ($gridGutterWidth * ($columnSpan - 1)) - 16;
- margin-left: 0;
+ display: table-column;
}
table {
- @for $i from 1 through $gridColumns {
- .span#{$i} { @include tableColumns($i); }
+ td,
+ th {
+ &[class*="col-"] {
+ position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)
+ float: none;
+ display: table-cell;
+ }
}
-} \ No newline at end of file
+}
+
+
+// Table backgrounds
+//
+// Exact selectors below required to override `.table-striped` and prevent
+// inheritance to nested tables.
+
+// Generate the contextual variants
+@include table-row-variant('active', $table-bg-active);
+@include table-row-variant('success', $state-success-bg);
+@include table-row-variant('info', $state-info-bg);
+@include table-row-variant('warning', $state-warning-bg);
+@include table-row-variant('danger', $state-danger-bg);
+
+
+// Responsive tables
+//
+// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
+// by enabling horizontal scrolling. Only applies <768px. Everything above that
+// will display normally.
+
+.table-responsive {
+ @media screen and (max-width: $screen-xs-max) {
+ width: 100%;
+ margin-bottom: ($line-height-computed * 0.75);
+ overflow-y: hidden;
+ overflow-x: scroll;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ border: 1px solid $table-border-color;
+ -webkit-overflow-scrolling: touch;
+
+ // Tighten up spacing
+ > .table {
+ margin-bottom: 0;
+
+ // Ensure the content doesn't wrap
+ > thead,
+ > tbody,
+ > tfoot {
+ > tr {
+ > th,
+ > td {
+ white-space: nowrap;
+ }
+ }
+ }
+ }
+
+ // Special overrides for the bordered tables
+ > .table-bordered {
+ border: 0;
+
+ // Nuke the appropriate borders so that the parent can handle them
+ > thead,
+ > tbody,
+ > tfoot {
+ > tr {
+ > th:first-child,
+ > td:first-child {
+ border-left: 0;
+ }
+ > th:last-child,
+ > td:last-child {
+ border-right: 0;
+ }
+ }
+ }
+
+ // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
+ // chances are there will be only one `tr` in a `thead` and that would
+ // remove the border altogether.
+ > tbody,
+ > tfoot {
+ > tr:last-child {
+ > th,
+ > td {
+ border-bottom: 0;
+ }
+ }
+ }
+
+ }
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_theme.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_theme.scss
new file mode 100644
index 000000000..d8f7bc2fb
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_theme.scss
@@ -0,0 +1,247 @@
+
+//
+// Load core variables and mixins
+// --------------------------------------------------
+
+@import "variables";
+@import "mixins";
+
+
+
+//
+// Buttons
+// --------------------------------------------------
+
+// Common styles
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+ text-shadow: 0 -1px 0 rgba(0,0,0,.2);
+ $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
+ @include box-shadow($shadow);
+
+ // Reset the shadow
+ &:active,
+ &.active {
+ @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
+ }
+}
+
+// Mixin for generating new styles
+@mixin btn-styles($btn-color: #555) {
+ @include gradient-vertical($start-color: $btn-color, $end-color: darken($btn-color, 12%));
+ @include reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners
+ background-repeat: repeat-x;
+ border-color: darken($btn-color, 14%);
+
+ &:hover,
+ &:focus {
+ background-color: darken($btn-color, 12%);
+ background-position: 0 -15px;
+ }
+
+ &:active,
+ &.active {
+ background-color: darken($btn-color, 12%);
+ border-color: darken($btn-color, 14%);
+ }
+}
+
+// Common styles
+.btn {
+ // Remove the gradient for the pressed/active state
+ &:active,
+ &.active {
+ background-image: none;
+ }
+}
+
+// Apply the mixin to the buttons
+.btn-default { @include btn-styles($btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
+.btn-primary { @include btn-styles($btn-primary-bg); }
+.btn-success { @include btn-styles($btn-success-bg); }
+.btn-info { @include btn-styles($btn-info-bg); }
+.btn-warning { @include btn-styles($btn-warning-bg); }
+.btn-danger { @include btn-styles($btn-danger-bg); }
+
+
+
+//
+// Images
+// --------------------------------------------------
+
+.thumbnail,
+.img-thumbnail {
+ @include box-shadow(0 1px 2px rgba(0,0,0,.075));
+}
+
+
+
+//
+// Dropdowns
+// --------------------------------------------------
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ @include gradient-vertical($start-color: $dropdown-link-hover-bg, $end-color: darken($dropdown-link-hover-bg, 5%));
+ background-color: darken($dropdown-link-hover-bg, 5%);
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ @include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
+ background-color: darken($dropdown-link-active-bg, 5%);
+}
+
+
+
+//
+// Navbar
+// --------------------------------------------------
+
+// Default navbar
+.navbar-default {
+ @include gradient-vertical($start-color: lighten($navbar-default-bg, 10%), $end-color: $navbar-default-bg);
+ @include reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
+ border-radius: $navbar-border-radius;
+ $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
+ @include box-shadow($shadow);
+
+ .navbar-nav > .active > a {
+ @include gradient-vertical($start-color: darken($navbar-default-bg, 5%), $end-color: darken($navbar-default-bg, 2%));
+ @include box-shadow(inset 0 3px 9px rgba(0,0,0,.075));
+ }
+}
+.navbar-brand,
+.navbar-nav > li > a {
+ text-shadow: 0 1px 0 rgba(255,255,255,.25);
+}
+
+// Inverted navbar
+.navbar-inverse {
+ @include gradient-vertical($start-color: lighten($navbar-inverse-bg, 10%), $end-color: $navbar-inverse-bg);
+ @include reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
+
+ .navbar-nav > .active > a {
+ @include gradient-vertical($start-color: $navbar-inverse-bg, $end-color: lighten($navbar-inverse-bg, 2.5%));
+ @include box-shadow(inset 0 3px 9px rgba(0,0,0,.25));
+ }
+
+ .navbar-brand,
+ .navbar-nav > li > a {
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ }
+}
+
+// Undo rounded corners in static and fixed navbars
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ border-radius: 0;
+}
+
+
+
+//
+// Alerts
+// --------------------------------------------------
+
+// Common styles
+.alert {
+ text-shadow: 0 1px 0 rgba(255,255,255,.2);
+ $shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
+ @include box-shadow($shadow);
+}
+
+// Mixin for generating new styles
+@mixin alert-styles($color) {
+ @include gradient-vertical($start-color: $color, $end-color: darken($color, 7.5%));
+ border-color: darken($color, 15%);
+}
+
+// Apply the mixin to the alerts
+.alert-success { @include alert-styles($alert-success-bg); }
+.alert-info { @include alert-styles($alert-info-bg); }
+.alert-warning { @include alert-styles($alert-warning-bg); }
+.alert-danger { @include alert-styles($alert-danger-bg); }
+
+
+
+//
+// Progress bars
+// --------------------------------------------------
+
+// Give the progress background some depth
+.progress {
+ @include gradient-vertical($start-color: darken($progress-bg, 4%), $end-color: $progress-bg)
+}
+
+// Mixin for generating new styles
+@mixin progress-bar-styles($color) {
+ @include gradient-vertical($start-color: $color, $end-color: darken($color, 10%));
+}
+
+// Apply the mixin to the progress bars
+.progress-bar { @include progress-bar-styles($progress-bar-bg); }
+.progress-bar-success { @include progress-bar-styles($progress-bar-success-bg); }
+.progress-bar-info { @include progress-bar-styles($progress-bar-info-bg); }
+.progress-bar-warning { @include progress-bar-styles($progress-bar-warning-bg); }
+.progress-bar-danger { @include progress-bar-styles($progress-bar-danger-bg); }
+
+
+
+//
+// List groups
+// --------------------------------------------------
+
+.list-group {
+ border-radius: $border-radius-base;
+ @include box-shadow(0 1px 2px rgba(0,0,0,.075));
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+ text-shadow: 0 -1px 0 darken($list-group-active-bg, 10%);
+ @include gradient-vertical($start-color: $list-group-active-bg, $end-color: darken($list-group-active-bg, 7.5%));
+ border-color: darken($list-group-active-border, 7.5%);
+}
+
+
+
+//
+// Panels
+// --------------------------------------------------
+
+// Common styles
+.panel {
+ @include box-shadow(0 1px 2px rgba(0,0,0,.05));
+}
+
+// Mixin for generating new styles
+@mixin panel-heading-styles($color) {
+ @include gradient-vertical($start-color: $color, $end-color: darken($color, 5%));
+}
+
+// Apply the mixin to the panel headings only
+.panel-default > .panel-heading { @include panel-heading-styles($panel-default-heading-bg); }
+.panel-primary > .panel-heading { @include panel-heading-styles($panel-primary-heading-bg); }
+.panel-success > .panel-heading { @include panel-heading-styles($panel-success-heading-bg); }
+.panel-info > .panel-heading { @include panel-heading-styles($panel-info-heading-bg); }
+.panel-warning > .panel-heading { @include panel-heading-styles($panel-warning-heading-bg); }
+.panel-danger > .panel-heading { @include panel-heading-styles($panel-danger-heading-bg); }
+
+
+
+//
+// Wells
+// --------------------------------------------------
+
+.well {
+ @include gradient-vertical($start-color: darken($well-bg, 5%), $end-color: $well-bg);
+ border-color: darken($well-bg, 10%);
+ $shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
+ @include box-shadow($shadow);
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_thumbnails.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_thumbnails.scss
index 4a434b17f..3d5ed86d0 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_thumbnails.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_thumbnails.scss
@@ -1,35 +1,38 @@
-// THUMBNAILS
-// ----------
+//
+// Thumbnails
+// --------------------------------------------------
-.thumbnails {
- margin-left: -$gridGutterWidth;
- list-style: none;
- @include clearfix();
-}
-.thumbnails > li {
- float: left;
- margin: 0 0 $baseLineHeight $gridGutterWidth;
-}
+
+// Mixin and adjust the regular image class
.thumbnail {
display: block;
- padding: 4px;
- line-height: 1;
- border: 1px solid #ddd;
- @include border-radius(4px);
- @include box-shadow(0 1px 1px rgba(0,0,0,.075));
+ padding: $thumbnail-padding;
+ margin-bottom: $line-height-computed;
+ line-height: $line-height-base;
+ background-color: $thumbnail-bg;
+ border: 1px solid $thumbnail-border;
+ border-radius: $thumbnail-border-radius;
+ @include transition(all .2s ease-in-out);
+
+ > img,
+ a > img {
+ @include img-responsive();
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active
+
+ // Image captions
+ .caption {
+ padding: $thumbnail-caption-padding;
+ color: $thumbnail-caption-color;
+ }
}
+
// Add a hover state for linked versions only
-a.thumbnail:hover {
- border-color: $linkColor;
- @include box-shadow(0 1px 4px rgba(0,105,214,.25));
-}
-// Images and captions
-.thumbnail > img {
- display: block;
- max-width: 100%;
- margin-left: auto;
- margin-right: auto;
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+ border-color: $link-color;
}
-.thumbnail .caption {
- padding: 9px;
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_tooltip.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_tooltip.scss
index 488dc63fa..dec674cb4 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_tooltip.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_tooltip.scss
@@ -1,35 +1,95 @@
-// TOOLTIP
-// ------=
+//
+// Tooltips
+// --------------------------------------------------
+
+// Base class
.tooltip {
position: absolute;
- z-index: $zindexTooltip;
+ z-index: $zindex-tooltip;
display: block;
visibility: visible;
- padding: 5px;
- font-size: 11px;
+ font-size: $font-size-small;
+ line-height: 1.4;
@include opacity(0);
- &.in { @include opacity(0.8); }
- &.top { margin-top: -2px; }
- &.right { margin-left: 2px; }
- &.bottom { margin-top: 2px; }
- &.left { margin-left: -2px; }
- &.top .tooltip-arrow { @include popoverArrowTop(); }
- &.left .tooltip-arrow { @include popoverArrowLeft(); }
- &.bottom .tooltip-arrow { @include popoverArrowBottom(); }
- &.right .tooltip-arrow { @include popoverArrowRight(); }
+
+ &.in { @include opacity($tooltip-opacity); }
+ &.top { margin-top: -3px; padding: $tooltip-arrow-width 0; }
+ &.right { margin-left: 3px; padding: 0 $tooltip-arrow-width; }
+ &.bottom { margin-top: 3px; padding: $tooltip-arrow-width 0; }
+ &.left { margin-left: -3px; padding: 0 $tooltip-arrow-width; }
}
+
+// Wrapper for the tooltip content
.tooltip-inner {
- max-width: 200px;
+ max-width: $tooltip-max-width;
padding: 3px 8px;
- color: $white;
+ color: $tooltip-color;
text-align: center;
text-decoration: none;
- background-color: $black;
- @include border-radius(4px);
+ background-color: $tooltip-bg;
+ border-radius: $border-radius-base;
}
+
+// Arrows
.tooltip-arrow {
position: absolute;
width: 0;
height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+.tooltip {
+ &.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -$tooltip-arrow-width;
+ border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
+ border-top-color: $tooltip-arrow-color;
+ }
+ &.top-left .tooltip-arrow {
+ bottom: 0;
+ left: $tooltip-arrow-width;
+ border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
+ border-top-color: $tooltip-arrow-color;
+ }
+ &.top-right .tooltip-arrow {
+ bottom: 0;
+ right: $tooltip-arrow-width;
+ border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
+ border-top-color: $tooltip-arrow-color;
+ }
+ &.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -$tooltip-arrow-width;
+ border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;
+ border-right-color: $tooltip-arrow-color;
+ }
+ &.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -$tooltip-arrow-width;
+ border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;
+ border-left-color: $tooltip-arrow-color;
+ }
+ &.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -$tooltip-arrow-width;
+ border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
+ border-bottom-color: $tooltip-arrow-color;
+ }
+ &.bottom-left .tooltip-arrow {
+ top: 0;
+ left: $tooltip-arrow-width;
+ border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
+ border-bottom-color: $tooltip-arrow-color;
+ }
+ &.bottom-right .tooltip-arrow {
+ top: 0;
+ right: $tooltip-arrow-width;
+ border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
+ border-bottom-color: $tooltip-arrow-color;
+ }
}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_type.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_type.scss
index 5670b49f6..bfdf2bb19 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_type.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_type.scss
@@ -1,209 +1,294 @@
-// Typography.less
-// Headings, body text, lists, code, and more for a versatile and durable typography system
-// ----------------------------------------------------------------------------------------
+//
+// Typography
+// --------------------------------------------------
-// BODY TEXT
-// ---------
+// Headings
+// -------------------------
-p {
- margin: 0 0 $baseLineHeight / 2;
- font-family: $baseFontFamily;
- font-size: $baseFontSize;
- line-height: $baseLineHeight;
- small {
- font-size: $baseFontSize - 2;
- color: $grayLight;
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ font-family: $headings-font-family;
+ font-weight: $headings-font-weight;
+ line-height: $headings-line-height;
+ color: $headings-color;
+
+ small,
+ .small {
+ font-weight: normal;
+ line-height: 1;
+ color: $headings-small-color;
}
}
-.lead {
- margin-bottom: $baseLineHeight;
- font-size: 20px;
- font-weight: 200;
- line-height: $baseLineHeight * 1.5;
-}
-// HEADINGS
-// --------
+h1, .h1,
+h2, .h2,
+h3, .h3 {
+ margin-top: $line-height-computed;
+ margin-bottom: ($line-height-computed / 2);
-h1, h2, h3, h4, h5, h6 {
- margin: 0;
- font-weight: bold;
- color: $grayDark;
- text-rendering: optimizelegibility; // Fix the character spacing for headings
- small {
- font-weight: normal;
- color: $grayLight;
+ small,
+ .small {
+ font-size: 65%;
}
}
-h1 {
- font-size: 30px;
- line-height: $baseLineHeight * 2;
- small {
- font-size: 18px;
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+ margin-top: ($line-height-computed / 2);
+ margin-bottom: ($line-height-computed / 2);
+
+ small,
+ .small {
+ font-size: 75%;
}
}
-h2 {
- font-size: 24px;
- line-height: $baseLineHeight * 2;
- small {
- font-size: 18px;
- }
+
+h1, .h1 { font-size: $font-size-h1; }
+h2, .h2 { font-size: $font-size-h2; }
+h3, .h3 { font-size: $font-size-h3; }
+h4, .h4 { font-size: $font-size-h4; }
+h5, .h5 { font-size: $font-size-h5; }
+h6, .h6 { font-size: $font-size-h6; }
+
+
+// Body text
+// -------------------------
+
+p {
+ margin: 0 0 ($line-height-computed / 2);
}
-h3 {
- line-height: $baseLineHeight * 1.5;
- font-size: 18px;
- small {
- font-size: 14px;
+
+.lead {
+ margin-bottom: $line-height-computed;
+ font-size: floor(($font-size-base * 1.15));
+ font-weight: 200;
+ line-height: 1.4;
+
+ @media (min-width: $screen-sm-min) {
+ font-size: ($font-size-base * 1.5);
}
}
-h4, h5, h6 {
- line-height: $baseLineHeight;
-}
-h4 {
- font-size: 14px;
- small {
- font-size: 12px;
- }
+
+
+// Emphasis & misc
+// -------------------------
+
+// Ex: 14px base font * 85% = about 12px
+small,
+.small { font-size: 85%; }
+
+// Undo browser default styling
+cite { font-style: normal; }
+
+mark,
+.mark {
+ background-color: $state-warning-bg;
+ padding: .2em;
}
-h5 {
- font-size: 12px;
+
+// Alignment
+.text-left { text-align: left; }
+.text-right { text-align: right; }
+.text-center { text-align: center; }
+.text-justify { text-align: justify; }
+
+// Contextual colors
+.text-muted {
+ color: $text-muted;
}
-h6 {
- font-size: 11px;
- color: $grayLight;
- text-transform: uppercase;
+
+@include text-emphasis-variant('.text-primary', $brand-primary);
+
+@include text-emphasis-variant('.text-success', $state-success-text);
+
+@include text-emphasis-variant('.text-info', $state-info-text);
+
+@include text-emphasis-variant('.text-warning', $state-warning-text);
+
+@include text-emphasis-variant('.text-danger', $state-danger-text);
+
+// Contextual backgrounds
+// For now we'll leave these alongside the text classes until v4 when we can
+// safely shift things around (per SemVer rules).
+.bg-primary {
+ // Given the contrast here, this is the only class to have its color inverted
+ // automatically.
+ color: #fff;
}
+@include bg-variant('.bg-primary', $brand-primary);
+
+@include bg-variant('.bg-success', $state-success-bg);
+
+@include bg-variant('.bg-info', $state-info-bg);
+
+@include bg-variant('.bg-warning', $state-warning-bg);
+
+@include bg-variant('.bg-danger', $state-danger-bg);
+
// Page header
+// -------------------------
+
.page-header {
- padding-bottom: $baseLineHeight - 1;
- margin: $baseLineHeight 0;
- border-bottom: 1px solid $grayLighter;
-}
-.page-header h1 {
- line-height: 1;
+ padding-bottom: (($line-height-computed / 2) - 1);
+ margin: ($line-height-computed * 2) 0 $line-height-computed;
+ border-bottom: 1px solid $page-header-border-color;
}
-
-// LISTS
-// -----
+// Lists
+// -------------------------
// Unordered and Ordered lists
-ul, ol {
- padding: 0;
- margin: 0 0 $baseLineHeight / 2 25px;
-}
-ul ul, ul ol, ol ol, ol ul {
- margin-bottom: 0;
-}
-ul {
- list-style: disc;
-}
+ul,
ol {
- list-style: decimal;
-}
-li {
- line-height: $baseLineHeight;
+ margin-top: 0;
+ margin-bottom: ($line-height-computed / 2);
+ ul,
+ ol {
+ margin-bottom: 0;
+ }
}
-ul.unstyled, ol.unstyled {
- margin-left: 0;
+
+// List options
+
+// Unstyled keeps list items block level, just removes default browser padding and list-style
+.list-unstyled {
+ padding-left: 0;
list-style: none;
}
+// Inline turns list items into inline-block
+.list-inline {
+ @extend .list-unstyled;
+ margin-left: -5px;
+
+ > li {
+ display: inline-block;
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
// Description Lists
dl {
- margin-bottom: $baseLineHeight;
+ margin-top: 0; // Remove browser default
+ margin-bottom: $line-height-computed;
}
-dt, dd {
- line-height: $baseLineHeight;
+dt,
+dd {
+ line-height: $line-height-base;
}
dt {
font-weight: bold;
}
dd {
- margin-left: $baseLineHeight / 2;
+ margin-left: 0; // Undo browser default
}
-// MISC
-// ----
+// Horizontal description lists
+//
+// Defaults to being stacked without any of the below styles applied, until the
+// grid breakpoint is reached (default of ~768px).
-// Horizontal rules
-hr {
- margin: $baseLineHeight 0;
- border: 0;
- border-top: 1px solid $hrBorder;
- border-bottom: 1px solid $white;
-}
+.dl-horizontal {
+ dd {
+ @include clearfix(); // Clear the floated `dt` if an empty `dd` is present
+ }
-// Emphasis
-strong {
- font-weight: bold;
-}
-em {
- font-style: italic;
-}
-.muted {
- color: $grayLight;
+ @media (min-width: $grid-float-breakpoint) {
+ dt {
+ float: left;
+ width: ($component-offset-horizontal - 20);
+ clear: left;
+ text-align: right;
+ @include text-overflow();
+ }
+ dd {
+ margin-left: $component-offset-horizontal;
+ }
+ }
}
+
+// Misc
+// -------------------------
+
// Abbreviations and acronyms
-abbr {
+abbr[title],
+// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted $abbr-border-color;
+}
+.initialism {
font-size: 90%;
text-transform: uppercase;
- border-bottom: 1px dotted #ddd;
- cursor: help;
}
// Blockquotes
blockquote {
- padding: 0 0 0 15px;
- margin: 0 0 $baseLineHeight;
- border-left: 5px solid $grayLighter;
- p {
- margin-bottom: 0;
- @include font-shorthand(16px,300,$baseLineHeight * 1.25);
+ padding: ($line-height-computed / 2) $line-height-computed;
+ margin: 0 0 $line-height-computed;
+ font-size: $blockquote-font-size;
+ border-left: 5px solid $blockquote-border-color;
+
+ p,
+ ul,
+ ol {
+ &:last-child {
+ margin-bottom: 0;
+ }
}
- small {
+
+ // Note: Deprecated small and .small as of v3.1.0
+ // Context: https://github.com/twbs/bootstrap/issues/11660
+ footer,
+ small,
+ .small {
display: block;
- line-height: $baseLineHeight;
- color: $grayLight;
+ font-size: 80%; // back to default font-size
+ line-height: $line-height-base;
+ color: $blockquote-small-color;
+
&:before {
- content: '\2014 \00A0';
+ content: '\2014 \00A0'; // em dash, nbsp
}
}
+}
- // Float right with text-align: right
- &.pull-right {
- float: right;
- padding-left: 0;
- padding-right: 15px;
- border-left: 0;
- border-right: 5px solid $grayLighter;
- p, small {
- text-align: right;
+// Opposite alignment of blockquote
+//
+// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.
+.blockquote-reverse,
+blockquote.pull-right {
+ padding-right: 15px;
+ padding-left: 0;
+ border-right: 5px solid $blockquote-border-color;
+ border-left: 0;
+ text-align: right;
+
+ // Account for citation
+ footer,
+ small,
+ .small {
+ &:before { content: ''; }
+ &:after {
+ content: '\00A0 \2014'; // nbsp, em dash
}
}
}
// Quotes
-q:before, q:after, blockquote:before, blockquote:after {
+blockquote:before,
+blockquote:after {
content: "";
}
// Addresses
address {
- display: block;
- margin-bottom: $baseLineHeight;
- line-height: $baseLineHeight;
+ margin-bottom: $line-height-computed;
font-style: normal;
+ line-height: $line-height-base;
}
-
-// Misc
-small {
- font-size: 100%;
-}
-cite {
- font-style: normal;
-} \ No newline at end of file
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_utilities.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_utilities.scss
index 2171f61a8..85cb62ea7 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_utilities.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_utilities.scss
@@ -1,23 +1,56 @@
-// UTILITY CLASSES
-// ---------------
+//
+// Utility classes
+// --------------------------------------------------
-// Quick floats
+
+// Floats
+// -------------------------
+
+.clearfix {
+ @include clearfix();
+}
+.center-block {
+ @include center-block();
+}
.pull-right {
- float: right;
+ float: right !important;
}
.pull-left {
- float: left;
+ float: left !important;
}
+
// Toggling content
+// -------------------------
+
+// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
.hide {
- display: none;
+ display: none !important;
}
.show {
- display: block;
+ display: block !important;
}
-
-// Visibility
.invisible {
visibility: hidden;
-} \ No newline at end of file
+}
+.text-hide {
+ @include text-hide();
+}
+
+
+// Hide from screenreaders and browsers
+//
+// Credit: HTML5 Boilerplate
+
+.hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+
+
+// For Affix plugin
+// -------------------------
+
+.affix {
+ position: fixed;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_variables.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_variables.scss
index 3e4faf555..4f4f3ac50 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_variables.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_variables.scss
@@ -1,103 +1,853 @@
-// Variables.less
-// Variables to customize the look and feel of Bootstrap
-// -----------------------------------------------------
+// a flag to toggle asset pipeline / compass integration
+// defaults to true if twbs-font-path function is present (no function => twbs-font-path('') parsed as string == right side)
+// in Sass 3.3 this can be improved with: function-exists(twbs-font-path)
+$bootstrap-sass-asset-helper: (twbs-font-path("") != unquote('twbs-font-path("")')) !default;
+//
+// Variables
+// --------------------------------------------------
+//== Colors
+//
+//## Gray and brand colors for use across Bootstrap.
-// GLOBAL VALUES
-// --------------------------------------------------
+$gray-darker: lighten(#000, 13.5%) !default; // #222
+$gray-dark: lighten(#000, 20%) !default; // #333
+$gray: lighten(#000, 33.5%) !default; // #555
+$gray-light: lighten(#000, 60%) !default; // #999
+$gray-lighter: lighten(#000, 93.5%) !default; // #eee
-// Links
-$linkColor: #08c !default;
-$linkColorHover: darken($linkColor, 15%) !default;
-
-// Grays
-$black: #000 !default;
-$grayDarker: #222 !default;
-$grayDark: #333 !default;
-$gray: #555 !default;
-$grayLight: #999 !default;
-$grayLighter: #eee !default;
-$white: #fff !default;
-
-// Accent colors
-$blue: #049cdb !default;
-$blueDark: #0064cd !default;
-$green: #46a546 !default;
-$red: #9d261d !default;
-$yellow: #ffc40d !default;
-$orange: #f89406 !default;
-$pink: #c3325f !default;
-$purple: #7a43b6 !default;
-
-// Typography
-$baseFontSize: 13px !default;
-$baseFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif !default;
-$baseLineHeight: 18px !default;
-$textColor: $grayDark !default;
-
-// Buttons
-$primaryButtonBackground: $linkColor !default;
-
-
-
-// COMPONENT VARIABLES
-// --------------------------------------------------
+$brand-primary: #428bca !default;
+$brand-success: #5cb85c !default;
+$brand-info: #5bc0de !default;
+$brand-warning: #f0ad4e !default;
+$brand-danger: #d9534f !default;
-// Z-index master list
-// Used for a bird's eye view of components dependent on the z-axis
-// Try to avoid customizing these :)
-$zindexDropdown: 1000;
-$zindexPopover: 1010;
-$zindexTooltip: 1020;
-$zindexFixedNavbar: 1030;
-$zindexModalBackdrop: 1040;
-$zindexModal: 1050;
-// Input placeholder text color
-$placeholderText: $grayLight !default;
+//== Scaffolding
+//
+//## Settings for some of the most global styles.
-// HR border color
-$hrBorder: $grayLighter !default;
+//** Background color for `<body>`.
+$body-bg: #fff !default;
+//** Global text color on `<body>`.
+$text-color: $gray-dark !default;
-// Navbar
-$navbarHeight: 40px !default;
-$navbarBackground: $grayDarker !default;
-$navbarBackgroundHighlight: $grayDark !default;
-$navbarLinkBackgroundHover: transparent !default;
+//** Global textual link color.
+$link-color: $brand-primary !default;
+//** Link hover color set via `darken()` function.
+$link-hover-color: darken($link-color, 15%) !default;
-$navbarText: $grayLight !default;
-$navbarLinkColor: $grayLight !default;
-$navbarLinkColorHover: $white !default;
-// Form states and alerts
-$warningText: #c09853 !default;
-$warningBackground: #fcf8e3 !default;
-$warningBorder: darken(adjust-hue($warningBackground, -10), 3%) !default;
+//== Typography
+//
+//## Font, line-height, and color for body text, headings, and more.
-$errorText: #b94a48 !default;
-$errorBackground: #f2dede !default;
-$errorBorder: darken(adjust-hue($errorBackground, -10), 3%) !default;
+$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default;
+$font-family-serif: Georgia, "Times New Roman", Times, serif !default;
+//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
+$font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace !default;
+$font-family-base: $font-family-sans-serif !default;
-$successText: #468847 !default;
-$successBackground: #dff0d8 !default;
-$successBorder: darken(adjust-hue($successBackground, -10), 5%) !default;
+$font-size-base: 14px !default;
+$font-size-large: ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-small: ceil(($font-size-base * 0.85)) !default; // ~12px
-$infoText: #3a87ad !default;
-$infoBackground: #d9edf7 !default;
-$infoBorder: darken(adjust-hue($infoBackground, -10), 7%) !default;
+$font-size-h1: floor(($font-size-base * 2.6)) !default; // ~36px
+$font-size-h2: floor(($font-size-base * 2.15)) !default; // ~30px
+$font-size-h3: ceil(($font-size-base * 1.7)) !default; // ~24px
+$font-size-h4: ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-h5: $font-size-base !default;
+$font-size-h6: ceil(($font-size-base * 0.85)) !default; // ~12px
+//** Unit-less `line-height` for use in components like buttons.
+$line-height-base: 1.428571429 !default; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+$line-height-computed: floor(($font-size-base * $line-height-base)) !default; // ~20px
+//** By default, this inherits from the `<body>`.
+$headings-font-family: inherit !default;
+$headings-font-weight: 500 !default;
+$headings-line-height: 1.1 !default;
+$headings-color: inherit !default;
-// GRID
-// --------------------------------------------------
-// Default 940px grid
-$gridColumns: 12 !default;
-$gridColumnWidth: 60px !default;
-$gridGutterWidth: 20px !default;
-$gridRowWidth: ($gridColumns * $gridColumnWidth) + ($gridGutterWidth * ($gridColumns - 1)) !default;
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+$icon-font-path: "bootstrap/" !default;
+//** File name for all font files.
+$icon-font-name: "glyphicons-halflings-regular" !default;
+//** Element ID within SVG icon file.
+$icon-font-svg-id: "glyphicons_halflingsregular" !default;
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+$padding-base-vertical: 6px !default;
+$padding-base-horizontal: 12px !default;
+
+$padding-large-vertical: 10px !default;
+$padding-large-horizontal: 16px !default;
+
+$padding-small-vertical: 5px !default;
+$padding-small-horizontal: 10px !default;
+
+$padding-xs-vertical: 1px !default;
+$padding-xs-horizontal: 5px !default;
+
+$line-height-large: 1.33 !default;
+$line-height-small: 1.5 !default;
+
+$border-radius-base: 4px !default;
+$border-radius-large: 6px !default;
+$border-radius-small: 3px !default;
+
+//** Global color for active items (e.g., navs or dropdowns).
+$component-active-color: #fff !default;
+//** Global background color for active items (e.g., navs or dropdowns).
+$component-active-bg: $brand-primary !default;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+$caret-width-base: 4px !default;
+//** Carets increase slightly in size for larger components.
+$caret-width-large: 5px !default;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for `<th>`s and `<td>`s.
+$table-cell-padding: 8px !default;
+//** Padding for cells in `.table-condensed`.
+$table-condensed-cell-padding: 5px !default;
+
+//** Default background color used for all tables.
+$table-bg: transparent !default;
+//** Background color used for `.table-striped`.
+$table-bg-accent: #f9f9f9 !default;
+//** Background color used for `.table-hover`.
+$table-bg-hover: #f5f5f5 !default;
+$table-bg-active: $table-bg-hover !default;
+
+//** Border color for table and cell borders.
+$table-border-color: #ddd !default;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+$btn-font-weight: normal !default;
+
+$btn-default-color: #333 !default;
+$btn-default-bg: #fff !default;
+$btn-default-border: #ccc !default;
+
+$btn-primary-color: #fff !default;
+$btn-primary-bg: $brand-primary !default;
+$btn-primary-border: darken($btn-primary-bg, 5%) !default;
+
+$btn-success-color: #fff !default;
+$btn-success-bg: $brand-success !default;
+$btn-success-border: darken($btn-success-bg, 5%) !default;
+
+$btn-info-color: #fff !default;
+$btn-info-bg: $brand-info !default;
+$btn-info-border: darken($btn-info-bg, 5%) !default;
+
+$btn-warning-color: #fff !default;
+$btn-warning-bg: $brand-warning !default;
+$btn-warning-border: darken($btn-warning-bg, 5%) !default;
+
+$btn-danger-color: #fff !default;
+$btn-danger-bg: $brand-danger !default;
+$btn-danger-border: darken($btn-danger-bg, 5%) !default;
+
+$btn-link-disabled-color: $gray-light !default;
+
+
+//== Forms
+//
+//##
+
+//** `<input>` background color
+$input-bg: #fff !default;
+//** `<input disabled>` background color
+$input-bg-disabled: $gray-lighter !default;
+
+//** Text color for `<input>`s
+$input-color: $gray !default;
+//** `<input>` border color
+$input-border: #ccc !default;
+//** `<input>` border radius
+$input-border-radius: $border-radius-base !default;
+//** Border color for inputs on focus
+$input-border-focus: #66afe9 !default;
+
+//** Placeholder text color
+$input-color-placeholder: $gray-light !default;
+
+//** Default `.form-control` height
+$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
+//** Large `.form-control` height
+$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
+//** Small `.form-control` height
+$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
+
+$legend-color: $gray-dark !default;
+$legend-border-color: #e5e5e5 !default;
+
+//** Background color for textual input addons
+$input-group-addon-bg: $gray-lighter !default;
+//** Border color for textual input addons
+$input-group-addon-border-color: $input-border !default;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+$dropdown-bg: #fff !default;
+//** Dropdown menu `border-color`.
+$dropdown-border: rgba(0,0,0,.15) !default;
+//** Dropdown menu `border-color` **for IE8**.
+$dropdown-fallback-border: #ccc !default;
+//** Divider color for between dropdown items.
+$dropdown-divider-bg: #e5e5e5 !default;
+
+//** Dropdown link text color.
+$dropdown-link-color: $gray-dark !default;
+//** Hover color for dropdown links.
+$dropdown-link-hover-color: darken($gray-dark, 5%) !default;
+//** Hover background for dropdown links.
+$dropdown-link-hover-bg: #f5f5f5 !default;
+
+//** Active dropdown menu item text color.
+$dropdown-link-active-color: $component-active-color !default;
+//** Active dropdown menu item background color.
+$dropdown-link-active-bg: $component-active-bg !default;
+
+//** Disabled dropdown menu item background color.
+$dropdown-link-disabled-color: $gray-light !default;
+
+//** Text color for headers within dropdown menus.
+$dropdown-header-color: $gray-light !default;
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+$dropdown-caret-color: #000 !default;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+$zindex-navbar: 1000 !default;
+$zindex-dropdown: 1000 !default;
+$zindex-popover: 1060 !default;
+$zindex-tooltip: 1070 !default;
+$zindex-navbar-fixed: 1030 !default;
+$zindex-modal-background: 1040 !default;
+$zindex-modal: 1050 !default;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+$screen-xs: 480px !default;
+//** Deprecated `$screen-xs-min` as of v3.2.0
+$screen-xs-min: $screen-xs !default;
+//** Deprecated `$screen-phone` as of v3.0.1
+$screen-phone: $screen-xs-min !default;
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+$screen-sm: 768px !default;
+$screen-sm-min: $screen-sm !default;
+//** Deprecated `$screen-tablet` as of v3.0.1
+$screen-tablet: $screen-sm-min !default;
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+$screen-md: 992px !default;
+$screen-md-min: $screen-md !default;
+//** Deprecated `$screen-desktop` as of v3.0.1
+$screen-desktop: $screen-md-min !default;
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+$screen-lg: 1200px !default;
+$screen-lg-min: $screen-lg !default;
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+$screen-lg-desktop: $screen-lg-min !default;
+
+// So media queries don't overlap when required, provide a maximum
+$screen-xs-max: ($screen-sm-min - 1) !default;
+$screen-sm-max: ($screen-md-min - 1) !default;
+$screen-md-max: ($screen-lg-min - 1) !default;
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+$grid-columns: 12 !default;
+//** Padding between columns. Gets divided in half for the left and right.
+$grid-gutter-width: 30px !default;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+$grid-float-breakpoint: $screen-sm-min !default;
+//** Point at which the navbar begins collapsing.
+$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+$container-tablet: ((720px + $grid-gutter-width)) !default;
+//** For `$screen-sm-min` and up.
+$container-sm: $container-tablet !default;
+
+// Medium screen / desktop
+$container-desktop: ((940px + $grid-gutter-width)) !default;
+//** For `$screen-md-min` and up.
+$container-md: $container-desktop !default;
+
+// Large screen / wide desktop
+$container-large-desktop: ((1140px + $grid-gutter-width)) !default;
+//** For `$screen-lg-min` and up.
+$container-lg: $container-large-desktop !default;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+$navbar-height: 50px !default;
+$navbar-margin-bottom: $line-height-computed !default;
+$navbar-border-radius: $border-radius-base !default;
+$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default;
+$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;
+$navbar-collapse-max-height: 340px !default;
+
+$navbar-default-color: #777 !default;
+$navbar-default-bg: #f8f8f8 !default;
+$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;
+
+// Navbar links
+$navbar-default-link-color: #777 !default;
+$navbar-default-link-hover-color: #333 !default;
+$navbar-default-link-hover-bg: transparent !default;
+$navbar-default-link-active-color: #555 !default;
+$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;
+$navbar-default-link-disabled-color: #ccc !default;
+$navbar-default-link-disabled-bg: transparent !default;
+
+// Navbar brand label
+$navbar-default-brand-color: $navbar-default-link-color !default;
+$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;
+$navbar-default-brand-hover-bg: transparent !default;
+
+// Navbar toggle
+$navbar-default-toggle-hover-bg: #ddd !default;
+$navbar-default-toggle-icon-bar-bg: #888 !default;
+$navbar-default-toggle-border-color: #ddd !default;
+
+
+// Inverted navbar
+// Reset inverted navbar basics
+$navbar-inverse-color: $gray-light !default;
+$navbar-inverse-bg: #222 !default;
+$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;
+
+// Inverted navbar links
+$navbar-inverse-link-color: $gray-light !default;
+$navbar-inverse-link-hover-color: #fff !default;
+$navbar-inverse-link-hover-bg: transparent !default;
+$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;
+$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;
+$navbar-inverse-link-disabled-color: #444 !default;
+$navbar-inverse-link-disabled-bg: transparent !default;
+
+// Inverted navbar brand label
+$navbar-inverse-brand-color: $navbar-inverse-link-color !default;
+$navbar-inverse-brand-hover-color: #fff !default;
+$navbar-inverse-brand-hover-bg: transparent !default;
+
+// Inverted navbar toggle
+$navbar-inverse-toggle-hover-bg: #333 !default;
+$navbar-inverse-toggle-icon-bar-bg: #fff !default;
+$navbar-inverse-toggle-border-color: #333 !default;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+$nav-link-padding: 10px 15px !default;
+$nav-link-hover-bg: $gray-lighter !default;
+
+$nav-disabled-link-color: $gray-light !default;
+$nav-disabled-link-hover-color: $gray-light !default;
+
+$nav-open-link-hover-color: #fff !default;
+
+//== Tabs
+$nav-tabs-border-color: #ddd !default;
+
+$nav-tabs-link-hover-border-color: $gray-lighter !default;
+
+$nav-tabs-active-link-hover-bg: $body-bg !default;
+$nav-tabs-active-link-hover-color: $gray !default;
+$nav-tabs-active-link-hover-border-color: #ddd !default;
+
+$nav-tabs-justified-link-border-color: #ddd !default;
+$nav-tabs-justified-active-link-border-color: $body-bg !default;
+
+//== Pills
+$nav-pills-border-radius: $border-radius-base !default;
+$nav-pills-active-link-hover-bg: $component-active-bg !default;
+$nav-pills-active-link-hover-color: $component-active-color !default;
+
+
+//== Pagination
+//
+//##
+
+$pagination-color: $link-color !default;
+$pagination-bg: #fff !default;
+$pagination-border: #ddd !default;
+
+$pagination-hover-color: $link-hover-color !default;
+$pagination-hover-bg: $gray-lighter !default;
+$pagination-hover-border: #ddd !default;
+
+$pagination-active-color: #fff !default;
+$pagination-active-bg: $brand-primary !default;
+$pagination-active-border: $brand-primary !default;
+
+$pagination-disabled-color: $gray-light !default;
+$pagination-disabled-bg: #fff !default;
+$pagination-disabled-border: #ddd !default;
+
+
+//== Pager
+//
+//##
+
+$pager-bg: $pagination-bg !default;
+$pager-border: $pagination-border !default;
+$pager-border-radius: 15px !default;
+
+$pager-hover-bg: $pagination-hover-bg !default;
+
+$pager-active-bg: $pagination-active-bg !default;
+$pager-active-color: $pagination-active-color !default;
+
+$pager-disabled-color: $pagination-disabled-color !default;
+
+
+//== Jumbotron
+//
+//##
+
+$jumbotron-padding: 30px !default;
+$jumbotron-color: inherit !default;
+$jumbotron-bg: $gray-lighter !default;
+$jumbotron-heading-color: inherit !default;
+$jumbotron-font-size: ceil(($font-size-base * 1.5)) !default;
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+$state-success-text: #3c763d !default;
+$state-success-bg: #dff0d8 !default;
+$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;
+
+$state-info-text: #31708f !default;
+$state-info-bg: #d9edf7 !default;
+$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;
+
+$state-warning-text: #8a6d3b !default;
+$state-warning-bg: #fcf8e3 !default;
+$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;
+
+$state-danger-text: #a94442 !default;
+$state-danger-bg: #f2dede !default;
+$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+$tooltip-max-width: 200px !default;
+//** Tooltip text color
+$tooltip-color: #fff !default;
+//** Tooltip background color
+$tooltip-bg: #000 !default;
+$tooltip-opacity: .9 !default;
+
+//** Tooltip arrow width
+$tooltip-arrow-width: 5px !default;
+//** Tooltip arrow color
+$tooltip-arrow-color: $tooltip-bg !default;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+$popover-bg: #fff !default;
+//** Popover maximum width
+$popover-max-width: 276px !default;
+//** Popover border color
+$popover-border-color: rgba(0,0,0,.2) !default;
+//** Popover fallback border color
+$popover-fallback-border-color: #ccc !default;
+
+//** Popover title background color
+$popover-title-bg: darken($popover-bg, 3%) !default;
+
+//** Popover arrow width
+$popover-arrow-width: 10px !default;
+//** Popover arrow color
+$popover-arrow-color: #fff !default;
+
+//** Popover outer arrow width
+$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;
+//** Popover outer arrow color
+$popover-arrow-outer-color: rgba($popover-border-color, 0.05) !default;
+//** Popover outer arrow fallback color
+$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%) !default;
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+$label-default-bg: $gray-light !default;
+//** Primary label background color
+$label-primary-bg: $brand-primary !default;
+//** Success label background color
+$label-success-bg: $brand-success !default;
+//** Info label background color
+$label-info-bg: $brand-info !default;
+//** Warning label background color
+$label-warning-bg: $brand-warning !default;
+//** Danger label background color
+$label-danger-bg: $brand-danger !default;
+
+//** Default label text color
+$label-color: #fff !default;
+//** Default text color of a linked label
+$label-link-hover-color: #fff !default;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+$modal-inner-padding: 15px !default;
+
+//** Padding applied to the modal title
+$modal-title-padding: 15px !default;
+//** Modal title line-height
+$modal-title-line-height: $line-height-base !default;
+
+//** Background color of modal content area
+$modal-content-bg: #fff !default;
+//** Modal content border color
+$modal-content-border-color: rgba(0,0,0,.2) !default;
+//** Modal content border color **for IE8**
+$modal-content-fallback-border-color: #999 !default;
+
+//** Modal backdrop background color
+$modal-backdrop-bg: #000 !default;
+//** Modal backdrop opacity
+$modal-backdrop-opacity: .5 !default;
+//** Modal header border color
+$modal-header-border-color: #e5e5e5 !default;
+//** Modal footer border color
+$modal-footer-border-color: $modal-header-border-color !default;
+
+$modal-lg: 900px !default;
+$modal-md: 600px !default;
+$modal-sm: 300px !default;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+$alert-padding: 15px !default;
+$alert-border-radius: $border-radius-base !default;
+$alert-link-font-weight: bold !default;
+
+$alert-success-bg: $state-success-bg !default;
+$alert-success-text: $state-success-text !default;
+$alert-success-border: $state-success-border !default;
+
+$alert-info-bg: $state-info-bg !default;
+$alert-info-text: $state-info-text !default;
+$alert-info-border: $state-info-border !default;
+
+$alert-warning-bg: $state-warning-bg !default;
+$alert-warning-text: $state-warning-text !default;
+$alert-warning-border: $state-warning-border !default;
+
+$alert-danger-bg: $state-danger-bg !default;
+$alert-danger-text: $state-danger-text !default;
+$alert-danger-border: $state-danger-border !default;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+$progress-bg: #f5f5f5 !default;
+//** Progress bar text color
+$progress-bar-color: #fff !default;
+
+//** Default progress bar color
+$progress-bar-bg: $brand-primary !default;
+//** Success progress bar color
+$progress-bar-success-bg: $brand-success !default;
+//** Warning progress bar color
+$progress-bar-warning-bg: $brand-warning !default;
+//** Danger progress bar color
+$progress-bar-danger-bg: $brand-danger !default;
+//** Info progress bar color
+$progress-bar-info-bg: $brand-info !default;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+$list-group-bg: #fff !default;
+//** `.list-group-item` border color
+$list-group-border: #ddd !default;
+//** List group border radius
+$list-group-border-radius: $border-radius-base !default;
+
+//** Background color of single list items on hover
+$list-group-hover-bg: #f5f5f5 !default;
+//** Text color of active list items
+$list-group-active-color: $component-active-color !default;
+//** Background color of active list items
+$list-group-active-bg: $component-active-bg !default;
+//** Border color of active list elements
+$list-group-active-border: $list-group-active-bg !default;
+//** Text color for content within active list items
+$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;
+
+//** Text color of disabled list items
+$list-group-disabled-color: $gray-light !default;
+//** Background color of disabled list items
+$list-group-disabled-bg: $gray-lighter !default;
+//** Text color for content within disabled list items
+$list-group-disabled-text-color: $list-group-disabled-color !default;
+
+$list-group-link-color: #555 !default;
+$list-group-link-hover-color: $list-group-link-color !default;
+$list-group-link-heading-color: #333 !default;
+
+
+//== Panels
+//
+//##
+
+$panel-bg: #fff !default;
+$panel-body-padding: 15px !default;
+$panel-heading-padding: 10px 15px !default;
+$panel-footer-padding: $panel-heading-padding !default;
+$panel-border-radius: $border-radius-base !default;
+
+//** Border color for elements within panels
+$panel-inner-border: #ddd !default;
+$panel-footer-bg: #f5f5f5 !default;
+
+$panel-default-text: $gray-dark !default;
+$panel-default-border: #ddd !default;
+$panel-default-heading-bg: #f5f5f5 !default;
+
+$panel-primary-text: #fff !default;
+$panel-primary-border: $brand-primary !default;
+$panel-primary-heading-bg: $brand-primary !default;
+
+$panel-success-text: $state-success-text !default;
+$panel-success-border: $state-success-border !default;
+$panel-success-heading-bg: $state-success-bg !default;
+
+$panel-info-text: $state-info-text !default;
+$panel-info-border: $state-info-border !default;
+$panel-info-heading-bg: $state-info-bg !default;
+
+$panel-warning-text: $state-warning-text !default;
+$panel-warning-border: $state-warning-border !default;
+$panel-warning-heading-bg: $state-warning-bg !default;
+
+$panel-danger-text: $state-danger-text !default;
+$panel-danger-border: $state-danger-border !default;
+$panel-danger-heading-bg: $state-danger-bg !default;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+$thumbnail-padding: 4px !default;
+//** Thumbnail background color
+$thumbnail-bg: $body-bg !default;
+//** Thumbnail border color
+$thumbnail-border: #ddd !default;
+//** Thumbnail border radius
+$thumbnail-border-radius: $border-radius-base !default;
+
+//** Custom text color for thumbnail captions
+$thumbnail-caption-color: $text-color !default;
+//** Padding around the thumbnail caption
+$thumbnail-caption-padding: 9px !default;
+
+
+//== Wells
+//
+//##
+
+$well-bg: #f5f5f5 !default;
+$well-border: darken($well-bg, 7%) !default;
+
+
+//== Badges
+//
+//##
+
+$badge-color: #fff !default;
+//** Linked badge text color on hover
+$badge-link-hover-color: #fff !default;
+$badge-bg: $gray-light !default;
+
+//** Badge text color in active nav link
+$badge-active-color: $link-color !default;
+//** Badge background color in active nav link
+$badge-active-bg: #fff !default;
+
+$badge-font-weight: bold !default;
+$badge-line-height: 1 !default;
+$badge-border-radius: 10px !default;
+
+
+//== Breadcrumbs
+//
+//##
+
+$breadcrumb-padding-vertical: 8px !default;
+$breadcrumb-padding-horizontal: 15px !default;
+//** Breadcrumb background color
+$breadcrumb-bg: #f5f5f5 !default;
+//** Breadcrumb text color
+$breadcrumb-color: #ccc !default;
+//** Text color of current page in the breadcrumb
+$breadcrumb-active-color: $gray-light !default;
+//** Textual separator for between breadcrumb elements
+$breadcrumb-separator: "/" !default;
+
+
+//== Carousel
+//
+//##
+
+$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;
+
+$carousel-control-color: #fff !default;
+$carousel-control-width: 15% !default;
+$carousel-control-opacity: .5 !default;
+$carousel-control-font-size: 20px !default;
+
+$carousel-indicator-active-bg: #fff !default;
+$carousel-indicator-border-color: #fff !default;
+
+$carousel-caption-color: #fff !default;
+
+
+//== Close
+//
+//##
+
+$close-font-weight: bold !default;
+$close-color: #000 !default;
+$close-text-shadow: 0 1px 0 #fff !default;
+
+
+//== Code
+//
+//##
+
+$code-color: #c7254e !default;
+$code-bg: #f9f2f4 !default;
+
+$kbd-color: #fff !default;
+$kbd-bg: #333 !default;
+
+$pre-bg: #f5f5f5 !default;
+$pre-color: $gray-dark !default;
+$pre-border-color: #ccc !default;
+$pre-scrollable-max-height: 340px !default;
+
+
+//== Type
+//
+//##
+
+//** Text muted color
+$text-muted: $gray-light !default;
+//** Abbreviations and acronyms border color
+$abbr-border-color: $gray-light !default;
+//** Headings small color
+$headings-small-color: $gray-light !default;
+//** Blockquote small color
+$blockquote-small-color: $gray-light !default;
+//** Blockquote font size
+$blockquote-font-size: ($font-size-base * 1.25) !default;
+//** Blockquote border color
+$blockquote-border-color: $gray-lighter !default;
+//** Page header border color
+$page-header-border-color: $gray-lighter !default;
+
+
+//== Miscellaneous
+//
+//##
+
+//** Horizontal line color.
+$hr-border: $gray-lighter !default;
-// Fluid grid
-$fluidGridColumnWidth: 6.382978723% !default;
-$fluidGridGutterWidth: 2.127659574% !default; \ No newline at end of file
+//** Horizontal offset for forms and lists.
+$component-offset-horizontal: 180px !default;
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/_wells.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/_wells.scss
index 4347b89b4..b8657118a 100644
--- a/openstack_dashboard/static/bootstrap/scss/bootstrap/_wells.scss
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/_wells.scss
@@ -1,17 +1,29 @@
-// WELLS
-// -----
+//
+// Wells
+// --------------------------------------------------
+
+// Base class
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
- background-color: #f5f5f5;
- border: 1px solid #eee;
- border: 1px solid rgba(0,0,0,.05);
- @include border-radius(4px);
+ background-color: $well-bg;
+ border: 1px solid $well-border;
+ border-radius: $border-radius-base;
@include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
blockquote {
border-color: #ddd;
border-color: rgba(0,0,0,.15);
}
-} \ No newline at end of file
+}
+
+// Sizes
+.well-lg {
+ padding: 24px;
+ border-radius: $border-radius-large;
+}
+.well-sm {
+ padding: 9px;
+ border-radius: $border-radius-small;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/bootstrap.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/bootstrap.scss
new file mode 100644
index 000000000..4d6f8aacf
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/bootstrap.scss
@@ -0,0 +1,50 @@
+// Core variables and mixins
+@import "variables";
+@import "mixins";
+
+// Reset and dependencies
+@import "normalize";
+@import "print";
+@import "glyphicons";
+
+// Core CSS
+@import "scaffolding";
+@import "type";
+@import "code";
+@import "grid";
+@import "tables";
+@import "forms";
+@import "buttons";
+
+// Components
+@import "component-animations";
+@import "dropdowns";
+@import "button-groups";
+@import "input-groups";
+@import "navs";
+@import "navbar";
+@import "breadcrumbs";
+@import "pagination";
+@import "pager";
+@import "labels";
+@import "badges";
+@import "jumbotron";
+@import "thumbnails";
+@import "alerts";
+@import "progress-bars";
+@import "media";
+@import "list-group";
+@import "panels";
+@import "responsive-embed";
+@import "wells";
+@import "close";
+
+// Components w/ JavaScript
+@import "modals";
+@import "tooltip";
+@import "popovers";
+@import "carousel";
+
+// Utility classes
+@import "utilities";
+@import "responsive-utilities";
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_alerts.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_alerts.scss
new file mode 100644
index 000000000..3faf0b5a5
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_alerts.scss
@@ -0,0 +1,14 @@
+// Alerts
+
+@mixin alert-variant($background, $border, $text-color) {
+ background-color: $background;
+ border-color: $border;
+ color: $text-color;
+
+ hr {
+ border-top-color: darken($border, 5%);
+ }
+ .alert-link {
+ color: darken($text-color, 10%);
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_background-variant.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_background-variant.scss
new file mode 100644
index 000000000..4993bd2b8
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_background-variant.scss
@@ -0,0 +1,11 @@
+// Contextual backgrounds
+
+// [converter] $parent hack
+@mixin bg-variant($parent, $color) {
+ #{$parent} {
+ background-color: $color;
+ }
+ a#{$parent}:hover {
+ background-color: darken($color, 10%);
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_border-radius.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_border-radius.scss
new file mode 100644
index 000000000..ce1949987
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_border-radius.scss
@@ -0,0 +1,18 @@
+// Single side border-radius
+
+@mixin border-top-radius($radius) {
+ border-top-right-radius: $radius;
+ border-top-left-radius: $radius;
+}
+@mixin border-right-radius($radius) {
+ border-bottom-right-radius: $radius;
+ border-top-right-radius: $radius;
+}
+@mixin border-bottom-radius($radius) {
+ border-bottom-right-radius: $radius;
+ border-bottom-left-radius: $radius;
+}
+@mixin border-left-radius($radius) {
+ border-bottom-left-radius: $radius;
+ border-top-left-radius: $radius;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_buttons.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_buttons.scss
new file mode 100644
index 000000000..58ad13e50
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_buttons.scss
@@ -0,0 +1,50 @@
+// Button variants
+//
+// Easily pump out default styles, as well as :hover, :focus, :active,
+// and disabled options for all buttons
+
+@mixin button-variant($color, $background, $border) {
+ color: $color;
+ background-color: $background;
+ border-color: $border;
+
+ &:hover,
+ &:focus,
+ &:active,
+ &.active,
+ .open > &.dropdown-toggle {
+ color: $color;
+ background-color: darken($background, 10%);
+ border-color: darken($border, 12%);
+ }
+ &:active,
+ &.active,
+ .open > &.dropdown-toggle {
+ background-image: none;
+ }
+ &.disabled,
+ &[disabled],
+ fieldset[disabled] & {
+ &,
+ &:hover,
+ &:focus,
+ &:active,
+ &.active {
+ background-color: $background;
+ border-color: $border;
+ }
+ }
+
+ .badge {
+ color: $background;
+ background-color: $color;
+ }
+}
+
+// Button sizes
+@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
+ padding: $padding-vertical $padding-horizontal;
+ font-size: $font-size;
+ line-height: $line-height;
+ border-radius: $border-radius;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_center-block.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_center-block.scss
new file mode 100644
index 000000000..e06fb5e27
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_center-block.scss
@@ -0,0 +1,7 @@
+// Center-align a block level element
+
+@mixin center-block() {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_clearfix.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_clearfix.scss
new file mode 100644
index 000000000..dc3e2ab42
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_clearfix.scss
@@ -0,0 +1,22 @@
+// Clearfix
+//
+// For modern browsers
+// 1. The space content is one way to avoid an Opera bug when the
+// contenteditable attribute is included anywhere else in the document.
+// Otherwise it causes space to appear at the top and bottom of elements
+// that are clearfixed.
+// 2. The use of `table` rather than `block` is only necessary if using
+// `:before` to contain the top-margins of child elements.
+//
+// Source: http://nicolasgallagher.com/micro-clearfix-hack/
+
+@mixin clearfix() {
+ &:before,
+ &:after {
+ content: " "; // 1
+ display: table; // 2
+ }
+ &:after {
+ clear: both;
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_forms.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_forms.scss
new file mode 100644
index 000000000..ff72f0efc
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_forms.scss
@@ -0,0 +1,84 @@
+// Form validation states
+//
+// Used in forms.less to generate the form validation CSS for warnings, errors,
+// and successes.
+
+@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {
+ // Color the label and help text
+ .help-block,
+ .control-label,
+ .radio,
+ .checkbox,
+ .radio-inline,
+ .checkbox-inline {
+ color: $text-color;
+ }
+ // Set the border and box shadow on specific inputs to match
+ .form-control {
+ border-color: $border-color;
+ @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
+ &:focus {
+ border-color: darken($border-color, 10%);
+ $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);
+ @include box-shadow($shadow);
+ }
+ }
+ // Set validation states also for addons
+ .input-group-addon {
+ color: $text-color;
+ border-color: $border-color;
+ background-color: $background-color;
+ }
+ // Optional feedback icon
+ .form-control-feedback {
+ color: $text-color;
+ }
+}
+
+
+// Form control focus state
+//
+// Generate a customized focus state and for any input with the specified color,
+// which defaults to the `$input-border-focus` variable.
+//
+// We highly encourage you to not customize the default value, but instead use
+// this to tweak colors on an as-needed basis. This aesthetic change is based on
+// WebKit's default styles, but applicable to a wider range of browsers. Its
+// usability and accessibility should be taken into account with any change.
+//
+// Example usage: change the default blue border and shadow to white for better
+// contrast against a dark gray background.
+@mixin form-control-focus($color: $input-border-focus) {
+ $color-rgba: rgba(red($color), green($color), blue($color), .6);
+ &:focus {
+ border-color: $color;
+ outline: 0;
+ @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);
+ }
+}
+
+// Form control sizing
+//
+// Relative text size, padding, and border-radii changes for form controls. For
+// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
+// element gets special love because it's special, and that's a fact!
+// [converter] $parent hack
+@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
+ #{$parent} {
+ height: $input-height;
+ padding: $padding-vertical $padding-horizontal;
+ font-size: $font-size;
+ line-height: $line-height;
+ border-radius: $border-radius;
+ }
+
+ select#{$parent} {
+ height: $input-height;
+ line-height: $input-height;
+ }
+
+ textarea#{$parent},
+ select[multiple]#{$parent} {
+ height: auto;
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_gradients.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_gradients.scss
new file mode 100644
index 000000000..743a003a2
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_gradients.scss
@@ -0,0 +1,58 @@
+// Gradients
+
+
+
+// Horizontal gradient, from left to right
+//
+// Creates two color stops, start and end, by specifying a color and position for each color stop.
+// Color stops are not available in IE9 and below.
+@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
+ background-image: -webkit-linear-gradient(left, color-stop($start-color $start-percent), color-stop($end-color $end-percent)); // Safari 5.1-6, Chrome 10+
+ background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12
+ background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down
+}
+
+// Vertical gradient, from top to bottom
+//
+// Creates two color stops, start and end, by specifying a color and position for each color stop.
+// Color stops are not available in IE9 and below.
+@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
+ background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+
+ background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Opera 12
+ background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down
+}
+
+@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
+ background-repeat: repeat-x;
+ background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+
+ background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12
+ background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+}
+@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
+ background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
+ background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
+ background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
+ background-repeat: no-repeat;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback
+}
+@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
+ background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);
+ background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);
+ background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
+ background-repeat: no-repeat;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback
+}
+@mixin gradient-radial($inner-color: #555, $outer-color: #333) {
+ background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);
+ background-image: radial-gradient(circle, $inner-color, $outer-color);
+ background-repeat: no-repeat;
+}
+@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {
+ background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
+ background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid-framework.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid-framework.scss
new file mode 100644
index 000000000..9db502cc6
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid-framework.scss
@@ -0,0 +1,87 @@
+// Framework grid generation
+//
+// Used only by Bootstrap to generate the correct number of grid classes given
+// any value of `$grid-columns`.
+
+// [converter] This is defined recursively in LESS, but Sass supports real loops
+@mixin make-grid-columns() {
+ $list: '';
+ $i: 1;
+ $list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
+ @for $i from (1 + 1) through $grid-columns {
+ $list: "#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
+ }
+ #{$list} {
+ position: relative;
+ // Prevent columns from collapsing when empty
+ min-height: 1px;
+ // Inner gutter via padding
+ padding-left: ($grid-gutter-width / 2);
+ padding-right: ($grid-gutter-width / 2);
+ }
+}
+
+
+// [converter] This is defined recursively in LESS, but Sass supports real loops
+@mixin float-grid-columns($class) {
+ $list: '';
+ $i: 1;
+ $list: ".col-#{$class}-#{$i}";
+ @for $i from (1 + 1) through $grid-columns {
+ $list: "#{$list}, .col-#{$class}-#{$i}";
+ }
+ #{$list} {
+ float: left;
+ }
+}
+
+
+@mixin calc-grid-column($index, $class, $type) {
+ @if ($type == width) and ($index > 0) {
+ .col-#{$class}-#{$index} {
+ width: percentage(($index / $grid-columns));
+ }
+ }
+ @if ($type == push) and ($index > 0) {
+ .col-#{$class}-push-#{$index} {
+ left: percentage(($index / $grid-columns));
+ }
+ }
+ @if ($type == push) and ($index == 0) {
+ .col-#{$class}-push-0 {
+ left: auto;
+ }
+ }
+ @if ($type == pull) and ($index > 0) {
+ .col-#{$class}-pull-#{$index} {
+ right: percentage(($index / $grid-columns));
+ }
+ }
+ @if ($type == pull) and ($index == 0) {
+ .col-#{$class}-pull-0 {
+ right: auto;
+ }
+ }
+ @if ($type == offset) {
+ .col-#{$class}-offset-#{$index} {
+ margin-left: percentage(($index / $grid-columns));
+ }
+ }
+}
+
+// [converter] This is defined recursively in LESS, but Sass supports real loops
+@mixin loop-grid-columns($columns, $class, $type) {
+ @for $i from 0 through $columns {
+ @include calc-grid-column($i, $class, $type);
+ }
+}
+
+
+// Create grid for specific class
+@mixin make-grid($class) {
+ @include float-grid-columns($class);
+ @include loop-grid-columns($grid-columns, $class, width);
+ @include loop-grid-columns($grid-columns, $class, pull);
+ @include loop-grid-columns($grid-columns, $class, push);
+ @include loop-grid-columns($grid-columns, $class, offset);
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid.scss
new file mode 100644
index 000000000..c33337543
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid.scss
@@ -0,0 +1,122 @@
+// Grid system
+//
+// Generate semantic grid columns with these mixins.
+
+// Centered container element
+@mixin container-fixed() {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: ($grid-gutter-width / 2);
+ padding-right: ($grid-gutter-width / 2);
+ @include clearfix();
+}
+
+// Creates a wrapper for a series of columns
+@mixin make-row($gutter: $grid-gutter-width) {
+ margin-left: ($gutter / -2);
+ margin-right: ($gutter / -2);
+ @include clearfix();
+}
+
+// Generate the extra small columns
+@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {
+ position: relative;
+ float: left;
+ width: percentage(($columns / $grid-columns));
+ min-height: 1px;
+ padding-left: ($gutter / 2);
+ padding-right: ($gutter / 2);
+}
+@mixin make-xs-column-offset($columns) {
+ margin-left: percentage(($columns / $grid-columns));
+}
+@mixin make-xs-column-push($columns) {
+ left: percentage(($columns / $grid-columns));
+}
+@mixin make-xs-column-pull($columns) {
+ right: percentage(($columns / $grid-columns));
+}
+
+// Generate the small columns
+@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {
+ position: relative;
+ min-height: 1px;
+ padding-left: ($gutter / 2);
+ padding-right: ($gutter / 2);
+
+ @media (min-width: $screen-sm-min) {
+ float: left;
+ width: percentage(($columns / $grid-columns));
+ }
+}
+@mixin make-sm-column-offset($columns) {
+ @media (min-width: $screen-sm-min) {
+ margin-left: percentage(($columns / $grid-columns));
+ }
+}
+@mixin make-sm-column-push($columns) {
+ @media (min-width: $screen-sm-min) {
+ left: percentage(($columns / $grid-columns));
+ }
+}
+@mixin make-sm-column-pull($columns) {
+ @media (min-width: $screen-sm-min) {
+ right: percentage(($columns / $grid-columns));
+ }
+}
+
+// Generate the medium columns
+@mixin make-md-column($columns, $gutter: $grid-gutter-width) {
+ position: relative;
+ min-height: 1px;
+ padding-left: ($gutter / 2);
+ padding-right: ($gutter / 2);
+
+ @media (min-width: $screen-md-min) {
+ float: left;
+ width: percentage(($columns / $grid-columns));
+ }
+}
+@mixin make-md-column-offset($columns) {
+ @media (min-width: $screen-md-min) {
+ margin-left: percentage(($columns / $grid-columns));
+ }
+}
+@mixin make-md-column-push($columns) {
+ @media (min-width: $screen-md-min) {
+ left: percentage(($columns / $grid-columns));
+ }
+}
+@mixin make-md-column-pull($columns) {
+ @media (min-width: $screen-md-min) {
+ right: percentage(($columns / $grid-columns));
+ }
+}
+
+// Generate the large columns
+@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {
+ position: relative;
+ min-height: 1px;
+ padding-left: ($gutter / 2);
+ padding-right: ($gutter / 2);
+
+ @media (min-width: $screen-lg-min) {
+ float: left;
+ width: percentage(($columns / $grid-columns));
+ }
+}
+@mixin make-lg-column-offset($columns) {
+ @media (min-width: $screen-lg-min) {
+ margin-left: percentage(($columns / $grid-columns));
+ }
+}
+@mixin make-lg-column-push($columns) {
+ @media (min-width: $screen-lg-min) {
+ left: percentage(($columns / $grid-columns));
+ }
+}
+@mixin make-lg-column-pull($columns) {
+ @media (min-width: $screen-lg-min) {
+ right: percentage(($columns / $grid-columns));
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_hide-text.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_hide-text.scss
new file mode 100644
index 000000000..5e0697218
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_hide-text.scss
@@ -0,0 +1,21 @@
+// CSS image replacement
+//
+// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for
+// mixins being reused as classes with the same name, this doesn't hold up. As
+// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
+//
+// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
+
+// Deprecated as of v3.0.1 (will be removed in v4)
+@mixin hide-text() {
+ font: #{0/0} a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+// New mixin to use as of v3.0.1
+@mixin text-hide() {
+ @include hide-text();
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_image.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_image.scss
new file mode 100644
index 000000000..c8dcf5e9c
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_image.scss
@@ -0,0 +1,33 @@
+// Image Mixins
+// - Responsive image
+// - Retina image
+
+
+// Responsive image
+//
+// Keep images from scaling beyond the width of their parents.
+@mixin img-responsive($display: block) {
+ display: $display;
+ max-width: 100%; // Part 1: Set a maximum relative to the parent
+ height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
+}
+
+
+// Retina image
+//
+// Short retina mixin for setting background-image and -size. Note that the
+// spelling of `min--moz-device-pixel-ratio` is intentional.
+@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
+ background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-1x}"), "#{$file-1x}"));
+
+ @media
+ only screen and (-webkit-min-device-pixel-ratio: 2),
+ only screen and ( min--moz-device-pixel-ratio: 2),
+ only screen and ( -o-min-device-pixel-ratio: 2/1),
+ only screen and ( min-device-pixel-ratio: 2),
+ only screen and ( min-resolution: 192dpi),
+ only screen and ( min-resolution: 2dppx) {
+ background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-2x}"), "#{$file-2x}"));
+ background-size: $width-1x $height-1x;
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_labels.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_labels.scss
new file mode 100644
index 000000000..d99a65337
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_labels.scss
@@ -0,0 +1,12 @@
+// Labels
+
+@mixin label-variant($color) {
+ background-color: $color;
+
+ &[href] {
+ &:hover,
+ &:focus {
+ background-color: darken($color, 10%);
+ }
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_list-group.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_list-group.scss
new file mode 100644
index 000000000..5f05e7ba2
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_list-group.scss
@@ -0,0 +1,31 @@
+// List Groups
+
+@mixin list-group-item-variant($state, $background, $color) {
+ .list-group-item-#{$state} {
+ color: $color;
+ background-color: $background;
+
+ // [converter] extracted a& to a.list-group-item-#{$state}
+ }
+
+ a.list-group-item-#{$state} {
+ color: $color;
+
+ .list-group-item-heading {
+ color: inherit;
+ }
+
+ &:hover,
+ &:focus {
+ color: $color;
+ background-color: darken($background, 5%);
+ }
+ &.active,
+ &.active:hover,
+ &.active:focus {
+ color: #fff;
+ background-color: $color;
+ border-color: $color;
+ }
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-divider.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-divider.scss
new file mode 100644
index 000000000..2e6da02a4
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-divider.scss
@@ -0,0 +1,10 @@
+// Horizontal dividers
+//
+// Dividers (basically an hr) within dropdowns and nav lists
+
+@mixin nav-divider($color: #e5e5e5) {
+ height: 1px;
+ margin: (($line-height-computed / 2) - 1) 0;
+ overflow: hidden;
+ background-color: $color;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-vertical-align.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-vertical-align.scss
new file mode 100644
index 000000000..c8fbf1a7d
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-vertical-align.scss
@@ -0,0 +1,9 @@
+// Navbar vertical align
+//
+// Vertically center elements in the navbar.
+// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
+
+@mixin navbar-vertical-align($element-height) {
+ margin-top: (($navbar-height - $element-height) / 2);
+ margin-bottom: (($navbar-height - $element-height) / 2);
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_opacity.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_opacity.scss
new file mode 100644
index 000000000..df088adfe
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_opacity.scss
@@ -0,0 +1,8 @@
+// Opacity
+
+@mixin opacity($opacity) {
+ opacity: $opacity;
+ // IE8 filter
+ $opacity-ie: ($opacity * 100);
+ filter: #{alpha(opacity=$opacity-ie)};
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_pagination.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_pagination.scss
new file mode 100644
index 000000000..43fff6863
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_pagination.scss
@@ -0,0 +1,23 @@
+// Pagination
+
+@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $border-radius) {
+ > li {
+ > a,
+ > span {
+ padding: $padding-vertical $padding-horizontal;
+ font-size: $font-size;
+ }
+ &:first-child {
+ > a,
+ > span {
+ @include border-left-radius($border-radius);
+ }
+ }
+ &:last-child {
+ > a,
+ > span {
+ @include border-right-radius($border-radius);
+ }
+ }
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_panels.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_panels.scss
new file mode 100644
index 000000000..361aafb82
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_panels.scss
@@ -0,0 +1,20 @@
+// Panels
+
+@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {
+ border-color: $border;
+
+ & > .panel-heading {
+ color: $heading-text-color;
+ background-color: $heading-bg-color;
+ border-color: $heading-border;
+
+ + .panel-collapse > .panel-body {
+ border-top-color: $border;
+ }
+ }
+ & > .panel-footer {
+ + .panel-collapse > .panel-body {
+ border-bottom-color: $border;
+ }
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_progress-bar.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_progress-bar.scss
new file mode 100644
index 000000000..4303d702a
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_progress-bar.scss
@@ -0,0 +1,8 @@
+// Progress bars
+
+@mixin progress-bar-variant($color) {
+ background-color: $color;
+ .progress-striped & {
+ @include gradient-striped();
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_reset-filter.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_reset-filter.scss
new file mode 100644
index 000000000..bf7305120
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_reset-filter.scss
@@ -0,0 +1,8 @@
+// Reset filters for IE
+//
+// When you need to remove a gradient background, do not forget to use this to reset
+// the IE filter for IE9 and below.
+
+@mixin reset-filter() {
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_resize.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_resize.scss
new file mode 100644
index 000000000..7d55002c5
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_resize.scss
@@ -0,0 +1,6 @@
+// Resize anything
+
+@mixin resizable($direction) {
+ resize: $direction; // Options: horizontal, vertical, both
+ overflow: auto; // Safari fix
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_responsive-visibility.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_responsive-visibility.scss
new file mode 100644
index 000000000..9867db013
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_responsive-visibility.scss
@@ -0,0 +1,21 @@
+// Responsive utilities
+
+//
+// More easily include all the states for responsive-utilities.less.
+// [converter] $parent hack
+@mixin responsive-visibility($parent) {
+ #{$parent} {
+ display: block !important;
+ }
+ table#{$parent} { display: table; }
+ tr#{$parent} { display: table-row !important; }
+ th#{$parent},
+ td#{$parent} { display: table-cell !important; }
+}
+
+// [converter] $parent hack
+@mixin responsive-invisibility($parent) {
+ #{$parent} {
+ display: none !important;
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_size.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_size.scss
new file mode 100644
index 000000000..abbe2463c
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_size.scss
@@ -0,0 +1,10 @@
+// Sizing shortcuts
+
+@mixin size($width, $height) {
+ width: $width;
+ height: $height;
+}
+
+@mixin square($size) {
+ @include size($size, $size);
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_tab-focus.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_tab-focus.scss
new file mode 100644
index 000000000..7df0ae7ca
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_tab-focus.scss
@@ -0,0 +1,9 @@
+// WebKit-style focus
+
+@mixin tab-focus() {
+ // Default
+ outline: thin dotted;
+ // WebKit
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_table-row.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_table-row.scss
new file mode 100644
index 000000000..136795081
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_table-row.scss
@@ -0,0 +1,28 @@
+// Tables
+
+@mixin table-row-variant($state, $background) {
+ // Exact selectors below required to override `.table-striped` and prevent
+ // inheritance to nested tables.
+ .table > thead > tr,
+ .table > tbody > tr,
+ .table > tfoot > tr {
+ > td.#{$state},
+ > th.#{$state},
+ &.#{$state} > td,
+ &.#{$state} > th {
+ background-color: $background;
+ }
+ }
+
+ // Hover states for `.table-hover`
+ // Note: this is not available for cells or rows within `thead` or `tfoot`.
+ .table-hover > tbody > tr {
+ > td.#{$state}:hover,
+ > th.#{$state}:hover,
+ &.#{$state}:hover > td,
+ &:hover > .#{$state},
+ &.#{$state}:hover > th {
+ background-color: darken($background, 5%);
+ }
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-emphasis.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-emphasis.scss
new file mode 100644
index 000000000..1101e0366
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-emphasis.scss
@@ -0,0 +1,11 @@
+// Typography
+
+// [converter] $parent hack
+@mixin text-emphasis-variant($parent, $color) {
+ #{$parent} {
+ color: $color;
+ }
+ a#{$parent}:hover {
+ color: darken($color, 10%);
+ }
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-overflow.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-overflow.scss
new file mode 100644
index 000000000..1593b25ea
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-overflow.scss
@@ -0,0 +1,8 @@
+// Text overflow
+// Requires inline-block or block for proper styling
+
+@mixin text-overflow() {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
diff --git a/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_vendor-prefixes.scss b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_vendor-prefixes.scss
new file mode 100644
index 000000000..9f0408b3b
--- /dev/null
+++ b/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_vendor-prefixes.scss
@@ -0,0 +1,224 @@
+// Vendor Prefixes
+//
+// All vendor mixins are deprecated as of v3.2 due to the introduction of
+// Autoprefixer in our Gruntfile. They will be removed in v4.
+
+// - Animations
+// - Backface visibility
+// - Box shadow
+// - Box sizing
+// - Content columns
+// - Hyphens
+// - Placeholder text
+// - Transformations
+// - Transitions
+// - User Select
+
+
+// Animations
+@mixin animation($animation) {
+ -webkit-animation: $animation;
+ -o-animation: $animation;
+ animation: $animation;
+}
+@mixin animation-name($name) {
+ -webkit-animation-name: $name;
+ animation-name: $name;
+}
+@mixin animation-duration($duration) {
+ -webkit-animation-duration: $duration;
+ animation-duration: $duration;
+}
+@mixin animation-timing-function($timing-function) {
+ -webkit-animation-timing-function: $timing-function;
+ animation-timing-function: $timing-function;
+}
+@mixin animation-delay($delay) {
+ -webkit-animation-delay: $delay;
+ animation-delay: $delay;
+}
+@mixin animation-iteration-count($iteration-count) {
+ -webkit-animation-iteration-count: $iteration-count;
+ animation-iteration-count: $iteration-count;
+}
+@mixin animation-direction($direction) {
+ -webkit-animation-direction: $direction;
+ animation-direction: $direction;
+}
+@mixin animation-fill-mode($fill-mode) {
+ -webkit-animation-fill-mode: $fill-mode;
+ animation-fill-mode: $fill-mode;
+}
+
+// Backface visibility
+// Prevent browsers from flickering when using CSS 3D transforms.
+// Default value is `visible`, but can be changed to `hidden`
+
+@mixin backface-visibility($visibility){
+ -webkit-backface-visibility: $visibility;
+ -moz-backface-visibility: $visibility;
+ backface-visibility: $visibility;
+}
+
+// Drop shadows
+//
+// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
+// supported browsers that have box shadow capabilities now support it.
+
+@mixin box-shadow($shadow...) {
+ -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1
+ box-shadow: $shadow;
+}
+
+// Box sizing
+@mixin box-sizing($boxmodel) {
+ -webkit-box-sizing: $boxmodel;
+ -moz-box-sizing: $boxmodel;
+ box-sizing: $boxmodel;
+}
+
+// CSS3 Content Columns
+@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {
+ -webkit-column-count: $column-count;
+ -moz-column-count: $column-count;
+ column-count: $column-count;
+ -webkit-column-gap: $column-gap;
+ -moz-column-gap: $column-gap;
+ column-gap: $column-gap;
+}
+
+// Optional hyphenation
+@mixin hyphens($mode: auto) {
+ word-wrap: break-word;
+ -webkit-hyphens: $mode;
+ -moz-hyphens: $mode;
+ -ms-hyphens: $mode; // IE10+
+ -o-hyphens: $mode;
+ hyphens: $mode;
+}
+
+// Placeholder text
+@mixin placeholder($color: $input-color-placeholder) {
+ &::-moz-placeholder { color: $color; // Firefox
+ opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526
+ &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+
+ &::-webkit-input-placeholder { color: $color; } // Safari and Chrome
+}
+
+// Transformations
+@mixin scale($ratio...) {
+ -webkit-transform: scale($ratio);
+ -ms-transform: scale($ratio); // IE9 only
+ -o-transform: scale($ratio);
+ transform: scale($ratio);
+}
+@mixin scale($ratioX, $ratioY...) {
+ -webkit-transform: scale($ratioX, $ratioY);
+ -ms-transform: scale($ratioX, $ratioY); // IE9 only
+ -o-transform: scale($ratioX, $ratioY);
+ transform: scale($ratioX, $ratioY);
+}
+@mixin scaleX($ratio) {
+ -webkit-transform: scaleX($ratio);
+ -ms-transform: scaleX($ratio); // IE9 only
+ -o-transform: scaleX($ratio);
+ transform: scaleX($ratio);
+}
+@mixin scaleY($ratio) {
+ -webkit-transform: scaleY($ratio);
+ -ms-transform: scaleY($ratio); // IE9 only
+ -o-transform: scaleY($ratio);
+ transform: scaleY($ratio);
+}
+@mixin skew($x, $y) {
+ -webkit-transform: skew($x, $y);
+ -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
+ -o-transform: skew($x, $y);
+ transform: skew($x, $y);
+}
+@mixin translate($x, $y) {
+ -webkit-transform: translate($x, $y);
+ -ms-transform: translate($x, $y); // IE9 only
+ -o-transform: translate($x, $y);
+ transform: translate($x, $y);
+}
+@mixin translate3d($x, $y, $z) {
+ -webkit-transform: translate3d($x, $y, $z);
+ transform: translate3d($x, $y, $z);
+}
+@mixin rotate($degrees) {
+ -webkit-transform: rotate($degrees);
+ -ms-transform: rotate($degrees); // IE9 only
+ -o-transform: rotate($degrees);
+ transform: rotate($degrees);
+}
+@mixin rotateX($degrees) {
+ -webkit-transform: rotateX($degrees);
+ -ms-transform: rotateX($degrees); // IE9 only
+ -o-transform: rotateX($degrees);
+ transform: rotateX($degrees);
+}
+@mixin rotateY($degrees) {
+ -webkit-transform: rotateY($degrees);
+ -ms-transform: rotateY($degrees); // IE9 only
+ -o-transform: rotateY($degrees);
+ transform: rotateY($degrees);
+}
+@mixin perspective($perspective) {
+ -webkit-perspective: $perspective;
+ -moz-perspective: $perspective;
+ perspective: $perspective;
+}
+@mixin perspective-origin($perspective) {
+ -webkit-perspective-origin: $perspective;
+ -moz-perspective-origin: $perspective;
+ perspective-origin: $perspective;
+}
+@mixin transform-origin($origin) {
+ -webkit-transform-origin: $origin;
+ -moz-transform-origin: $origin;
+ -ms-transform-origin: $origin; // IE9 only
+ transform-origin: $origin;
+}
+
+
+// Transitions
+
+@mixin transition($transition...) {
+ -webkit-transition: $transition;
+ -o-transition: $transition;
+ transition: $transition;
+}
+@mixin transition-property($transition-property...) {
+ -webkit-transition-property: $transition-property;
+ transition-property: $transition-property;
+}
+@mixin transition-delay($transition-delay) {
+ -webkit-transition-delay: $transition-delay;
+ transition-delay: $transition-delay;
+}
+@mixin transition-duration($transition-duration...) {
+ -webkit-transition-duration: $transition-duration;
+ transition-duration: $transition-duration;
+}
+@mixin transition-timing-function($timing-function) {
+ -webkit-transition-timing-function: $timing-function;
+ transition-timing-function: $timing-function;
+}
+@mixin transition-transform($transition...) {
+ -webkit-transition: -webkit-transform $transition;
+ -moz-transition: -moz-transform $transition;
+ -o-transition: -o-transform $transition;
+ transition: transform $transition;
+}
+
+
+// User select
+// For selecting text on the page
+
+@mixin user-select($select) {
+ -webkit-user-select: $select;
+ -moz-user-select: $select;
+ -ms-user-select: $select; // IE10+
+ user-select: $select;
+}
diff --git a/openstack_dashboard/static/dashboard/scss/_accordion_nav.scss b/openstack_dashboard/static/dashboard/scss/_accordion_nav.scss
index ebece0360..595e5a709 100644
--- a/openstack_dashboard/static/dashboard/scss/_accordion_nav.scss
+++ b/openstack_dashboard/static/dashboard/scss/_accordion_nav.scss
@@ -18,10 +18,11 @@ $accordionBorderColor: #e5e5e5;
padding: 10px 0 10px 0;
line-height: 16px;
margin-top: 0;
+ margin-bottom: 0;
color: #6e6e6e;
font-weight: bold;
text-rendering: optimizelegibility;
- max-width: 193px;
+ max-width: 217px;
padding-right: 16px;
cursor: pointer;
div {
@@ -49,10 +50,11 @@ $accordionBorderColor: #e5e5e5;
ul {
list-style: none outside none;
margin: 10px 0 0;
+ padding: 0;
width: 222px; }
li {
a {
- width: 185px;
+ width: 209px;
padding: 10px;
display: block;
line-height: 18px;
@@ -70,6 +72,7 @@ $accordionBorderColor: #e5e5e5;
margin-bottom: 8px; } } }
dd {
padding: 0;
+ margin-left: 9px;
font-size: 12px; }
dt {
border-top: 1px solid #bbbbbb;
@@ -78,7 +81,7 @@ $accordionBorderColor: #e5e5e5;
background-position: 96% center;
background-image: url("/static/dashboard/img/right_droparrow.png");
padding-right: 16px;
- max-width: 217px;
+ max-width: 231px;
cursor: pointer;
div {
color: #6e6e6e;
diff --git a/openstack_dashboard/static/dashboard/scss/horizon.scss b/openstack_dashboard/static/dashboard/scss/horizon.scss
index a0add0123..587a613cf 100644
--- a/openstack_dashboard/static/dashboard/scss/horizon.scss
+++ b/openstack_dashboard/static/dashboard/scss/horizon.scss
@@ -1,4 +1,9 @@
-@import "/bootstrap/scss/_bootstrap";
+// bootstrap overrides:
+$icon-font-path: "/static/bootstrap/fonts/bootstrap/";
+$font-size-base: 13px;
+$modal-md: 732px;
+
+@import "/bootstrap/scss/bootstrap";
@import "/bootstrap/scss/_datepicker";
@import "_variables";
@import "_accordion_nav";
@@ -112,16 +117,6 @@ dt {
width: 130px;
}
-.topbar .switcher_bar h3 {
- padding: 2px 10px 1px;
- font-size: 13px !important;
- line-height: 20px;
- color: $gray;
- text-decoration: none;
- text-overflow: ellipsis;
- overflow: hidden;
-}
-
.topbar .switcher_bar div {
padding: 2px 10px 1px;
font-size: 11px !important;
@@ -171,6 +166,9 @@ dt {
font-family: anivers;
height: auto;
width: 100%;
+ h2 {
+ margin: 0;
+ }
}
h2 {
@@ -216,7 +214,7 @@ h2 {
}
}
-#splash .help-block {
+#splash p.help-block {
display: none;
}
@@ -235,7 +233,7 @@ h2 {
@include border-radius(0 0 5px 0);
float: left;
- min-width: 231px;
+ min-width: 236px;
}
.sidebar h4 {
@@ -412,10 +410,14 @@ a.current_item:hover h4 {
min-height: 35px;
padding: 5px 0;
}
+
.table_caption th {
background-color: transparent;
border: none;
}
+
+.table-bordered th.table_header { border: none; }
+
.table-bordered tr.table_caption + tr th {
border-top: 1px solid $table-border-color;
}
@@ -457,7 +459,7 @@ a.current_item:hover h4 {
font-family: anivers;
font-weight: normal;
font-size: 24px;
- margin-bottom: 5px;
+ margin: 0 0 5px 0;
float: left;
}
.table th.header {
@@ -469,7 +471,6 @@ a.current_item:hover h4 {
}
.table tbody td.anchor a {
display: block;
- padding: 8px;
}
.table tr.table_caption th.header:hover {
background-color: transparent;
@@ -540,22 +541,22 @@ table form {
top: 20px;
right: 20px;
width: 300px;
- .alert-block {
+ .alert {
@include box-shadow(0 3px 7px rgba(0, 0, 0, 0.3));
}
- .alert-block.alert-error {
+ .alert.alert-danger {
border-width: 1px;
border-style: solid;
border-color: darken($brand-danger, 5%);
}
- .alert-block.alert-success {
+ .alert.alert-success {
border-width: 1px;
border-style: solid;
border-color: darken($brand-success, 5%);
}
}
-.alert-block .alert-actions {
+.alert .alert-actions {
margin-top: -23px;
margin-right: -23px;
}
@@ -566,12 +567,12 @@ table form {
margin-bottom: 0;
}
-.alert-block p {
+.alert p {
overflow: hidden;
word-wrap: break-word;
}
-.alert-block p:last-child {
+.alert p:last-child {
margin-bottom: 0;
}
@@ -595,6 +596,16 @@ table form {
.table {
margin-bottom: 25px;
+ > thead,
+ > tbody,
+ > tfoot {
+ > tr {
+ > th,
+ > td {
+ vertical-align: middle;
+ }
+ }
+ }
}
.table tr td {
@@ -615,6 +626,7 @@ table form {
.table_actions {
float: right;
min-width: 400px;
+ @extend .form-inline;
}
.table_actions .table_search,
@@ -622,65 +634,12 @@ table form {
display: inline-block;
}
-.table_search input {
- background: url(/static/dashboard/img/search.png) no-repeat 195px 5px;
- display: inline-block;
- margin-bottom: 0;
-}
-
-.table_actions a, .table_actions button {
- float: right;
- margin-left: 10px;
-}
-
-.table_actions button.filter {
- margin-left: 0;
-}
-
-@mixin btn-icon($x, $y, $icons: "/static/bootstrap/img/glyphicons-halflings.png") {
- padding-left: 23px;
- position: relative;
-
- &:before {
- display: inline-block;
- content: "";
- width: 18px;
- height: 20px;
- margin-top: 1px;
- *margin-right: .3em;
- line-height: 14px;
- background-image: url($icons);
- background-position: $x $y;
- background-repeat: no-repeat;
- position: absolute;
- top: 0px;
- left: 0px;
+.table_search {
+ input[type="text"] {
+ padding-right: 26px;
}
}
-@mixin btn-icon-danger($x, $y) {
- @include btn-icon($x, $y, "/static/bootstrap/img/glyphicons-halflings-white.png");
-}
-
-.table_actions {
-
- a.btn-create, button.btn-create, a.btn-launch {
- @include btn-icon(-403px, -92px);
- }
-
- a.btn-download, button.btn-download {
- @include btn-icon(-91px, -19px);
- }
-
- a.btn-upload, button.btn-upload {
- @include btn-icon(-283px, -92px);
- }
-
- button.btn-delete, button.btn-terminate {
- @include btn-icon-danger(-451px, 5px);
- }
-}
-
td.no-transition {
-webkit-transition: none !important;
-moz-transition: none !important;
@@ -990,6 +949,9 @@ div.table_cell_wrapper {
/* Forms */
+.datepicker input{
+ @extend .form-control;
+}
form label {
text-align: left;
@@ -998,25 +960,17 @@ form label {
display: inline-block;
}
-.modal {
- width: 700px;
- max-height: none; /* Prevents large modals from scrolling unnecessarily */
- top: 80px;
- margin-top: 0;
- position: absolute;
-}
-
-.modal.fullscreen {
+.modal.fullscreen .modal-dialog {
width: 90%;
margin: auto;
left: 5%;
}
-.modal.loading {
- width: 150px;
- height: 150px;
- margin: 0 auto;
- overflow: hidden;
+.modal.loading .modal-dialog {
+ width: 170px;
+ .modal-body {
+ height: 170px;
+ }
}
.modal.loading p {
@@ -1026,39 +980,6 @@ form label {
width: 150px;
}
-.datepicker {
- margin-top: 10px;
-}
-
-.datepicker input {
- width: 66px;
- margin-right: 10px;
-}
-
-.datepicker .btn {
- margin-right: 10px;
-}
-
-form.horizontal .form-field {
- float: left;
-}
-
-form.horizontal.split_half .form-field {
- width: 334px; /* Fits 2 fields to a row */
-}
-
-form.horizontal.split_quarter .form-field {
- width: 167px; /* Fits 4 fields to a row */
-}
-
-form.horizontal.split_five .form-field {
- width: 133px; /* Fits 5 fields to a row */
-}
-
-form.horizontal fieldset {
- width: 100%;
-}
-
.modal-body {
overflow-y: visible;
max-height: none;
@@ -1074,7 +995,6 @@ form.horizontal fieldset {
.static_page {
float: left;
- width: 700px;
background-color: $body-bg;
border: 1px solid $border-color;
}
@@ -1084,7 +1004,7 @@ form.horizontal fieldset {
.left {
float: left;
- width: 347px;
+ width: 342px;
margin-right: 15px;
}
@@ -1094,7 +1014,7 @@ form.horizontal fieldset {
.right {
float: left;
- width: 308px;
+ width: 342px;
}
.clear {
@@ -1105,29 +1025,6 @@ form.horizontal fieldset {
margin: 0;
}
-.modal-body fieldset {
- margin: 0;
- padding: 0;
-}
-
-.modal-body fieldset ul {
- width: 90%;
-}
-
-.modal-body fieldset .form-field input,
-.modal-body fieldset .form-field textarea {
- width: 298px;
-}
-.modal-body fieldset .form-field select {
- width: 308px;
-}
-.modal-body fieldset .form-field textarea {
- height: $baseLineHeight * 2;
-}
-.modal-body-fixed-width {
- max-width: 298px;
-}
-
.modal-footer input {
width: auto;
}
@@ -1307,7 +1204,7 @@ td.actions_column ul.row_actions.single button:hover {
}
th.multi_select_column, td.multi_select_column {
- width: 25px;
+ width: 41px;
}
th.multi_select_column, td.multi_select_column {
@@ -1412,10 +1309,6 @@ tr.terminated {
background-image: url(/static/dashboard/img/drop_arrow.png);
}
-form div.clearfix.error {
- width: 308px;
-}
-
.nav-tabs a {
cursor: pointer;
}
@@ -1429,7 +1322,7 @@ form div.clearfix.error {
}
.nav-tabs li.required a:after,
-form .form-field.required > label:after {
+form .form-group.required > label:after {
content: "*";
font-weight: bold;
line-height: 0;
@@ -1544,7 +1437,6 @@ iframe {
}
.quota_bar {
- height: 15px;
margin: -8px 0 8px;
}
@@ -1562,11 +1454,11 @@ div .flavor_table {
width: 160px;
}
-#main_content .row-fluid {
+#main_content .row {
margin: 10px 0 20px;
}
-#main_content .row-fluid:last-child {
+#main_content .row:last-child {
margin-bottom: 0;
}
@@ -1585,13 +1477,12 @@ div .flavor_table {
margin-right: 50px;
}
-.error .help-inline, .dynamic-error {
- background: $body-bg;
- border: 1px solid $border-color;
+.has-error .help-block, .dynamic-error {
padding: 10px;
- display: block;
}
.dynamic-error {
+ background: $body-bg;
+ border: 1px solid $border-color;
color: $brand-danger;
margin-bottom: 0.5em;
}
@@ -1638,8 +1529,8 @@ label.log-length {
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
}
-.split_five div.control-group input[type="text"],
-.split_five div.control-group select {
+.split_five div.form-group input[type="text"],
+.split_five div.form-group select {
width: 120px;
}
@@ -2410,27 +2301,6 @@ $contentTableWidth: $browserWrapperWidth - $navigationTableWidth;
color: darken($brand-danger, 20%);
}
-#ceilometer-stats .form-horizontal {
- .control-label {
- width: auto;
- }
- .controls {
- float: left;
- margin-left: 0;
- }
- .control-group {
- float: left;
- margin-right: 20px;
- }
- .btn {
- float: left;
- margin-right: 20px;
- margin-bottom: 18px;
- }
-}
-
-
-
/* Styling for draged firewall rule object */
#ruleListSortContainer {
display: none;
diff --git a/openstack_dashboard/static/dashboard/scss/horizon_workflow.scss b/openstack_dashboard/static/dashboard/scss/horizon_workflow.scss
index f76a74355..87217b07d 100644
--- a/openstack_dashboard/static/dashboard/scss/horizon_workflow.scss
+++ b/openstack_dashboard/static/dashboard/scss/horizon_workflow.scss
@@ -25,7 +25,7 @@
}
&.wizard {
- .row-fluid {
+ .row {
.btn {
float: none;
margin: 0;
diff --git a/openstack_dashboard/templates/_header.html b/openstack_dashboard/templates/_header.html
index 5b4dc8d7f..768b8329c 100644
--- a/openstack_dashboard/templates/_header.html
+++ b/openstack_dashboard/templates/_header.html
@@ -8,7 +8,7 @@
{% if num_of_tenants > 1 %}
<a class="dropdown-toggle" data-toggle="dropdown" href="#tenant_switcher">
{% endif %}
- <h3>{{ request.user.project_name }}</h3>
+ <div>{{ request.user.project_name }}</div>
{% if num_of_tenants > 1 %}
</a>
{% endif %}
@@ -30,7 +30,7 @@
{% if num_of_regions > 1 %}
<div id="services_region_switcher" class="dropdown switcher_bar" tabindex="1">
<a class="dropdown-toggle" data-toggle="dropdown" href="#services_region_switcher">
- <h3>{{ request.user.services_region }}</h3>
+ <div>{{ request.user.services_region }}</div>
</a>
<ul id="services_regions_list" class="dropdown-menu">
diff --git a/openstack_dashboard/test/test_panels/plugin_panel/templates/plugin_panel/index.html b/openstack_dashboard/test/test_panels/plugin_panel/templates/plugin_panel/index.html
index 0df359105..257c426fc 100644
--- a/openstack_dashboard/test/test_panels/plugin_panel/templates/plugin_panel/index.html
+++ b/openstack_dashboard/test/test_panels/plugin_panel/templates/plugin_panel/index.html
@@ -7,8 +7,8 @@
{% endblock page_header %}
{% block main %}
-<div class="row-fluid">
- <div class="span12">
+<div class="row">
+ <div class="col-sm-12">
Plugin-based Panel
</div>
</div>
diff --git a/openstack_dashboard/usage/tables.py b/openstack_dashboard/usage/tables.py
index 4def227cc..acdcad8f8 100644
--- a/openstack_dashboard/usage/tables.py
+++ b/openstack_dashboard/usage/tables.py
@@ -23,7 +23,7 @@ from horizon.utils import filters
class CSVSummary(tables.LinkAction):
name = "csv_summary"
verbose_name = _("Download CSV Summary")
- classes = ("btn-download",)
+ icon = "download"
def get_link_url(self, usage=None):
return self.table.kwargs['usage'].csv_link()