From 330d5023dffa664334d0a71ed99888342dd321bf Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Mon, 10 Sep 2018 19:56:24 +0300 Subject: [PATCH 01/33] write migrations --- .gitignore | 1 + ckan/migration/README | 5 +- ckan/migration/alembic.ini | 74 ++++++ ckan/migration/env.py | 73 ++++++ ckan/migration/manage.py | 6 - ckan/migration/migrate.cfg | 20 -- ckan/migration/script.py.mako | 24 ++ ...001_103676e0a497_create_existing_tables.py | 154 ++++++++++++ .../versions/001_add_existing_tables.py | 115 --------- ..._86fdd8c54775_add_author_and_maintainer.py | 34 +++ .../versions/002_add_author_and_maintainer.py | 34 --- .../migration/versions/003_add_user_object.py | 27 --- .../003_f22b4f5241a5_add_user_object.py | 34 +++ .../versions/004_add_group_object.py | 38 --- .../004_f92ee205e46d_add_group_object.py | 40 ++++ ...5_12c2232c15f5_add_authorization_tables.py | 61 +++++ .../versions/005_add_authorization_tables.py | 57 ----- ckan/migration/versions/006_add_ratings.py | 30 --- .../versions/006_c83955e7acb6_add_ratings.py | 31 +++ .../007_1928d4af1cda_add_system_roles.py | 31 +++ .../versions/007_add_system_roles.py | 27 --- .../008_e8283ffb257e_update_vdm_ids.py | 53 +++++ ckan/migration/versions/008_update_vdm_ids.py | 91 -------- .../versions/009_add_creation_timestamps.py | 27 --- ...09_b739a48de5c4_add_creation_timestamps.py | 27 +++ .../010_a6f13bf14d0c_add_user_about.py | 23 ++ ckan/migration/versions/010_add_user_about.py | 16 -- ..._866f6370b4ac_add_package_search_vector.py | 31 +++ .../versions/011_add_package_search_vector.py | 25 -- ckan/migration/versions/012_add_resources.py | 80 ------- .../012_e5ca33a5d445_add_resources.py | 63 +++++ .../versions/013_8a3a5af39797_add_hash.py | 23 ++ ckan/migration/versions/013_add_hash.py | 17 -- .../versions/014_93519b684820_hash_2.py | 25 ++ ckan/migration/versions/014_hash_2.py | 19 -- .../015_6d8ffebcaf54_remove_state_object.py | 41 ++++ .../versions/015_remove_state_object.py | 35 --- .../016_37ada738328e_uuids_everywhere.py | 127 ++++++++++ .../versions/016_uuids_everywhere.py | 196 ---------------- .../017_1250b2ff3e36_add_pkg_relationships.py | 58 +++++ .../versions/017_add_pkg_relationships.py | 41 ---- .../018_05a0778051ca_adjust_licenses.py | 40 ++++ .../migration/versions/018_adjust_licenses.py | 180 -------------- ...19_b2eb6f34a638_pkg_relationships_state.py | 27 +++ .../versions/019_pkg_relationships_state.py | 26 --- .../020_69a0b0efc609_add_changeset.py | 68 ++++++ ckan/migration/versions/020_add_changeset.py | 47 ---- ...021_765143af2ba3_postgresql_upgrade_sql.py | 102 ++++++++ .../versions/021_postgres_downgrade.sql | 1 - .../versions/021_postgres_upgrade.sql | 73 ------ .../versions/021_postgresql_downgrade.sql | 1 - .../versions/021_postgresql_upgrade.sql | 73 ------ .../022_7b324ca6c0dc_add_group_extras.py | 29 +++ .../versions/022_add_group_extras.py | 53 ----- .../023_87fdd05f0744_add_harvesting.py | 49 ++++ ckan/migration/versions/023_add_harvesting.py | 42 ---- ...024_12981fe12484_add_harvested_document.py | 29 +++ .../versions/024_add_harvested_document.py | 22 -- .../versions/025_add_authorization_groups.py | 58 ----- ...5_b581622ad327_add_authorization_groups.py | 76 ++++++ ...615b25af443_authorization_group_user_pk.py | 23 ++ .../026_authorization_group_user_pk.py | 37 --- .../027_11e5745c6fc9_adjust_harvester.py | 39 ++++ .../versions/027_adjust_harvester.py | 34 --- ...cdd68fe9ba21_drop_harvest_source_status.py | 23 ++ .../028_drop_harvest_source_status.py | 18 -- .../029_1bfdf4240915_version_groups.py | 106 +++++++++ ckan/migration/versions/029_version_groups.py | 174 -------------- .../030_additional_user_attributes.py | 24 -- ...b16cbf164c8a_additional_user_attributes.py | 29 +++ ...1_1b05245167d6_move_openid_to_new_field.py | 23 ++ .../versions/031_move_openid_to_new_field.py | 39 ---- .../032_add_extra_info_field_to_resources.py | 20 -- ...1422d_add_extra_info_field_to_resources.py | 27 +++ ...df15_auth_group_user_id_add_conditional.py | 26 +++ .../033_auth_group_user_id_add_conditional.py | 32 --- .../034_6c600693af5b_resource_group_table.py | 158 +++++++++++++ .../versions/034_resource_group_table.py | 209 ----------------- ..._81148ccebd6c_harvesting_doc_versioning.py | 91 ++++++++ .../versions/035_harvesting_doc_versioning.py | 50 ---- .../036_ecaa8b38782f_lockdown_roles.py | 23 ++ ckan/migration/versions/036_lockdown_roles.py | 37 --- .../037_edcf3b8c3c1b_role_anon_editor.py | 23 ++ .../versions/037_role_anon_editor.py | 50 ---- .../versions/038_delete_migration_tables.py | 12 - ...38_fd6622e3d964_delete_migration_tables.py | 101 ++++++++ .../versions/039_add_expired_id_and_dates.py | 221 ------------------ ...9_cca459c76d45_add_expired_id_and_dates.py | 156 +++++++++++++ .../040_500a08f4818e_reset_key_on_user.py | 23 ++ .../versions/040_reset_key_on_user.py | 15 -- .../041_6817d4e3bdc3_resource_new_fields.py | 43 ++++ .../versions/041_resource_new_fields.py | 34 --- .../042_da65e2877034_user_revision_indexes.py | 33 +++ .../versions/042_user_revision_indexes.py | 15 -- .../043_bd38cd6502b2_drop_postgres_search.py | 31 +++ .../versions/043_drop_postgres_search.py | 14 -- .../044_4190eeeb8d73_add_task_status.py | 41 ++++ .../migration/versions/044_add_task_status.py | 26 --- .../045_54e3f155d945_user_name_unique.py | 23 ++ .../versions/045_user_name_unique.py | 19 -- .../046_b69e9b80396f_drop_changesets.py | 68 ++++++ .../migration/versions/046_drop_changesets.py | 12 - ...83a7c406926_rename_package_group_member.py | 168 +++++++++++++ .../047_rename_package_group_member.py | 110 --------- ...a7011172b3f_add_activity_streams_tables.py | 50 ++++ .../048_add_activity_streams_tables.py | 37 --- .../versions/049_add_group_approval_status.py | 19 -- ..._e0c06c2177b5_add_group_approval_status.py | 27 +++ ...050_01a6b058cb7f_term_translation_table.py | 29 +++ .../versions/050_term_translation_table.py | 22 -- .../051_a4fb0d85ced6_add_tag_vocabulary.py | 43 ++++ .../versions/051_add_tag_vocabulary.py | 31 --- ...2_ba693d64c6d7_update_member_capacities.py | 23 ++ .../versions/052_update_member_capacities.py | 14 -- .../053_9d051a099097_add_group_logo.py | 25 ++ ckan/migration/versions/053_add_group_logo.py | 14 -- .../versions/054_add_resource_created_date.py | 11 - ..._da21b38da4db_add_resource_created_date.py | 25 ++ ...db947bf_update_user_and_activity_detail.py | 25 ++ .../055_update_user_and_activity_detail.py | 11 - .../056_11af3215ae89_add_related_table.py | 49 ++++ .../versions/056_add_related_table.py | 42 ---- .../versions/057_660a5aae527e_tracking.py | 59 +++++ ckan/migration/versions/057_tracking.py | 35 --- .../versions/058_add_follower_tables.py | 39 ---- .../058_bd36d1826a5d_add_follower_tables.py | 73 ++++++ ...9291bb46f352_add_related_count_and_flag.py | 33 +++ .../059_add_related_count_and_flag.py | 16 -- .../060_31ad11c518fc_add_system_info_table.py | 47 ++++ .../versions/060_add_system_info_table.py | 29 --- ...1_338d460bc460_add_follower_group_table.py | 49 ++++ .../versions/061_add_follower__group_table.py | 24 -- .../062_6deb2bbab394_add_dashboard_table.py | 34 +++ .../versions/062_add_dashboard_table.py | 18 -- .../versions/063_8b633852cb7a_org_changes.py | 54 +++++ ckan/migration/versions/063_org_changes.py | 33 --- ...4f8becd4919a_add_email_last_sent_column.py | 31 +++ .../064_add_email_last_sent_column.py | 12 - ...439e_add_email_notifications_preference.py | 30 +++ .../065_add_email_notifications_preference.py | 12 - .../066_ad16b3bd8cb6_default_package_type.py | 23 ++ .../versions/066_default_package_type.py | 14 -- ...067_266c110eafec_turn_extras_to_strings.py | 23 ++ .../versions/067_turn_extras_to_strings.py | 30 --- .../versions/068_add_package_extras_index.py | 10 - ...8_e33a5f2b2a84_add_package_extras_index.py | 26 +++ ...5cdb_resource_url_and_metadata_modified.py | 41 ++++ .../069_resource_url_and_metadata_modified.py | 76 ------ .../070_add_activity_and_resource_indexes.py | 16 -- ...12fa7_add_activity_and_resource_indexes.py | 38 +++ .../071_add_state_column_to_user_table.py | 11 - ...081ef73a_add_state_column_to_user_table.py | 28 +++ .../072_08dcb9233ad7_add_resource_view.py | 38 +++ .../versions/072_add_resource_view.py | 26 --- ...08be3_update_resource_view_resource_id_.py | 34 +++ ...te_resource_view_resource_id_constraint.py | 17 -- ...074_a4ca55f0f45e_remove_resource_groups.py | 128 ++++++++++ .../versions/074_remove_resource_groups.py | 31 --- .../075_9cdc88c8896a_rename_view_plugins.py | 23 ++ .../versions/075_rename_view_plugins.py | 17 -- .../076_59995aa965c0_rename_view_plugins_2.py | 23 ++ .../versions/076_rename_view_plugins_2.py | 17 -- ...171a04d86d_add_revisions_to_system_info.py | 57 +++++ .../077_add_revisions_to_system_info.py | 25 -- ...078_ae821876532a_remove_old_authz_model.py | 109 +++++++++ .../versions/078_remove_old_authz_model.py | 16 -- ...79_e0177a15d2c9_resource_revision_index.py | 25 ++ .../versions/079_resource_revision_index.py | 10 - .../080_8224d872c64f_continuity_id_indexes.py | 39 ++++ .../versions/080_continuity_id_indexes.py | 16 -- .../081_a64cf4a79182_set_datastore_active.py | 24 ++ .../versions/081_set_datastore_active.py | 67 ------ ...a886d0ede4_create_index_creator_user_id.py | 25 ++ .../082_create_index_creator_user_id.py | 10 - .../083_f98d8fa2a7f7_remove_related_items.py | 72 ++++++ .../versions/083_remove_related_items.py | 28 --- .../versions/084_add_metadata_created.py | 17 -- .../084_d85ce5783688_add_metadata_created.py | 38 +++ .../085_adjust_activity_timestamps.py | 23 -- ...f9bf3d5c4b4d_adjust_activity_timestamps.py | 44 ++++ .../086_19663581b3bb_drop_openid_column.py | 24 ++ .../versions/086_drop_openid_column.py | 12 - ...03cab77_remove_old_authorization_tables.py | 47 ++++ .../087_remove_old_authorization_tables.py | 10 - ckan/migration/versions/__init__.py | 0 requirements.txt | 1 + 186 files changed, 4363 insertions(+), 3601 deletions(-) create mode 100644 ckan/migration/alembic.ini create mode 100644 ckan/migration/env.py delete mode 100644 ckan/migration/manage.py delete mode 100644 ckan/migration/migrate.cfg create mode 100644 ckan/migration/script.py.mako create mode 100644 ckan/migration/versions/001_103676e0a497_create_existing_tables.py delete mode 100644 ckan/migration/versions/001_add_existing_tables.py create mode 100644 ckan/migration/versions/002_86fdd8c54775_add_author_and_maintainer.py delete mode 100644 ckan/migration/versions/002_add_author_and_maintainer.py delete mode 100644 ckan/migration/versions/003_add_user_object.py create mode 100644 ckan/migration/versions/003_f22b4f5241a5_add_user_object.py delete mode 100644 ckan/migration/versions/004_add_group_object.py create mode 100644 ckan/migration/versions/004_f92ee205e46d_add_group_object.py create mode 100644 ckan/migration/versions/005_12c2232c15f5_add_authorization_tables.py delete mode 100644 ckan/migration/versions/005_add_authorization_tables.py delete mode 100644 ckan/migration/versions/006_add_ratings.py create mode 100644 ckan/migration/versions/006_c83955e7acb6_add_ratings.py create mode 100644 ckan/migration/versions/007_1928d4af1cda_add_system_roles.py delete mode 100644 ckan/migration/versions/007_add_system_roles.py create mode 100644 ckan/migration/versions/008_e8283ffb257e_update_vdm_ids.py delete mode 100644 ckan/migration/versions/008_update_vdm_ids.py delete mode 100644 ckan/migration/versions/009_add_creation_timestamps.py create mode 100644 ckan/migration/versions/009_b739a48de5c4_add_creation_timestamps.py create mode 100644 ckan/migration/versions/010_a6f13bf14d0c_add_user_about.py delete mode 100644 ckan/migration/versions/010_add_user_about.py create mode 100644 ckan/migration/versions/011_866f6370b4ac_add_package_search_vector.py delete mode 100644 ckan/migration/versions/011_add_package_search_vector.py delete mode 100644 ckan/migration/versions/012_add_resources.py create mode 100644 ckan/migration/versions/012_e5ca33a5d445_add_resources.py create mode 100644 ckan/migration/versions/013_8a3a5af39797_add_hash.py delete mode 100644 ckan/migration/versions/013_add_hash.py create mode 100644 ckan/migration/versions/014_93519b684820_hash_2.py delete mode 100644 ckan/migration/versions/014_hash_2.py create mode 100644 ckan/migration/versions/015_6d8ffebcaf54_remove_state_object.py delete mode 100644 ckan/migration/versions/015_remove_state_object.py create mode 100644 ckan/migration/versions/016_37ada738328e_uuids_everywhere.py delete mode 100644 ckan/migration/versions/016_uuids_everywhere.py create mode 100644 ckan/migration/versions/017_1250b2ff3e36_add_pkg_relationships.py delete mode 100644 ckan/migration/versions/017_add_pkg_relationships.py create mode 100644 ckan/migration/versions/018_05a0778051ca_adjust_licenses.py delete mode 100644 ckan/migration/versions/018_adjust_licenses.py create mode 100644 ckan/migration/versions/019_b2eb6f34a638_pkg_relationships_state.py delete mode 100644 ckan/migration/versions/019_pkg_relationships_state.py create mode 100644 ckan/migration/versions/020_69a0b0efc609_add_changeset.py delete mode 100644 ckan/migration/versions/020_add_changeset.py create mode 100644 ckan/migration/versions/021_765143af2ba3_postgresql_upgrade_sql.py delete mode 100644 ckan/migration/versions/021_postgres_downgrade.sql delete mode 100644 ckan/migration/versions/021_postgres_upgrade.sql delete mode 100644 ckan/migration/versions/021_postgresql_downgrade.sql delete mode 100644 ckan/migration/versions/021_postgresql_upgrade.sql create mode 100644 ckan/migration/versions/022_7b324ca6c0dc_add_group_extras.py delete mode 100644 ckan/migration/versions/022_add_group_extras.py create mode 100644 ckan/migration/versions/023_87fdd05f0744_add_harvesting.py delete mode 100644 ckan/migration/versions/023_add_harvesting.py create mode 100644 ckan/migration/versions/024_12981fe12484_add_harvested_document.py delete mode 100644 ckan/migration/versions/024_add_harvested_document.py delete mode 100644 ckan/migration/versions/025_add_authorization_groups.py create mode 100644 ckan/migration/versions/025_b581622ad327_add_authorization_groups.py create mode 100644 ckan/migration/versions/026_3615b25af443_authorization_group_user_pk.py delete mode 100644 ckan/migration/versions/026_authorization_group_user_pk.py create mode 100644 ckan/migration/versions/027_11e5745c6fc9_adjust_harvester.py delete mode 100644 ckan/migration/versions/027_adjust_harvester.py create mode 100644 ckan/migration/versions/028_cdd68fe9ba21_drop_harvest_source_status.py delete mode 100644 ckan/migration/versions/028_drop_harvest_source_status.py create mode 100644 ckan/migration/versions/029_1bfdf4240915_version_groups.py delete mode 100644 ckan/migration/versions/029_version_groups.py delete mode 100644 ckan/migration/versions/030_additional_user_attributes.py create mode 100644 ckan/migration/versions/030_b16cbf164c8a_additional_user_attributes.py create mode 100644 ckan/migration/versions/031_1b05245167d6_move_openid_to_new_field.py delete mode 100644 ckan/migration/versions/031_move_openid_to_new_field.py delete mode 100644 ckan/migration/versions/032_add_extra_info_field_to_resources.py create mode 100644 ckan/migration/versions/032_d89e0731422d_add_extra_info_field_to_resources.py create mode 100644 ckan/migration/versions/033_6da92ef2df15_auth_group_user_id_add_conditional.py delete mode 100644 ckan/migration/versions/033_auth_group_user_id_add_conditional.py create mode 100644 ckan/migration/versions/034_6c600693af5b_resource_group_table.py delete mode 100644 ckan/migration/versions/034_resource_group_table.py create mode 100644 ckan/migration/versions/035_81148ccebd6c_harvesting_doc_versioning.py delete mode 100644 ckan/migration/versions/035_harvesting_doc_versioning.py create mode 100644 ckan/migration/versions/036_ecaa8b38782f_lockdown_roles.py delete mode 100644 ckan/migration/versions/036_lockdown_roles.py create mode 100644 ckan/migration/versions/037_edcf3b8c3c1b_role_anon_editor.py delete mode 100644 ckan/migration/versions/037_role_anon_editor.py delete mode 100644 ckan/migration/versions/038_delete_migration_tables.py create mode 100644 ckan/migration/versions/038_fd6622e3d964_delete_migration_tables.py delete mode 100644 ckan/migration/versions/039_add_expired_id_and_dates.py create mode 100644 ckan/migration/versions/039_cca459c76d45_add_expired_id_and_dates.py create mode 100644 ckan/migration/versions/040_500a08f4818e_reset_key_on_user.py delete mode 100644 ckan/migration/versions/040_reset_key_on_user.py create mode 100644 ckan/migration/versions/041_6817d4e3bdc3_resource_new_fields.py delete mode 100644 ckan/migration/versions/041_resource_new_fields.py create mode 100644 ckan/migration/versions/042_da65e2877034_user_revision_indexes.py delete mode 100644 ckan/migration/versions/042_user_revision_indexes.py create mode 100644 ckan/migration/versions/043_bd38cd6502b2_drop_postgres_search.py delete mode 100644 ckan/migration/versions/043_drop_postgres_search.py create mode 100644 ckan/migration/versions/044_4190eeeb8d73_add_task_status.py delete mode 100644 ckan/migration/versions/044_add_task_status.py create mode 100644 ckan/migration/versions/045_54e3f155d945_user_name_unique.py delete mode 100644 ckan/migration/versions/045_user_name_unique.py create mode 100644 ckan/migration/versions/046_b69e9b80396f_drop_changesets.py delete mode 100644 ckan/migration/versions/046_drop_changesets.py create mode 100644 ckan/migration/versions/047_883a7c406926_rename_package_group_member.py delete mode 100644 ckan/migration/versions/047_rename_package_group_member.py create mode 100644 ckan/migration/versions/048_4a7011172b3f_add_activity_streams_tables.py delete mode 100644 ckan/migration/versions/048_add_activity_streams_tables.py delete mode 100644 ckan/migration/versions/049_add_group_approval_status.py create mode 100644 ckan/migration/versions/049_e0c06c2177b5_add_group_approval_status.py create mode 100644 ckan/migration/versions/050_01a6b058cb7f_term_translation_table.py delete mode 100644 ckan/migration/versions/050_term_translation_table.py create mode 100644 ckan/migration/versions/051_a4fb0d85ced6_add_tag_vocabulary.py delete mode 100644 ckan/migration/versions/051_add_tag_vocabulary.py create mode 100644 ckan/migration/versions/052_ba693d64c6d7_update_member_capacities.py delete mode 100644 ckan/migration/versions/052_update_member_capacities.py create mode 100644 ckan/migration/versions/053_9d051a099097_add_group_logo.py delete mode 100644 ckan/migration/versions/053_add_group_logo.py delete mode 100644 ckan/migration/versions/054_add_resource_created_date.py create mode 100644 ckan/migration/versions/054_da21b38da4db_add_resource_created_date.py create mode 100644 ckan/migration/versions/055_048f7db947bf_update_user_and_activity_detail.py delete mode 100644 ckan/migration/versions/055_update_user_and_activity_detail.py create mode 100644 ckan/migration/versions/056_11af3215ae89_add_related_table.py delete mode 100644 ckan/migration/versions/056_add_related_table.py create mode 100644 ckan/migration/versions/057_660a5aae527e_tracking.py delete mode 100644 ckan/migration/versions/057_tracking.py delete mode 100644 ckan/migration/versions/058_add_follower_tables.py create mode 100644 ckan/migration/versions/058_bd36d1826a5d_add_follower_tables.py create mode 100644 ckan/migration/versions/059_9291bb46f352_add_related_count_and_flag.py delete mode 100644 ckan/migration/versions/059_add_related_count_and_flag.py create mode 100644 ckan/migration/versions/060_31ad11c518fc_add_system_info_table.py delete mode 100644 ckan/migration/versions/060_add_system_info_table.py create mode 100644 ckan/migration/versions/061_338d460bc460_add_follower_group_table.py delete mode 100644 ckan/migration/versions/061_add_follower__group_table.py create mode 100644 ckan/migration/versions/062_6deb2bbab394_add_dashboard_table.py delete mode 100644 ckan/migration/versions/062_add_dashboard_table.py create mode 100644 ckan/migration/versions/063_8b633852cb7a_org_changes.py delete mode 100644 ckan/migration/versions/063_org_changes.py create mode 100644 ckan/migration/versions/064_4f8becd4919a_add_email_last_sent_column.py delete mode 100644 ckan/migration/versions/064_add_email_last_sent_column.py create mode 100644 ckan/migration/versions/065_1fab0bc6439e_add_email_notifications_preference.py delete mode 100644 ckan/migration/versions/065_add_email_notifications_preference.py create mode 100644 ckan/migration/versions/066_ad16b3bd8cb6_default_package_type.py delete mode 100644 ckan/migration/versions/066_default_package_type.py create mode 100644 ckan/migration/versions/067_266c110eafec_turn_extras_to_strings.py delete mode 100644 ckan/migration/versions/067_turn_extras_to_strings.py delete mode 100644 ckan/migration/versions/068_add_package_extras_index.py create mode 100644 ckan/migration/versions/068_e33a5f2b2a84_add_package_extras_index.py create mode 100644 ckan/migration/versions/069_e7524c675cdb_resource_url_and_metadata_modified.py delete mode 100644 ckan/migration/versions/069_resource_url_and_metadata_modified.py delete mode 100644 ckan/migration/versions/070_add_activity_and_resource_indexes.py create mode 100644 ckan/migration/versions/070_cfb544112fa7_add_activity_and_resource_indexes.py delete mode 100644 ckan/migration/versions/071_add_state_column_to_user_table.py create mode 100644 ckan/migration/versions/071_c16f081ef73a_add_state_column_to_user_table.py create mode 100644 ckan/migration/versions/072_08dcb9233ad7_add_resource_view.py delete mode 100644 ckan/migration/versions/072_add_resource_view.py create mode 100644 ckan/migration/versions/073_011f51208be3_update_resource_view_resource_id_.py delete mode 100644 ckan/migration/versions/073_update_resource_view_resource_id_constraint.py create mode 100644 ckan/migration/versions/074_a4ca55f0f45e_remove_resource_groups.py delete mode 100644 ckan/migration/versions/074_remove_resource_groups.py create mode 100644 ckan/migration/versions/075_9cdc88c8896a_rename_view_plugins.py delete mode 100644 ckan/migration/versions/075_rename_view_plugins.py create mode 100644 ckan/migration/versions/076_59995aa965c0_rename_view_plugins_2.py delete mode 100644 ckan/migration/versions/076_rename_view_plugins_2.py create mode 100644 ckan/migration/versions/077_51171a04d86d_add_revisions_to_system_info.py delete mode 100644 ckan/migration/versions/077_add_revisions_to_system_info.py create mode 100644 ckan/migration/versions/078_ae821876532a_remove_old_authz_model.py delete mode 100644 ckan/migration/versions/078_remove_old_authz_model.py create mode 100644 ckan/migration/versions/079_e0177a15d2c9_resource_revision_index.py delete mode 100644 ckan/migration/versions/079_resource_revision_index.py create mode 100644 ckan/migration/versions/080_8224d872c64f_continuity_id_indexes.py delete mode 100644 ckan/migration/versions/080_continuity_id_indexes.py create mode 100644 ckan/migration/versions/081_a64cf4a79182_set_datastore_active.py delete mode 100644 ckan/migration/versions/081_set_datastore_active.py create mode 100644 ckan/migration/versions/082_8ea886d0ede4_create_index_creator_user_id.py delete mode 100644 ckan/migration/versions/082_create_index_creator_user_id.py create mode 100644 ckan/migration/versions/083_f98d8fa2a7f7_remove_related_items.py delete mode 100644 ckan/migration/versions/083_remove_related_items.py delete mode 100644 ckan/migration/versions/084_add_metadata_created.py create mode 100644 ckan/migration/versions/084_d85ce5783688_add_metadata_created.py delete mode 100644 ckan/migration/versions/085_adjust_activity_timestamps.py create mode 100644 ckan/migration/versions/085_f9bf3d5c4b4d_adjust_activity_timestamps.py create mode 100644 ckan/migration/versions/086_19663581b3bb_drop_openid_column.py delete mode 100644 ckan/migration/versions/086_drop_openid_column.py create mode 100644 ckan/migration/versions/087_ff1b303cab77_remove_old_authorization_tables.py delete mode 100644 ckan/migration/versions/087_remove_old_authorization_tables.py delete mode 100644 ckan/migration/versions/__init__.py diff --git a/.gitignore b/.gitignore index 39267c75f22..ea6f07afd1b 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ tmp/* solr_runtime/* fl_notes.txt *.ini +!ckan/migration/alembic.ini .noseids *~ .idea diff --git a/ckan/migration/README b/ckan/migration/README index 6218f8cac42..98e4f9c44ef 100644 --- a/ckan/migration/README +++ b/ckan/migration/README @@ -1,4 +1 @@ -This is a database migration repository. - -More information at -http://code.google.com/p/sqlalchemy-migrate/ +Generic single-database configuration. \ No newline at end of file diff --git a/ckan/migration/alembic.ini b/ckan/migration/alembic.ini new file mode 100644 index 00000000000..eb2da491029 --- /dev/null +++ b/ckan/migration/alembic.ini @@ -0,0 +1,74 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = . + +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# timezone to use when rendering the date +# within the migration file as well as the filename. +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +#truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; this defaults +# to ckan/migration/alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path +# version_locations = %(here)s/bar %(here)s/bat ckan/migration/alembic/versions + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +sqlalchemy.url = postgresql://ckan_default:root@localhost/ckan_alembic + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/ckan/migration/env.py b/ckan/migration/env.py new file mode 100644 index 00000000000..1b451f47470 --- /dev/null +++ b/ckan/migration/env.py @@ -0,0 +1,73 @@ +from __future__ import with_statement +from alembic import context +from sqlalchemy import engine_from_config, pool +from logging.config import fileConfig + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +from ckan.model import init_model +from ckan.model.meta import metadata +target_metadata = metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=target_metadata, literal_binds=True) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix='sqlalchemy.', + poolclass=pool.NullPool) + with connectable.connect() as connection: + init_model(connection) + + context.configure( + connection=connection, + target_metadata=target_metadata + ) + + with context.begin_transaction(): + context.run_migrations() + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/ckan/migration/manage.py b/ckan/migration/manage.py deleted file mode 100644 index 85da87c325b..00000000000 --- a/ckan/migration/manage.py +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - -from migrate.versioning.shell import main - -main(repository='ckan/migration') diff --git a/ckan/migration/migrate.cfg b/ckan/migration/migrate.cfg deleted file mode 100644 index bb7c61566b9..00000000000 --- a/ckan/migration/migrate.cfg +++ /dev/null @@ -1,20 +0,0 @@ -[db_settings] -# Used to identify which repository this database is versioned under. -# You can use the name of your project. -repository_id=Ckan - -# The name of the database table used to track the schema version. -# This name shouldn't already be used by your project. -# If this is changed once a database is under version control, you'll need to -# change the table name in each database too. -version_table=migrate_version - -# When committing a change script, Migrate will attempt to generate the -# sql for all supported databases; normally, if one of them fails - probably -# because you don't have that database installed - it is ignored and the -# commit continues, perhaps ending successfully. -# Databases in this list MUST compile successfully during a commit, or the -# entire commit will fail. List the databases your application will actually -# be using to ensure your updates to that database work properly. -# This must be a list; example: ['postgres','sqlite'] -required_dbs=[] diff --git a/ckan/migration/script.py.mako b/ckan/migration/script.py.mako new file mode 100644 index 00000000000..2c0156303a8 --- /dev/null +++ b/ckan/migration/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/ckan/migration/versions/001_103676e0a497_create_existing_tables.py b/ckan/migration/versions/001_103676e0a497_create_existing_tables.py new file mode 100644 index 00000000000..45b5ed93ee0 --- /dev/null +++ b/ckan/migration/versions/001_103676e0a497_create_existing_tables.py @@ -0,0 +1,154 @@ +"""Create existing tables + +Revision ID: 103676e0a497 +Revises: +Create Date: 2018-09-04 16:57:42.622504 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '103676e0a497' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + + op.create_table( + 'state', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('name', sa.Unicode(100)), + ) + + op.create_table( + 'revision', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('timestamp', sa.DateTime(timezone=False)), + sa.Column('author', sa.Unicode(200)), + sa.Column('message', sa.UnicodeText()), + sa.Column('state_id', sa.Integer), + ) + + op.create_table( + 'apikey', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('name', sa.UnicodeText()), + sa.Column('key', sa.UnicodeText()), + ) + + op.create_table( + 'license', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('name', sa.Unicode(100)), sa.Column('state_id', sa.Integer) + ) + + op.create_table( + 'package', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('name', sa.Unicode(100), nullable=False, unique=True), + sa.Column('title', sa.UnicodeText()), + sa.Column('version', sa.Unicode(100)), + sa.Column('url', sa.UnicodeText()), + sa.Column('download_url', sa.UnicodeText()), + sa.Column('notes', sa.UnicodeText()), + sa.Column('license_id', sa.Integer, sa.ForeignKey('license.id')), + sa.Column('state_id', sa.Integer, sa.ForeignKey('state.id')), + sa.Column('revision_id', sa.Integer, sa.ForeignKey('revision.id')), + ) + + op.create_table( + 'package_revision', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('name', sa.Unicode(100), nullable=False), + sa.Column('title', sa.UnicodeText()), + sa.Column('version', sa.Unicode(100)), + sa.Column('url', sa.UnicodeText()), + sa.Column('download_url', sa.UnicodeText()), + sa.Column('notes', sa.UnicodeText()), + sa.Column('license_id', sa.Integer, sa.ForeignKey('license.id')), + sa.Column('state_id', sa.Integer, sa.ForeignKey('state.id')), + sa.Column( + 'revision_id', + sa.Integer, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column('continuity_id', sa.Integer, sa.ForeignKey('package.id')), + ) + + op.create_table( + 'tag', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('name', sa.Unicode(100), nullable=False, unique=True), + ) + + op.create_table( + 'package_tag', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('package_id', sa.Integer, sa.ForeignKey('package.id')), + sa.Column('tag_id', sa.Integer, sa.ForeignKey('tag.id')), + sa.Column('state_id', sa.Integer, sa.ForeignKey('state.id')), + sa.Column('revision_id', sa.Integer, sa.ForeignKey('revision.id')), + ) + + op.create_table( + 'package_tag_revision', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('package_id', sa.Integer, sa.ForeignKey('package.id')), + sa.Column('tag_id', sa.Integer, sa.ForeignKey('tag.id')), + sa.Column('state_id', sa.Integer, sa.ForeignKey('state.id')), + sa.Column( + 'revision_id', + sa.Integer, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column( + 'continuity_id', sa.Integer, sa.ForeignKey('package_tag.id') + ), + ) + + op.create_table( + 'package_extra', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('package_id', sa.Integer, sa.ForeignKey('package.id')), + sa.Column('key', sa.UnicodeText()), + sa.Column('value', sa.UnicodeText()), + sa.Column('state_id', sa.Integer, sa.ForeignKey('state.id')), + sa.Column('revision_id', sa.Integer, sa.ForeignKey('revision.id')), + ) + + op.create_table( + 'package_extra_revision', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('package_id', sa.Integer, sa.ForeignKey('package.id')), + sa.Column('key', sa.UnicodeText()), + sa.Column('value', sa.UnicodeText()), + sa.Column('state_id', sa.Integer, sa.ForeignKey('state.id')), + sa.Column( + 'revision_id', + sa.Integer, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column( + 'continuity_id', sa.Integer, sa.ForeignKey('package_extra.id') + ), + ) + + +def downgrade(): + op.drop_table('package_extra_revision') + op.drop_table('package_extra') + op.drop_table('package_tag_revision') + op.drop_table('package_tag') + op.drop_table('tag') + op.drop_table('package_revision') + op.drop_table('package') + op.drop_table('license') + op.drop_table('apikey') + op.drop_table('revision') + op.drop_table('state') diff --git a/ckan/migration/versions/001_add_existing_tables.py b/ckan/migration/versions/001_add_existing_tables.py deleted file mode 100644 index c346a889b45..00000000000 --- a/ckan/migration/versions/001_add_existing_tables.py +++ /dev/null @@ -1,115 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -from ckan.common import config as ckan_config - - -def upgrade(migrate_engine): - schema = ckan_config.get(u'ckan.migrations.target_schema') or 'public' - # we specify the schema here because of a clash with another 'state' table - # in the mdillon/postgis container. You only need to change the value in the - # config if you've altered the default schema from 'public' in your - # postgresql.conf. Because this is such a rarely needed option, it is - # otherwise undocumented. - meta = MetaData(schema=schema) - - state = Table('state', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('name', Unicode(100)), - ) - - revision = Table('revision', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('timestamp', DateTime(timezone=False) ), - Column('author', Unicode(200)), - Column('message', UnicodeText()), - Column('state_id', Integer() ), - ) - - apikey = Table('apikey', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('name', UnicodeText()), - Column('key', UnicodeText()), - ) - - license = Table('license', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('name', Unicode(100)), - # Column('state_id', Integer(), ForeignKey('state.id')), - Column('state_id', Integer()) - ) - - package = Table('package', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('name', Unicode(100) , nullable=False, unique=True), - Column('title', UnicodeText()), - Column('version', Unicode(100)), - Column('url', UnicodeText()), - Column('download_url', UnicodeText()), - Column('notes', UnicodeText()), - Column('license_id', Integer(), ForeignKey('license.id') ), - Column('state_id', Integer(), ForeignKey('state.id') ), - Column('revision_id', Integer(), ForeignKey('revision.id') ), - ) - - package_revision = Table('package_revision', meta, - Column('id', Integer(), primary_key=True, nullable=False), - Column('name', Unicode(100), nullable=False), - Column('title', UnicodeText()), - Column('version', Unicode(100)), - Column('url', UnicodeText()), - Column('download_url', UnicodeText()), - Column('notes', UnicodeText()), - Column('license_id', Integer(), ForeignKey('license.id') ), - Column('state_id', Integer(), ForeignKey('state.id') ), - Column('revision_id', Integer() , ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', Integer(), ForeignKey('package.id') ), - ) - - tag = Table('tag', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('name', Unicode(100), nullable=False, unique=True), - ) - - package_tag = Table('package_tag', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('package_id', Integer(), ForeignKey('package.id') ), - Column('tag_id', Integer(), ForeignKey('tag.id') ), - Column('state_id', Integer(), ForeignKey('state.id') ), - Column('revision_id', Integer(), ForeignKey('revision.id') ), - ) - - package_tag_revision = Table('package_tag_revision', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('package_id', Integer(), ForeignKey('package.id') ), - Column('tag_id', Integer(), ForeignKey('tag.id') ), - Column('state_id', Integer(), ForeignKey('state.id') ), - Column('revision_id', Integer() , ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', Integer(), ForeignKey('package_tag.id') ), - ) - - package_extra = Table('package_extra', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('package_id', Integer(), ForeignKey('package.id') ), - Column('key', UnicodeText()), - Column('value', UnicodeText()), - Column('state_id', Integer(), ForeignKey('state.id') ), - Column('revision_id', Integer(), ForeignKey('revision.id') ), - ) - - package_extra_revision = Table('package_extra_revision', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('package_id', Integer(), ForeignKey('package.id') ), - Column('key', UnicodeText()), - Column('value', UnicodeText()), - Column('state_id', Integer(), ForeignKey('state.id') ), - Column('revision_id', Integer(), ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', Integer(), ForeignKey('package_extra.id') ), - ) - - meta.bind = migrate_engine - meta.create_all() - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/002_86fdd8c54775_add_author_and_maintainer.py b/ckan/migration/versions/002_86fdd8c54775_add_author_and_maintainer.py new file mode 100644 index 00000000000..b31b01e7daa --- /dev/null +++ b/ckan/migration/versions/002_86fdd8c54775_add_author_and_maintainer.py @@ -0,0 +1,34 @@ +"""Add author and maintainer + +Revision ID: 86fdd8c54775 +Revises: 103676e0a497 +Create Date: 2018-09-04 17:11:59.181744 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '86fdd8c54775' +down_revision = '103676e0a497' +branch_labels = None +depends_on = None + +_columns = ( + 'author', + 'author_email', + 'maintainer', + 'maintainer_email', +) + + +def upgrade(): + for column in _columns: + op.add_column('package', sa.Column(column, sa.UnicodeText)) + op.add_column('package_revision', sa.Column(column, sa.UnicodeText)) + + +def downgrade(): + for column in reversed(_columns): + op.drop_column('package_revision', column) + op.drop_column('package', column) diff --git a/ckan/migration/versions/002_add_author_and_maintainer.py b/ckan/migration/versions/002_add_author_and_maintainer.py deleted file mode 100644 index 4178e24ff6e..00000000000 --- a/ckan/migration/versions/002_add_author_and_maintainer.py +++ /dev/null @@ -1,34 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - # Upgrade operations go here. Don't create your own engine; use the engine - # named 'migrate_engine' imported from migrate. - package = Table('package', metadata, autoload=True) - package_revision = Table('package_revision', metadata, autoload=True) - - columns = [Column('author', UnicodeText), - Column('author_email', UnicodeText), - Column('maintainer', UnicodeText), - Column('maintainer_email', UnicodeText), - ] - columns2 = [Column('author', UnicodeText), - Column('author_email', UnicodeText), - Column('maintainer', UnicodeText), - Column('maintainer_email', UnicodeText), - ] - - for col in columns: - col.create(package) - for col in columns2: - col.create(package_revision) - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/003_add_user_object.py b/ckan/migration/versions/003_add_user_object.py deleted file mode 100644 index f81529dd631..00000000000 --- a/ckan/migration/versions/003_add_user_object.py +++ /dev/null @@ -1,27 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import uuid - - -def make_uuid(): - return unicode(uuid.uuid4()) - - -def upgrade(migrate_engine): - metadata = MetaData() - user_table = Table('user', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('name', UnicodeText), - Column('apikey', UnicodeText, default=make_uuid) - ) - metadata.bind = migrate_engine - apikey_table = Table('apikey', metadata, autoload=True) - - user_table.create() - apikey_table.drop() - -def downgrade(migrate_engine): - raise NotImplementedError() - diff --git a/ckan/migration/versions/003_f22b4f5241a5_add_user_object.py b/ckan/migration/versions/003_f22b4f5241a5_add_user_object.py new file mode 100644 index 00000000000..d874d014d2c --- /dev/null +++ b/ckan/migration/versions/003_f22b4f5241a5_add_user_object.py @@ -0,0 +1,34 @@ +"""Add user object + +Revision ID: f22b4f5241a5 +Revises: 86fdd8c54775 +Create Date: 2018-09-04 17:19:32.836747 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'f22b4f5241a5' +down_revision = '86fdd8c54775' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'user', sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('name', sa.UnicodeText), sa.Column('apikey', sa.UnicodeText) + ) + + op.drop_table('apikey') + + +def downgrade(): + op.create_table( + 'apikey', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('name', sa.UnicodeText()), + sa.Column('key', sa.UnicodeText()), + ) + op.drop_table('user') diff --git a/ckan/migration/versions/004_add_group_object.py b/ckan/migration/versions/004_add_group_object.py deleted file mode 100644 index 5d1c3d414d1..00000000000 --- a/ckan/migration/versions/004_add_group_object.py +++ /dev/null @@ -1,38 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import uuid - - -def make_uuid(): - return unicode(uuid.uuid4()) - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - # you need to load this for foreign keys to work in package_group_table - package_table = Table('package', metadata, autoload=True) - - group_table = Table('group', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('name', UnicodeText, unique=True, nullable=False), - Column('title', UnicodeText), - Column('description', UnicodeText), - ) - - package_group_table = Table('package_group', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('package_id', Integer, ForeignKey('package.id')), - Column('group_id', UnicodeText, ForeignKey('group.id')), - ) - - - group_table.create() - package_group_table.create() - -def downgrade(migrate_engine): - raise NotImplementedError() - diff --git a/ckan/migration/versions/004_f92ee205e46d_add_group_object.py b/ckan/migration/versions/004_f92ee205e46d_add_group_object.py new file mode 100644 index 00000000000..fb833544ef9 --- /dev/null +++ b/ckan/migration/versions/004_f92ee205e46d_add_group_object.py @@ -0,0 +1,40 @@ +"""Add group object + +Revision ID: f92ee205e46d +Revises: f22b4f5241a5 +Create Date: 2018-09-04 17:22:50.675045 + +""" +import uuid + +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'f92ee205e46d' +down_revision = 'f22b4f5241a5' +branch_labels = None +depends_on = None + + +def upgrade(): + + op.create_table( + 'group', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('name', sa.UnicodeText, unique=True, nullable=False), + sa.Column('title', sa.UnicodeText), + sa.Column('description', sa.UnicodeText), + ) + + op.create_table( + 'package_group', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('package_id', sa.Integer, sa.ForeignKey('package.id')), + sa.Column('group_id', sa.UnicodeText, sa.ForeignKey('group.id')), + ) + + +def downgrade(): + op.drop_table('package_group') + op.drop_table('group') diff --git a/ckan/migration/versions/005_12c2232c15f5_add_authorization_tables.py b/ckan/migration/versions/005_12c2232c15f5_add_authorization_tables.py new file mode 100644 index 00000000000..db146351be5 --- /dev/null +++ b/ckan/migration/versions/005_12c2232c15f5_add_authorization_tables.py @@ -0,0 +1,61 @@ +"""005 Add authorization tables + +Revision ID: 12c2232c15f5 +Revises: f92ee205e46d +Create Date: 2018-09-04 17:34:59.667587 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '12c2232c15f5' +down_revision = 'f92ee205e46d' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'role_action', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('role', sa.UnicodeText), + sa.Column('context', sa.UnicodeText, nullable=False), + sa.Column('action', sa.UnicodeText), + ) + + op.create_table( + 'user_object_role', sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('user_id', sa.UnicodeText, sa.ForeignKey('user.id')), + sa.Column('context', sa.UnicodeText, nullable=False), + sa.Column('role', sa.UnicodeText) + ) + + op.create_table( + 'package_role', + sa.Column( + 'user_object_role_id', + sa.UnicodeText, + sa.ForeignKey('user_object_role.id'), + primary_key=True + ), + sa.Column('package_id', sa.Integer, sa.ForeignKey('package.id')), + ) + + op.create_table( + 'group_role', + sa.Column( + 'user_object_role_id', + sa.UnicodeText, + sa.ForeignKey('user_object_role.id'), + primary_key=True + ), + sa.Column('group_id', sa.UnicodeText, sa.ForeignKey('group.id')), + ) + + +def downgrade(): + op.drop_table('group_role') + op.drop_table('package_role') + op.drop_table('user_object_role') + op.drop_table('role_action') diff --git a/ckan/migration/versions/005_add_authorization_tables.py b/ckan/migration/versions/005_add_authorization_tables.py deleted file mode 100644 index e73b72f88d4..00000000000 --- a/ckan/migration/versions/005_add_authorization_tables.py +++ /dev/null @@ -1,57 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import uuid - - -def make_uuid(): - return unicode(uuid.uuid4()) - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - # you need to load these two for foreign keys to work - package_table = Table('package', metadata, autoload=True) - group_table = Table('group', metadata, autoload=True) - user_table = Table('user', metadata, autoload=True) - - # authorization tables - role_action_table = Table('role_action', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('role', UnicodeText), - Column('context', UnicodeText, nullable=False), - Column('action', UnicodeText), - ) - - user_object_role_table = Table('user_object_role', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('user_id', UnicodeText, ForeignKey('user.id')), - Column('context', UnicodeText, nullable=False), - Column('role', UnicodeText) - ) - - package_role_table = Table('package_role', metadata, - Column('user_object_role_id', UnicodeText, ForeignKey('user_object_role.id'), primary_key=True), - Column('package_id', Integer, ForeignKey('package.id')), - ) - - group_role_table = Table('group_role', metadata, - Column('user_object_role_id', UnicodeText, ForeignKey('user_object_role.id'), primary_key=True), - Column('group_id', UnicodeText, ForeignKey('group.id')), - ) - - role_action_table.create() - user_object_role_table.create() - package_role_table.create() - group_role_table.create() - - # Not Good to use model here. TODO: refactor this. - # import ckan.model as model - # model.repo.init_db() - # call this explicitly elsewhere - # model.give_all_packages_default_user_roles() - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/006_add_ratings.py b/ckan/migration/versions/006_add_ratings.py deleted file mode 100644 index 4af295f6577..00000000000 --- a/ckan/migration/versions/006_add_ratings.py +++ /dev/null @@ -1,30 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import uuid - - -def make_uuid(): - return unicode(uuid.uuid4()) - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - # you need to load these two for foreign keys to work - package_table = Table('package', metadata, autoload=True) - user_table = Table('user', metadata, autoload=True) - - rating_table = Table('rating', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('user_id', UnicodeText, ForeignKey('user.id')), - Column('user_ip_address', UnicodeText), # alternative to user_id if not logged in - Column('package_id', Integer, ForeignKey('package.id')), - Column('rating', Float) - ) - - rating_table.create() - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/006_c83955e7acb6_add_ratings.py b/ckan/migration/versions/006_c83955e7acb6_add_ratings.py new file mode 100644 index 00000000000..b71585cd76e --- /dev/null +++ b/ckan/migration/versions/006_c83955e7acb6_add_ratings.py @@ -0,0 +1,31 @@ +"""006 Add ratings + +Revision ID: c83955e7acb6 +Revises: 12c2232c15f5 +Create Date: 2018-09-04 17:39:11.520922 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'c83955e7acb6' +down_revision = '12c2232c15f5' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'rating', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('user_id', sa.UnicodeText, sa.ForeignKey('user.id')), + sa.Column('user_ip_address', + sa.UnicodeText), # alternative to user_id if not logged in + sa.Column('package_id', sa.Integer, sa.ForeignKey('package.id')), + sa.Column('rating', sa.Float) + ) + + +def downgrade(): + op.drop_table('rating') diff --git a/ckan/migration/versions/007_1928d4af1cda_add_system_roles.py b/ckan/migration/versions/007_1928d4af1cda_add_system_roles.py new file mode 100644 index 00000000000..dafc500053e --- /dev/null +++ b/ckan/migration/versions/007_1928d4af1cda_add_system_roles.py @@ -0,0 +1,31 @@ +"""007 Add system roles + +Revision ID: 1928d4af1cda +Revises: c83955e7acb6 +Create Date: 2018-09-04 17:42:00.367475 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '1928d4af1cda' +down_revision = 'c83955e7acb6' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'system_role', + sa.Column( + 'user_object_role_id', + sa.UnicodeText, + sa.ForeignKey('user_object_role.id'), + primary_key=True + ), + ) + + +def downgrade(): + op.drop_table('system_role') diff --git a/ckan/migration/versions/007_add_system_roles.py b/ckan/migration/versions/007_add_system_roles.py deleted file mode 100644 index d7fe8094be8..00000000000 --- a/ckan/migration/versions/007_add_system_roles.py +++ /dev/null @@ -1,27 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import uuid - - - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - user_object_role_table = Table('user_object_role', metadata, autoload=True) - - # authorization tables - system_role_table = Table('system_role', metadata, - Column('user_object_role_id', UnicodeText, ForeignKey('user_object_role.id'), primary_key=True), - ) - - system_role_table.create() - - # you can now add system administrators - # e.g. paster create-sysadmin http://bgates.openid.com/ - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/008_e8283ffb257e_update_vdm_ids.py b/ckan/migration/versions/008_e8283ffb257e_update_vdm_ids.py new file mode 100644 index 00000000000..02e4850ce80 --- /dev/null +++ b/ckan/migration/versions/008_e8283ffb257e_update_vdm_ids.py @@ -0,0 +1,53 @@ +"""008 Update vdm ids + +Revision ID: e8283ffb257e +Revises: 1928d4af1cda +Create Date: 2018-09-04 17:43:27.042436 + +Originally this revision was altering id columns +to UnicodeText +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'e8283ffb257e' +down_revision = '1928d4af1cda' +branch_labels = None +depends_on = None + +foreign_tables = ( + 'package', 'package_tag', 'package_revision', 'package_tag_revision', + 'package_extra', 'package_extra_revision' +) + + +def upgrade(): + for table in foreign_tables: + op.drop_column(table, 'revision_id') + op.alter_column('revision', 'id', type_=sa.UnicodeText, server_default=None) + for table in foreign_tables: + op.add_column( + table, + sa.Column( + 'revision_id', sa.UnicodeText, sa.ForeignKey('revision.id') + ) + ) + + +def downgrade(): + for table in foreign_tables: + op.drop_column(table, 'revision_id') + op.drop_column('revision', 'id') + op.add_column( + 'revision', + sa.Column( + 'id', sa.Integer, primary_key=True, nullable=False, unique=True + ) + ) + + for table in foreign_tables: + op.add_column( + table, + sa.Column('revision_id', sa.Integer, sa.ForeignKey('revision.id')) + ) diff --git a/ckan/migration/versions/008_update_vdm_ids.py b/ckan/migration/versions/008_update_vdm_ids.py deleted file mode 100644 index f6a2c74b0bb..00000000000 --- a/ckan/migration/versions/008_update_vdm_ids.py +++ /dev/null @@ -1,91 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -import sqlalchemy.schema -import uuid - -from migrate import * -import migrate.changeset -from migrate.changeset.constraint import ForeignKeyConstraint, PrimaryKeyConstraint - -metadata = None - -def make_uuid(): - return unicode(uuid.uuid4()) - -# 1 drop all foreign key constraints -# 2 alter type of revision id and foreign keys -# 3 create foreign key constraints (using cascade!) -# 4 create uuids for revisions (auto cascades elsewhere!) -def upgrade(migrate_engine): - global metadata - metadata = MetaData() - metadata.bind = migrate_engine - dropped_fk_constraints = drop_constraints_and_alter_types() - upgrade2(migrate_engine, dropped_fk_constraints) - -def drop_constraints_and_alter_types(): - # 1 drop all foreign key constraints - dropped_fk_constraints = [] - revision_table = Table('revision', metadata, autoload=True) - foreign_tables = ['package', 'package_tag', 'package_revision', 'package_tag_revision', 'package_extra', 'package_extra_revision', ] - for table_name in foreign_tables: - table = Table(table_name, metadata, autoload=True) - for constraint in table.constraints.copy(): - if isinstance(constraint, sqlalchemy.schema.ForeignKeyConstraint): - foreign_key_cols = [key.column for key in constraint.elements] - fk_col = foreign_key_cols[0] - if fk_col.table == revision_table: - orig_fk = ForeignKeyConstraint(constraint.columns, foreign_key_cols, name=constraint.name, table=table) - orig_fk.drop() - dropped_fk_constraints.append((constraint.columns, foreign_key_cols, constraint.name, table.name)) - - # 2 alter type of revision id and foreign keys - # Sanity check - if len(constraint.columns.keys()) != 1: - raise ValueError() - id_col = constraint.table.columns[constraint.columns.keys()[0]] - id_col.alter(type=UnicodeText) - - revision_table = Table('revision', metadata, autoload=True) - id_col = revision_table.c['id'] - id_col.alter(type=UnicodeText, - ) - - return dropped_fk_constraints - -def upgrade2(migrate_engine, dropped_fk_constraints): - # have changed type of cols so recreate metadata - metadata = MetaData(migrate_engine) - - # 3 create foreign key constraints - for fk_constraint in dropped_fk_constraints: - # cascade doesn't work - # see http://code.google.com/p/sqlalchemy-migrate/issues/detail?id=48 - # new_fk = ForeignKeyConstraint(*fk_constraint, onupdate='CASCADE') - # new_fk = ForeignKeyConstraint(*fk_constraint) - # new_fk.create() - - # So we create via hand ... - constraint_columns, foreign_key_cols, constraint_name, table_name = fk_constraint - # Sanity check - if len(constraint_columns.keys()) != 1: - raise ValueError() - - oursql = '''ALTER TABLE %(table)s - ADD CONSTRAINT %(fkeyname)s - FOREIGN KEY (%(col_name)s) - REFERENCES revision (id) - ''' % {'table':table_name, 'fkeyname':constraint_name, - 'col_name':constraint_columns.keys()[0] } - migrate_engine.execute(oursql) - - # 4 create uuids for revisions and in related tables - revision_table = Table('revision', metadata, autoload=True) - from sqlalchemy.sql import select - for row in migrate_engine.execute(select([revision_table])): - update = revision_table.update().where(revision_table.c.id==row.id).values(id=make_uuid()) - migrate_engine.execute(update) - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/009_add_creation_timestamps.py b/ckan/migration/versions/009_add_creation_timestamps.py deleted file mode 100644 index beb83d23bad..00000000000 --- a/ckan/migration/versions/009_add_creation_timestamps.py +++ /dev/null @@ -1,27 +0,0 @@ -# encoding: utf-8 - -from datetime import datetime - -from sqlalchemy import * -from migrate import * -import migrate.changeset - - -domain_obj_names = ['rating', 'group', 'user'] - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - # Use sql instead of migrate.changeset because user and group are sql - # reserved words and migrate doesn't quote them. - for domain_obj_name in domain_obj_names: - sql = 'ALTER TABLE "%s" ADD created TIMESTAMP WITHOUT TIME ZONE' % domain_obj_name - migrate_engine.execute(sql) - - now = datetime.now() - for domain_obj_name in domain_obj_names[::-1]: - table = Table(domain_obj_name, metadata, autoload=True) - migrate_engine.execute(table.update(values={table.c.created:now})) - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/009_b739a48de5c4_add_creation_timestamps.py b/ckan/migration/versions/009_b739a48de5c4_add_creation_timestamps.py new file mode 100644 index 00000000000..a1574896d08 --- /dev/null +++ b/ckan/migration/versions/009_b739a48de5c4_add_creation_timestamps.py @@ -0,0 +1,27 @@ +"""009 Add creation timestamps + +Revision ID: b739a48de5c4 +Revises: e8283ffb257e +Create Date: 2018-09-04 18:41:15.442929 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'b739a48de5c4' +down_revision = 'e8283ffb257e' +branch_labels = None +depends_on = None + +domain_obj_names = ['rating', 'group', 'user'] + + +def upgrade(): + for table in domain_obj_names: + op.add_column(table, sa.Column('created', sa.TIMESTAMP)) + + +def downgrade(): + for table in domain_obj_names: + op.drop_column(table, 'created') diff --git a/ckan/migration/versions/010_a6f13bf14d0c_add_user_about.py b/ckan/migration/versions/010_a6f13bf14d0c_add_user_about.py new file mode 100644 index 00000000000..d791cda98c4 --- /dev/null +++ b/ckan/migration/versions/010_a6f13bf14d0c_add_user_about.py @@ -0,0 +1,23 @@ +"""010 Add user about + +Revision ID: a6f13bf14d0c +Revises: b739a48de5c4 +Create Date: 2018-09-04 18:44:53.313230 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'a6f13bf14d0c' +down_revision = 'b739a48de5c4' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('user', sa.Column('about', sa.Text)) + + +def downgrade(): + op.drop_column('user', 'about') diff --git a/ckan/migration/versions/010_add_user_about.py b/ckan/migration/versions/010_add_user_about.py deleted file mode 100644 index c4f3c10dfac..00000000000 --- a/ckan/migration/versions/010_add_user_about.py +++ /dev/null @@ -1,16 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - # Using sql because migrate doesn't quote reserved word 'user' - user_sql = 'ALTER TABLE "user" ADD about TEXT' - migrate_engine.execute(user_sql) - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/011_866f6370b4ac_add_package_search_vector.py b/ckan/migration/versions/011_866f6370b4ac_add_package_search_vector.py new file mode 100644 index 00000000000..cb337f0b158 --- /dev/null +++ b/ckan/migration/versions/011_866f6370b4ac_add_package_search_vector.py @@ -0,0 +1,31 @@ +"""011 Add package search vector + +Revision ID: 866f6370b4ac +Revises: 746205dde53d +Create Date: 2018-09-04 18:48:51.971937 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '866f6370b4ac' +down_revision = 'a6f13bf14d0c' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'package_search', + sa.Column( + 'package_id', + sa.Integer, + sa.ForeignKey('package.id'), + primary_key=True + ), sa.Column('search_vector', sa.dialects.postgresql.TSVECTOR) + ) + + +def downgrade(): + op.drop_table('package_search') diff --git a/ckan/migration/versions/011_add_package_search_vector.py b/ckan/migration/versions/011_add_package_search_vector.py deleted file mode 100644 index ff9eea3e5c3..00000000000 --- a/ckan/migration/versions/011_add_package_search_vector.py +++ /dev/null @@ -1,25 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - package_table = Table('package', metadata, autoload=True) - package_search_table = Table('package_search', metadata, - Column('package_id', Integer, ForeignKey('package.id'), primary_key=True), - ) - - package_search_table.create() - sql = 'ALTER TABLE package_search ADD COLUMN search_vector tsvector' - migrate_engine.execute(sql) - - # This is not so important now and annoying to read when testing - #print 'IMPORTANT! Now run:\n paster create-search-index' - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/012_add_resources.py b/ckan/migration/versions/012_add_resources.py deleted file mode 100644 index 2ebf11b21ed..00000000000 --- a/ckan/migration/versions/012_add_resources.py +++ /dev/null @@ -1,80 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset -import vdm.sqlalchemy - - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - package_table = Table('package', metadata, autoload=True) - package_revision_table = Table('package_revision', metadata, autoload=True) - package_resource_table = Table('package_resource', metadata, - Column('id', Integer, primary_key=True), - Column('package_id', Integer, ForeignKey('package.id')), - Column('url', UnicodeText, nullable=False), - Column('format', UnicodeText), - Column('description', UnicodeText), - Column('position', Integer), - Column('state_id', Integer), - Column('revision_id', UnicodeText, ForeignKey('revision.id')) - ) - - package_resource_revision_table = Table('package_resource_revision', metadata, - Column('id', Integer, primary_key=True), - Column('package_id', Integer, ForeignKey('package.id')), - Column('url', UnicodeText, nullable=False), - Column('format', UnicodeText), - Column('description', UnicodeText), - Column('position', Integer), - Column('state_id', Integer), - Column('revision_id', UnicodeText, ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', Integer, ForeignKey('package_resource.id')) - ) - - - package_resource_table.create() - package_resource_revision_table.create() - - # Move download_urls across to resources - # NB: strictly we should check each package_revision to check whether - # download_url changed (and if only change) and then create - # package_resource_revision for each such revision (and delete every - # package_revision where only change is download_url) - # However, we adopt a cruder approach in which we just create - engine = migrate_engine - select_sql = select([package_table]) - for pkg in engine.execute(select_sql): - download_url = pkg['download_url'] - if download_url: - # what about revision_id? - res_values = {'package_id':pkg.id, - 'url':download_url, - 'format':u'', - 'description':u'', - 'position':0, - 'state_id':1, - 'revision_id': pkg.revision_id, - } - insert_sql = package_resource_table.insert(values=res_values) - engine.execute(insert_sql) - # get id of just inserted resource - getid_sql = select([package_resource_table]).where( - package_resource_table.c.package_id==pkg.id) - resource_id = getid_sql.execute().fetchone().id - # now we need to update revision table ... - res_rev_values = dict(res_values) - res_rev_values['continuity_id'] = resource_id - res_rev_values['id'] = resource_id - insert_sql = package_resource_revision_table.insert(values=res_rev_values) - engine.execute(insert_sql) - - package_table.c.download_url.drop() - package_revision_table.c.download_url.drop() - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/012_e5ca33a5d445_add_resources.py b/ckan/migration/versions/012_e5ca33a5d445_add_resources.py new file mode 100644 index 00000000000..bcb2ef9c80a --- /dev/null +++ b/ckan/migration/versions/012_e5ca33a5d445_add_resources.py @@ -0,0 +1,63 @@ +"""012 Add resources + +Revision ID: e5ca33a5d445 +Revises: 866f6370b4ac +Create Date: 2018-09-04 18:48:52.303211 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'e5ca33a5d445' +down_revision = '866f6370b4ac' +branch_labels = None +depends_on = None + + +def upgrade(): + + op.create_table( + 'package_resource', sa.Column('id', sa.Integer, primary_key=True), + sa.Column('package_id', sa.Integer, sa.ForeignKey('package.id')), + sa.Column('url', sa.UnicodeText, nullable=False), + sa.Column('format', sa.UnicodeText), + sa.Column('description', sa.UnicodeText), + sa.Column('position', sa.Integer), sa.Column('state_id', sa.Integer), + sa.Column('revision_id', sa.UnicodeText, sa.ForeignKey('revision.id')) + ) + + op.create_table( + 'package_resource_revision', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('package_id', sa.Integer, sa.ForeignKey('package.id')), + sa.Column('url', sa.UnicodeText, nullable=False), + sa.Column('format', sa.UnicodeText), + sa.Column('description', sa.UnicodeText), + sa.Column('position', sa.Integer), sa.Column('state_id', sa.Integer), + sa.Column( + 'revision_id', + sa.UnicodeText, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column( + 'continuity_id', sa.Integer, sa.ForeignKey('package_resource.id') + ) + ) + + op.drop_column('package', 'download_url') + op.drop_column('package_revision', 'download_url') + + +def downgrade(): + op.drop_table('package_resource_revision') + op.drop_table('package_resource') + op.add_column( + 'package', + sa.Column('download_url', sa.UnicodeText()), + ) + op.add_column( + 'package_revision', + sa.Column('download_url', sa.UnicodeText()), + ) diff --git a/ckan/migration/versions/013_8a3a5af39797_add_hash.py b/ckan/migration/versions/013_8a3a5af39797_add_hash.py new file mode 100644 index 00000000000..0c288e12314 --- /dev/null +++ b/ckan/migration/versions/013_8a3a5af39797_add_hash.py @@ -0,0 +1,23 @@ +"""013 Add hash + +Revision ID: 8a3a5af39797 +Revises: e5ca33a5d445 +Create Date: 2018-09-04 18:48:52.640250 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '8a3a5af39797' +down_revision = 'e5ca33a5d445' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('package_resource', sa.Column('hash', sa.UnicodeText)) + + +def downgrade(): + op.drop_column('package_resource', 'hash') diff --git a/ckan/migration/versions/013_add_hash.py b/ckan/migration/versions/013_add_hash.py deleted file mode 100644 index 68bb54184fe..00000000000 --- a/ckan/migration/versions/013_add_hash.py +++ /dev/null @@ -1,17 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - package_resource = Table('package_resource', metadata, autoload=True) - column = Column('hash', UnicodeText) - column.create(package_resource) - -def downgrade(migrate_engine): - raise NotImplementedError() - diff --git a/ckan/migration/versions/014_93519b684820_hash_2.py b/ckan/migration/versions/014_93519b684820_hash_2.py new file mode 100644 index 00000000000..d9f16989de1 --- /dev/null +++ b/ckan/migration/versions/014_93519b684820_hash_2.py @@ -0,0 +1,25 @@ +"""014 Hash 2 + +Revision ID: 93519b684820 +Revises: 8a3a5af39797 +Create Date: 2018-09-04 18:48:52.968191 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '93519b684820' +down_revision = '8a3a5af39797' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column( + 'package_resource_revision', sa.Column('hash', sa.UnicodeText) + ) + + +def downgrade(): + op.drop_column('package_resource_revision', 'hash') diff --git a/ckan/migration/versions/014_hash_2.py b/ckan/migration/versions/014_hash_2.py deleted file mode 100644 index 8a1e320248c..00000000000 --- a/ckan/migration/versions/014_hash_2.py +++ /dev/null @@ -1,19 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - # When adding a column to a revisioned object, need to add it to it's - # counterpart revision object too. Here is the counter-part for that in - # 013_add_hash.py - package_resource_revision = Table('package_resource_revision', metadata, autoload=True) - column = Column('hash', UnicodeText) - column.create(package_resource_revision) - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/015_6d8ffebcaf54_remove_state_object.py b/ckan/migration/versions/015_6d8ffebcaf54_remove_state_object.py new file mode 100644 index 00000000000..9d1988fefd0 --- /dev/null +++ b/ckan/migration/versions/015_6d8ffebcaf54_remove_state_object.py @@ -0,0 +1,41 @@ +"""015 Remove state_object + +Revision ID: 6d8ffebcaf54 +Revises: 93519b684820 +Create Date: 2018-09-04 18:48:53.302758 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '6d8ffebcaf54' +down_revision = '93519b684820' +branch_labels = None +depends_on = None + +stateful_tables = [ + 'license', 'package', 'package_revision', 'package_tag', + 'package_tag_revision', 'package_extra', 'package_extra_revision', + 'package_resource', 'package_resource_revision', 'revision' +] + + +def upgrade(): + for table_name in stateful_tables: + op.add_column(table_name, sa.Column('state', sa.UnicodeText)) + op.drop_column(table_name, 'state_id') + + op.drop_table('state') + + +def downgrade(): + op.create_table( + 'state', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('name', sa.Unicode(100)), + ) + + for table_name in stateful_tables: + op.drop_column(table_name, 'state') + op.add_column(table_name, sa.Column('state_id', sa.Integer)) diff --git a/ckan/migration/versions/015_remove_state_object.py b/ckan/migration/versions/015_remove_state_object.py deleted file mode 100644 index 0c0eda373b7..00000000000 --- a/ckan/migration/versions/015_remove_state_object.py +++ /dev/null @@ -1,35 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -import sqlalchemy.sql as sql - -from migrate import * -import migrate.changeset - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - stateful_tables = [ - 'license', - 'package', 'package_revision', - 'package_tag', 'package_tag_revision', - 'package_extra', 'package_extra_revision', - 'package_resource', 'package_resource_revision', - 'revision' - ] - for table_name in stateful_tables: - # print '***** Processing table: %s' % table_name - table = Table(table_name, metadata, autoload=True) - column = Column('state', UnicodeText) - column.create(table) - for (name,id) in [ ('active',1), ('deleted',2), ('pending',3) ]: - sqlcmd = '''UPDATE %s SET state = '%s' WHERE state_id = %s''' % (table.name, name, id) - migrate_engine.execute(sqlcmd) - stateid = table.c['state_id'] - stateid.drop() - table = Table('state', metadata, autoload=True) - table.drop() - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/016_37ada738328e_uuids_everywhere.py b/ckan/migration/versions/016_37ada738328e_uuids_everywhere.py new file mode 100644 index 00000000000..75ef15f8591 --- /dev/null +++ b/ckan/migration/versions/016_37ada738328e_uuids_everywhere.py @@ -0,0 +1,127 @@ +"""016 Uuids everywhere + +Revision ID: 37ada738328e +Revises: 6d8ffebcaf54 +Create Date: 2018-09-04 18:48:53.632517 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '37ada738328e' +down_revision = '6d8ffebcaf54' +branch_labels = None +depends_on = None + +foreign_keys = [ + ('package_tag', 'package_id'), + ('package_tag', 'tag_id'), + ('package_extra', 'package_id'), + ('package_resource', 'package_id'), + ('package_tag_revision', 'package_id'), + ('package_tag_revision', 'tag_id'), + ('package_extra_revision', 'package_id'), + ('package_resource_revision', 'package_id'), + ('rating', 'package_id'), + ('package_search', 'package_id'), + ('package_role', 'package_id'), + ('package_group', 'package_id'), +] +ids = [ + 'package', 'package_tag', 'package_extra', 'package_resource', + 'package_revision', 'package_tag_revision', 'package_extra_revision', + 'package_resource_revision', 'tag' +] + +continuity = [ + 'package_revision', 'package_tag_revision', 'package_extra_revision', + 'package_resource_revision' +] + +sequences = [ + 'package_id_seq', 'package_extra_id_seq', 'package_resource_id_seq', + 'package_tag_id_seq', 'tag_id_seq' +] + +combined_primary_keys = [ + 'package_extra_revision', 'package_revision', 'package_tag_revision' +] + + +def upgrade(): + for table, column in foreign_keys: + op.drop_column(table, column) + for table in continuity: + op.drop_column(table, 'continuity_id') + for table in ids: + op.alter_column(table, 'id', type_=sa.UnicodeText, server_default=None) + + for table, column in foreign_keys: + op.add_column( + table, + sa.Column( + column, sa.UnicodeText, + sa.ForeignKey(column.replace('_', '.')) + ) + ) + for table in continuity: + op.add_column( + table, + sa.Column( + 'continuity_id', sa.UnicodeText, + sa.ForeignKey(table.replace('_revision', '.id')) + ) + ) + for table in combined_primary_keys: + op.create_primary_key(table + '_pkey', table, ['id', 'revision_id']) + + op.execute( + sa.schema.DropSequence(sa.schema.Sequence('package_extra_id_seq')) + ) + op.execute(sa.schema.DropSequence(sa.schema.Sequence('package_id_seq'))) + op.execute( + sa.schema.DropSequence(sa.schema.Sequence('package_tag_id_seq')) + ) + op.execute( + sa.schema.DropSequence(sa.schema.Sequence('package_resource_id_seq')) + ) + op.execute(sa.schema.DropSequence(sa.schema.Sequence('tag_id_seq'))) + op.execute(sa.schema.DropSequence(sa.schema.Sequence('revision_id_seq'))) + + +def downgrade(): + for table, column in foreign_keys: + op.drop_column(table, column) + for table in continuity: + op.drop_column(table, 'continuity_id') + + for table in ids: + op.drop_column(table, 'id') + op.add_column( + table, + sa.Column( + 'id', + sa.Integer, + primary_key=True, + autoincrement=True, + nullable=False, + unique=True + ) + ) + + for table, column in foreign_keys: + op.add_column( + table, + sa.Column( + column, sa.Integer, sa.ForeignKey(column.replace('_', '.')) + ) + ) + for table in continuity: + op.add_column( + table, + sa.Column( + 'continuity_id', sa.Integer, + sa.ForeignKey(table.replace('_revision', '.id')) + ) + ) diff --git a/ckan/migration/versions/016_uuids_everywhere.py b/ckan/migration/versions/016_uuids_everywhere.py deleted file mode 100644 index d661268fd6c..00000000000 --- a/ckan/migration/versions/016_uuids_everywhere.py +++ /dev/null @@ -1,196 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -import sqlalchemy.schema -import uuid -from sqlalchemy.sql import select - -from migrate import * -import migrate.changeset -from migrate.changeset.constraint import ForeignKeyConstraint, PrimaryKeyConstraint - -metadata = MetaData() - -def make_uuid(): - return unicode(uuid.uuid4()) - -## Tables and columns changed in the model -## Versioned: -## ('package', 'id'), -## ('package_tag', ('id', 'package_id', 'tag_id')), -## ('package_extra', ('id', 'package_id')), -## ('package_resource', ('id', 'package_id')), -## Versions: -## ('package_revision', 'id'), -## ('package_tag_revision', ('id', 'package_id', 'tag_id')), -## ('package_extra_revision', ('id', 'package_id')), -## ('package_resource_revision', ('id', 'package_id')), -## Non-versioned: -## ('tag', 'id'), -## ('rating', 'package_id'), -## ('package_search', 'package_id'), -## ('package_role', 'package_id'), -## ('package_group', 'package_id'), - -def upgrade(migrate_engine): - global metadata - metadata = MetaData() - metadata.bind = migrate_engine - primary_table_name = 'package' - foreign_tables = ['package_revision', - 'package_tag', 'package_tag_revision', - 'package_extra', 'package_extra_revision', - 'package_resource', 'package_resource_revision', - 'rating', 'package_search', - 'package_role', 'package_group'] - revision_table_name = 'package_revision' - convert_to_uuids(migrate_engine, primary_table_name, foreign_tables, revision_table_name) - - primary_table_name = 'package_resource' - foreign_tables = ['package_resource_revision'] - revision_table_name = 'package_resource_revision' - convert_to_uuids(migrate_engine, primary_table_name, foreign_tables, revision_table_name) - - primary_table_name = 'package_tag' - foreign_tables = ['package_tag_revision'] - revision_table_name = 'package_tag_revision' - convert_to_uuids(migrate_engine, primary_table_name, foreign_tables, revision_table_name) - - primary_table_name = 'package_extra' - foreign_tables = ['package_extra_revision'] - revision_table_name = 'package_extra_revision' - convert_to_uuids(migrate_engine, primary_table_name, foreign_tables, revision_table_name) - - primary_table_name = 'tag' - foreign_tables = ['package_tag', 'package_tag_revision'] - revision_table_name = None - convert_to_uuids(migrate_engine, primary_table_name, foreign_tables, revision_table_name) - - drop_sequencies(migrate_engine) - -def convert_to_uuids(migrate_engine, primary_table_name, foreign_tables, revision_table_name=None): - '''Convert an id column in Primary Table to string type UUIDs. - How it works: - 1 drop all foreign key constraints - 2 alter type of revision id and foreign keys - 3 create foreign key constraints (using cascade!) - 4 create uuids for revisions (auto cascades elsewhere!) - - @param primary_table_name - table containing the primary key id column - @param foreign_tables - names of tables which have this same key as a - foreign key constraint - @param revision_table_name - if primary_table is versioned, supply the name - of its related revision table, so that it can be updated at the same - time. - ''' - #print('** Processing %s' % primary_table_name) - #print('*** Dropping fk constraints') - dropped_fk_constraints = drop_constraints_and_alter_types(primary_table_name, foreign_tables, revision_table_name) - #print('*** Adding fk constraints (with cascade)') - add_fk_constraints(migrate_engine, dropped_fk_constraints, primary_table_name) - #print('*** Creating UUIDs') - create_uuids(migrate_engine, primary_table_name, revision_table_name) - -def drop_constraints_and_alter_types(primary_table_name, foreign_tables, revision_table_name): - # 1 drop all foreign key constraints - dropped_fk_constraints = [] - primary_table = Table(primary_table_name, metadata, autoload=True) - for table_name in foreign_tables: - table = Table(table_name, metadata, autoload=True) - for constraint in table.constraints.copy(): - if isinstance(constraint, sqlalchemy.schema.ForeignKeyConstraint): - foreign_key_cols = [key.column for key in constraint.elements] - fk_col = foreign_key_cols[0] - if fk_col.table == primary_table: - orig_fk = ForeignKeyConstraint(constraint.columns, foreign_key_cols, name=constraint.name, table=table) - orig_fk.drop() - dropped_fk_constraints.append((constraint.columns, foreign_key_cols, constraint.name, table.name)) - #print 'CON', dropped_fk_constraints[-1] - - # 2 alter type of primary table id and foreign keys - if len(constraint.columns.keys()) != 1: - raise ValueError() - id_col = constraint.table.columns[constraint.columns.keys()[0]] - id_col.alter(type=UnicodeText) - - primary_table = Table(primary_table_name, metadata, autoload=True) - id_col = primary_table.c['id'] - id_col.alter(type=UnicodeText) - - if revision_table_name: - # Revision table id column type changed as well - revision_table = Table(revision_table_name, metadata, autoload=True) - id_col = revision_table.c['id'] - id_col.alter(type=UnicodeText) - - return dropped_fk_constraints - -def add_fk_constraints(migrate_engine, dropped_fk_constraints, primary_table_name): - # 3 create foreign key constraints - for fk_constraint in dropped_fk_constraints: - # cascade doesn't work - # see http://code.google.com/p/sqlalchemy-migrate/issues/detail?id=48 - # new_fk = ForeignKeyConstraint(*fk_constraint, onupdate='CASCADE') - # new_fk = ForeignKeyConstraint(*fk_constraint) - # new_fk.create() - - # So we create via hand ... - constraint_columns, foreign_key_cols, constraint_name, table_name = fk_constraint - # Sanity check - if len(constraint_columns.keys()) != 1: - raise ValueError() - - oursql = '''ALTER TABLE %(table)s - ADD CONSTRAINT %(fkeyname)s - FOREIGN KEY (%(col_name)s) - REFERENCES %(primary_table_name)s (id) - ''' % {'table':table_name, 'fkeyname':constraint_name, - 'col_name':constraint_columns.keys()[0], - 'primary_table_name':primary_table_name} - migrate_engine.execute(oursql) - -def create_uuids(migrate_engine, primary_table_name, revision_table_name): - # have changed type of cols so recreate metadata - metadata = MetaData(migrate_engine) - - # 4 create uuids for primary entities and in related tables - primary_table = Table(primary_table_name, metadata, autoload=True) - if revision_table_name: - revision_table = Table(revision_table_name, metadata, autoload=True) - # fetchall wouldn't be optimal with really large sets of data but here <20k - ids = [ res[0] for res in - migrate_engine.execute(select([primary_table.c.id])).fetchall() ] - for count,id in enumerate(ids): - # if count % 100 == 0: print(count, id) - myuuid = make_uuid() - update = primary_table.update().where(primary_table.c.id==id).values(id=myuuid) - migrate_engine.execute(update) - if revision_table_name: - # ensure each id in revision table match its continuity id. - q = revision_table.update().values(id=revision_table.c.continuity_id) - migrate_engine.execute(q) - - -def drop_sequencies(migrate_engine): - - sequences = ['package_extra', 'package_extra_revision', 'package', - 'package_resource', 'package_resource_revision', - 'package_revision', ' package_tag', 'package_tag_revision', - 'revision', 'tag'] - - for sequence in sequences: - migrate_engine.execute('ALTER TABLE %s ALTER COLUMN id DROP DEFAULT;' % sequence) - - for sequence in sequences: - try: - migrate_engine.execute('drop sequence %s_id_seq;' % sequence) - except sqlalchemy.exc.ProgrammingError as e: - if 'sequence "{}_id_seq" does not exist'.format(sequence) in str(e): - pass - else: - raise - - - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/017_1250b2ff3e36_add_pkg_relationships.py b/ckan/migration/versions/017_1250b2ff3e36_add_pkg_relationships.py new file mode 100644 index 00000000000..767f9feb7ac --- /dev/null +++ b/ckan/migration/versions/017_1250b2ff3e36_add_pkg_relationships.py @@ -0,0 +1,58 @@ +"""017 Add pkg_relationships + +Revision ID: 1250b2ff3e36 +Revises: 37ada738328e +Create Date: 2018-09-04 18:48:53.963557 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '1250b2ff3e36' +down_revision = '37ada738328e' +branch_labels = None +depends_on = None + + +def upgrade(): + + op.create_table( + 'package_relationship', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column( + 'subject_package_id', sa.UnicodeText, sa.ForeignKey('package.id') + ), + sa.Column( + 'object_package_id', sa.UnicodeText, sa.ForeignKey('package.id') + ), sa.Column('type', sa.UnicodeText), + sa.Column('comment', sa.UnicodeText), + sa.Column('revision_id', sa.UnicodeText, sa.ForeignKey('revision.id')) + ) + + op.create_table( + 'package_relationship_revision', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column( + 'subject_package_id', sa.UnicodeText, sa.ForeignKey('package.id') + ), + sa.Column( + 'object_package_id', sa.UnicodeText, sa.ForeignKey('package.id') + ), sa.Column('type', sa.UnicodeText), + sa.Column('comment', sa.UnicodeText), + sa.Column( + 'revision_id', + sa.UnicodeText, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column( + 'continuity_id', sa.UnicodeText, + sa.ForeignKey('package_relationship.id') + ) + ) + + +def downgrade(): + op.drop_table('package_relationship_revision') + op.drop_table('package_relationship') diff --git a/ckan/migration/versions/017_add_pkg_relationships.py b/ckan/migration/versions/017_add_pkg_relationships.py deleted file mode 100644 index f833f40dfae..00000000000 --- a/ckan/migration/versions/017_add_pkg_relationships.py +++ /dev/null @@ -1,41 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import uuid - - -def make_uuid(): - return unicode(uuid.uuid4()) - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - package_table = Table('package', metadata, autoload=True) - - package_relationship_table = Table('package_relationship', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('subject_package_id', UnicodeText, ForeignKey('package.id')), - Column('object_package_id', UnicodeText, ForeignKey('package.id')), - Column('type', UnicodeText), - Column('comment', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id')) - ) - - package_relationship_revision_table = Table('package_relationship_revision', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('subject_package_id', UnicodeText, ForeignKey('package.id')), - Column('object_package_id', UnicodeText, ForeignKey('package.id')), - Column('type', UnicodeText), - Column('comment', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', UnicodeText, ForeignKey('package_relationship.id')) - ) - - package_relationship_table.create() - package_relationship_revision_table.create() - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/018_05a0778051ca_adjust_licenses.py b/ckan/migration/versions/018_05a0778051ca_adjust_licenses.py new file mode 100644 index 00000000000..b8c72272284 --- /dev/null +++ b/ckan/migration/versions/018_05a0778051ca_adjust_licenses.py @@ -0,0 +1,40 @@ +"""018 Adjust licenses + +Revision ID: 05a0778051ca +Revises: 1250b2ff3e36 +Create Date: 2018-09-04 18:48:54.288030 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '05a0778051ca' +down_revision = '1250b2ff3e36' +branch_labels = None +depends_on = None + +tables = ['package', 'package_revision'] + + +def upgrade(): + for table in tables: + op.drop_column(table, 'license_id') + op.add_column(table, sa.Column('license_id', sa.UnicodeText)) + op.drop_table('license') + + +def downgrade(): + + op.create_table( + 'license', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('name', sa.Unicode(100)), + sa.Column('state', sa.UnicodeText) + ) + for table in tables: + op.drop_column(table, 'license_id') + op.add_column( + table, + sa.Column('license_id', sa.Integer, sa.ForeignKey('license.id')) + ) diff --git a/ckan/migration/versions/018_adjust_licenses.py b/ckan/migration/versions/018_adjust_licenses.py deleted file mode 100644 index 4b7c1d6e245..00000000000 --- a/ckan/migration/versions/018_adjust_licenses.py +++ /dev/null @@ -1,180 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import uuid - - -map = { - u'OSI Approved::Mozilla Public License 1.1 (MPL)': 'mozilla1.1', - u'OKD Compliant::Creative Commons Attribution-ShareAlike': 'cc-by-sa', - u'OSI Approved::Nokia Open Source License': 'nokia', - u'OSI Approved::Computer Associates Trusted Open Source License 1.1': 'ca-tosl1.1', - u'OKD Compliant::Higher Education Statistics Agency Copyright with data.gov.uk rights': 'hesa-withrights', - u'OSI Approved::Lucent Public License Version 1.02': 'lucent1.02', - u'OSI Approved::Open Software License': 'osl-3.0', - u'OSI Approved::Motosoto License': 'motosoto', - u'OSI Approved::MIT license': 'mit-license', - u'OSI Approved::Mozilla Public License 1.0 (MPL)': 'mozilla', - u'OSI Approved::GNU General Public License v3 (GPLv3)': 'gpl-3.0', - u'OKD Compliant::UK Click Use PSI': 'ukclickusepsi', - u'OSI Approved::Eiffel Forum License': 'eiffel', - u'OSI Approved::Jabber Open Source License': 'jabber-osl', - u'OSI Approved::Open Group Test Suite License': 'opengroup', - u'OSI Approved::Entessa Public License': 'entessa', - u'OKD Compliant::Other': 'other-open', - u'OSI Approved::EU DataGrid Software License': 'eudatagrid', - u'OSI Approved::Zope Public License': 'zpl', - u'OSI Approved::Naumen Public License': 'naumen', - u'OSI Approved::wxWindows Library License': 'wxwindows', - u'OKD Compliant::GNU Free Documentation License (GFDL)': 'gfdl', - u'Non-OKD Compliant::Non-Commercial Other': 'other-nc', - u'OKD Compliant::Open Data Commons Public Domain Dedication and License (PDDL)': 'odc-pddl', - u'OSI Approved::NASA Open Source Agreement 1.3': 'nasa1.3', - u'OSI Approved::X.Net License': 'xnet', - u'OSI Approved::W3C License': 'W3C', - u'OSI Approved::Academic Free License': 'afl-3.0', - u'Non-OKD Compliant::Crown Copyright': 'ukcrown', - u'OSI Approved::RealNetworks Public Source License V1.0': 'real', - u'OSI Approved::Common Development and Distribution License': 'cddl1', - u'OSI Approved::Intel Open Source License': 'intel-osl', - u'OSI Approved::GNU General Public License (GPL)': 'gpl-2.0', - u'Non-OKD Compliant::Creative Commons Non-Commercial (Any)': 'cc-nc', - u'Non-OKD Compliant::Other': 'other-closed', - u'Other::License Not Specified': 'notspecified', - u'OSI Approved::Sybase Open Watcom Public License 1.0': 'sybase', - u'OSI Approved::Educational Community License': 'ecl2', - u'OSI Approved::Sun Industry Standards Source License (SISSL)': 'sun-issl', - u'OKD Compliant::Other (Public Domain)': 'other-pd', - u'OKD Compliant::Public Domain': 'other-pd', - u'OKD Compliant::Creative Commons Attribution': 'cc-by', - u'OSI Approved::OCLC Research Public License 2.0': 'oclc2', - u'OSI Approved::Artistic license': 'artistic-license-2.0', - u'OKD Compliant::Other (Attribution)': 'other-at', - u'OSI Approved::Sleepycat License': 'sleepycat', - u'OSI Approved::PHP License': 'php', - u'OKD Compliant::Creative Commons CCZero': 'cc-zero', - u'OSI Approved::University of Illinois/NCSA Open Source License': 'UoI-NCSA', - u'OSI Approved::Adaptive Public License': 'apl1.0', - u'OSI Approved::Ricoh Source Code Public License': 'ricohpl', - u'OSI Approved::Eiffel Forum License V2.0': 'ver2_eiffel', - u'OSI Approved::Python license (CNRI Python License)': 'pythonpl', - u'OSI Approved::Frameworx License': 'frameworx', - u'OSI Approved::IBM Public License': 'ibmpl', - u'OSI Approved::Fair License': 'fair', - u'OSI Approved::Lucent Public License (Plan9)': 'lucent-plan9', - u'OSI Approved::Nethack General Public License': 'nethack', - u'OSI Approved::Common Public License 1.0': 'cpal_1.0', - u'OSI Approved::Attribution Assurance Licenses': 'attribution', - u'OSI Approved::Reciprocal Public License': 'rpl1.5', - u'OSI Approved::Eclipse Public License': 'eclipse-1.0', - u'OSI Approved::CUA Office Public License Version 1.0': 'cuaoffice', - u'OSI Approved::Vovida Software License v. 1.0': 'vovidapl', - u'OSI Approved::Apple Public Source License': 'apsl-2.0', - u'OKD Compliant::UK Crown Copyright with data.gov.uk rights': 'ukcrown-withrights', - u'OKD Compliant::Local Authority Copyright with data.gov.uk rights': 'localauth-withrights', - u'OKD Compliant::Open Data Commons Open Database License (ODbL)': 'odc-odbl', - u'OSI Approved::New BSD license': 'bsd-license', - u'OSI Approved::Qt Public License (QPL)': 'qtpl', - u'OSI Approved::GNU Library or "Lesser" General Public License (LGPL)': 'lgpl-2.1', - u'OSI Approved::MITRE Collaborative Virtual Workspace License (CVW License)': 'mitre', - u'OSI Approved::Apache License, 2.0': 'apache2.0', - u'OSI Approved::Apache Software License': 'apache', - u'OSI Approved::Python Software Foundation License': 'PythonSoftFoundation', - u'OSI Approved::Sun Public License': 'sunpublic', - u'OSI Approved::zlib/libpng license': 'zlib-license' -} - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - #print("Changing package license_ids to strings.") - - # Get licenses, package license ids, and package revision license ids. - old_license_titles = _get_old_license_titles(migrate_engine) - old_package_license_ids = _get_old_package_license_ids(migrate_engine) - old_package_revision_license_ids = _get_old_package_revision_license_ids(migrate_engine) - _check_map_has_old_license_titles(old_license_titles, map) - - # Upgrade database scheme. - drop_fk_constraint_on_package_table = "ALTER TABLE package DROP CONSTRAINT package_license_id_fkey;" - drop_fk_constraint_on_package_revision_table = "ALTER TABLE package_revision DROP CONSTRAINT package_revision_license_id_fkey;" - change_license_id_type_on_package_table = "ALTER TABLE package ALTER COLUMN license_id TYPE text;" - change_license_id_type_on_package_revision_table = "ALTER TABLE package_revision ALTER COLUMN license_id TYPE text;" - drop_licenses_table = "DROP TABLE license CASCADE;" - - migrate_engine.execute(drop_fk_constraint_on_package_table) - migrate_engine.execute(drop_fk_constraint_on_package_revision_table) - migrate_engine.execute(change_license_id_type_on_package_table) - migrate_engine.execute(change_license_id_type_on_package_revision_table) - migrate_engine.execute(drop_licenses_table) - - # Set package license ids, and package revision license ids. - new_package_license_ids = _switch_package_license_ids( - old_package_license_ids, old_license_titles, map) - new_package_revision_license_ids = _switch_package_license_ids( - old_package_revision_license_ids, old_license_titles, map) - _set_new_package_license_ids(migrate_engine, new_package_license_ids) - _set_new_package_revision_license_ids(migrate_engine, new_package_revision_license_ids) - -def downgrade(migrate_engine): - raise NotImplementedError() - -def _check_map_has_old_license_titles(old_license_titles, map): - for title in old_license_titles.values(): - if title not in map: - raise Exception("The old license title '%s' wasn't found in the upgrade map. Decide which new license id should be substituted for this license and add an entry to the map (in ckan/migration/versions/018_adjust_licenses.py)." % title) - -def _get_old_license_titles(migrate_engine): - "Returns a dict of old license titles, keyed by old license id." - titles = {} - select_licenses = "SELECT id, name FROM license;" - q = migrate_engine.execute(select_licenses) - for id, title in q: - titles[id] = title - return titles - -def _get_old_package_license_ids(migrate_engine): - "Returns a dict of old license ids, keyed by package id." - old_ids = {} - select_licenses = "SELECT id, license_id FROM package;" - q = migrate_engine.execute(select_licenses) - for id, license_id in q: - old_ids[id] = license_id - return old_ids - -def _get_old_package_revision_license_ids(migrate_engine): - "Returns a dict of old license ids, keyed by package_revision id." - old_ids = {} - select_licenses = "SELECT id, license_id FROM package_revision;" - q = migrate_engine.execute(select_licenses) - for id, license_id in q: - old_ids[id] = license_id - return old_ids - -def _switch_package_license_ids(old_ids, old_license_titles, map): - "Returns a dict of new license ids, keyed by package id." - new_ids = {} - for (package_id, old_license_id) in old_ids.items(): - if old_license_id != None: - old_license_title = old_license_titles[old_license_id] - new_license_id = map[old_license_title] - new_ids[package_id] = new_license_id - print("Switched license_id %s to %s" % (old_license_id, new_license_id)) - return new_ids - -def _set_new_package_license_ids(migrate_engine, new_ids): - for (package_id, license_id) in new_ids.items(): - _set_package_license_id(migrate_engine, package_id, license_id) - -def _set_package_license_id(migrate_engine, package_id, license_id): - set_package_license_id = """UPDATE package SET license_id ='%s' where id = '%s';""" % (license_id, package_id) - migrate_engine.execute(set_package_license_id) - -def _set_new_package_revision_license_ids(migrate_engine, new_ids): - for (package_id, license_id) in new_ids.items(): - _set_package_revision_license_id(migrate_engine, package_id, license_id) - -def _set_package_revision_license_id(migrate_engine, package_id, license_id): - set_package_license_id = """UPDATE package_revision SET license_id ='%s' where id = '%s';""" % (license_id, package_id) - migrate_engine.execute(set_package_license_id) diff --git a/ckan/migration/versions/019_b2eb6f34a638_pkg_relationships_state.py b/ckan/migration/versions/019_b2eb6f34a638_pkg_relationships_state.py new file mode 100644 index 00000000000..9fd7f1dba87 --- /dev/null +++ b/ckan/migration/versions/019_b2eb6f34a638_pkg_relationships_state.py @@ -0,0 +1,27 @@ +"""019 Pkg relationships_state + +Revision ID: b2eb6f34a638 +Revises: 05a0778051ca +Create Date: 2018-09-04 18:48:54.620241 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'b2eb6f34a638' +down_revision = '05a0778051ca' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('package_relationship', sa.Column('state', sa.UnicodeText)) + op.add_column( + 'package_relationship_revision', sa.Column('state', sa.UnicodeText) + ) + + +def downgrade(): + op.drop_column('package_relationship', 'state') + op.drop_column('package_relationship_revision', 'state') diff --git a/ckan/migration/versions/019_pkg_relationships_state.py b/ckan/migration/versions/019_pkg_relationships_state.py deleted file mode 100644 index e70ad48a21c..00000000000 --- a/ckan/migration/versions/019_pkg_relationships_state.py +++ /dev/null @@ -1,26 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - package_relationship_table = Table('package_relationship', - metadata, autoload=True) - package_relationship_revision_table = Table('package_relationship_revision', - metadata, autoload=True) - - state_column = Column('state', UnicodeText) - state_column.create(package_relationship_table) - state_column = Column('state', UnicodeText) - state_column.create(package_relationship_revision_table) - # No package relationship objects exist to migrate, so no - # need to populate state column - -def downgrade(migrate_engine): - raise NotImplementedError() - diff --git a/ckan/migration/versions/020_69a0b0efc609_add_changeset.py b/ckan/migration/versions/020_69a0b0efc609_add_changeset.py new file mode 100644 index 00000000000..e8335313a23 --- /dev/null +++ b/ckan/migration/versions/020_69a0b0efc609_add_changeset.py @@ -0,0 +1,68 @@ +"""020 Add changeset + +Revision ID: 69a0b0efc609 +Revises: b2eb6f34a638 +Create Date: 2018-09-04 18:48:54.952113 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '69a0b0efc609' +down_revision = 'b2eb6f34a638' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'changeset', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('closes_id', sa.UnicodeText, nullable=True), + sa.Column('follows_id', sa.UnicodeText, nullable=True), + sa.Column('meta', sa.UnicodeText, nullable=True), + sa.Column('branch', sa.UnicodeText, nullable=True), + sa.Column( + 'timestamp', + sa.DateTime, + server_default=sa.func.current_timestamp() + ), + sa.Column('is_working', sa.Boolean, default=False), + sa.Column( + 'revision_id', + sa.UnicodeText, + sa.ForeignKey('revision.id'), + nullable=True + ), + sa.Column( + 'added_here', + sa.DateTime, + server_default=sa.func.current_timestamp() + ), + ) + + op.create_table( + 'change', + sa.Column('ref', sa.UnicodeText, nullable=True), + sa.Column('diff', sa.UnicodeText, nullable=True), + sa.Column( + 'changeset_id', sa.UnicodeText, sa.ForeignKey('changeset.id') + ), + ) + + op.create_table( + 'changemask', + sa.Column('ref', sa.UnicodeText, primary_key=True), + sa.Column( + 'timestamp', + sa.DateTime, + server_default=sa.func.current_timestamp() + ), + ) + + +def downgrade(): + op.drop_table('changeset') + op.drop_table('change') + op.drop_table('changemask') diff --git a/ckan/migration/versions/020_add_changeset.py b/ckan/migration/versions/020_add_changeset.py deleted file mode 100644 index 4c41a6c1d33..00000000000 --- a/ckan/migration/versions/020_add_changeset.py +++ /dev/null @@ -1,47 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import datetime -from migrate.changeset.constraint import PrimaryKeyConstraint - - - -def upgrade(migrate_engine): - metadata = MetaData() - - revision_table = Table('revision', metadata, - Column('id', UnicodeText, primary_key=True), - ) - - changeset_table = Table('changeset', metadata, - Column('id', UnicodeText, primary_key=True), - Column('closes_id', UnicodeText, nullable=True), - Column('follows_id', UnicodeText, nullable=True), - Column('meta', UnicodeText, nullable=True), - Column('branch', UnicodeText, nullable=True), - Column('timestamp', DateTime, default=datetime.datetime.utcnow), - Column('is_working', Boolean, default=False), - Column('revision_id', UnicodeText, ForeignKey('revision.id'), nullable=True), - Column('added_here', DateTime, default=datetime.datetime.utcnow), - ) - - change_table = Table('change', metadata, - Column('ref', UnicodeText, nullable=True), - Column('diff', UnicodeText, nullable=True), - Column('changeset_id', UnicodeText, ForeignKey('changeset.id')), - ) - - changemask_table = Table('changemask', metadata, - Column('ref', UnicodeText, primary_key=True), - Column('timestamp', DateTime, default=datetime.datetime.utcnow), - ) - metadata.bind = migrate_engine - changeset_table.create() - change_table.create() - changemask_table.create() - -def downgrade(migrate_engine): - change_table.drop() - changeset_table.drop() - diff --git a/ckan/migration/versions/021_765143af2ba3_postgresql_upgrade_sql.py b/ckan/migration/versions/021_765143af2ba3_postgresql_upgrade_sql.py new file mode 100644 index 00000000000..e5b468af436 --- /dev/null +++ b/ckan/migration/versions/021_765143af2ba3_postgresql_upgrade_sql.py @@ -0,0 +1,102 @@ +"""021 Postgresql upgrade.sql + +Revision ID: 765143af2ba3 +Revises: 4a8577e55a02 +Create Date: 2018-09-04 18:48:55.958481 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '765143af2ba3' +down_revision = '69a0b0efc609' +branch_labels = None +depends_on = None + +indexes = ( + ('idx_extra_pkg_id', 'package_extra', ['package_id']), + ('idx_extra_id_pkg_id', 'package_extra', ['id', 'package_id']), + ('idx_group_pkg_id', 'package_group', ['package_id']), + ('idx_extra_grp_id_pkg_id', 'package_group', ['group_id', 'package_id']), + ('idx_pkg_id', 'package', ['id']), + ('idx_pkg_name', 'package', ['name']), + ('idx_pkg_title', 'package', ['title']), + ('idx_pkg_lname', 'package', [sa.text('lower(name)')]), + ('idx_pkg_uname', 'package', [sa.text('upper(name)')]), + ('idx_pkg_rev_id', 'package', ['revision_id']), + ('idx_pkg_sid', 'package', ['id', 'state']), + ('idx_pkg_sname', 'package', ['name', 'state']), + ('idx_pkg_stitle', 'package', ['title', 'state']), + ('idx_pkg_slname', 'package', [sa.text('lower(name)'), 'state']), + ('idx_pkg_suname', 'package', [sa.text('upper(name)'), 'state']), + ('idx_pkg_srev_id', 'package', ['revision_id', 'state']), + ('idx_pkg_revision_id', 'package_revision', ['id']), + ('idx_pkg_revision_name', 'package_revision', ['name']), + ('idx_pkg_revision_rev_id', 'package_revision', ['revision_id']), + ('idx_rev_state', 'revision', ['state']), + ('idx_tag_id', 'tag', ['id']), + ('idx_tag_name', 'tag', ['name']), + ('idx_package_tag_id', 'package_tag', ['id']), + ('idx_package_tag_tag_id', 'package_tag', ['tag_id']), + ('idx_package_tag_pkg_id', 'package_tag', ['package_id']), + ('idx_package_tag_pkg_id_tag_id', 'package_tag', ['tag_id', 'package_id']), + ('idx_package_tag_revision_id', 'package_tag_revision', ['id']), + ('idx_package_tag_revision_tag_id', 'package_tag_revision', ['tag_id']), + ( + 'idx_package_tag_revision_rev_id', 'package_tag_revision', + ['revision_id'] + ), + ( + 'idx_package_tag_revision_pkg_id', 'package_tag_revision', + ['package_id'] + ), + ( + 'idx_package_tag_revision_pkg_id_tag_id', 'package_tag_revision', + ['tag_id', 'package_id'] + ), + ('idx_rating_id', 'rating', ['id']), + ('idx_rating_user_id', 'rating', ['user_id']), + ('idx_rating_package_id', 'rating', ['package_id']), + ('idx_user_id', 'user', ['id']), + ('idx_user_name', 'user', ['name']), + # ('idx_uor_id', 'user_object_role', ['id']), + # ('idx_uor_user_id', 'user_object_role', ['user_id']), + ('idx_uor_context', 'user_object_role', ['context']), + ('idx_uor_role', 'user_object_role', ['role']), + ('idx_uor_user_id_role', 'user_object_role', ['user_id', 'role']), + ('idx_ra_role', 'role_action', ['role']), + ('idx_ra_action', 'role_action', ['action']), + ('idx_ra_role_action', 'role_action', ['action', 'role']), + ('idx_group_id', 'group', ['id']), + ('idx_group_name', 'group', ['name']), + ('idx_package_group_id', 'package_group', ['id']), + ('idx_package_group_group_id', 'package_group', ['group_id']), + ('idx_package_group_pkg_id', 'package_group', ['package_id']), + ( + 'idx_package_group_pkg_id_group_id', 'package_group', + ['group_id', 'package_id'] + ), + ('idx_package_resource_id', 'package_resource', ['id']), + ('idx_package_resource_url', 'package_resource', ['url']), + ('idx_package_resource_pkg_id', 'package_resource', ['package_id']), + ( + 'idx_package_resource_pkg_id_resource_id', 'package_resource', + ['package_id', 'id'] + ), + ( + 'idx_package_resource_rev_id', 'package_resource_revision', + ['revision_id'] + ), + ('idx_package_extra_rev_id', 'package_extra_revision', ['revision_id']), +) + + +def upgrade(): + for name, table, columns in indexes: + op.create_index(name, table, columns) + + +def downgrade(): + for name, table, _ in indexes: + op.drop_index(name, table) diff --git a/ckan/migration/versions/021_postgres_downgrade.sql b/ckan/migration/versions/021_postgres_downgrade.sql deleted file mode 100644 index 332126148a4..00000000000 --- a/ckan/migration/versions/021_postgres_downgrade.sql +++ /dev/null @@ -1 +0,0 @@ -# NOP \ No newline at end of file diff --git a/ckan/migration/versions/021_postgres_upgrade.sql b/ckan/migration/versions/021_postgres_upgrade.sql deleted file mode 100644 index af97af7e462..00000000000 --- a/ckan/migration/versions/021_postgres_upgrade.sql +++ /dev/null @@ -1,73 +0,0 @@ -CREATE INDEX idx_extra_pkg_id ON package_extra (package_id); -CREATE INDEX idx_extra_id_pkg_id ON package_extra (id, package_id); - -CREATE INDEX idx_group_pkg_id ON package_group (package_id); -CREATE INDEX idx_extra_grp_id_pkg_id ON package_group (group_id, package_id); - -CREATE INDEX idx_pkg_id ON package (id); -CREATE INDEX idx_pkg_name ON package (name); -CREATE INDEX idx_pkg_title ON package (title); -CREATE INDEX idx_pkg_lname ON package (lower(name)); -CREATE INDEX idx_pkg_uname ON package (upper(name)); -CREATE INDEX idx_pkg_rev_id ON package (revision_id); - -CREATE INDEX idx_pkg_sid ON package (id,state); -CREATE INDEX idx_pkg_sname ON package (name,state); -CREATE INDEX idx_pkg_stitle ON package (title,state); -CREATE INDEX idx_pkg_slname ON package (lower(name),state); -CREATE INDEX idx_pkg_suname ON package (upper(name),state); -CREATE INDEX idx_pkg_srev_id ON package (revision_id,state); - -CREATE INDEX idx_pkg_revision_id ON package_revision (id); -CREATE INDEX idx_pkg_revision_name ON package_revision (name); -CREATE INDEX idx_pkg_revision_rev_id ON package_revision (revision_id); - -CREATE INDEX idx_rev_state ON revision (state); - -CREATE INDEX idx_tag_id ON tag (id); -CREATE INDEX idx_tag_name ON tag (name); - -CREATE INDEX idx_package_tag_id ON package_tag (id); -CREATE INDEX idx_package_tag_tag_id ON package_tag (tag_id); -CREATE INDEX idx_package_tag_pkg_id ON package_tag (package_id); -CREATE INDEX idx_package_tag_pkg_id_tag_id ON package_tag (tag_id, package_id); - -CREATE INDEX idx_package_tag_revision_id ON package_tag_revision (id); -CREATE INDEX idx_package_tag_revision_tag_id ON package_tag_revision (tag_id); -CREATE INDEX idx_package_tag_revision_rev_id ON package_tag_revision (revision_id); -CREATE INDEX idx_package_tag_revision_pkg_id ON package_tag_revision (package_id); -CREATE INDEX idx_package_tag_revision_pkg_id_tag_id ON package_tag_revision (tag_id, package_id); - -CREATE INDEX idx_rating_id ON rating (id); -CREATE INDEX idx_rating_user_id ON rating (user_id); -CREATE INDEX idx_rating_package_id ON rating (package_id); - -CREATE INDEX idx_user_id ON "user" (id); -CREATE INDEX idx_user_name ON "user" (name); - -CREATE INDEX idx_uor_id ON user_object_role (id); -CREATE INDEX idx_uor_user_id ON user_object_role (user_id); -CREATE INDEX idx_uor_context ON user_object_role (context); -CREATE INDEX idx_uor_role ON user_object_role (role); - -CREATE INDEX idx_uor_user_id_role ON user_object_role (user_id,role); -CREATE INDEX idx_ra_role ON role_action (role); -CREATE INDEX idx_ra_action ON role_action (action); -CREATE INDEX idx_ra_role_action ON role_action (action,role); - -CREATE INDEX idx_group_id ON "group" (id); -CREATE INDEX idx_group_name ON "group" (name); - -CREATE INDEX idx_package_group_id ON package_group (id); -CREATE INDEX idx_package_group_group_id ON package_group (group_id); -CREATE INDEX idx_package_group_pkg_id ON package_group (package_id); -CREATE INDEX idx_package_group_pkg_id_group_id ON package_group (group_id, package_id); - -CREATE INDEX idx_package_resource_id ON package_resource (id); -CREATE INDEX idx_package_resource_url ON package_resource (url); -CREATE INDEX idx_package_resource_pkg_id ON package_resource (package_id); -CREATE INDEX idx_package_resource_pkg_id_resource_id ON package_resource (package_id, id); - -CREATE INDEX idx_package_resource_rev_id ON package_resource_revision (revision_id); -CREATE INDEX idx_package_extra_rev_id ON package_extra_revision (revision_id); - diff --git a/ckan/migration/versions/021_postgresql_downgrade.sql b/ckan/migration/versions/021_postgresql_downgrade.sql deleted file mode 100644 index 332126148a4..00000000000 --- a/ckan/migration/versions/021_postgresql_downgrade.sql +++ /dev/null @@ -1 +0,0 @@ -# NOP \ No newline at end of file diff --git a/ckan/migration/versions/021_postgresql_upgrade.sql b/ckan/migration/versions/021_postgresql_upgrade.sql deleted file mode 100644 index af97af7e462..00000000000 --- a/ckan/migration/versions/021_postgresql_upgrade.sql +++ /dev/null @@ -1,73 +0,0 @@ -CREATE INDEX idx_extra_pkg_id ON package_extra (package_id); -CREATE INDEX idx_extra_id_pkg_id ON package_extra (id, package_id); - -CREATE INDEX idx_group_pkg_id ON package_group (package_id); -CREATE INDEX idx_extra_grp_id_pkg_id ON package_group (group_id, package_id); - -CREATE INDEX idx_pkg_id ON package (id); -CREATE INDEX idx_pkg_name ON package (name); -CREATE INDEX idx_pkg_title ON package (title); -CREATE INDEX idx_pkg_lname ON package (lower(name)); -CREATE INDEX idx_pkg_uname ON package (upper(name)); -CREATE INDEX idx_pkg_rev_id ON package (revision_id); - -CREATE INDEX idx_pkg_sid ON package (id,state); -CREATE INDEX idx_pkg_sname ON package (name,state); -CREATE INDEX idx_pkg_stitle ON package (title,state); -CREATE INDEX idx_pkg_slname ON package (lower(name),state); -CREATE INDEX idx_pkg_suname ON package (upper(name),state); -CREATE INDEX idx_pkg_srev_id ON package (revision_id,state); - -CREATE INDEX idx_pkg_revision_id ON package_revision (id); -CREATE INDEX idx_pkg_revision_name ON package_revision (name); -CREATE INDEX idx_pkg_revision_rev_id ON package_revision (revision_id); - -CREATE INDEX idx_rev_state ON revision (state); - -CREATE INDEX idx_tag_id ON tag (id); -CREATE INDEX idx_tag_name ON tag (name); - -CREATE INDEX idx_package_tag_id ON package_tag (id); -CREATE INDEX idx_package_tag_tag_id ON package_tag (tag_id); -CREATE INDEX idx_package_tag_pkg_id ON package_tag (package_id); -CREATE INDEX idx_package_tag_pkg_id_tag_id ON package_tag (tag_id, package_id); - -CREATE INDEX idx_package_tag_revision_id ON package_tag_revision (id); -CREATE INDEX idx_package_tag_revision_tag_id ON package_tag_revision (tag_id); -CREATE INDEX idx_package_tag_revision_rev_id ON package_tag_revision (revision_id); -CREATE INDEX idx_package_tag_revision_pkg_id ON package_tag_revision (package_id); -CREATE INDEX idx_package_tag_revision_pkg_id_tag_id ON package_tag_revision (tag_id, package_id); - -CREATE INDEX idx_rating_id ON rating (id); -CREATE INDEX idx_rating_user_id ON rating (user_id); -CREATE INDEX idx_rating_package_id ON rating (package_id); - -CREATE INDEX idx_user_id ON "user" (id); -CREATE INDEX idx_user_name ON "user" (name); - -CREATE INDEX idx_uor_id ON user_object_role (id); -CREATE INDEX idx_uor_user_id ON user_object_role (user_id); -CREATE INDEX idx_uor_context ON user_object_role (context); -CREATE INDEX idx_uor_role ON user_object_role (role); - -CREATE INDEX idx_uor_user_id_role ON user_object_role (user_id,role); -CREATE INDEX idx_ra_role ON role_action (role); -CREATE INDEX idx_ra_action ON role_action (action); -CREATE INDEX idx_ra_role_action ON role_action (action,role); - -CREATE INDEX idx_group_id ON "group" (id); -CREATE INDEX idx_group_name ON "group" (name); - -CREATE INDEX idx_package_group_id ON package_group (id); -CREATE INDEX idx_package_group_group_id ON package_group (group_id); -CREATE INDEX idx_package_group_pkg_id ON package_group (package_id); -CREATE INDEX idx_package_group_pkg_id_group_id ON package_group (group_id, package_id); - -CREATE INDEX idx_package_resource_id ON package_resource (id); -CREATE INDEX idx_package_resource_url ON package_resource (url); -CREATE INDEX idx_package_resource_pkg_id ON package_resource (package_id); -CREATE INDEX idx_package_resource_pkg_id_resource_id ON package_resource (package_id, id); - -CREATE INDEX idx_package_resource_rev_id ON package_resource_revision (revision_id); -CREATE INDEX idx_package_extra_rev_id ON package_extra_revision (revision_id); - diff --git a/ckan/migration/versions/022_7b324ca6c0dc_add_group_extras.py b/ckan/migration/versions/022_7b324ca6c0dc_add_group_extras.py new file mode 100644 index 00000000000..d7230ca9000 --- /dev/null +++ b/ckan/migration/versions/022_7b324ca6c0dc_add_group_extras.py @@ -0,0 +1,29 @@ +"""022 Add group_extras + +Revision ID: 7b324ca6c0dc +Revises: c7743043ed99 +Create Date: 2018-09-04 18:48:56.635671 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '7b324ca6c0dc' +down_revision = '765143af2ba3' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'group_extra', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('group_id', sa.UnicodeText, sa.ForeignKey('group.id')), + sa.Column('key', sa.UnicodeText), + sa.Column('value', sa.UnicodeText), + ) + + +def downgrade(): + op.drop_table('group_extra') diff --git a/ckan/migration/versions/022_add_group_extras.py b/ckan/migration/versions/022_add_group_extras.py deleted file mode 100644 index 06db6479a8a..00000000000 --- a/ckan/migration/versions/022_add_group_extras.py +++ /dev/null @@ -1,53 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset -import vdm.sqlalchemy -import uuid -from sqlalchemy import types - -from ckan.common import json - -class JsonType(types.TypeDecorator): - '''Store data as JSON serializing on save and unserializing on use. - ''' - impl = types.UnicodeText - - def process_bind_param(self, value, engine): - if value is None or value == {}: # ensure we stores nulls in db not json "null" - return None - else: - # ensure_ascii=False => allow unicode but still need to convert - return unicode(json.dumps(value, ensure_ascii=False)) - - def process_result_value(self, value, engine): - if value is None: - return None - else: - return json.loads(value) - - def copy(self): - return JsonType(self.impl.length) - -def make_uuid(): - return unicode(uuid.uuid4()) - - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - group_table = Table('group', metadata, autoload=True) - group_extra_table = Table('group_extra', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('group_id', UnicodeText, ForeignKey('group.id')), - Column('key', UnicodeText), - Column('value', JsonType), - ) - - group_extra_table.create() - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/023_87fdd05f0744_add_harvesting.py b/ckan/migration/versions/023_87fdd05f0744_add_harvesting.py new file mode 100644 index 00000000000..e7cb28f1afe --- /dev/null +++ b/ckan/migration/versions/023_87fdd05f0744_add_harvesting.py @@ -0,0 +1,49 @@ +"""023 Add harvesting + +Revision ID: 87fdd05f0744 +Revises: 7b324ca6c0dc +Create Date: 2018-09-04 18:48:56.975156 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '87fdd05f0744' +down_revision = '7b324ca6c0dc' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'harvest_source', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('status', sa.UnicodeText, server_default=u'New'), + sa.Column('url', sa.UnicodeText, unique=True, nullable=False), + sa.Column('description', sa.UnicodeText, default=u''), + sa.Column('user_ref', sa.UnicodeText, default=u''), + sa.Column('publisher_ref', sa.UnicodeText, default=u''), + sa.Column( + 'created', sa.DateTime, server_default=sa.func.current_timestamp() + ), + ) + + op.create_table( + 'harvesting_job', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('status', sa.UnicodeText, default=u'', nullable=False), + sa.Column( + 'created', sa.DateTime, server_default=sa.func.current_timestamp() + ), + sa.Column('user_ref', sa.UnicodeText, nullable=False), + sa.Column('report', sa.UnicodeText, default=u''), + sa.Column( + 'source_id', sa.UnicodeText, sa.ForeignKey('harvest_source.id') + ), + ) + + +def downgrade(): + op.drop_table('harvesting_job') + op.drop_table('harvest_source') diff --git a/ckan/migration/versions/023_add_harvesting.py b/ckan/migration/versions/023_add_harvesting.py deleted file mode 100644 index b110285cfcc..00000000000 --- a/ckan/migration/versions/023_add_harvesting.py +++ /dev/null @@ -1,42 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import datetime -import uuid -from migrate.changeset.constraint import PrimaryKeyConstraint - - -def make_uuid(): - return unicode(uuid.uuid4()) - -def upgrade(migrate_engine): - metadata = MetaData() - harvest_source_table = Table('harvest_source', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('status', UnicodeText, default=u'New'), - Column('url', UnicodeText, unique=True, nullable=False), - Column('description', UnicodeText, default=u''), - Column('user_ref', UnicodeText, default=u''), - Column('publisher_ref', UnicodeText, default=u''), - Column('created', DateTime, default=datetime.datetime.utcnow), - ) - - harvesting_job_table = Table('harvesting_job', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('status', UnicodeText, default=u'', nullable=False), - Column('created', DateTime, default=datetime.datetime.utcnow), - Column('user_ref', UnicodeText, nullable=False), - Column('report', UnicodeText, default=u''), - Column('source_id', UnicodeText, ForeignKey('harvest_source.id')), - ) - - metadata.bind = migrate_engine - harvest_source_table.create(checkfirst=True) - harvesting_job_table.create(checkfirst=True) - -def downgrade(migrate_engine): - metadata.bind = migrate_engine - harvesting_job_table.drop() - harvest_source_table.drop() - diff --git a/ckan/migration/versions/024_12981fe12484_add_harvested_document.py b/ckan/migration/versions/024_12981fe12484_add_harvested_document.py new file mode 100644 index 00000000000..a4ecc117e9f --- /dev/null +++ b/ckan/migration/versions/024_12981fe12484_add_harvested_document.py @@ -0,0 +1,29 @@ +"""024 Add harvested_document + +Revision ID: 12981fe12484 +Revises: 87fdd05f0744 +Create Date: 2018-09-04 18:48:57.309349 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '12981fe12484' +down_revision = '87fdd05f0744' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'harvested_document', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('created', sa.DateTime), + sa.Column('url', sa.UnicodeText, nullable=False), + sa.Column('content', sa.UnicodeText, nullable=False), + ) + + +def downgrade(): + op.drop_table('harvested_document') diff --git a/ckan/migration/versions/024_add_harvested_document.py b/ckan/migration/versions/024_add_harvested_document.py deleted file mode 100644 index 558e98cb6df..00000000000 --- a/ckan/migration/versions/024_add_harvested_document.py +++ /dev/null @@ -1,22 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import datetime - - -def upgrade(migrate_engine): - metadata = MetaData() - harvested_document_table = Table('harvested_document', metadata, - Column('id', UnicodeText, primary_key=True), - Column('created', DateTime), - Column('url', UnicodeText, nullable=False), - Column('content', UnicodeText, nullable=False), - ) - metadata.bind = migrate_engine - harvested_document_table.create() - -def downgrade(migrate_engine): - metadata.bind = migrate_engine - harvested_document_table.drop() - diff --git a/ckan/migration/versions/025_add_authorization_groups.py b/ckan/migration/versions/025_add_authorization_groups.py deleted file mode 100644 index 75c74e672e8..00000000000 --- a/ckan/migration/versions/025_add_authorization_groups.py +++ /dev/null @@ -1,58 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -from datetime import datetime -import migrate.changeset -import vdm.sqlalchemy -import uuid -from sqlalchemy import types - -def make_uuid(): - return unicode(uuid.uuid4()) - - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - user_table = Table('user', metadata, autoload=True) - - authorization_group_table = Table('authorization_group', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('name', UnicodeText), - Column('created', DateTime, default=datetime.now), - ) - - authorization_group_user_table = Table('authorization_group_user', metadata, - Column('authorization_group_id', UnicodeText, ForeignKey('authorization_group.id'), nullable=False), - Column('user_id', UnicodeText, ForeignKey('user.id'), nullable=False) - ) - - # make user nullable: - user_object_role_table = Table('user_object_role', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('user_id', UnicodeText, ForeignKey('user.id'), nullable=True), - Column('context', UnicodeText, nullable=False), - Column('role', UnicodeText) - ) - - authorization_group_role_table = Table('authorization_group_role', metadata, - Column('user_object_role_id', UnicodeText, ForeignKey('user_object_role.id'), primary_key=True), - Column('authorization_group_id', UnicodeText, ForeignKey('authorization_group.id')), - ) - - authorization_group_table.create() - authorization_group_user_table.create() - authorization_group_role_table.create() - authorization_group_id = Column('authorized_group_id', UnicodeText, - ForeignKey('authorization_group.id'), nullable=True) - authorization_group_id.create(user_object_role_table) - -def downgrade(migrate_engine): - raise NotImplementedError() - - - - diff --git a/ckan/migration/versions/025_b581622ad327_add_authorization_groups.py b/ckan/migration/versions/025_b581622ad327_add_authorization_groups.py new file mode 100644 index 00000000000..0c78a31c4f7 --- /dev/null +++ b/ckan/migration/versions/025_b581622ad327_add_authorization_groups.py @@ -0,0 +1,76 @@ +"""025 Add authorization groups + +Revision ID: b581622ad327 +Revises: 12981fe12484 +Create Date: 2018-09-04 18:48:57.649187 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'b581622ad327' +down_revision = '12981fe12484' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'authorization_group', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('name', sa.UnicodeText), + sa.Column( + 'created', sa.DateTime, server_default=sa.func.current_timestamp() + ), + ) + + op.create_table( + 'authorization_group_user', + sa.Column( + 'authorization_group_id', + sa.UnicodeText, + sa.ForeignKey('authorization_group.id'), + nullable=False + ), + sa.Column( + 'user_id', + sa.UnicodeText, + sa.ForeignKey('user.id'), + nullable=False + ) + ) + # make user nullable: + op.alter_column('user_object_role', 'user_id', nullable=True) + + op.create_table( + 'authorization_group_role', + sa.Column( + 'user_object_role_id', + sa.UnicodeText, + sa.ForeignKey('user_object_role.id'), + primary_key=True + ), + sa.Column( + 'authorization_group_id', sa.UnicodeText, + sa.ForeignKey('authorization_group.id') + ), + ) + + op.add_column( + 'user_object_role', + sa.Column( + 'authorized_group_id', + sa.UnicodeText, + sa.ForeignKey('authorization_group.id'), + nullable=True + ) + ) + + +def downgrade(): + op.drop_column('user_object_role', 'authorized_group_id') + op.drop_table('authorization_group_role') + op.alter_column('user_object_role', 'user_id', nullable=False) + op.drop_table('authorization_group_user') + op.drop_table('authorization_group') diff --git a/ckan/migration/versions/026_3615b25af443_authorization_group_user_pk.py b/ckan/migration/versions/026_3615b25af443_authorization_group_user_pk.py new file mode 100644 index 00000000000..a15ceecfcdd --- /dev/null +++ b/ckan/migration/versions/026_3615b25af443_authorization_group_user_pk.py @@ -0,0 +1,23 @@ +"""026 Authorization group user pk + +Revision ID: 3615b25af443 +Revises: b581622ad327 +Create Date: 2018-09-04 18:48:57.988110 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '3615b25af443' +down_revision = 'b581622ad327' +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + pass diff --git a/ckan/migration/versions/026_authorization_group_user_pk.py b/ckan/migration/versions/026_authorization_group_user_pk.py deleted file mode 100644 index 8e788a27c7f..00000000000 --- a/ckan/migration/versions/026_authorization_group_user_pk.py +++ /dev/null @@ -1,37 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -from datetime import datetime -import migrate.changeset -import vdm.sqlalchemy -import uuid -from sqlalchemy import types - -def make_uuid(): - return unicode(uuid.uuid4()) - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - user_table = Table('user', metadata, autoload=True) - - authorization_group_table = Table('authorization_group', metadata, autoload=True) - - authorization_group_role_table = Table('authorization_group_role', metadata, - Column('user_object_role_id', UnicodeText, ForeignKey('user_object_role.id'), primary_key=True), - Column('authorization_group_id', UnicodeText, ForeignKey('authorization_group.id')), - ) -## id = Column('id', UnicodeText, primary_key=True, default=make_uuid) -## id.create(table=authorization_group_role_table, -## primary_key_name='blum' -### unique_name='id' -## ) - -def downgrade(migrate_engine): - raise NotImplementedError() - - - - diff --git a/ckan/migration/versions/027_11e5745c6fc9_adjust_harvester.py b/ckan/migration/versions/027_11e5745c6fc9_adjust_harvester.py new file mode 100644 index 00000000000..8c445bc851d --- /dev/null +++ b/ckan/migration/versions/027_11e5745c6fc9_adjust_harvester.py @@ -0,0 +1,39 @@ +"""027 Adjust harvester + +Revision ID: 11e5745c6fc9 +Revises: 3615b25af443 +Create Date: 2018-09-04 18:48:58.333396 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '11e5745c6fc9' +down_revision = '3615b25af443' +branch_labels = None +depends_on = None + +table = 'harvested_document' + + +def upgrade(): + op.add_column(table, sa.Column('guid', sa.UnicodeText, server_default=u'')) + op.add_column( + table, + sa.Column( + 'source_id', sa.UnicodeText, sa.ForeignKey('harvest_source.id') + ) + ) + op.add_column( + table, + sa.Column('package_id', sa.UnicodeText, sa.ForeignKey('package.id')) + ) + op.drop_column(table, 'url') + + +def downgrade(): + op.drop_column(table, 'package_id') + op.drop_column(table, 'source_id') + op.drop_column(table, 'guid') + op.add_column(table, sa.Column('url', sa.UnicodeText, nullable=False)) diff --git a/ckan/migration/versions/027_adjust_harvester.py b/ckan/migration/versions/027_adjust_harvester.py deleted file mode 100644 index 4b4a6be39eb..00000000000 --- a/ckan/migration/versions/027_adjust_harvester.py +++ /dev/null @@ -1,34 +0,0 @@ -# encoding: utf-8 - -import warnings - -from sqlalchemy import exc as sa_exc -from sqlalchemy import * -from migrate import * -import migrate.changeset - -def upgrade(migrate_engine): - # ignore reflection warnings - with warnings.catch_warnings(): - warnings.simplefilter("ignore", category=sa_exc.SAWarning) - metadata = MetaData() - metadata.bind = migrate_engine - - harvest_source_table = Table('harvest_source', metadata, autoload=True) - package_table = Table('package', metadata, autoload=True) - - harvested_document_table = Table('harvested_document', metadata, - Column('url', UnicodeText, nullable=False), - Column('guid', UnicodeText, default=u''), - Column('source_id', UnicodeText, ForeignKey('harvest_source.id')), - Column('package_id', UnicodeText, ForeignKey('package.id')), - ) - - harvested_document_table.c.url.drop() - harvested_document_table.c.guid.create(harvested_document_table) - harvested_document_table.c.source_id.create(harvested_document_table) - harvested_document_table.c.package_id.create(harvested_document_table) - -def downgrade(migrate_engine): - raise NotImplementedError() - diff --git a/ckan/migration/versions/028_cdd68fe9ba21_drop_harvest_source_status.py b/ckan/migration/versions/028_cdd68fe9ba21_drop_harvest_source_status.py new file mode 100644 index 00000000000..f41b7d2af9c --- /dev/null +++ b/ckan/migration/versions/028_cdd68fe9ba21_drop_harvest_source_status.py @@ -0,0 +1,23 @@ +"""028 Drop harvest_source_status + +Revision ID: cdd68fe9ba21 +Revises: 11e5745c6fc9 +Create Date: 2018-09-04 18:48:58.674039 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'cdd68fe9ba21' +down_revision = '11e5745c6fc9' +branch_labels = None +depends_on = None + + +def upgrade(): + op.alter_column('harvest_source', 'status', nullable=False) + + +def downgrade(): + op.alter_column('harvest_source', 'status', nullable=True) diff --git a/ckan/migration/versions/028_drop_harvest_source_status.py b/ckan/migration/versions/028_drop_harvest_source_status.py deleted file mode 100644 index 0f906a92b27..00000000000 --- a/ckan/migration/versions/028_drop_harvest_source_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset - - -def upgrade(migrate_engine): - metadata = MetaData() - harvested_source_table = Table('harvest_source', metadata, - Column('status', UnicodeText, nullable=False), - ) - metadata.bind = migrate_engine - harvested_source_table.c.status.drop() - -def downgrade(): - raise NotImplementedError() - diff --git a/ckan/migration/versions/029_1bfdf4240915_version_groups.py b/ckan/migration/versions/029_1bfdf4240915_version_groups.py new file mode 100644 index 00000000000..e7a72103aaa --- /dev/null +++ b/ckan/migration/versions/029_1bfdf4240915_version_groups.py @@ -0,0 +1,106 @@ +"""029 Version groups + +Revision ID: 1bfdf4240915 +Revises: cdd68fe9ba21 +Create Date: 2018-09-04 18:48:59.007126 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '1bfdf4240915' +down_revision = 'cdd68fe9ba21' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'group_revision', sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('name', sa.UnicodeText, nullable=False), + sa.Column('title', sa.UnicodeText), + sa.Column('description', sa.UnicodeText), + sa.Column( + 'created', sa.DateTime, server_default=sa.func.current_timestamp() + ), sa.Column('state', sa.UnicodeText), + sa.Column( + 'revision_id', + sa.UnicodeText, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column('continuity_id', sa.UnicodeText, sa.ForeignKey('group.id')) + ) + + op.create_table( + 'package_group_revision', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('package_id', sa.UnicodeText, sa.ForeignKey('package.id')), + sa.Column('group_id', sa.UnicodeText, sa.ForeignKey('group.id')), + sa.Column('state', sa.UnicodeText), + sa.Column( + 'revision_id', + sa.UnicodeText, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column( + 'continuity_id', sa.UnicodeText, sa.ForeignKey('package_group.id') + ) + ) + + op.create_table( + 'group_extra_revision', + sa.Column( + 'id', + sa.UnicodeText, + primary_key=True, + ), sa.Column('group_id', sa.UnicodeText, sa.ForeignKey('group.id')), + sa.Column('key', sa.UnicodeText), sa.Column('value', sa.UnicodeText), + sa.Column('state', sa.UnicodeText), + sa.Column( + 'revision_id', + sa.UnicodeText, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column( + 'continuity_id', sa.UnicodeText, sa.ForeignKey('group_extra.id') + ) + ) + + op.add_column('group', sa.Column('state', sa.UnicodeText)) + op.add_column('group', sa.Column('revision_id', sa.UnicodeText)) + op.create_foreign_key( + 'group_revision_id_fkey', 'group', 'revision', ['revision_id'], ['id'] + ) + + op.add_column('package_group', sa.Column('state', sa.UnicodeText)) + op.add_column('package_group', sa.Column('revision_id', sa.UnicodeText)) + op.create_foreign_key( + 'package_group_revision_id_fkey', 'package_group', 'revision', + ['revision_id'], ['id'] + ) + + op.add_column('group_extra', sa.Column('state', sa.UnicodeText)) + op.add_column('group_extra', sa.Column('revision_id', sa.UnicodeText)) + op.create_foreign_key( + 'group_extra_revision_id_fkey', 'group_extra', 'revision', + ['revision_id'], ['id'] + ) + + +def downgrade(): + op.drop_column('group_extra', 'revision_id') + op.drop_column('group_extra', 'state') + + op.drop_column('package_group', 'revision_id') + op.drop_column('package_group', 'state') + + op.drop_column('group', 'revision_id') + op.drop_column('group', 'state') + + op.drop_table('group_extra_revision') + op.drop_table('package_group_revision') + op.drop_table('group_revision') diff --git a/ckan/migration/versions/029_version_groups.py b/ckan/migration/versions/029_version_groups.py deleted file mode 100644 index 4c930aa97f6..00000000000 --- a/ckan/migration/versions/029_version_groups.py +++ /dev/null @@ -1,174 +0,0 @@ -# encoding: utf-8 - -import uuid - -from sqlalchemy import * -from sqlalchemy import types -from migrate import * -from datetime import datetime -import migrate.changeset -from migrate.changeset.constraint import ForeignKeyConstraint - -from ckan.common import json - -class JsonType(types.TypeDecorator): - '''Store data as JSON serializing on save and unserializing on use. - ''' - impl = types.UnicodeText - - def process_bind_param(self, value, engine): - if value is None or value == {}: # ensure we stores nulls in db not json "null" - return None - else: - # ensure_ascii=False => allow unicode but still need to convert - return unicode(json.dumps(value, ensure_ascii=False)) - - def process_result_value(self, value, engine): - if value is None: - return None - else: - return json.loads(value) - - def copy(self): - return JsonType(self.impl.length) - -def make_uuid(): - return unicode(uuid.uuid4()) - - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - - group_table = Table('group', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('name', UnicodeText, unique=True, nullable=False), - Column('title', UnicodeText), - Column('description', UnicodeText), - Column('created', DateTime, default=datetime.now), - ) - - group_revision_table = Table('group_revision', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('name', UnicodeText, nullable=False), - Column('title', UnicodeText), - Column('description', UnicodeText), - Column('created', DateTime, default=datetime.now), - Column('state', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', UnicodeText, ForeignKey('group.id')) - ) - - package_group_table = Table('package_group', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('package_id', UnicodeText, ForeignKey('package.id')), - Column('group_id', UnicodeText, ForeignKey('group.id')), - ) - - package_group_revision_table = Table('package_group_revision', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('package_id', UnicodeText, ForeignKey('package.id')), - Column('group_id', UnicodeText, ForeignKey('group.id')), - Column('state', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', UnicodeText, ForeignKey('package_group.id')) - ) - - group_extra_table = Table('group_extra', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('group_id', UnicodeText, ForeignKey('group.id')), - Column('key', UnicodeText), - Column('value', JsonType), - ) - - group_extra_revision_table = Table('group_extra_revision', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('group_id', UnicodeText, ForeignKey('group.id')), - Column('key', UnicodeText), - Column('value', JsonType), - Column('state', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', UnicodeText, ForeignKey('group_extra.id')) - ) - - revision_table = Table('revision', metadata, autoload=True) - package_table = Table('package', metadata, autoload=True) - - rev_id = make_uuid() - q = revision_table.insert(values={'id': rev_id, - 'author': u'system', - 'message': u"Add versioning to groups, group_extras and package_groups", - 'timestamp': datetime.utcnow(), - 'state': u'active'}) - r = migrate_engine.execute(q) - - # handle groups: - - # BUG in sqlalchemy-migrate 0.4/0.5.4: "group" isn't escaped properly when sent to - # postgres. - # cf http://code.google.com/p/sqlalchemy-migrate/issues/detail?id=32 - - #state = Column('state', UnicodeText) - #revision_id = Column('revision_id', UnicodeText) - #state.create(group_table) - #revision_id.create(group_table) - migrate_engine.execute('ALTER TABLE "group" ADD COLUMN state TEXT') - migrate_engine.execute('ALTER TABLE "group" ADD COLUMN revision_id TEXT') - #q = group_table.update(values={'state': 'active', - # 'revision_id': rev_id}) - #migrate_engine.execute(q) - migrate_engine.execute('UPDATE "group" SET revision_id = \'%s\', state=\'active\'' % rev_id) - #fk = ForeignKeyConstraint(['revision_id'], [revision_table.c.id], table=group_table) - #fk.create(migrate_engine) - migrate_engine.execute('ALTER TABLE "group" ADD CONSTRAINT "group_revision_id_fkey" ' + \ - 'FOREIGN KEY (revision_id) REFERENCES revision(id)') - - group_revision_table.create() - for row in migrate_engine.execute(group_table.select()): - group_rev = dict(row.items()) - group_rev['continuity_id'] = group_rev['id'] - - # otherwise, this doesn't get mapped due to the bug above: - group_rev['state'] = u'active' - group_rev['revision_id'] = rev_id - - q = group_revision_table.insert(values=group_rev) - migrate_engine.execute(q) - - - state = Column('state', UnicodeText) - revision_id = Column('revision_id', UnicodeText) - state.create(package_group_table) - revision_id.create(package_group_table) - q = package_group_table.update(values={'state': u'active', - 'revision_id': rev_id}) - migrate_engine.execute(q) - fk = ForeignKeyConstraint(['revision_id'], [revision_table.c.id], table=package_group_table, name = 'package_group_revision_id_fkey') - fk.create(migrate_engine) - package_group_revision_table.create() - for row in migrate_engine.execute(package_group_table.select()): - pkg_group_rev = dict(row.items()) - pkg_group_rev['continuity_id'] = pkg_group_rev['id'] - q = package_group_revision_table.insert(values=pkg_group_rev) - migrate_engine.execute(q) - - state = Column('state', UnicodeText) - revision_id = Column('revision_id', UnicodeText) - state.create(group_extra_table) - revision_id.create(group_extra_table) - q = group_extra_table.update(values={'state': u'active', - 'revision_id': rev_id}) - migrate_engine.execute(q) - fk = ForeignKeyConstraint(['revision_id'], [revision_table.c.id], table=group_extra_table, name='group_extra_revision_id_fkey') - fk.create(migrate_engine) - group_extra_revision_table.create() - for row in migrate_engine.execute(group_extra_table.select()): - group_extra_rev = dict(row.items()) - group_extra_rev['continuity_id'] = group_rev['id'] - q = group_extra_revision_table.insert(values=group_extra_rev) - migrate_engine.execute(q) - - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/030_additional_user_attributes.py b/ckan/migration/versions/030_additional_user_attributes.py deleted file mode 100644 index 84808afbbae..00000000000 --- a/ckan/migration/versions/030_additional_user_attributes.py +++ /dev/null @@ -1,24 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from sqlalchemy import types -from migrate import * -from datetime import datetime -import migrate.changeset -import uuid - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - user_sql = 'ALTER TABLE "user" ADD openid TEXT' - migrate_engine.execute(user_sql) - user_sql = 'ALTER TABLE "user" ADD password TEXT' - migrate_engine.execute(user_sql) - user_sql = 'ALTER TABLE "user" ADD fullname TEXT' - migrate_engine.execute(user_sql) - user_sql = 'ALTER TABLE "user" ADD email TEXT' - migrate_engine.execute(user_sql) - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/030_b16cbf164c8a_additional_user_attributes.py b/ckan/migration/versions/030_b16cbf164c8a_additional_user_attributes.py new file mode 100644 index 00000000000..d918934c70d --- /dev/null +++ b/ckan/migration/versions/030_b16cbf164c8a_additional_user_attributes.py @@ -0,0 +1,29 @@ +"""030 Additional user_attributes + +Revision ID: b16cbf164c8a +Revises: 1bfdf4240915 +Create Date: 2018-09-04 18:48:59.340276 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'b16cbf164c8a' +down_revision = '1bfdf4240915' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('user', sa.Column('openid', sa.UnicodeText)) + op.add_column('user', sa.Column('password', sa.UnicodeText)) + op.add_column('user', sa.Column('fullname', sa.UnicodeText)) + op.add_column('user', sa.Column('email', sa.UnicodeText)) + + +def downgrade(): + op.drop_column('user', 'openid') + op.drop_column('user', 'password') + op.drop_column('user', 'fullname') + op.drop_column('user', 'email') diff --git a/ckan/migration/versions/031_1b05245167d6_move_openid_to_new_field.py b/ckan/migration/versions/031_1b05245167d6_move_openid_to_new_field.py new file mode 100644 index 00000000000..ad5d579dafa --- /dev/null +++ b/ckan/migration/versions/031_1b05245167d6_move_openid_to_new_field.py @@ -0,0 +1,23 @@ +"""031 Move openid to new_field + +Revision ID: 1b05245167d6 +Revises: b16cbf164c8a +Create Date: 2018-09-04 18:48:59.666938 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '1b05245167d6' +down_revision = 'b16cbf164c8a' +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + pass diff --git a/ckan/migration/versions/031_move_openid_to_new_field.py b/ckan/migration/versions/031_move_openid_to_new_field.py deleted file mode 100644 index 9a45cc51241..00000000000 --- a/ckan/migration/versions/031_move_openid_to_new_field.py +++ /dev/null @@ -1,39 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from sqlalchemy import types -from migrate import * -from datetime import datetime -import migrate.changeset -import uuid - - -def make_uuid(): - return unicode(uuid.uuid4()) - - -def upgrade(migrate_engine): - metadata = MetaData() - user_table = Table('user', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('name', UnicodeText), - Column('openid', UnicodeText), - Column('password', UnicodeText), - Column('fullname', UnicodeText), - Column('email', UnicodeText), - Column('apikey', UnicodeText, default=make_uuid), - Column('created', DateTime, default=datetime.now), - Column('about', UnicodeText), - ) - metadata.bind = migrate_engine - for row in migrate_engine.execute(user_table.select()): - user = dict(row.items()) - name = user.get('name').lower().strip() - if name.startswith('http://') or name.startswith('https://'): - user['openid'] = name - q = user_table.update(user_table.c.id==user.get('id'), - values=user) - migrate_engine.execute(q) - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/032_add_extra_info_field_to_resources.py b/ckan/migration/versions/032_add_extra_info_field_to_resources.py deleted file mode 100644 index 46ab4b98ff7..00000000000 --- a/ckan/migration/versions/032_add_extra_info_field_to_resources.py +++ /dev/null @@ -1,20 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from sqlalchemy import types -from migrate import * -from datetime import datetime -import migrate.changeset -import uuid - - -def upgrade(migrate_engine): - metadata = MetaData(migrate_engine) - user_sql = 'ALTER TABLE package_resource ADD COLUMN extras text' - migrate_engine.execute(user_sql) - user_sql = 'ALTER TABLE package_resource_revision ADD COLUMN extras text' - migrate_engine.execute(user_sql) - -def downgrade(): - raise NotImplementedError() - diff --git a/ckan/migration/versions/032_d89e0731422d_add_extra_info_field_to_resources.py b/ckan/migration/versions/032_d89e0731422d_add_extra_info_field_to_resources.py new file mode 100644 index 00000000000..7ad8607049e --- /dev/null +++ b/ckan/migration/versions/032_d89e0731422d_add_extra_info_field_to_resources.py @@ -0,0 +1,27 @@ +"""032 Add extra info field_to_resources + +Revision ID: d89e0731422d +Revises: 1b05245167d6 +Create Date: 2018-09-04 18:49:00.003141 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'd89e0731422d' +down_revision = '1b05245167d6' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('package_resource', sa.Column('extras', sa.UnicodeText)) + op.add_column( + 'package_resource_revision', sa.Column('extras', sa.UnicodeText) + ) + + +def downgrade(): + op.drop_column('package_resource', 'extras') + op.drop_column('package_resource_revision', 'extras') diff --git a/ckan/migration/versions/033_6da92ef2df15_auth_group_user_id_add_conditional.py b/ckan/migration/versions/033_6da92ef2df15_auth_group_user_id_add_conditional.py new file mode 100644 index 00000000000..a2feaa1037f --- /dev/null +++ b/ckan/migration/versions/033_6da92ef2df15_auth_group_user_id_add_conditional.py @@ -0,0 +1,26 @@ +"""033 Auth group user id_add_conditional + +Revision ID: 6da92ef2df15 +Revises: d89e0731422d +Create Date: 2018-09-04 18:49:00.347621 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '6da92ef2df15' +down_revision = 'd89e0731422d' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('authorization_group_user', sa.Column('id', sa.UnicodeText)) + op.create_primary_key( + 'authorization_group_user_pkey', 'authorization_group_user', ['id'] + ) + + +def downgrade(): + op.drop_column('authorization_group_user', 'id') diff --git a/ckan/migration/versions/033_auth_group_user_id_add_conditional.py b/ckan/migration/versions/033_auth_group_user_id_add_conditional.py deleted file mode 100644 index dbe5fa6e1e6..00000000000 --- a/ckan/migration/versions/033_auth_group_user_id_add_conditional.py +++ /dev/null @@ -1,32 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import datetime -import uuid -from migrate.changeset.constraint import PrimaryKeyConstraint - - -def make_uuid(): - return unicode(uuid.uuid4()) - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - authorization_group_user_table = Table('authorization_group_user', - metadata, autoload=True) - - try: - ##check if id column already exists - authorization_group_user_table.c["id"] - return - except KeyError: - pass - - - id_col = Column('id', UnicodeText, primary_key=True, default=make_uuid) - id_col.create(authorization_group_user_table, - primary_key_name='authorization_group_user_pkey') - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/034_6c600693af5b_resource_group_table.py b/ckan/migration/versions/034_6c600693af5b_resource_group_table.py new file mode 100644 index 00000000000..8696b41193d --- /dev/null +++ b/ckan/migration/versions/034_6c600693af5b_resource_group_table.py @@ -0,0 +1,158 @@ +"""034 Resource group table + +Revision ID: 6c600693af5b +Revises: 6da92ef2df15 +Create Date: 2018-09-04 18:49:00.683101 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '6c600693af5b' +down_revision = '6da92ef2df15' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'resource_group', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('package_id', sa.UnicodeText, sa.ForeignKey('package.id')), + sa.Column('label', sa.UnicodeText), + sa.Column('sort_order', sa.UnicodeText), + sa.Column('extras', sa.UnicodeText), + sa.Column('state', sa.UnicodeText), + sa.Column('revision_id', sa.UnicodeText, sa.ForeignKey('revision.id')), + ) + + op.create_table( + 'resource_group_revision', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('package_id', sa.UnicodeText, sa.ForeignKey('package.id')), + sa.Column('label', sa.UnicodeText), + sa.Column('sort_order', sa.UnicodeText), + sa.Column('extras', sa.UnicodeText), + sa.Column('state', sa.UnicodeText), + sa.Column( + 'revision_id', + sa.UnicodeText, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column( + 'continuity_id', sa.UnicodeText, + sa.ForeignKey('resource_group.id') + ) + ) + op.alter_column( + 'package_resource', 'package_id', new_column_name='resource_group_id' + ) + op.alter_column( + 'package_resource_revision', + 'package_id', + new_column_name='resource_group_id' + ) + + op.rename_table('package_resource', 'resource') + op.rename_table('package_resource_revision', 'resource_revision') + op.execute('ALTER INDEX package_resource_pkey RENAME TO resource_pkey') + op.execute( + 'ALTER INDEX package_resource_revision_pkey RENAME TO resource_revision_pkey' + ) + + op.drop_constraint( + 'package_resource_revision_continuity_id_fkey', 'resource_revision' + ) + op.drop_constraint( + 'package_resource_revision_package_id_fkey', 'resource_revision' + ) + op.drop_constraint( + 'package_resource_revision_revision_id_fkey', 'resource_revision' + ) + op.drop_constraint('package_resource_revision_id_fkey', 'resource') + op.drop_constraint('package_resource_package_id_fkey', 'resource') + + op.create_foreign_key( + 'resource_resource_group_id_fkey', 'resource', 'resource_group', + ['resource_group_id'], ['id'] + ) + op.create_foreign_key( + 'resource_revision_id_fkey', 'resource', 'revision', ['revision_id'], + ['id'] + ) + op.create_foreign_key( + 'resource_revision_continuity_id_fkey', 'resource_revision', + 'resource', ['continuity_id'], ['id'] + ) + op.create_foreign_key( + 'resource_revision_resource_group_id_fkey', 'resource_revision', + 'resource_group', ['resource_group_id'], ['id'] + ) + op.create_foreign_key( + 'resource_revision_revision_id_fkey', 'resource_revision', 'revision', + ['revision_id'], ['id'] + ) + + +def downgrade(): + op.drop_constraint('resource_resource_group_id_fkey', 'resource') + op.drop_constraint('resource_revision_id_fkey', 'resource') + op.drop_constraint( + 'resource_revision_continuity_id_fkey', 'resource_revision' + ) + op.drop_constraint( + 'resource_revision_resource_group_id_fkey', 'resource_revision' + ) + op.drop_constraint( + 'resource_revision_revision_id_fkey', 'resource_revision' + ) + + op.rename_table('resource_revision', 'package_resource_revision') + op.rename_table('resource', 'package_resource') + op.execute('ALTER INDEX resource_pkey RENAME TO package_resource_pkey') + op.execute( + 'ALTER INDEX resource_revision_pkey RENAME TO package_resource_revision_pkey' + ) + + op.alter_column( + 'package_resource_revision', + 'resource_group_id', + new_column_name='package_id' + ) + op.alter_column( + 'package_resource', 'resource_group_id', new_column_name='package_id' + ) + + op.create_foreign_key( + 'package_resource_package_id_fkey', 'package_resource', 'package', + ['package_id'], ['id'] + ) + op.create_foreign_key( + 'package_resource_revision_id_fkey', 'package_resource', 'revision', + ['revision_id'], ['id'] + ) + op.create_foreign_key( + 'package_resource_revision_revision_id_fkey', + 'package_resource_revision', 'revision', ['revision_id'], ['id'] + ) + op.create_foreign_key( + 'package_resource_revision_package_id_fkey', + 'package_resource_revision', 'package', ['package_id'], ['id'] + ) + op.create_foreign_key( + 'package_resource_revision_continuity_id_fkey', + 'package_resource_revision', 'package_resource', ['continuity_id'], + ['id'] + ) + op.create_index( + 'idx_package_resource_pkg_id', 'package_resource', ['package_id'] + ) + op.create_index( + 'idx_package_resource_pkg_id_resource_id', 'package_resource', + ['package_id', 'id'] + ) + + op.drop_table('resource_group_revision') + op.drop_table('resource_group') diff --git a/ckan/migration/versions/034_resource_group_table.py b/ckan/migration/versions/034_resource_group_table.py deleted file mode 100644 index 5e38e5db641..00000000000 --- a/ckan/migration/versions/034_resource_group_table.py +++ /dev/null @@ -1,209 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import datetime -import uuid -import migrate.changeset -from migrate.changeset.constraint import PrimaryKeyConstraint -from ckan.model.types import JsonDictType - -def make_uuid(): - return unicode(uuid.uuid4()) - -def upgrade(migrate_engine): - - metadata = MetaData(migrate_engine) - - package = Table('package', metadata, autoload=True) - - resource = Table( - 'package_resource', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('package_id', UnicodeText, ForeignKey('package.id')), - Column('url', UnicodeText, nullable=False), - Column('format', UnicodeText), - Column('description', UnicodeText), - Column('hash', UnicodeText), - Column('position', Integer), - Column('extras', JsonDictType), - Column('state', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id'), primary_key=True), - ) - - resource_revision = Table( - 'package_resource_revision', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('package_id', UnicodeText), - Column('url', UnicodeText, nullable=False), - Column('format', UnicodeText), - Column('description', UnicodeText), - Column('hash', UnicodeText), - Column('position', Integer), - Column('extras', JsonDictType), - Column('state', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', UnicodeText, ForeignKey('package_resource.id')) - ) - - resource_group = Table( - 'resource_group', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('package_id', UnicodeText, ForeignKey('package.id')), - Column('label', UnicodeText), - Column('sort_order', UnicodeText), - Column('extras', JsonDictType), - Column('state', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id')), - ) - - resource_group_revision = Table( - 'resource_group_revision', metadata, - Column('id', UnicodeText, primary_key=True, default=make_uuid), - Column('package_id', UnicodeText, ForeignKey('package.id')), - Column('label', UnicodeText), - Column('sort_order', UnicodeText), - Column('extras', JsonDictType), - Column('state', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', UnicodeText, ForeignKey('resource_group.id')) - ) - - resource_count = migrate_engine.execute('''select count(*) from package_resource''').first()[0] - package_count = migrate_engine.execute('''select count(*) from package''').first()[0] - - - # change field names - resource.c.package_id.alter(name = 'resource_group_id') - resource_revision.c.package_id.alter(name = 'resource_group_id') - - # rename tables - resource.rename('resource') - resource_revision.rename('resource_revision') - - # make new tables - metadata.create_all(migrate_engine) - - # drop all constaints - migrate_engine.execute(''' -ALTER TABLE resource_revision - DROP CONSTRAINT package_resource_revision_pkey; - -ALTER TABLE resource - DROP CONSTRAINT package_resource_revision_id_fkey; - -ALTER TABLE resource_revision - DROP CONSTRAINT package_resource_revision_continuity_id_fkey; - -ALTER TABLE resource_revision - DROP CONSTRAINT package_resource_revision_package_id_fkey; - -ALTER TABLE resource_revision - DROP CONSTRAINT package_resource_revision_revision_id_fkey; - -ALTER TABLE resource - DROP CONSTRAINT package_resource_pkey; - -ALTER TABLE resource - DROP CONSTRAINT package_resource_package_id_fkey; -''') - - - # do data transfer - # give resource group a hashed version of package uuid - # so that we can use the same hash calculation on - # the resource and resource revision table - migrate_engine.execute(''' -insert into resource_group - select - %s, id, 'default', null, null, state, revision_id - from - package; -''' % make_new_uuid("id") -) - - migrate_engine.execute(''' -insert into resource_group_revision - select - id, package_id, 'default', null, null, state, revision_id, id - from - resource_group; -''' -) - - ## update resource table with new ids generated from the - migrate_engine.execute('update resource set resource_group_id = %s' - % make_new_uuid('resource_group_id')) - - migrate_engine.execute('update resource_revision set resource_group_id = %s' - % make_new_uuid('resource_group_id')) - -##add back contraints - - migrate_engine.execute(''' -ALTER TABLE resource - ADD CONSTRAINT resource_pkey PRIMARY KEY (id); - -ALTER TABLE resource_revision - ADD CONSTRAINT resource_revision_pkey PRIMARY KEY (id, revision_id); - -ALTER TABLE resource - ADD CONSTRAINT resource_resource_group_id_fkey FOREIGN KEY (resource_group_id) REFERENCES resource_group(id); - -ALTER TABLE resource - ADD CONSTRAINT resource_revision_id_fkey FOREIGN KEY (revision_id) REFERENCES revision(id); - -ALTER TABLE resource_revision - ADD CONSTRAINT resource_revision_continuity_id_fkey FOREIGN KEY (continuity_id) REFERENCES resource(id); - -ALTER TABLE resource_revision - ADD CONSTRAINT resource_revision_resource_group_id_fkey FOREIGN KEY (resource_group_id) REFERENCES resource_group(id); - -ALTER TABLE resource_revision - ADD CONSTRAINT resource_revision_revision_id_fkey FOREIGN KEY (revision_id) REFERENCES revision(id); -''') - - resource_count_after = migrate_engine.execute('''select count(*) from resource''').first()[0] - resource_group_after = migrate_engine.execute('''select count(*) from resource_group''').first()[0] - package_count_after = migrate_engine.execute('''select count(*) from package''').first()[0] - - all_joined = migrate_engine.execute('''select count(*) from package p - join resource_group rg on rg.package_id = p.id - join resource r on r.resource_group_id = rg.id - ''').first()[0] - - all_uuids = migrate_engine.execute(''' - select count(*) from - (select id from resource union - select id from resource_group union - select id from package) sub - ''').first()[0] - - assert resource_count_after == resource_count - assert resource_group_after == package_count - assert package_count_after == package_count - - ## this makes sure all uuids are unique (union dedupes) - assert all_uuids == resource_count + package_count * 2 - - ## this makes sure all uuids are unique (union dedupes) - assert all_joined == resource_count - - - -def make_new_uuid(column_name): - - out = '''substring(md5(%s), 1, 8) || '-' || - substring(md5(%s), 9, 4) || '-' || - substring(md5(%s), 13, 4) || '-' || - substring(md5(%s), 17, 4) || '-' || - substring(md5(%s), 21, 12)''' - - return out % tuple([column_name] * 5) - - - - - -def downgrade(migrate_engine): - raise NotImplementedError() diff --git a/ckan/migration/versions/035_81148ccebd6c_harvesting_doc_versioning.py b/ckan/migration/versions/035_81148ccebd6c_harvesting_doc_versioning.py new file mode 100644 index 00000000000..71fddce62d0 --- /dev/null +++ b/ckan/migration/versions/035_81148ccebd6c_harvesting_doc_versioning.py @@ -0,0 +1,91 @@ +"""035 Harvesting doc versioning + +Revision ID: 81148ccebd6c +Revises: 6c600693af5b +Create Date: 2018-09-04 18:49:01.017635 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '81148ccebd6c' +down_revision = '6c600693af5b' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'harvested_document_revision', + sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('guid', sa.UnicodeText), sa.Column('created', sa.TIMESTAMP), + sa.Column('content', sa.UnicodeText, nullable=False), + sa.Column('source_id', sa.UnicodeText), + sa.Column('package_id', sa.UnicodeText), + sa.Column('state', sa.UnicodeText), + sa.Column('revision_id', sa.UnicodeText, nullable=False), + sa.Column('continuity_id', sa.UnicodeText) + ) + + op.add_column('harvested_document', sa.Column('state', sa.UnicodeText)) + op.add_column( + 'harvested_document', sa.Column('revision_id', sa.UnicodeText) + ) + + op.create_primary_key( + 'harvested_document_revision_pkey', 'harvested_document_revision', + ['id', 'revision_id'] + ) + op.create_foreign_key( + 'harvested_document_revision_id_fkey', 'harvested_document', + 'revision', ['revision_id'], ['id'] + ) + op.create_foreign_key( + 'harvested_document_revision_continuity_id_fkey', + 'harvested_document_revision', 'harvested_document', ['continuity_id'], + ['id'] + ) + op.create_foreign_key( + 'harvested_document_revision_package_id_fkey', + 'harvested_document_revision', 'package', ['package_id'], ['id'] + ) + + op.create_foreign_key( + 'harvested_document_revision_revision_id_fkey', + 'harvested_document_revision', 'revision', ['revision_id'], ['id'] + ) + op.create_foreign_key( + 'harvested_document_revision_source_id_fkey', + 'harvested_document_revision', 'harvest_source', ['source_id'], ['id'] + ) + + +def downgrade(): + op.drop_constraint( + 'harvested_document_revision_source_id_fkey', + 'harvested_document_revision' + ) + op.drop_constraint( + 'harvested_document_revision_revision_id_fkey', + 'harvested_document_revision' + ) + op.drop_constraint( + 'harvested_document_revision_package_id_fkey', + 'harvested_document_revision' + ) + op.drop_constraint( + 'harvested_document_revision_continuity_id_fkey', + 'harvested_document_revision' + ) + op.drop_constraint( + 'harvested_document_revision_id_fkey', 'harvested_document' + ) + op.drop_constraint( + 'harvested_document_revision_pkey', 'harvested_document_revision' + ) + + op.drop_column('harvested_document', 'state') + op.drop_column('harvested_document', 'revision_id') + + op.drop_table('harvested_document_revision') diff --git a/ckan/migration/versions/035_harvesting_doc_versioning.py b/ckan/migration/versions/035_harvesting_doc_versioning.py deleted file mode 100644 index bbdcae8e9dd..00000000000 --- a/ckan/migration/versions/035_harvesting_doc_versioning.py +++ /dev/null @@ -1,50 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import datetime -import uuid -import migrate.changeset -from migrate.changeset.constraint import PrimaryKeyConstraint -from ckan.model.types import JsonDictType - -def upgrade(migrate_engine): - metadata = MetaData(migrate_engine) - - migrate_engine.execute(''' - - CREATE TABLE harvested_document_revision ( - id text NOT NULL, - guid text, - created timestamp without time zone, - content text NOT NULL, - source_id text, - package_id text, - state text, - revision_id text NOT NULL, - continuity_id text - ); - - ALTER TABLE harvested_document - ADD COLUMN state text, - ADD COLUMN revision_id text; - - ALTER TABLE harvested_document_revision - ADD CONSTRAINT harvested_document_revision_pkey PRIMARY KEY (id, revision_id); - - ALTER TABLE harvested_document - ADD CONSTRAINT harvested_document_revision_id_fkey FOREIGN KEY (revision_id) REFERENCES revision(id); - - ALTER TABLE harvested_document_revision - ADD CONSTRAINT harvested_document_revision_continuity_id_fkey FOREIGN KEY (continuity_id) REFERENCES harvested_document(id); - - ALTER TABLE harvested_document_revision - ADD CONSTRAINT harvested_document_revision_package_id_fkey FOREIGN KEY (package_id) REFERENCES package(id); - - ALTER TABLE harvested_document_revision - ADD CONSTRAINT harvested_document_revision_revision_id_fkey FOREIGN KEY (revision_id) REFERENCES revision(id); - - ALTER TABLE harvested_document_revision - ADD CONSTRAINT harvested_document_revision_source_id_fkey FOREIGN KEY (source_id) REFERENCES harvest_source(id); - ''' - ) diff --git a/ckan/migration/versions/036_ecaa8b38782f_lockdown_roles.py b/ckan/migration/versions/036_ecaa8b38782f_lockdown_roles.py new file mode 100644 index 00000000000..c37f1ba7957 --- /dev/null +++ b/ckan/migration/versions/036_ecaa8b38782f_lockdown_roles.py @@ -0,0 +1,23 @@ +"""036 Lockdown roles + +Revision ID: ecaa8b38782f +Revises: 81148ccebd6c +Create Date: 2018-09-04 18:49:01.359019 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'ecaa8b38782f' +down_revision = '81148ccebd6c' +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + pass diff --git a/ckan/migration/versions/036_lockdown_roles.py b/ckan/migration/versions/036_lockdown_roles.py deleted file mode 100644 index fce82bf659f..00000000000 --- a/ckan/migration/versions/036_lockdown_roles.py +++ /dev/null @@ -1,37 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import datetime -import uuid -from migrate.changeset.constraint import PrimaryKeyConstraint - -def make_uuid(): - return unicode(uuid.uuid4()) - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - role_action = Table('role_action', metadata, autoload=True) - q = role_action.insert(values={'id': make_uuid(), 'role': 'editor', - 'action': 'read-site', 'context': ''}) - migrate_engine.execute(q) - q = role_action.insert(values={'id': make_uuid(), 'role': 'editor', - 'action': 'read-user', 'context': ''}) - migrate_engine.execute(q) - q = role_action.insert(values={'id': make_uuid(), 'role': 'editor', - 'action': 'create-user', 'context': ''}) - migrate_engine.execute(q) - q = role_action.insert(values={'id': make_uuid(), 'role': 'reader', - 'action': 'read-site', 'context': ''}) - migrate_engine.execute(q) - q = role_action.insert(values={'id': make_uuid(), 'role': 'reader', - 'action': 'read-user', 'context': ''}) - migrate_engine.execute(q) - q = role_action.insert(values={'id': make_uuid(), 'role': 'reader', - 'action': 'create-user', 'context': ''}) - migrate_engine.execute(q) - -def downgrade(migrate_engine): - raise NotImplementedError() - diff --git a/ckan/migration/versions/037_edcf3b8c3c1b_role_anon_editor.py b/ckan/migration/versions/037_edcf3b8c3c1b_role_anon_editor.py new file mode 100644 index 00000000000..09f9e3cb7e1 --- /dev/null +++ b/ckan/migration/versions/037_edcf3b8c3c1b_role_anon_editor.py @@ -0,0 +1,23 @@ +"""037 Role anon_editor + +Revision ID: edcf3b8c3c1b +Revises: ecaa8b38782f +Create Date: 2018-09-04 18:49:01.692660 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'edcf3b8c3c1b' +down_revision = 'ecaa8b38782f' +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + pass diff --git a/ckan/migration/versions/037_role_anon_editor.py b/ckan/migration/versions/037_role_anon_editor.py deleted file mode 100644 index e0af0557b00..00000000000 --- a/ckan/migration/versions/037_role_anon_editor.py +++ /dev/null @@ -1,50 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from sqlalchemy.sql import select, and_ -from migrate import * -import logging - -log = logging.getLogger(__name__) - -def upgrade(migrate_engine): - '''#1066 Change Visitor role on System from "reader" to "anon_editor".''' - metadata = MetaData(migrate_engine) - - # get visitor ID - user = Table('user', metadata, autoload=True) - s = select([user.c.id, user.c.name], - user.c.name == u'visitor') - results = migrate_engine.execute(s).fetchall() - if len(results) == 0: - log.debug('No visitor on the system - obviously init hasn\'t been run yet' \ - 'and that will init visitor to an anon_editor') - return - - visitor_id, visitor_name = results[0] - - # find visitor role as reader on system - uor = Table('user_object_role', metadata, autoload=True) - visitor_system_condition = and_(uor.c.context == u'System', - uor.c.user_id == visitor_id) - s = select([uor.c.context, uor.c.user_id, uor.c.role], - visitor_system_condition) - results = migrate_engine.execute(s).fetchall() - if len(results) != 1: - log.warn('Could not find a Right for a Visitor on the System') - return - context, user_id, role = results[0] - if role != 'reader': - log.info('Visitor right for the System is not "reader", so not upgrading it to anon_editor.') - return - - # change visitor role to anon_editor - log.info('Visitor is a "reader" on the System, so upgrading it to "anon_editor".') - sql = uor.update().where(visitor_system_condition).\ - values(role=u'anon_editor') - migrate_engine.execute(sql) - - -def downgrade(migrate_engine): - raise NotImplementedError() - diff --git a/ckan/migration/versions/038_delete_migration_tables.py b/ckan/migration/versions/038_delete_migration_tables.py deleted file mode 100644 index 72c90b24100..00000000000 --- a/ckan/migration/versions/038_delete_migration_tables.py +++ /dev/null @@ -1,12 +0,0 @@ -# encoding: utf-8 - -from migrate import * - -def upgrade(migrate_engine): - - migrate_engine.execute(''' -DROP TABLE harvested_document_revision, harvested_document, harvesting_job, harvest_source; -''') - - - diff --git a/ckan/migration/versions/038_fd6622e3d964_delete_migration_tables.py b/ckan/migration/versions/038_fd6622e3d964_delete_migration_tables.py new file mode 100644 index 00000000000..6ef7589caf4 --- /dev/null +++ b/ckan/migration/versions/038_fd6622e3d964_delete_migration_tables.py @@ -0,0 +1,101 @@ +"""038 Delete migration tables + +Revision ID: fd6622e3d964 +Revises: edcf3b8c3c1b +Create Date: 2018-09-04 18:49:02.023123 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'fd6622e3d964' +down_revision = 'edcf3b8c3c1b' +branch_labels = None +depends_on = None + + +def upgrade(): + op.drop_table('harvested_document_revision') + op.drop_table('harvested_document') + op.drop_table('harvesting_job') + op.drop_table('harvest_source') + + +def downgrade(): + op.create_table( + 'harvest_source', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('status', sa.UnicodeText, server_default=u'New'), + sa.Column('url', sa.UnicodeText, unique=True, nullable=False), + sa.Column('description', sa.UnicodeText, default=u''), + sa.Column('user_ref', sa.UnicodeText, default=u''), + sa.Column('publisher_ref', sa.UnicodeText, default=u''), + sa.Column( + 'created', sa.DateTime, server_default=sa.func.current_timestamp() + ), + ) + + op.create_table( + 'harvesting_job', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('status', sa.UnicodeText, default=u'', nullable=False), + sa.Column( + 'created', sa.DateTime, server_default=sa.func.current_timestamp() + ), + sa.Column('user_ref', sa.UnicodeText, nullable=False), + sa.Column('report', sa.UnicodeText, default=u''), + sa.Column( + 'source_id', sa.UnicodeText, sa.ForeignKey('harvest_source.id') + ), + ) + + op.create_table( + 'harvested_document', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('created', sa.DateTime), + sa.Column('content', sa.UnicodeText, nullable=False), + sa.Column('source_id', sa.UnicodeText), + sa.Column('package_id', sa.UnicodeText), + sa.Column('state', sa.UnicodeText), + sa.Column('revision_id', sa.UnicodeText, nullable=False), + sa.Column('guid', sa.UnicodeText), sa.Column('created', sa.TIMESTAMP), + ) + + op.create_table( + 'harvested_document_revision', + sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('guid', sa.UnicodeText), sa.Column('created', sa.TIMESTAMP), + sa.Column('content', sa.UnicodeText, nullable=False), + sa.Column('source_id', sa.UnicodeText), + sa.Column('package_id', sa.UnicodeText), + sa.Column('state', sa.UnicodeText), + sa.Column('revision_id', sa.UnicodeText, nullable=False), + sa.Column('continuity_id', sa.UnicodeText) + ) + op.create_primary_key( + 'harvested_document_revision_pkey', 'harvested_document_revision', + ['id', 'revision_id'] + ) + op.create_foreign_key( + 'harvested_document_revision_id_fkey', 'harvested_document', + 'revision', ['revision_id'], ['id'] + ) + op.create_foreign_key( + 'harvested_document_revision_continuity_id_fkey', + 'harvested_document_revision', 'harvested_document', ['continuity_id'], + ['id'] + ) + op.create_foreign_key( + 'harvested_document_revision_package_id_fkey', + 'harvested_document_revision', 'package', ['package_id'], ['id'] + ) + + op.create_foreign_key( + 'harvested_document_revision_revision_id_fkey', + 'harvested_document_revision', 'revision', ['revision_id'], ['id'] + ) + op.create_foreign_key( + 'harvested_document_revision_source_id_fkey', + 'harvested_document_revision', 'harvest_source', ['source_id'], ['id'] + ) diff --git a/ckan/migration/versions/039_add_expired_id_and_dates.py b/ckan/migration/versions/039_add_expired_id_and_dates.py deleted file mode 100644 index c10f5f17c7a..00000000000 --- a/ckan/migration/versions/039_add_expired_id_and_dates.py +++ /dev/null @@ -1,221 +0,0 @@ -# encoding: utf-8 - -from migrate import * -import uuid -import datetime - -def upgrade(migrate_engine): - - id = uuid.uuid4() - - make_missing_revisions = ''' - --- make sure all tables have an entry in the revision_table - -insert into revision values ('%(id)s' , '%(timestamp)s', 'admin', 'Admin: make sure every object has a row in a revision table', 'active'); - -insert into package_tag_revision (id,package_id,tag_id,revision_id,state,continuity_id) select id,package_id,tag_id, '%(id)s' ,state, id from package_tag where package_tag.id not in (select id from package_tag_revision); - -insert into resource_revision (id,resource_group_id,url,format,description,position,revision_id,hash,state,extras,continuity_id) select id,resource_group_id,url,format,description,position, '%(id)s' ,hash,state,extras, id from resource where resource.id not in (select id from resource_revision); - -insert into group_extra_revision (id,group_id,key,value,state,revision_id,continuity_id) select id,group_id,key,value,state, '%(id)s' , id from group_extra where group_extra.id not in (select id from group_extra_revision); - -insert into resource_group_revision (id,package_id,label,sort_order,extras,state,revision_id,continuity_id) select id,package_id,label,sort_order,extras,state, '%(id)s', id from resource_group where resource_group.id not in (select id from resource_group_revision); - -insert into package_extra_revision (id,package_id,key,value,revision_id,state,continuity_id) select id,package_id,key,value, '%(id)s',state, id from package_extra where package_extra.id not in (select id from package_extra_revision); - -insert into package_relationship_revision (id,subject_package_id,object_package_id,type,comment,revision_id,state,continuity_id) select id,subject_package_id,object_package_id,type,comment, '%(id)s',state, id from package_relationship where package_relationship.id not in (select id from package_relationship_revision); - -insert into group_revision (id,name,title,description,created,state,revision_id,continuity_id) select id,name,title,description,created,state, '%(id)s', id from "group" where "group".id not in (select id from group_revision); - -insert into package_revision (id,name,title,url,notes,license_id,revision_id,version,author,author_email,maintainer,maintainer_email,state,continuity_id) select id,name,title,url,notes,license_id, '%(id)s',version,author,author_email,maintainer,maintainer_email,state, id from package where package.id not in (select id from package_revision); - -''' % dict(id=id, timestamp=datetime.datetime.utcnow().isoformat()) - - - update_schema = ''' -ALTER TABLE package_revision - ADD COLUMN expired_id text, - ADD COLUMN revision_timestamp timestamp without time zone, - ADD COLUMN expired_timestamp timestamp without time zone, - ADD COLUMN current boolean; - -ALTER TABLE package_extra_revision - ADD COLUMN expired_id text, - ADD COLUMN revision_timestamp timestamp without time zone, - ADD COLUMN expired_timestamp timestamp without time zone, - ADD COLUMN current boolean; - -ALTER TABLE group_revision - ADD COLUMN expired_id text, - ADD COLUMN revision_timestamp timestamp without time zone, - ADD COLUMN expired_timestamp timestamp without time zone, - ADD COLUMN current boolean; - -ALTER TABLE group_extra_revision - ADD COLUMN expired_id text, - ADD COLUMN revision_timestamp timestamp without time zone, - ADD COLUMN expired_timestamp timestamp without time zone, - ADD COLUMN current boolean; - - -ALTER TABLE package_group_revision - ADD COLUMN expired_id text, - ADD COLUMN revision_timestamp timestamp without time zone, - ADD COLUMN expired_timestamp timestamp without time zone, - ADD COLUMN current boolean; - -ALTER TABLE package_tag_revision - ADD COLUMN expired_id text, - ADD COLUMN revision_timestamp timestamp without time zone, - ADD COLUMN expired_timestamp timestamp without time zone, - ADD COLUMN current boolean; - -ALTER TABLE resource_group_revision - ADD COLUMN expired_id text, - ADD COLUMN revision_timestamp timestamp without time zone, - ADD COLUMN expired_timestamp timestamp without time zone, - ADD COLUMN current boolean; - -ALTER TABLE resource_revision - ADD COLUMN expired_id text, - ADD COLUMN revision_timestamp timestamp without time zone, - ADD COLUMN expired_timestamp timestamp without time zone, - ADD COLUMN current boolean; - -ALTER TABLE package_relationship_revision - ADD COLUMN expired_id text, - ADD COLUMN revision_timestamp timestamp without time zone, - ADD COLUMN expired_timestamp timestamp without time zone, - ADD COLUMN current boolean; - -ALTER TABLE revision - ADD COLUMN approved_timestamp timestamp without time zone; - -create table tmp_expired_id(id text, revision_id text, revision_timestamp timestamp, expired_timestamp timestamp, expired_id text); -create index id_exp on tmp_expired_id(id, revision_id); - ---package revision -truncate tmp_expired_id; -insert into tmp_expired_id select pr.id, revision_id, timestamp, lead(timestamp, 1, '9999-12-31') over (partition by pr.id order by timestamp), lead(pr.revision_id) over (partition by pr.id order by timestamp) from package_revision pr join revision r on pr.revision_id = r.id; -update package_revision pr set revision_timestamp = (select revision_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_timestamp = (select expired_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_id = (select expired_id from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id); -update package_revision set current = '1' where expired_timestamp = '9999-12-31'; - -create index idx_package_period on package_revision(revision_timestamp, expired_timestamp, id); -create index idx_package_current on package_revision(current); - ---package extra revision -truncate tmp_expired_id; -insert into tmp_expired_id select pr.id, revision_id, timestamp, lead(timestamp, 1, '9999-12-31') over (partition by pr.id order by timestamp), lead(pr.revision_id) over (partition by pr.id order by timestamp) from package_extra_revision pr join revision r on pr.revision_id = r.id; -update package_extra_revision pr set revision_timestamp = (select revision_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_timestamp = (select expired_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_id = (select expired_id from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id); -update package_extra_revision set current = '1' where expired_timestamp = '9999-12-31'; - -create index idx_package_extra_period on package_extra_revision(revision_timestamp, expired_timestamp, id); -create index idx_package_extra_period_package on package_extra_revision(revision_timestamp, expired_timestamp, package_id); -create index idx_package_extra_current on package_extra_revision(current); - ---package group revision -truncate tmp_expired_id; -insert into tmp_expired_id select pr.id, revision_id, timestamp, lead(timestamp, 1, '9999-12-31') over (partition by pr.id order by timestamp), lead(pr.revision_id) over (partition by pr.id order by timestamp) from package_group_revision pr join revision r on pr.revision_id = r.id; -update package_group_revision pr set revision_timestamp = (select revision_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_timestamp = (select expired_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_id = (select expired_id from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id); -update package_group_revision set current = '1' where expired_timestamp = '9999-12-31'; - -create index idx_package_group_period_package_group on package_group_revision(revision_timestamp, expired_timestamp, package_id, group_id); -create index idx_package_group_current on package_group_revision(current); - - --- package_tags -truncate tmp_expired_id; -insert into tmp_expired_id select pr.id, revision_id, timestamp, lead(timestamp, 1, '9999-12-31') over (partition by pr.id order by timestamp), lead(pr.revision_id) over (partition by pr.id order by timestamp) from package_tag_revision pr join revision r on pr.revision_id = r.id; -update package_tag_revision pr set revision_timestamp = (select revision_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_timestamp = (select expired_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_id = (select expired_id from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id); -update package_tag_revision set current = '1' where expired_timestamp = '9999-12-31'; - -create index idx_period_package_tag on package_tag_revision(revision_timestamp, expired_timestamp, package_id, tag_id); -create index idx_package_tag_current on package_tag_revision(current); - --- package relationship -truncate tmp_expired_id; -insert into tmp_expired_id select pr.id, revision_id, timestamp, lead(timestamp, 1, '9999-12-31') over (partition by pr.id order by timestamp), lead(pr.revision_id) over (partition by pr.id order by timestamp) from package_relationship_revision pr join revision r on pr.revision_id = r.id; -update package_relationship_revision pr set revision_timestamp = (select revision_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_timestamp = (select expired_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_id = (select expired_id from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id); -update package_relationship_revision set current = '1' where expired_timestamp = '9999-12-31'; - -create index idx_period_package_relationship on package_relationship_revision(revision_timestamp, expired_timestamp, object_package_id, subject_package_id); -create index idx_package_relationship_current on package_relationship_revision(current); - --- resource revision -truncate tmp_expired_id; -insert into tmp_expired_id select pr.id, revision_id, timestamp, lead(timestamp, 1, '9999-12-31') over (partition by pr.id order by timestamp), lead(pr.revision_id) over (partition by pr.id order by timestamp) from resource_revision pr join revision r on pr.revision_id = r.id; -update resource_revision pr set revision_timestamp = (select revision_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_timestamp = (select expired_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_id = (select expired_id from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id); -update resource_revision set current = '1' where expired_timestamp = '9999-12-31'; - -create index idx_resource_period on resource_revision(revision_timestamp, expired_timestamp, id); -create index idx_resource_period_resource_group on resource_revision(revision_timestamp, expired_timestamp, resource_group_id); -create index idx_resource_current on resource_revision(current); - --- resource group revision; -truncate tmp_expired_id; -insert into tmp_expired_id select pr.id, revision_id, timestamp, lead(timestamp, 1, '9999-12-31') over (partition by pr.id order by timestamp), lead(pr.revision_id) over (partition by pr.id order by timestamp) from resource_group_revision pr join revision r on pr.revision_id = r.id; -update resource_group_revision pr set revision_timestamp = (select revision_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_timestamp = (select expired_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_id = (select expired_id from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id); -update resource_group_revision set current = '1' where expired_timestamp = '9999-12-31'; - -create index idx_resource_group_period on resource_group_revision(revision_timestamp, expired_timestamp, id); -create index idx_resource_group_period_package on resource_group_revision(revision_timestamp, expired_timestamp, package_id); -create index idx_resource_group_current on resource_group_revision(current); - ---group revision; -truncate tmp_expired_id; -insert into tmp_expired_id select pr.id, revision_id, timestamp, lead(timestamp, 1, '9999-12-31') over (partition by pr.id order by timestamp), lead(pr.revision_id) over (partition by pr.id order by timestamp) from group_revision pr join revision r on pr.revision_id = r.id; -update group_revision pr set revision_timestamp = (select revision_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_timestamp = (select expired_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_id = (select expired_id from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id); -update group_revision set current = '1' where expired_timestamp = '9999-12-31'; - -create index idx_group_period on group_revision(revision_timestamp, expired_timestamp, id); -create index idx_group_current on group_revision(current); - ---group extra revision -truncate tmp_expired_id; -insert into tmp_expired_id select pr.id, revision_id, timestamp, lead(timestamp, 1, '9999-12-31') over (partition by pr.id order by timestamp), lead(pr.revision_id) over (partition by pr.id order by timestamp) from group_extra_revision pr join revision r on pr.revision_id = r.id; -update group_extra_revision pr set revision_timestamp = (select revision_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_timestamp = (select expired_timestamp from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id), - expired_id = (select expired_id from tmp_expired_id tmp where tmp.revision_id = pr.revision_id and tmp.id = pr.id); -update group_extra_revision set current = '1' where expired_timestamp = '9999-12-31'; - -create index idx_group_extra_period on group_extra_revision(revision_timestamp, expired_timestamp, id); -create index idx_group_extra_period_group on group_extra_revision(revision_timestamp, expired_timestamp, group_id); -create index idx_group_extra_current on group_extra_revision(current); - -drop table tmp_expired_id; - --- change state of revision tables - -update revision set approved_timestamp = timestamp; -''' - - migrate_engine.execute('begin; ' + make_missing_revisions + update_schema + ' commit;') - - for table in ['package', 'resource', 'resource_group', 'package_extra', - 'package_tag', 'package_relationship', 'group', 'group_extra']: - count = migrate_engine.execute('''select count(*) from "%s"''' % table).first()[0] - revision_expired_id_count = migrate_engine.execute('''select count(*) from %s_revision where %s_revision.expired_id is null''' % (table, table)).first()[0] - revision_expired_data_count = migrate_engine.execute('''select count(*) from %s_revision where %s_revision.expired_timestamp = '9999-12-31' ''' % (table, table)).first()[0] - revision_current = migrate_engine.execute('''select count(*) from %s_revision where %s_revision.current = '1' ''' % (table, table)).first()[0] - assert count == revision_expired_id_count - assert count == revision_expired_data_count - assert count == revision_current - - diff --git a/ckan/migration/versions/039_cca459c76d45_add_expired_id_and_dates.py b/ckan/migration/versions/039_cca459c76d45_add_expired_id_and_dates.py new file mode 100644 index 00000000000..0ddaf80778c --- /dev/null +++ b/ckan/migration/versions/039_cca459c76d45_add_expired_id_and_dates.py @@ -0,0 +1,156 @@ +"""039 Add expired id and_dates + +Revision ID: cca459c76d45 +Revises: fd6622e3d964 +Create Date: 2018-09-04 18:49:02.364964 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'cca459c76d45' +down_revision = 'fd6622e3d964' +branch_labels = None +depends_on = None + +tables = [ + 'package_revision', 'package_extra_revision', 'group_revision', + 'group_extra_revision', 'package_group_revision', 'package_tag_revision', + 'resource_group_revision', 'resource_revision', + 'package_relationship_revision' +] +indexes = ( + ( + 'package_revision', ( + ( + 'idx_package_period', + ('revision_timestamp', 'expired_timestamp', 'id') + ), + ('idx_package_current', ('current', )), + ) + ), + ( + 'package_extra_revision', ( + ( + 'idx_package_extra_period', + ('revision_timestamp', 'expired_timestamp', 'id') + ), + ( + 'idx_package_extra_period_package', + ('revision_timestamp', 'expired_timestamp', 'package_id') + ), + ('idx_package_extra_current', ('current', )), + ) + ), + ( + 'package_group_revision', ( + ( + 'idx_package_group_period_package_group', ( + 'revision_timestamp', 'expired_timestamp', 'package_id', + 'group_id' + ) + ), + ('idx_package_group_current', ('current', )), + ) + ), + ( + 'package_tag_revision', ( + ( + 'idx_period_package_tag', ( + 'revision_timestamp', 'expired_timestamp', 'package_id', + 'tag_id' + ) + ), + ('idx_package_tag_current', ('current', )), + ) + ), + ( + 'package_relationship_revision', ( + ( + 'idx_period_package_relationship', ( + 'revision_timestamp', 'expired_timestamp', + 'object_package_id', 'subject_package_id' + ) + ), + ('idx_package_relationship_current', ('current', )), + ) + ), + ( + 'resource_revision', ( + ( + 'idx_resource_period', + ('revision_timestamp', 'expired_timestamp', 'id') + ), + ( + 'idx_resource_period_resource_group', ( + 'revision_timestamp', 'expired_timestamp', + 'resource_group_id' + ) + ), + ('idx_resource_current', ('current', )), + ) + ), + ( + 'resource_group_revision', ( + ( + 'idx_resource_group_period', + ('revision_timestamp', 'expired_timestamp', 'id') + ), + ( + 'idx_resource_group_period_package', + ('revision_timestamp', 'expired_timestamp', 'package_id') + ), + ('idx_resource_group_current', ('current', )), + ) + ), + ( + 'group_revision', ( + ( + 'idx_group_period', + ('revision_timestamp', 'expired_timestamp', 'id') + ), + ('idx_group_current', ('current', )), + ) + ), + ( + 'group_extra_revision', ( + ( + 'idx_group_extra_period', + ('revision_timestamp', 'expired_timestamp', 'id') + ), + ( + 'idx_group_extra_period_group', + ('revision_timestamp', 'expired_timestamp', 'group_id') + ), + ('idx_group_extra_current', ('current', )), + ) + ), +) + + +def upgrade(): + + for table in tables: + op.add_column(table, sa.Column('expired_id', sa.UnicodeText)) + op.add_column(table, sa.Column('revision_timestamp', sa.TIMESTAMP)) + op.add_column(table, sa.Column('expired_timestamp', sa.TIMESTAMP)) + op.add_column(table, sa.Column('current', sa.Boolean)) + op.add_column('revision', sa.Column('approved_timestamp', sa.TIMESTAMP)) + + for table, items in indexes: + for index, columns in items: + op.create_index(index, table, list(columns)) + + +def downgrade(): + for table, items in reversed(indexes): + for index, _ in items: + op.drop_index(index, table) + + op.drop_column('revision', 'approved_timestamp') + for table in reversed(tables): + op.drop_column(table, 'expired_id') + op.drop_column(table, 'revision_timestamp') + op.drop_column(table, 'expired_timestamp') + op.drop_column(table, 'current') diff --git a/ckan/migration/versions/040_500a08f4818e_reset_key_on_user.py b/ckan/migration/versions/040_500a08f4818e_reset_key_on_user.py new file mode 100644 index 00000000000..7cc2c0ef66e --- /dev/null +++ b/ckan/migration/versions/040_500a08f4818e_reset_key_on_user.py @@ -0,0 +1,23 @@ +"""040 Reset key on user + +Revision ID: 500a08f4818e +Revises: cca459c76d45 +Create Date: 2018-09-04 18:49:02.701370 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '500a08f4818e' +down_revision = 'cca459c76d45' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('user', sa.Column('reset_key', sa.UnicodeText)) + + +def downgrade(): + op.drop_column('user', 'reset_key') diff --git a/ckan/migration/versions/040_reset_key_on_user.py b/ckan/migration/versions/040_reset_key_on_user.py deleted file mode 100644 index 4acdaa2f3b4..00000000000 --- a/ckan/migration/versions/040_reset_key_on_user.py +++ /dev/null @@ -1,15 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - user_table = Table('user', metadata, autoload=True) - reset_key_col = Column('reset_key', UnicodeText) - reset_key_col.create(user_table) - -def downgrade(migrate_engine): - raise NotImplementedError() - diff --git a/ckan/migration/versions/041_6817d4e3bdc3_resource_new_fields.py b/ckan/migration/versions/041_6817d4e3bdc3_resource_new_fields.py new file mode 100644 index 00000000000..1fcdd72f884 --- /dev/null +++ b/ckan/migration/versions/041_6817d4e3bdc3_resource_new_fields.py @@ -0,0 +1,43 @@ +"""041 Resource new fields + +Revision ID: 6817d4e3bdc3 +Revises: 500a08f4818e +Create Date: 2018-09-04 18:49:03.042528 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '6817d4e3bdc3' +down_revision = '500a08f4818e' +branch_labels = None +depends_on = None + + +def upgrade(): + for table in ('resource', 'resource_revision'): + op.add_column(table, sa.Column('name', sa.UnicodeText)) + op.add_column(table, sa.Column('resource_type', sa.UnicodeText)) + op.add_column(table, sa.Column('mimetype', sa.UnicodeText)) + op.add_column(table, sa.Column('mimetype_inner', sa.UnicodeText)) + op.add_column(table, sa.Column('size', sa.BigInteger)) + op.add_column(table, sa.Column('last_modified', sa.TIMESTAMP)) + op.add_column(table, sa.Column('cache_url', sa.UnicodeText)) + op.add_column(table, sa.Column('cache_last_updated', sa.TIMESTAMP)) + op.add_column(table, sa.Column('webstore_url', sa.UnicodeText)) + op.add_column(table, sa.Column('webstore_last_updated', sa.TIMESTAMP)) + + +def downgrade(): + for table in ('resource', 'resource_revision'): + op.drop_column(table, 'name') + op.drop_column(table, 'resource_type') + op.drop_column(table, 'mimetype') + op.drop_column(table, 'mimetype_inner') + op.drop_column(table, 'size') + op.drop_column(table, 'last_modified') + op.drop_column(table, 'cache_url') + op.drop_column(table, 'cache_last_updated') + op.drop_column(table, 'webstore_url') + op.drop_column(table, 'webstore_last_updated') diff --git a/ckan/migration/versions/041_resource_new_fields.py b/ckan/migration/versions/041_resource_new_fields.py deleted file mode 100644 index 1acd6a51dce..00000000000 --- a/ckan/migration/versions/041_resource_new_fields.py +++ /dev/null @@ -1,34 +0,0 @@ -# encoding: utf-8 - -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - begin; - ALTER TABLE resource - ADD COLUMN name text, - ADD COLUMN resource_type text, - ADD COLUMN mimetype text, - ADD COLUMN mimetype_inner text, - ADD COLUMN "size" bigint, - ADD COLUMN last_modified timestamp without time zone, - ADD COLUMN cache_url text, - ADD COLUMN cache_last_updated timestamp without time zone, - ADD COLUMN webstore_url text, - ADD COLUMN webstore_last_updated timestamp without time zone; - - ALTER TABLE resource_revision - ADD COLUMN name text, - ADD COLUMN resource_type text, - ADD COLUMN mimetype text, - ADD COLUMN mimetype_inner text, - ADD COLUMN "size" bigint, - ADD COLUMN last_modified timestamp without time zone, - ADD COLUMN cache_url text, - ADD COLUMN cache_last_updated timestamp without time zone, - ADD COLUMN webstore_url text, - ADD COLUMN webstore_last_updated timestamp without time zone; - commit; - ''' - ) diff --git a/ckan/migration/versions/042_da65e2877034_user_revision_indexes.py b/ckan/migration/versions/042_da65e2877034_user_revision_indexes.py new file mode 100644 index 00000000000..26e10d612b1 --- /dev/null +++ b/ckan/migration/versions/042_da65e2877034_user_revision_indexes.py @@ -0,0 +1,33 @@ +"""042 User revision indexes + +Revision ID: da65e2877034 +Revises: 6817d4e3bdc3 +Create Date: 2018-09-04 18:49:03.380103 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'da65e2877034' +down_revision = '6817d4e3bdc3' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_index('idx_revision_author', 'revision', ['author']) + op.create_index('idx_openid', 'user', ['openid']) + op.create_index( + 'idx_user_name_index', 'user', [ + sa.text( + '''(CASE WHEN ("user".fullname IS NULL OR "user".fullname = '') THEN "user".name ELSE "user".fullname END)''' + ) + ] + ) + + +def downgrade(): + op.drop_index('idx_user_name_index', 'user') + op.drop_index('idx_openid', 'user') + op.drop_index('idx_revision_author', 'revision') diff --git a/ckan/migration/versions/042_user_revision_indexes.py b/ckan/migration/versions/042_user_revision_indexes.py deleted file mode 100644 index 0be68b3885a..00000000000 --- a/ckan/migration/versions/042_user_revision_indexes.py +++ /dev/null @@ -1,15 +0,0 @@ -# encoding: utf-8 - -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute(''' - BEGIN; - CREATE INDEX idx_revision_author ON "revision" (author); - CREATE INDEX idx_openid ON "user" (openid); - CREATE INDEX "idx_user_name_index" on "user"((CASE WHEN ("user".fullname IS NULL OR "user".fullname = '') THEN "user".name ELSE "user".fullname END)); - COMMIT; - ''' - ) - - diff --git a/ckan/migration/versions/043_bd38cd6502b2_drop_postgres_search.py b/ckan/migration/versions/043_bd38cd6502b2_drop_postgres_search.py new file mode 100644 index 00000000000..fb7411a8cda --- /dev/null +++ b/ckan/migration/versions/043_bd38cd6502b2_drop_postgres_search.py @@ -0,0 +1,31 @@ +"""043 Drop postgres search + +Revision ID: bd38cd6502b2 +Revises: da65e2877034 +Create Date: 2018-09-04 18:49:03.717678 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'bd38cd6502b2' +down_revision = 'da65e2877034' +branch_labels = None +depends_on = None + + +def upgrade(): + op.drop_table('package_search') + + +def downgrade(): + op.create_table( + 'package_search', + sa.Column( + 'package_id', + sa.UnicodeText, + sa.ForeignKey('package.id'), + primary_key=True + ), sa.Column('search_vector', sa.dialects.postgresql.TSVECTOR) + ) diff --git a/ckan/migration/versions/043_drop_postgres_search.py b/ckan/migration/versions/043_drop_postgres_search.py deleted file mode 100644 index b44089a9f36..00000000000 --- a/ckan/migration/versions/043_drop_postgres_search.py +++ /dev/null @@ -1,14 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - package_search_table = Table('package_search', metadata, autoload=True) - package_search_table.drop() -## migrate_engine.execute(''' -##DROP TABLE package_search; -##''') diff --git a/ckan/migration/versions/044_4190eeeb8d73_add_task_status.py b/ckan/migration/versions/044_4190eeeb8d73_add_task_status.py new file mode 100644 index 00000000000..eb3367b4ef7 --- /dev/null +++ b/ckan/migration/versions/044_4190eeeb8d73_add_task_status.py @@ -0,0 +1,41 @@ +"""044 Add task status + +Revision ID: 4190eeeb8d73 +Revises: bd38cd6502b2 +Create Date: 2018-09-04 18:49:04.084036 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '4190eeeb8d73' +down_revision = 'bd38cd6502b2' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'task_status', sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('entity_id', sa.UnicodeText, nullable=False), + sa.Column('entity_type', sa.UnicodeText, nullable=False), + sa.Column('task_type', sa.UnicodeText, nullable=False), + sa.Column('key', sa.UnicodeText, nullable=False), + sa.Column('value', sa.UnicodeText, nullable=False), + sa.Column('state', sa.UnicodeText), sa.Column('error', sa.UnicodeText), + sa.Column('last_updated', sa.TIMESTAMP) + ) + op.create_primary_key('task_status_pkey', 'task_status', ['id']) + op.create_unique_constraint( + 'task_status_entity_id_task_type_key_key', 'task_status', + ['entity_id', 'task_type', 'key'] + ) + + +def downgrade(): + op.drop_constraint('task_status_pkey', 'task_status') + op.drop_constraint( + 'task_status_entity_id_task_type_key_key', 'task_status' + ) + op.drop_table('task_status') diff --git a/ckan/migration/versions/044_add_task_status.py b/ckan/migration/versions/044_add_task_status.py deleted file mode 100644 index c9a950e1a6d..00000000000 --- a/ckan/migration/versions/044_add_task_status.py +++ /dev/null @@ -1,26 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute(''' - CREATE TABLE task_status ( - id text NOT NULL, - entity_id text NOT NULL, - entity_type text NOT NULL, - task_type text NOT NULL, - "key" text NOT NULL, - "value" text NOT NULL, - "state" text, - "error" text, - last_updated timestamp without time zone - ); - - ALTER TABLE task_status - ADD CONSTRAINT task_status_pkey PRIMARY KEY (id); - - ALTER TABLE task_status - ADD CONSTRAINT task_status_entity_id_task_type_key_key UNIQUE (entity_id, task_type, key); - ''' - ) diff --git a/ckan/migration/versions/045_54e3f155d945_user_name_unique.py b/ckan/migration/versions/045_54e3f155d945_user_name_unique.py new file mode 100644 index 00000000000..42a7b006538 --- /dev/null +++ b/ckan/migration/versions/045_54e3f155d945_user_name_unique.py @@ -0,0 +1,23 @@ +"""045 User name unique + +Revision ID: 54e3f155d945 +Revises: 4190eeeb8d73 +Create Date: 2018-09-04 18:49:04.437304 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '54e3f155d945' +down_revision = '4190eeeb8d73' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_unique_constraint('user_name_key', 'user', ['name']) + + +def downgrade(): + op.drop_constraint('user_name_key', 'user') diff --git a/ckan/migration/versions/045_user_name_unique.py b/ckan/migration/versions/045_user_name_unique.py deleted file mode 100644 index c8873182b35..00000000000 --- a/ckan/migration/versions/045_user_name_unique.py +++ /dev/null @@ -1,19 +0,0 @@ -# encoding: utf-8 - -import warnings - -from sqlalchemy import exc as sa_exc -from sqlalchemy import * -from migrate import * -from migrate.changeset.constraint import UniqueConstraint - -def upgrade(migrate_engine): - # ignore reflection warnings - with warnings.catch_warnings(): - warnings.simplefilter("ignore", category=sa_exc.SAWarning) - metadata = MetaData() - metadata.bind = migrate_engine - user_table = Table('user', metadata, autoload=True) - # name_column = user_table.c.name - unique_name_constraint = UniqueConstraint('name', table=user_table) - unique_name_constraint.create() diff --git a/ckan/migration/versions/046_b69e9b80396f_drop_changesets.py b/ckan/migration/versions/046_b69e9b80396f_drop_changesets.py new file mode 100644 index 00000000000..062d2a2d9af --- /dev/null +++ b/ckan/migration/versions/046_b69e9b80396f_drop_changesets.py @@ -0,0 +1,68 @@ +"""046 Drop changesets + +Revision ID: b69e9b80396f +Revises: 54e3f155d945 +Create Date: 2018-09-04 18:49:04.791120 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'b69e9b80396f' +down_revision = '54e3f155d945' +branch_labels = None +depends_on = None + + +def upgrade(): + op.drop_table('change') + op.drop_table('changemask') + op.drop_table('changeset') + + +def downgrade(): + op.create_table( + 'changeset', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('closes_id', sa.UnicodeText, nullable=True), + sa.Column('follows_id', sa.UnicodeText, nullable=True), + sa.Column('meta', sa.UnicodeText, nullable=True), + sa.Column('branch', sa.UnicodeText, nullable=True), + sa.Column( + 'timestamp', + sa.DateTime, + server_default=sa.func.current_timestamp() + ), + sa.Column('is_working', sa.Boolean, default=False), + sa.Column( + 'revision_id', + sa.UnicodeText, + sa.ForeignKey('revision.id'), + nullable=True + ), + sa.Column( + 'added_here', + sa.DateTime, + server_default=sa.func.current_timestamp() + ), + ) + + op.create_table( + 'change', + sa.Column('ref', sa.UnicodeText, nullable=True), + sa.Column('diff', sa.UnicodeText, nullable=True), + sa.Column( + 'changeset_id', sa.UnicodeText, sa.ForeignKey('changeset.id') + ), + ) + + op.create_table( + 'changemask', + sa.Column('ref', sa.UnicodeText, primary_key=True), + sa.Column( + 'timestamp', + sa.DateTime, + server_default=sa.func.current_timestamp() + ), + ) diff --git a/ckan/migration/versions/046_drop_changesets.py b/ckan/migration/versions/046_drop_changesets.py deleted file mode 100644 index 2715b32265c..00000000000 --- a/ckan/migration/versions/046_drop_changesets.py +++ /dev/null @@ -1,12 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * -import migrate.changeset - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - for table_name in ['change', 'changemask', 'changeset']: - table = Table(table_name, metadata, autoload=True) - table.drop() diff --git a/ckan/migration/versions/047_883a7c406926_rename_package_group_member.py b/ckan/migration/versions/047_883a7c406926_rename_package_group_member.py new file mode 100644 index 00000000000..7467535727a --- /dev/null +++ b/ckan/migration/versions/047_883a7c406926_rename_package_group_member.py @@ -0,0 +1,168 @@ +"""047 Rename package_group_member + +Revision ID: 883a7c406926 +Revises: b69e9b80396f +Create Date: 2018-09-04 18:49:05.130215 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '883a7c406926' +down_revision = 'b69e9b80396f' +branch_labels = None +depends_on = None + + +def upgrade(): + op.rename_table('package_group', 'member') + op.rename_table('package_group_revision', 'member_revision') + + op.alter_column( + 'member', 'package_id', new_column_name='table_id', nullable=False + ) + op.alter_column( + 'member_revision', + 'package_id', + new_column_name='table_id', + nullable=False + ) + + op.drop_constraint('package_group_revision_pkey', 'member_revision') + op.drop_constraint( + 'package_group_revision_continuity_id_fkey', 'member_revision' + ) + op.drop_constraint( + 'package_group_revision_group_id_fkey', 'member_revision' + ) + op.drop_constraint( + 'package_group_revision_package_id_fkey', 'member_revision' + ) + op.drop_constraint( + 'package_group_revision_revision_id_fkey', 'member_revision' + ) + + op.drop_constraint('package_group_pkey', 'member') + op.drop_constraint('package_group_group_id_fkey', 'member') + op.drop_constraint('package_group_package_id_fkey', 'member') + op.drop_constraint('package_group_revision_id_fkey', 'member') + + op.add_column( + 'member', sa.Column('table_name', sa.UnicodeText, nullable=False) + ) + op.add_column( + 'member', sa.Column('capacity', sa.UnicodeText, nullable=False) + ) + op.add_column( + 'member_revision', + sa.Column('table_name', sa.UnicodeText, nullable=False) + ) + op.add_column( + 'member_revision', + sa.Column('capacity', sa.UnicodeText, nullable=False) + ) + + op.create_primary_key('member_pkey', 'member', ['id']) + op.create_primary_key( + 'member_revision_pkey', 'member_revision', ['id', 'revision_id'] + ) + + op.create_foreign_key( + 'member_group_id_fkey', 'member', 'group', ['group_id'], ['id'] + ) + op.create_foreign_key( + 'member_revision_id_fkey', 'member', 'revision', ['revision_id'], + ['id'] + ) + op.create_foreign_key( + 'member_revision_continuity_id_fkey', 'member_revision', 'member', + ['continuity_id'], ['id'] + ) + op.create_foreign_key( + 'member_revision_group_id_fkey', 'member_revision', 'group', + ['group_id'], ['id'] + ) + op.create_foreign_key( + 'member_revision_revision_id_fkey', 'member_revision', 'revision', + ['revision_id'], ['id'] + ) + + op.add_column('group', sa.Column('type', sa.UnicodeText, nullable=False)) + op.add_column( + 'group_revision', sa.Column('type', sa.UnicodeText, nullable=False) + ) + + op.add_column('package', sa.Column('type', sa.UnicodeText)) + op.add_column('package_revision', sa.Column('type', sa.UnicodeText)) + + +def downgrade(): + op.drop_column('package', 'type') + op.drop_column('package_revision', 'type') + + op.drop_column('group', 'type') + op.drop_column('group_revision', 'type') + + op.drop_constraint('member_revision_continuity_id_fkey', 'member_revision') + op.drop_constraint('member_revision_group_id_fkey', 'member_revision') + op.drop_constraint('member_revision_revision_id_fkey', 'member_revision') + op.drop_constraint('member_group_id_fkey', 'member') + op.drop_constraint('member_revision_id_fkey', 'member') + + op.drop_constraint('member_revision_pkey', 'member_revision') + op.drop_constraint('member_pkey', 'member') + + op.drop_column('member_revision', 'table_name') + op.drop_column('member_revision', 'capacity') + + op.drop_column('member', 'table_name') + op.drop_column('member', 'capacity') + + op.alter_column( + 'member_revision', + 'table_id', + new_column_name='package_id', + nullable=True + ) + op.alter_column( + 'member', 'table_id', new_column_name='package_id', nullable=True + ) + + op.create_primary_key('package_group_pkey', 'member', ['id']) + op.create_primary_key( + 'package_group_revision_pkey', 'member_revision', + ['id', 'revision_id'] + ) + + op.create_foreign_key( + 'package_group_group_id_fkey', 'member', 'group', ['group_id'], ['id'] + ) + op.create_foreign_key( + 'package_group_package_id_fkey', 'member', 'package', ['package_id'], + ['id'] + ) + op.create_foreign_key( + 'package_group_revision_id_fkey', 'member', 'revision', + ['revision_id'], ['id'] + ) + + op.create_foreign_key( + 'package_group_revision_continuity_id_fkey', 'member_revision', + 'member', ['continuity_id'], ['id'] + ) + op.create_foreign_key( + 'package_group_revision_group_id_fkey', 'member_revision', 'group', + ['group_id'], ['id'] + ) + op.create_foreign_key( + 'package_group_revision_package_id_fkey', 'member_revision', 'package', + ['package_id'], ['id'] + ) + op.create_foreign_key( + 'package_group_revision_revision_id_fkey', 'member_revision', + 'revision', ['revision_id'], ['id'] + ) + + op.rename_table('member_revision', 'package_group_revision') + op.rename_table('member', 'package_group') diff --git a/ckan/migration/versions/047_rename_package_group_member.py b/ckan/migration/versions/047_rename_package_group_member.py deleted file mode 100644 index 1d377739e9c..00000000000 --- a/ckan/migration/versions/047_rename_package_group_member.py +++ /dev/null @@ -1,110 +0,0 @@ -# encoding: utf-8 - -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute(''' -BEGIN; -alter table package_group RENAME to member; -alter table package_group_revision RENAME to member_revision; -alter table member RENAME column package_id to table_id; -alter table member_revision RENAME column package_id to table_id; - -alter table member ALTER column table_id set NOT NULL; -alter table member_revision ALTER column table_id set NOT NULL; - -ALTER TABLE member_revision - DROP CONSTRAINT package_group_revision_pkey; - -ALTER TABLE member_revision - DROP CONSTRAINT package_group_revision_continuity_id_fkey; - -ALTER TABLE member_revision - DROP CONSTRAINT package_group_revision_group_id_fkey; - -ALTER TABLE member_revision - DROP CONSTRAINT package_group_revision_package_id_fkey; - -ALTER TABLE member_revision - DROP CONSTRAINT package_group_revision_revision_id_fkey; - -ALTER TABLE "member" - DROP CONSTRAINT package_group_pkey; - -ALTER TABLE "member" - DROP CONSTRAINT package_group_group_id_fkey; - -ALTER TABLE "member" - DROP CONSTRAINT package_group_package_id_fkey; - -ALTER TABLE "member" - DROP CONSTRAINT package_group_revision_id_fkey; - - -ALTER TABLE "member" - ADD COLUMN table_name text; -ALTER TABLE "member" - ADD COLUMN capacity text; - -ALTER TABLE "member_revision" - ADD COLUMN table_name text; -ALTER TABLE "member_revision" - ADD COLUMN capacity text; - -ALTER TABLE "member" - ADD CONSTRAINT member_pkey PRIMARY KEY (id); - -ALTER TABLE member_revision - ADD CONSTRAINT member_revision_pkey PRIMARY KEY (id, revision_id); - -ALTER TABLE "member" - ADD CONSTRAINT member_group_id_fkey FOREIGN KEY (group_id) REFERENCES "group"(id); - -ALTER TABLE "member" - ADD CONSTRAINT member_revision_id_fkey FOREIGN KEY (revision_id) REFERENCES revision(id); - -ALTER TABLE member_revision - ADD CONSTRAINT member_revision_continuity_id_fkey FOREIGN KEY (continuity_id) REFERENCES member(id); - -ALTER TABLE member_revision - ADD CONSTRAINT member_revision_group_id_fkey FOREIGN KEY (group_id) REFERENCES "group"(id); - -ALTER TABLE member_revision - ADD CONSTRAINT member_revision_revision_id_fkey FOREIGN KEY (revision_id) REFERENCES revision(id); - -ALTER TABLE "group" - ADD COLUMN "type" text; -ALTER TABLE "group_revision" - ADD COLUMN "type" text; - -update member set table_name = 'package', capacity = 'public'; -update member_revision set table_name = 'package', capacity = 'public'; - -update "group" set type = 'group'; -update group_revision set type = 'group'; - - -ALTER TABLE "member" - ALTER COLUMN table_name set not null; -ALTER TABLE "member" - ALTER COLUMN capacity set not null; - -ALTER TABLE member_revision - ALTER COLUMN table_name set not null; -ALTER TABLE "member_revision" - ALTER COLUMN capacity set not null; - -ALTER TABLE "group" - ALTER COLUMN "type" set not null; -ALTER TABLE "group_revision" - ALTER COLUMN "type" set not null; - -ALTER TABLE "package" - ADD COLUMN "type" text; -ALTER TABLE "package_revision" - ADD COLUMN "type" text; - - -COMMIT; - ''' - ) diff --git a/ckan/migration/versions/048_4a7011172b3f_add_activity_streams_tables.py b/ckan/migration/versions/048_4a7011172b3f_add_activity_streams_tables.py new file mode 100644 index 00000000000..95c201da4be --- /dev/null +++ b/ckan/migration/versions/048_4a7011172b3f_add_activity_streams_tables.py @@ -0,0 +1,50 @@ +"""048 Add activity streams tables + +Revision ID: 4a7011172b3f +Revises: 883a7c406926 +Create Date: 2018-09-04 18:49:05.463765 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '4a7011172b3f' +down_revision = '883a7c406926' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'activity', + sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('timestamp', sa.TIMESTAMP), + sa.Column('user_id', sa.UnicodeText), + sa.Column('object_id', sa.UnicodeText), + sa.Column('revision_id', sa.UnicodeText), + sa.Column('activity_type', sa.UnicodeText), + sa.Column('data', sa.UnicodeText), + ) + + op.create_table( + 'activity_detail', + sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('activity_id', sa.UnicodeText, nullable=False), + sa.Column('object_id', sa.UnicodeText), + sa.Column('object_type', sa.UnicodeText), + sa.Column('activity_type', sa.UnicodeText), + sa.Column('data', sa.UnicodeText), + ) + + op.create_primary_key('activity_pkey', 'activity', ['id']) + op.create_primary_key('activity_detail_pkey', 'activity_detail', ['id']) + op.create_foreign_key( + 'activity_detail_activity_id_fkey', 'activity_detail', 'activity', + ['activity_id'], ['id'] + ) + + +def downgrade(): + op.drop_table('activity_detail') + op.drop_table('activity') diff --git a/ckan/migration/versions/048_add_activity_streams_tables.py b/ckan/migration/versions/048_add_activity_streams_tables.py deleted file mode 100644 index 079cc6fc3fa..00000000000 --- a/ckan/migration/versions/048_add_activity_streams_tables.py +++ /dev/null @@ -1,37 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - migrate_engine.execute(''' -CREATE TABLE activity ( - id text NOT NULL, - timestamp timestamp without time zone, - user_id text, - object_id text, - revision_id text, - activity_type text, - data text -); - -CREATE TABLE activity_detail ( - id text NOT NULL, - activity_id text NOT NULL, - object_id text, - object_type text, - activity_type text, - data text -); - -ALTER TABLE activity - ADD CONSTRAINT activity_pkey PRIMARY KEY (id); - -ALTER TABLE activity_detail - ADD CONSTRAINT activity_detail_pkey PRIMARY KEY (id); - -ALTER TABLE activity_detail - ADD CONSTRAINT activity_detail_activity_id_fkey FOREIGN KEY (activity_id) REFERENCES activity(id); - ''') diff --git a/ckan/migration/versions/049_add_group_approval_status.py b/ckan/migration/versions/049_add_group_approval_status.py deleted file mode 100644 index a327bf2bf03..00000000000 --- a/ckan/migration/versions/049_add_group_approval_status.py +++ /dev/null @@ -1,19 +0,0 @@ -# encoding: utf-8 - -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute(''' -BEGIN; -ALTER TABLE "group" - ADD COLUMN approval_status text; - -ALTER TABLE group_revision - ADD COLUMN approval_status text; - -update "group" set approval_status = 'approved'; -update group_revision set approval_status = 'approved'; - -COMMIT; - ''' - ) diff --git a/ckan/migration/versions/049_e0c06c2177b5_add_group_approval_status.py b/ckan/migration/versions/049_e0c06c2177b5_add_group_approval_status.py new file mode 100644 index 00000000000..10717202768 --- /dev/null +++ b/ckan/migration/versions/049_e0c06c2177b5_add_group_approval_status.py @@ -0,0 +1,27 @@ +"""049 Add group approval status + +Revision ID: e0c06c2177b5 +Revises: 4a7011172b3f +Create Date: 2018-09-04 18:49:05.797861 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'e0c06c2177b5' +down_revision = '4a7011172b3f' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('group', sa.Column('approval_status', sa.UnicodeText)) + op.add_column( + 'group_revision', sa.Column('approval_status', sa.UnicodeText) + ) + + +def downgrade(): + op.drop_column('group', 'approval_status') + op.drop_column('group_revision', 'approval_status') diff --git a/ckan/migration/versions/050_01a6b058cb7f_term_translation_table.py b/ckan/migration/versions/050_01a6b058cb7f_term_translation_table.py new file mode 100644 index 00000000000..9894644156c --- /dev/null +++ b/ckan/migration/versions/050_01a6b058cb7f_term_translation_table.py @@ -0,0 +1,29 @@ +"""050 Term translation table + +Revision ID: 01a6b058cb7f +Revises: e0c06c2177b5 +Create Date: 2018-09-04 18:49:06.143050 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '01a6b058cb7f' +down_revision = 'e0c06c2177b5' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'term_translation', sa.Column('term', sa.UnicodeText, nullable=False), + sa.Column('term_translation', sa.UnicodeText, nullable=False), + sa.Column('lang_code', sa.UnicodeText, nullable=False) + ) + op.create_index('term_lang', 'term_translation', ['term', 'lang_code']) + op.create_index('term', 'term_translation', ['term']) + + +def downgrade(): + op.drop_table('term_translation') diff --git a/ckan/migration/versions/050_term_translation_table.py b/ckan/migration/versions/050_term_translation_table.py deleted file mode 100644 index f87608c08c2..00000000000 --- a/ckan/migration/versions/050_term_translation_table.py +++ /dev/null @@ -1,22 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute(''' - CREATE TABLE term_translation ( - term text NOT NULL, - term_translation text NOT NULL, - lang_code text NOT NULL - ); - - create index term_lang on term_translation(term, lang_code); - create index term on term_translation(term); - ''' - ) - - - - - diff --git a/ckan/migration/versions/051_a4fb0d85ced6_add_tag_vocabulary.py b/ckan/migration/versions/051_a4fb0d85ced6_add_tag_vocabulary.py new file mode 100644 index 00000000000..4557f84a4a2 --- /dev/null +++ b/ckan/migration/versions/051_a4fb0d85ced6_add_tag_vocabulary.py @@ -0,0 +1,43 @@ +"""051 Add tag vocabulary + +Revision ID: a4fb0d85ced6 +Revises: 01a6b058cb7f +Create Date: 2018-09-04 18:49:06.480087 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'a4fb0d85ced6' +down_revision = '01a6b058cb7f' +branch_labels = None +depends_on = None + + +def upgrade(): + op.drop_constraint('tag_name_key', 'tag') + op.create_table( + 'vocabulary', sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('name', sa.String(100), nullable=False) + ) + + op.add_column('tag', sa.Column('vocabulary_id', sa.String(100))) + op.create_primary_key('vocabulary_pkey', 'vocabulary', ['id']) + op.create_unique_constraint( + 'tag_name_vocabulary_id_key', 'tag', ['name', 'vocabulary_id'] + ) + op.create_foreign_key( + 'tag_vocabulary_id_fkey', 'tag', 'vocabulary', ['vocabulary_id'], + ['id'] + ) + op.create_unique_constraint('vocabulary_name_key', 'vocabulary', ['name']) + + +def downgrade(): + op.drop_constraint('tag_name_vocabulary_id_key', 'tag') + op.drop_constraint('tag_vocabulary_id_fkey', 'tag') + + op.drop_column('tag', 'vocabulary_id') + op.drop_table('vocabulary') + op.create_unique_constraint('tag_name_key', 'tag', ['name']) diff --git a/ckan/migration/versions/051_add_tag_vocabulary.py b/ckan/migration/versions/051_add_tag_vocabulary.py deleted file mode 100644 index 746eff4fd3c..00000000000 --- a/ckan/migration/versions/051_add_tag_vocabulary.py +++ /dev/null @@ -1,31 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute(''' - ALTER TABLE tag - DROP CONSTRAINT tag_name_key; - - CREATE TABLE vocabulary ( - id text NOT NULL, - name character varying(100) NOT NULL - ); - - ALTER TABLE tag - ADD COLUMN vocabulary_id character varying(100); - - ALTER TABLE vocabulary - ADD CONSTRAINT vocabulary_pkey PRIMARY KEY (id); - - ALTER TABLE tag - ADD CONSTRAINT tag_name_vocabulary_id_key UNIQUE (name, vocabulary_id); - - ALTER TABLE tag - ADD CONSTRAINT tag_vocabulary_id_fkey FOREIGN KEY (vocabulary_id) REFERENCES vocabulary(id); - - ALTER TABLE vocabulary - ADD CONSTRAINT vocabulary_name_key UNIQUE (name); - ''' - ) diff --git a/ckan/migration/versions/052_ba693d64c6d7_update_member_capacities.py b/ckan/migration/versions/052_ba693d64c6d7_update_member_capacities.py new file mode 100644 index 00000000000..0a66b12607b --- /dev/null +++ b/ckan/migration/versions/052_ba693d64c6d7_update_member_capacities.py @@ -0,0 +1,23 @@ +"""052 Update member capacities + +Revision ID: ba693d64c6d7 +Revises: a4fb0d85ced6 +Create Date: 2018-09-04 18:49:06.885179 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'ba693d64c6d7' +down_revision = 'a4fb0d85ced6' +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + pass diff --git a/ckan/migration/versions/052_update_member_capacities.py b/ckan/migration/versions/052_update_member_capacities.py deleted file mode 100644 index 971b50ecb2d..00000000000 --- a/ckan/migration/versions/052_update_member_capacities.py +++ /dev/null @@ -1,14 +0,0 @@ -# encoding: utf-8 - -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute(""" - BEGIN; - UPDATE member SET capacity='public' WHERE capacity='member' - AND table_name='package'; - UPDATE member_revision SET capacity='public' WHERE capacity='member' - AND table_name='package'; - COMMIT; - """ - ) diff --git a/ckan/migration/versions/053_9d051a099097_add_group_logo.py b/ckan/migration/versions/053_9d051a099097_add_group_logo.py new file mode 100644 index 00000000000..e0219cfc481 --- /dev/null +++ b/ckan/migration/versions/053_9d051a099097_add_group_logo.py @@ -0,0 +1,25 @@ +"""053 Add group logo + +Revision ID: 9d051a099097 +Revises: ba693d64c6d7 +Create Date: 2018-09-04 18:49:07.217429 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '9d051a099097' +down_revision = 'ba693d64c6d7' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('group', sa.Column('image_url', sa.UnicodeText)) + op.add_column('group_revision', sa.Column('image_url', sa.UnicodeText)) + + +def downgrade(): + op.drop_column('group', 'image_url') + op.drop_column('group_revision', 'image_url') diff --git a/ckan/migration/versions/053_add_group_logo.py b/ckan/migration/versions/053_add_group_logo.py deleted file mode 100644 index fc1fe3bdbf9..00000000000 --- a/ckan/migration/versions/053_add_group_logo.py +++ /dev/null @@ -1,14 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute(''' - ALTER TABLE "group" - ADD COLUMN image_url text; - - ALTER TABLE group_revision - ADD COLUMN image_url text; - ''' - ) diff --git a/ckan/migration/versions/054_add_resource_created_date.py b/ckan/migration/versions/054_add_resource_created_date.py deleted file mode 100644 index 2f6a0cd993d..00000000000 --- a/ckan/migration/versions/054_add_resource_created_date.py +++ /dev/null @@ -1,11 +0,0 @@ -# encoding: utf-8 - -def upgrade(migrate_engine): - migrate_engine.execute(''' - ALTER TABLE resource - ADD COLUMN created timestamp without time zone; - - ALTER TABLE resource_revision - ADD COLUMN created timestamp without time zone; - ''' - ) diff --git a/ckan/migration/versions/054_da21b38da4db_add_resource_created_date.py b/ckan/migration/versions/054_da21b38da4db_add_resource_created_date.py new file mode 100644 index 00000000000..0c33c3608eb --- /dev/null +++ b/ckan/migration/versions/054_da21b38da4db_add_resource_created_date.py @@ -0,0 +1,25 @@ +"""054 Add resource created date + +Revision ID: da21b38da4db +Revises: 9d051a099097 +Create Date: 2018-09-04 18:49:07.555419 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'da21b38da4db' +down_revision = '9d051a099097' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('resource', sa.Column('created', sa.TIMESTAMP)) + op.add_column('resource_revision', sa.Column('created', sa.TIMESTAMP)) + + +def downgrade(): + op.drop_column('resource', 'created') + op.drop_column('resource_revision', 'created') diff --git a/ckan/migration/versions/055_048f7db947bf_update_user_and_activity_detail.py b/ckan/migration/versions/055_048f7db947bf_update_user_and_activity_detail.py new file mode 100644 index 00000000000..e8d83abeafd --- /dev/null +++ b/ckan/migration/versions/055_048f7db947bf_update_user_and_activity_detail.py @@ -0,0 +1,25 @@ +"""055 Update user and activity_detail + +Revision ID: 048f7db947bf +Revises: da21b38da4db +Create Date: 2018-09-04 18:49:07.896968 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '048f7db947bf' +down_revision = 'da21b38da4db' +branch_labels = None +depends_on = None + + +def upgrade(): + op.alter_column('activity_detail', 'activity_id', nullable=True) + op.alter_column('user', 'name', nullable=False) + + +def downgrade(): + op.alter_column('activity_detail', 'activity_id', nullable=False) + op.alter_column('user', 'name', nullable=True) diff --git a/ckan/migration/versions/055_update_user_and_activity_detail.py b/ckan/migration/versions/055_update_user_and_activity_detail.py deleted file mode 100644 index 7e91c2038ee..00000000000 --- a/ckan/migration/versions/055_update_user_and_activity_detail.py +++ /dev/null @@ -1,11 +0,0 @@ -# encoding: utf-8 - -def upgrade(migrate_engine): - migrate_engine.execute(''' - ALTER TABLE activity_detail - ALTER COLUMN activity_id DROP NOT NULL; - - ALTER TABLE "user" - ALTER COLUMN name SET NOT NULL; - ''' - ) diff --git a/ckan/migration/versions/056_11af3215ae89_add_related_table.py b/ckan/migration/versions/056_11af3215ae89_add_related_table.py new file mode 100644 index 00000000000..ce048574c9d --- /dev/null +++ b/ckan/migration/versions/056_11af3215ae89_add_related_table.py @@ -0,0 +1,49 @@ +"""056 Add related table + +Revision ID: 11af3215ae89 +Revises: 048f7db947bf +Create Date: 2018-09-04 18:49:08.239860 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '11af3215ae89' +down_revision = '048f7db947bf' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'related', sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('type', sa.UnicodeText, nullable=False), + sa.Column('title', sa.UnicodeText), + sa.Column('description', sa.UnicodeText), + sa.Column('image_url', sa.UnicodeText), + sa.Column('url', sa.UnicodeText), sa.Column('created', sa.TIMESTAMP), + sa.Column('owner_id', sa.UnicodeText) + ) + op.create_table( + 'related_dataset', sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('dataset_id', sa.UnicodeText, nullable=False), + sa.Column('related_id', sa.UnicodeText, nullable=False), + sa.Column('status', sa.UnicodeText) + ) + op.create_primary_key('related_pkey', 'related', ['id']) + op.create_primary_key('related_dataset_pkey', 'related_dataset', ['id']) + + op.create_foreign_key( + 'related_dataset_dataset_id_fkey', 'related_dataset', 'package', + ['dataset_id'], ['id'] + ) + op.create_foreign_key( + 'related_dataset_related_id_fkey', 'related_dataset', 'related', + ['related_id'], ['id'] + ) + + +def downgrade(): + op.drop_table('related_dataset') + op.drop_table('related') diff --git a/ckan/migration/versions/056_add_related_table.py b/ckan/migration/versions/056_add_related_table.py deleted file mode 100644 index f525d38cadd..00000000000 --- a/ckan/migration/versions/056_add_related_table.py +++ /dev/null @@ -1,42 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - migrate_engine.execute(''' -BEGIN; -CREATE TABLE related ( - id text NOT NULL, - type text NOT NULL, - title text, - description text, - image_url text, - url text, - created timestamp without time zone, - owner_id text -); - -CREATE TABLE related_dataset ( - id text NOT NULL, - dataset_id text NOT NULL, - related_id text NOT NULL, - status text -); - -ALTER TABLE related - ADD CONSTRAINT related_pkey PRIMARY KEY (id); - -ALTER TABLE related_dataset - ADD CONSTRAINT related_dataset_pkey PRIMARY KEY (id); - -ALTER TABLE related_dataset - ADD CONSTRAINT related_dataset_dataset_id_fkey FOREIGN KEY (dataset_id) REFERENCES package(id); - -ALTER TABLE related_dataset - ADD CONSTRAINT related_dataset_related_id_fkey FOREIGN KEY (related_id) REFERENCES related(id); -COMMIT; - ''' - ) diff --git a/ckan/migration/versions/057_660a5aae527e_tracking.py b/ckan/migration/versions/057_660a5aae527e_tracking.py new file mode 100644 index 00000000000..9cadfe72fcc --- /dev/null +++ b/ckan/migration/versions/057_660a5aae527e_tracking.py @@ -0,0 +1,59 @@ +"""057 Tracking + +Revision ID: 660a5aae527e +Revises: 11af3215ae89 +Create Date: 2018-09-04 18:49:08.573692 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '660a5aae527e' +down_revision = '11af3215ae89' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'tracking_raw', sa.Column('user_key', sa.String(100), nullable=False), + sa.Column('url', sa.UnicodeText, nullable=False), + sa.Column('tracking_type', sa.String(10), nullable=False), + sa.Column( + 'access_timestamp', + sa.TIMESTAMP, + server_default=sa.func.current_timestamp() + ) + ) + op.create_index('tracking_raw_url', 'tracking_raw', ['url']) + op.create_index('tracking_raw_user_key', 'tracking_raw', ['user_key']) + op.create_index( + 'tracking_raw_access_timestamp', 'tracking_raw', ['access_timestamp'] + ) + + op.create_table( + 'tracking_summary', sa.Column('url', sa.UnicodeText, nullable=False), + sa.Column('package_id', sa.UnicodeText), + sa.Column('tracking_type', sa.String(10), nullable=False), + sa.Column('count', sa.Integer, nullable=False), + sa.Column( + 'running_total', sa.Integer, nullable=False, server_default='0' + ), + sa.Column( + 'recent_views', sa.Integer, nullable=False, server_default='0' + ), sa.Column('tracking_date', sa.Date) + ) + + op.create_index('tracking_summary_url', 'tracking_summary', ['url']) + op.create_index( + 'tracking_summary_package_id', 'tracking_summary', ['package_id'] + ) + op.create_index( + 'tracking_summary_date', 'tracking_summary', ['tracking_date'] + ) + + +def downgrade(): + op.drop_table('tracking_summary') + op.drop_table('tracking_raw') diff --git a/ckan/migration/versions/057_tracking.py b/ckan/migration/versions/057_tracking.py deleted file mode 100644 index 9c151a177be..00000000000 --- a/ckan/migration/versions/057_tracking.py +++ /dev/null @@ -1,35 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute(''' - BEGIN; - CREATE TABLE tracking_raw ( - user_key character varying(100) NOT NULL, - url text NOT NULL, - tracking_type character varying(10) NOT NULL, - access_timestamp timestamp without time zone DEFAULT current_timestamp - ); - CREATE INDEX tracking_raw_url ON tracking_raw(url); - CREATE INDEX tracking_raw_user_key ON tracking_raw(user_key); - CREATE INDEX tracking_raw_access_timestamp ON tracking_raw(access_timestamp); - - CREATE TABLE tracking_summary( - url text NOT NULL, - package_id text, - tracking_type character varying(10) NOT NULL, - count int NOT NULL, - running_total int NOT NULL DEFAULT 0, - recent_views int NOT NULL DEFAULT 0, - tracking_date date - ); - - CREATE INDEX tracking_summary_url ON tracking_summary(url); - CREATE INDEX tracking_summary_package_id ON tracking_summary(package_id); - CREATE INDEX tracking_summary_date ON tracking_summary(tracking_date); - - COMMIT; - ''' - ) diff --git a/ckan/migration/versions/058_add_follower_tables.py b/ckan/migration/versions/058_add_follower_tables.py deleted file mode 100644 index 4ed829cc697..00000000000 --- a/ckan/migration/versions/058_add_follower_tables.py +++ /dev/null @@ -1,39 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - migrate_engine.execute(''' -CREATE TABLE user_following_dataset ( - follower_id text NOT NULL, - object_id text NOT NULL, - datetime timestamp without time zone NOT NULL -); - -CREATE TABLE user_following_user ( - follower_id text NOT NULL, - object_id text NOT NULL, - datetime timestamp without time zone NOT NULL -); - -ALTER TABLE user_following_dataset - ADD CONSTRAINT user_following_dataset_pkey PRIMARY KEY (follower_id, object_id); - -ALTER TABLE user_following_user - ADD CONSTRAINT user_following_user_pkey PRIMARY KEY (follower_id, object_id); - -ALTER TABLE user_following_dataset - ADD CONSTRAINT user_following_dataset_follower_id_fkey FOREIGN KEY (follower_id) REFERENCES "user"(id) ON UPDATE CASCADE ON DELETE CASCADE; - -ALTER TABLE user_following_dataset - ADD CONSTRAINT user_following_dataset_object_id_fkey FOREIGN KEY (object_id) REFERENCES package(id) ON UPDATE CASCADE ON DELETE CASCADE; - -ALTER TABLE user_following_user - ADD CONSTRAINT user_following_user_follower_id_fkey FOREIGN KEY (follower_id) REFERENCES "user"(id) ON UPDATE CASCADE ON DELETE CASCADE; - -ALTER TABLE user_following_user - ADD CONSTRAINT user_following_user_object_id_fkey FOREIGN KEY (object_id) REFERENCES "user"(id) ON UPDATE CASCADE ON DELETE CASCADE; - ''') diff --git a/ckan/migration/versions/058_bd36d1826a5d_add_follower_tables.py b/ckan/migration/versions/058_bd36d1826a5d_add_follower_tables.py new file mode 100644 index 00000000000..a1f5a28742e --- /dev/null +++ b/ckan/migration/versions/058_bd36d1826a5d_add_follower_tables.py @@ -0,0 +1,73 @@ +"""058 Add follower tables + +Revision ID: bd36d1826a5d +Revises: 660a5aae527e +Create Date: 2018-09-04 18:49:08.908624 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'bd36d1826a5d' +down_revision = '660a5aae527e' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'user_following_dataset', + sa.Column('follower_id', sa.UnicodeText, nullable=False), + sa.Column('object_id', sa.UnicodeText, nullable=False), + sa.Column('datetime', sa.TIMESTAMP, nullable=False) + ) + op.create_table( + 'user_following_user', + sa.Column('follower_id', sa.UnicodeText, nullable=False), + sa.Column('object_id', sa.UnicodeText, nullable=False), + sa.Column('datetime', sa.TIMESTAMP, nullable=False) + ) + + op.create_primary_key( + 'user_following_dataset_pkey', 'user_following_dataset', + ['follower_id', 'object_id'] + ) + op.create_primary_key( + 'user_following_user_pkey', 'user_following_user', + ['follower_id', 'object_id'] + ) + + op.create_foreign_key( + 'user_following_dataset_follower_id_fkey', + 'user_following_dataset', + 'user', ['follower_id'], ['id'], + onupdate='CASCADE', + ondelete='CASCADE' + ) + op.create_foreign_key( + 'user_following_dataset_object_id_fkey', + 'user_following_dataset', + 'package', ['object_id'], ['id'], + onupdate='CASCADE', + ondelete='CASCADE' + ) + op.create_foreign_key( + 'user_following_user_follower_id_fkey', + 'user_following_user', + 'user', ['follower_id'], ['id'], + onupdate='CASCADE', + ondelete='CASCADE' + ) + op.create_foreign_key( + 'user_following_user_object_id_fkey', + 'user_following_user', + 'user', ['object_id'], ['id'], + onupdate='CASCADE', + ondelete='CASCADE' + ) + + +def downgrade(): + op.drop_table('user_following_dataset') + op.drop_table('user_following_user') diff --git a/ckan/migration/versions/059_9291bb46f352_add_related_count_and_flag.py b/ckan/migration/versions/059_9291bb46f352_add_related_count_and_flag.py new file mode 100644 index 00000000000..8371a37a0c7 --- /dev/null +++ b/ckan/migration/versions/059_9291bb46f352_add_related_count_and_flag.py @@ -0,0 +1,33 @@ +"""059 Add related count and_flag + +Revision ID: 9291bb46f352 +Revises: bd36d1826a5d +Create Date: 2018-09-04 18:49:09.243738 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '9291bb46f352' +down_revision = 'bd36d1826a5d' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column( + 'related', + sa.Column( + 'view_count', sa.Integer, nullable=False, server_default='0' + ) + ) + op.add_column( + 'related', + sa.Column('featured', sa.Integer, nullable=False, server_default='0') + ) + + +def downgrade(): + op.drop_column('related', 'view_count') + op.drop_column('related', 'featured') diff --git a/ckan/migration/versions/059_add_related_count_and_flag.py b/ckan/migration/versions/059_add_related_count_and_flag.py deleted file mode 100644 index 294e5c45a12..00000000000 --- a/ckan/migration/versions/059_add_related_count_and_flag.py +++ /dev/null @@ -1,16 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - migrate_engine.execute(''' - ALTER TABLE "related" - ADD COLUMN view_count INT NOT NULL DEFAULT 0; - - ALTER TABLE "related" - ADD COLUMN featured INT NOT NULL DEFAULT 0; - - UPDATE related SET view_count=0, featured=0 WHERE view_count IS NULL; - ''' - ) diff --git a/ckan/migration/versions/060_31ad11c518fc_add_system_info_table.py b/ckan/migration/versions/060_31ad11c518fc_add_system_info_table.py new file mode 100644 index 00000000000..5639f9302da --- /dev/null +++ b/ckan/migration/versions/060_31ad11c518fc_add_system_info_table.py @@ -0,0 +1,47 @@ +"""060 Add system info table + +Revision ID: 31ad11c518fc +Revises: 9291bb46f352 +Create Date: 2018-09-04 18:49:09.587220 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '31ad11c518fc' +down_revision = '9291bb46f352' +branch_labels = None +depends_on = None + + +def upgrade(): + + op.create_table( + 'system_info', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('key', sa.Unicode(100), unique=True, nullable=False), + sa.Column('value', sa.UnicodeText), + sa.Column('revision_id', sa.UnicodeText, sa.ForeignKey('revision.id')) + ) + + op.create_table( + 'system_info_revision', + sa.Column('id', sa.Integer, primary_key=True, nullable=False), + sa.Column('key', sa.Unicode(100), unique=True, nullable=False), + sa.Column('value', sa.UnicodeText), + sa.Column( + 'revision_id', + sa.UnicodeText, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column( + 'continuity_id', sa.Integer, sa.ForeignKey('system_info.id') + ), + ) + + +def downgrade(): + op.drop_table('system_info_revision') + op.drop_table('system_info') diff --git a/ckan/migration/versions/060_add_system_info_table.py b/ckan/migration/versions/060_add_system_info_table.py deleted file mode 100644 index ceeb821036e..00000000000 --- a/ckan/migration/versions/060_add_system_info_table.py +++ /dev/null @@ -1,29 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - meta = MetaData() - - - system_info_table = Table('system_info', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('key', Unicode(100), unique=True, nullable=False), - Column('value', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id')) - ) - - system_info_revision_table = Table('system_info_revision', meta, - Column('id', Integer() , primary_key=True, nullable=False), - Column('key', Unicode(100), unique=True, nullable=False), - Column('value', UnicodeText), - Column('revision_id', UnicodeText, ForeignKey('revision.id'), primary_key=True), - Column('continuity_id', Integer(), ForeignKey('system_info.id') ), - ) - - - meta.bind = migrate_engine - revision_table = Table('revision', meta, autoload=True) - - meta.create_all() diff --git a/ckan/migration/versions/061_338d460bc460_add_follower_group_table.py b/ckan/migration/versions/061_338d460bc460_add_follower_group_table.py new file mode 100644 index 00000000000..a3a9185fa5a --- /dev/null +++ b/ckan/migration/versions/061_338d460bc460_add_follower_group_table.py @@ -0,0 +1,49 @@ +"""061 Add follower group_table + +Revision ID: 338d460bc460 +Revises: 31ad11c518fc +Create Date: 2018-09-04 18:49:09.925977 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '338d460bc460' +down_revision = '31ad11c518fc' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'user_following_group', + sa.Column('follower_id', sa.UnicodeText, nullable=False), + sa.Column('object_id', sa.UnicodeText, nullable=False), + sa.Column('datetime', sa.TIMESTAMP, nullable=False) + ) + + op.create_primary_key( + 'user_following_group_pkey', 'user_following_group', + ['follower_id', 'object_id'] + ) + op.create_foreign_key( + 'user_following_group_user_id_fkey', + 'user_following_group', + 'user', ['follower_id'], + ['id'], + onupdate='CASCADE', + ondelete='CASCADE' + ) + op.create_foreign_key( + 'user_following_group_group_id_fkey', + 'user_following_group', + 'group', ['object_id'], + ['id'], + onupdate='CASCADE', + ondelete='CASCADE' + ) + + +def downgrade(): + op.drop_table('user_following_group') diff --git a/ckan/migration/versions/061_add_follower__group_table.py b/ckan/migration/versions/061_add_follower__group_table.py deleted file mode 100644 index 5fe27e2fc9e..00000000000 --- a/ckan/migration/versions/061_add_follower__group_table.py +++ /dev/null @@ -1,24 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - migrate_engine.execute(''' -CREATE TABLE user_following_group ( - follower_id text NOT NULL, - object_id text NOT NULL, - datetime timestamp without time zone NOT NULL -); - -ALTER TABLE user_following_group - ADD CONSTRAINT user_following_group_pkey PRIMARY KEY (follower_id, object_id); - -ALTER TABLE user_following_group - ADD CONSTRAINT user_following_group_user_id_fkey FOREIGN KEY (follower_id) REFERENCES "user"(id) ON UPDATE CASCADE ON DELETE CASCADE; - -ALTER TABLE user_following_group - ADD CONSTRAINT user_following_group_group_id_fkey FOREIGN KEY (object_id) REFERENCES "group"(id) ON UPDATE CASCADE ON DELETE CASCADE; - ''') diff --git a/ckan/migration/versions/062_6deb2bbab394_add_dashboard_table.py b/ckan/migration/versions/062_6deb2bbab394_add_dashboard_table.py new file mode 100644 index 00000000000..8d3e063b17c --- /dev/null +++ b/ckan/migration/versions/062_6deb2bbab394_add_dashboard_table.py @@ -0,0 +1,34 @@ +"""062 Add dashboard table + +Revision ID: 6deb2bbab394 +Revises: 338d460bc460 +Create Date: 2018-09-04 18:49:10.266290 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '6deb2bbab394' +down_revision = '338d460bc460' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'dashboard', sa.Column('user_id', sa.UnicodeText, nullable=False), + sa.Column('activity_stream_last_viewed', sa.TIMESTAMP, nullable=False) + ) + op.create_primary_key('dashboard_pkey', 'dashboard', ['user_id']) + op.create_foreign_key( + 'dashboard_user_id_fkey', + 'dashboard', + 'user', ['user_id'], ['id'], + onupdate='CASCADE', + ondelete='CASCADE' + ) + + +def downgrade(): + op.drop_table('dashboard') diff --git a/ckan/migration/versions/062_add_dashboard_table.py b/ckan/migration/versions/062_add_dashboard_table.py deleted file mode 100644 index c820ba372d0..00000000000 --- a/ckan/migration/versions/062_add_dashboard_table.py +++ /dev/null @@ -1,18 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - migrate_engine.execute(''' -CREATE TABLE dashboard ( - user_id text NOT NULL, - activity_stream_last_viewed timestamp without time zone NOT NULL -); -ALTER TABLE dashboard - ADD CONSTRAINT dashboard_pkey PRIMARY KEY (user_id); -ALTER TABLE dashboard - ADD CONSTRAINT dashboard_user_id_fkey FOREIGN KEY (user_id) REFERENCES "user"(id) ON UPDATE CASCADE ON DELETE CASCADE; - ''') diff --git a/ckan/migration/versions/063_8b633852cb7a_org_changes.py b/ckan/migration/versions/063_8b633852cb7a_org_changes.py new file mode 100644 index 00000000000..3569ccbc35b --- /dev/null +++ b/ckan/migration/versions/063_8b633852cb7a_org_changes.py @@ -0,0 +1,54 @@ +"""063 Org changes + +Revision ID: 8b633852cb7a +Revises: 6deb2bbab394 +Create Date: 2018-09-04 18:49:10.608831 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '8b633852cb7a' +down_revision = '6deb2bbab394' +branch_labels = None +depends_on = None + + +def upgrade(): + + op.add_column( + 'user', sa.Column('sysadmin', sa.Boolean, server_default='FALSE') + ) + op.add_column('package', sa.Column('owner_org', sa.UnicodeText)) + op.add_column( + 'package', sa.Column('private', sa.Boolean, server_default='FALSE') + ) + + op.add_column('package_revision', sa.Column('owner_org', sa.UnicodeText)) + op.add_column( + 'package_revision', + sa.Column('private', sa.Boolean, server_default='FALSE') + ) + + op.add_column( + 'group', + sa.Column('is_organization', sa.Boolean, server_default='FALSE') + ) + op.add_column( + 'group_revision', + sa.Column('is_organization', sa.Boolean, server_default='FALSE') + ) + + +def downgrade(): + + op.drop_column('user', 'sysadmin') + op.drop_column('package', 'owner_org') + op.drop_column('package', 'private') + + op.drop_column('package_revision', 'owner_org') + op.drop_column('package_revision', 'private') + + op.drop_column('group', 'is_organization') + op.drop_column('group_revision', 'is_organization') diff --git a/ckan/migration/versions/063_org_changes.py b/ckan/migration/versions/063_org_changes.py deleted file mode 100644 index d2ce6772ad5..00000000000 --- a/ckan/migration/versions/063_org_changes.py +++ /dev/null @@ -1,33 +0,0 @@ -# encoding: utf-8 - -from migrate import * - -def upgrade(migrate_engine): - - update_schema = ''' -BEGIN; - -ALTER TABLE "user" - ADD COLUMN sysadmin boolean DEFAULT FALSE; - -ALTER TABLE package - ADD COLUMN owner_org TEXT, - ADD COLUMN private boolean DEFAULT FALSE; - -ALTER TABLE package_revision - ADD COLUMN owner_org TEXT, - ADD COLUMN private boolean DEFAULT FALSE; - - -ALTER TABLE "group" - ADD COLUMN is_organization boolean DEFAULT FALSE; - -ALTER TABLE group_revision - ADD COLUMN is_organization boolean DEFAULT FALSE; - -UPDATE "user" SET sysadmin=true WHERE id in ( SELECT user_id FROM user_object_role WHERE role='admin' AND context='System'); - -COMMIT; - -''' - migrate_engine.execute(update_schema) diff --git a/ckan/migration/versions/064_4f8becd4919a_add_email_last_sent_column.py b/ckan/migration/versions/064_4f8becd4919a_add_email_last_sent_column.py new file mode 100644 index 00000000000..96c571df8f4 --- /dev/null +++ b/ckan/migration/versions/064_4f8becd4919a_add_email_last_sent_column.py @@ -0,0 +1,31 @@ +"""064 Add email_last_sent_column + +Revision ID: 4f8becd4919a +Revises: 8b633852cb7a +Create Date: 2018-09-04 18:49:10.939639 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '4f8becd4919a' +down_revision = '8b633852cb7a' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column( + 'dashboard', + sa.Column( + 'email_last_sent', + sa.TIMESTAMP, + nullable=False, + server_default=sa.func.localtimestamp() + ) + ) + + +def downgrade(): + op.drop_column('dashboard', 'email_last_sent') diff --git a/ckan/migration/versions/064_add_email_last_sent_column.py b/ckan/migration/versions/064_add_email_last_sent_column.py deleted file mode 100644 index d47a74cf9f6..00000000000 --- a/ckan/migration/versions/064_add_email_last_sent_column.py +++ /dev/null @@ -1,12 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - migrate_engine.execute(''' -ALTER TABLE dashboard - ADD COLUMN email_last_sent timestamp without time zone NOT NULL DEFAULT LOCALTIMESTAMP; - ''') diff --git a/ckan/migration/versions/065_1fab0bc6439e_add_email_notifications_preference.py b/ckan/migration/versions/065_1fab0bc6439e_add_email_notifications_preference.py new file mode 100644 index 00000000000..aa594e63be8 --- /dev/null +++ b/ckan/migration/versions/065_1fab0bc6439e_add_email_notifications_preference.py @@ -0,0 +1,30 @@ +"""065 Add email notifications preference + +Revision ID: 1fab0bc6439e +Revises: 4f8becd4919a +Create Date: 2018-09-04 18:49:11.283832 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '1fab0bc6439e' +down_revision = '4f8becd4919a' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column( + 'user', + sa.Column( + 'activity_streams_email_notifications', + sa.Boolean, + server_default='FALSE' + ) + ) + + +def downgrade(): + op.drop_column('user', 'activity_streams_email_notifications') diff --git a/ckan/migration/versions/065_add_email_notifications_preference.py b/ckan/migration/versions/065_add_email_notifications_preference.py deleted file mode 100644 index ced562eb589..00000000000 --- a/ckan/migration/versions/065_add_email_notifications_preference.py +++ /dev/null @@ -1,12 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import * -from migrate import * - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - migrate_engine.execute(''' -ALTER TABLE public.user - ADD COLUMN activity_streams_email_notifications BOOLEAN DEFAULT FALSE; - ''') diff --git a/ckan/migration/versions/066_ad16b3bd8cb6_default_package_type.py b/ckan/migration/versions/066_ad16b3bd8cb6_default_package_type.py new file mode 100644 index 00000000000..dd56a043af1 --- /dev/null +++ b/ckan/migration/versions/066_ad16b3bd8cb6_default_package_type.py @@ -0,0 +1,23 @@ +"""066 Default package type + +Revision ID: ad16b3bd8cb6 +Revises: 1fab0bc6439e +Create Date: 2018-09-04 18:49:11.624055 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'ad16b3bd8cb6' +down_revision = '1fab0bc6439e' +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + pass diff --git a/ckan/migration/versions/066_default_package_type.py b/ckan/migration/versions/066_default_package_type.py deleted file mode 100644 index 48ccec0153d..00000000000 --- a/ckan/migration/versions/066_default_package_type.py +++ /dev/null @@ -1,14 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - - update_statement = ''' -BEGIN; - -UPDATE package SET type = 'dataset' WHERE type IS NULL; - -COMMIT; - -''' - migrate_engine.execute(update_statement) diff --git a/ckan/migration/versions/067_266c110eafec_turn_extras_to_strings.py b/ckan/migration/versions/067_266c110eafec_turn_extras_to_strings.py new file mode 100644 index 00000000000..edbc2cdc496 --- /dev/null +++ b/ckan/migration/versions/067_266c110eafec_turn_extras_to_strings.py @@ -0,0 +1,23 @@ +"""067 Turn extras to strings + +Revision ID: 266c110eafec +Revises: ad16b3bd8cb6 +Create Date: 2018-09-04 18:49:11.961287 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '266c110eafec' +down_revision = 'ad16b3bd8cb6' +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + pass diff --git a/ckan/migration/versions/067_turn_extras_to_strings.py b/ckan/migration/versions/067_turn_extras_to_strings.py deleted file mode 100644 index c69be512969..00000000000 --- a/ckan/migration/versions/067_turn_extras_to_strings.py +++ /dev/null @@ -1,30 +0,0 @@ -# encoding: utf-8 - -import json - -def upgrade(migrate_engine): - - with migrate_engine.begin() as connection: - tables = 'package_extra group_extra' - revision_tables = 'package_extra_revision group_extra_revision' - - for table in tables.split(): - sql = """select id, value from {table} where substr(value,1,1) = '"' """.format(table=table) - results = connection.execute(sql) - for result in results: - id, value = result - update_sql = 'update {table} set value = %s where id = %s' - connection.execute(update_sql.format(table=table), - json.loads(value), id) - - for table in revision_tables.split(): - sql = """select id, revision_id, value from {table} where substr(value,1,1) = '"' """.format(table=table) - - results = connection.execute(sql) - for result in results: - id, revision_id, value = result - update_sql = 'update {table} set value = %s where id = %s and revision_id = %s' - connection.execute(update_sql.format(table=table), - json.loads(value), id, revision_id) - - diff --git a/ckan/migration/versions/068_add_package_extras_index.py b/ckan/migration/versions/068_add_package_extras_index.py deleted file mode 100644 index 1aac25089e5..00000000000 --- a/ckan/migration/versions/068_add_package_extras_index.py +++ /dev/null @@ -1,10 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - CREATE INDEX idx_package_extra_package_id ON package_extra_revision - USING BTREE (package_id, current); - ''' - ) diff --git a/ckan/migration/versions/068_e33a5f2b2a84_add_package_extras_index.py b/ckan/migration/versions/068_e33a5f2b2a84_add_package_extras_index.py new file mode 100644 index 00000000000..d6f27a06268 --- /dev/null +++ b/ckan/migration/versions/068_e33a5f2b2a84_add_package_extras_index.py @@ -0,0 +1,26 @@ +"""068 Add package extras index + +Revision ID: e33a5f2b2a84 +Revises: 266c110eafec +Create Date: 2018-09-04 18:49:12.301432 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'e33a5f2b2a84' +down_revision = '266c110eafec' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_index( + 'idx_package_extra_package_id', 'package_extra_revision', + ['package_id', 'current'] + ) + + +def downgrade(): + op.drop_index('idx_package_extra_package_id', 'package_extra_revision') diff --git a/ckan/migration/versions/069_e7524c675cdb_resource_url_and_metadata_modified.py b/ckan/migration/versions/069_e7524c675cdb_resource_url_and_metadata_modified.py new file mode 100644 index 00000000000..1137d615f92 --- /dev/null +++ b/ckan/migration/versions/069_e7524c675cdb_resource_url_and_metadata_modified.py @@ -0,0 +1,41 @@ +"""069 Resource url and metadata_modified + +Revision ID: e7524c675cdb +Revises: e33a5f2b2a84 +Create Date: 2018-09-04 18:49:12.639912 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'e7524c675cdb' +down_revision = 'e33a5f2b2a84' +branch_labels = None +depends_on = None + + +def upgrade(): + + op.add_column('resource', sa.Column('url_type', sa.UnicodeText)) + op.add_column('resource_revision', sa.Column('url_type', sa.UnicodeText)) + + op.add_column('package', sa.Column('metadata_modified', sa.TIMESTAMP)) + op.add_column('package', sa.Column('creator_user_id', sa.UnicodeText)) + op.add_column( + 'package_revision', sa.Column('metadata_modified', sa.TIMESTAMP) + ) + op.add_column( + 'package_revision', sa.Column('creator_user_id', sa.UnicodeText) + ) + + +def downgrade(): + + op.drop_column('resource', 'url_type') + op.drop_column('resource_revision', 'url_type') + + op.drop_column('package', 'metadata_modified') + op.drop_column('package', 'creator_user_id') + op.drop_column('package_revision', 'metadata_modified') + op.drop_column('package_revision', 'creator_user_id') diff --git a/ckan/migration/versions/069_resource_url_and_metadata_modified.py b/ckan/migration/versions/069_resource_url_and_metadata_modified.py deleted file mode 100644 index 888d146f93c..00000000000 --- a/ckan/migration/versions/069_resource_url_and_metadata_modified.py +++ /dev/null @@ -1,76 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - - update_schema = ''' -BEGIN; - -ALTER TABLE resource - ADD COLUMN url_type TEXT; - -ALTER TABLE resource_revision - ADD COLUMN url_type TEXT; - -ALTER TABLE package - ADD COLUMN metadata_modified timestamp without time zone, - ADD COLUMN creator_user_id TEXT; - -ALTER TABLE package_revision - ADD COLUMN metadata_modified timestamp without time zone, - ADD COLUMN creator_user_id TEXT; - - --- package -update package -set metadata_modified = greatest(max_revision, metadata_modified) -from -( -select id package_id, max(revision_timestamp) max_revision -from package_revision group by id -) max_rev -where max_rev.package_id = package.id; - --- package tag -update package -set metadata_modified = greatest(max_revision, metadata_modified) -from (select package_id, max(revision_timestamp) max_revision -from package_tag_revision group by package_id) max_rev -where max_rev.package_id = package.id; - --- package extra -update package -set metadata_modified = greatest(max_revision, metadata_modified) -from (select package_id, max(revision_timestamp) max_revision -from package_extra_revision group by package_id) max_rev -where max_rev.package_id = package.id; - ---resource - -update package -set metadata_modified = greatest(max_revision, metadata_modified) -from (select package_id, max(revision_timestamp) max_revision - from resource_revision - join resource_group - on resource_revision.resource_group_id = resource_group.id - group by package_id) max_rev -where max_rev.package_id = package.id -; - --- add as many creators as we can find -update package set creator_user_id = user_id from -(select - package_revision.id as package_id, - "user".id as user_id, revision_timestamp, - row_number() over - (partition by package_revision.id order by revision_timestamp) num -from package_revision - join revision on package_revision.revision_id = revision.id join "user" - on (revision.author = "user".name - or revision.author = "user".openid)) first_rev - where package_id = id and num = 1; - -COMMIT; - -''' - migrate_engine.execute(update_schema) diff --git a/ckan/migration/versions/070_add_activity_and_resource_indexes.py b/ckan/migration/versions/070_add_activity_and_resource_indexes.py deleted file mode 100644 index 62c1a3802e0..00000000000 --- a/ckan/migration/versions/070_add_activity_and_resource_indexes.py +++ /dev/null @@ -1,16 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - CREATE INDEX idx_activity_user_id ON activity - (user_id, timestamp); - CREATE INDEX idx_activity_object_id ON activity - (object_id, timestamp); - CREATE INDEX idx_activity_detail_activity_id ON activity_detail - (activity_id); - CREATE INDEX idx_resource_resource_group_id ON resource_revision - (resource_group_id, current); - ''' - ) diff --git a/ckan/migration/versions/070_cfb544112fa7_add_activity_and_resource_indexes.py b/ckan/migration/versions/070_cfb544112fa7_add_activity_and_resource_indexes.py new file mode 100644 index 00000000000..3498045a108 --- /dev/null +++ b/ckan/migration/versions/070_cfb544112fa7_add_activity_and_resource_indexes.py @@ -0,0 +1,38 @@ +"""070 Add activity and resource_indexes + +Revision ID: cfb544112fa7 +Revises: e7524c675cdb +Create Date: 2018-09-04 18:49:13.010411 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'cfb544112fa7' +down_revision = 'e7524c675cdb' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_index( + 'idx_activity_user_id', 'activity', ['user_id', 'timestamp'] + ) + op.create_index( + 'idx_activity_object_id', 'activity', ['object_id', 'timestamp'] + ) + op.create_index( + 'idx_activity_detail_activity_id', 'activity_detail', ['activity_id'] + ) + op.create_index( + 'idx_resource_resource_group_id', 'resource_revision', + ['resource_group_id', 'current'] + ) + + +def downgrade(): + op.drop_index('idx_activity_user_id', 'activity') + op.drop_index('idx_activity_object_id', 'activity') + op.drop_index('idx_activity_detail_activity_id', 'activity_detail') + op.drop_index('idx_resource_resource_group_id', 'resource_revision') diff --git a/ckan/migration/versions/071_add_state_column_to_user_table.py b/ckan/migration/versions/071_add_state_column_to_user_table.py deleted file mode 100644 index e890b5b05be..00000000000 --- a/ckan/migration/versions/071_add_state_column_to_user_table.py +++ /dev/null @@ -1,11 +0,0 @@ -# encoding: utf-8 - -import ckan.model - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - ALTER TABLE "user" ADD COLUMN "state" text NOT NULL DEFAULT '%s' - ''' % ckan.model.State.ACTIVE - ) diff --git a/ckan/migration/versions/071_c16f081ef73a_add_state_column_to_user_table.py b/ckan/migration/versions/071_c16f081ef73a_add_state_column_to_user_table.py new file mode 100644 index 00000000000..930a826b23b --- /dev/null +++ b/ckan/migration/versions/071_c16f081ef73a_add_state_column_to_user_table.py @@ -0,0 +1,28 @@ +"""071 Add state column to_user_table + +Revision ID: c16f081ef73a +Revises: cfb544112fa7 +Create Date: 2018-09-04 18:49:13.351494 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'c16f081ef73a' +down_revision = 'cfb544112fa7' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column( + 'user', + sa.Column( + 'state', sa.UnicodeText, nullable=False, server_default='active' + ) + ) + + +def downgrade(): + op.drop_column('user', 'state') diff --git a/ckan/migration/versions/072_08dcb9233ad7_add_resource_view.py b/ckan/migration/versions/072_08dcb9233ad7_add_resource_view.py new file mode 100644 index 00000000000..45d992e7821 --- /dev/null +++ b/ckan/migration/versions/072_08dcb9233ad7_add_resource_view.py @@ -0,0 +1,38 @@ +"""072 Add resource view + +Revision ID: 08dcb9233ad7 +Revises: c16f081ef73a +Create Date: 2018-09-04 18:49:13.697490 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '08dcb9233ad7' +down_revision = 'c16f081ef73a' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'resource_view', + sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('resource_id', sa.UnicodeText), + sa.Column('title', sa.UnicodeText), + sa.Column('description', sa.UnicodeText), + sa.Column('view_type', sa.UnicodeText, nullable=False), + sa.Column('order', sa.Integer, nullable=False), + sa.Column('config', sa.UnicodeText), + ) + + op.create_primary_key('resource_view_pkey', 'resource_view', ['id']) + op.create_foreign_key( + 'resource_view_resource_id_fkey', 'resource_view', 'resource', + ['resource_id'], ['id'] + ) + + +def downgrade(): + op.drop_table('resource_view') diff --git a/ckan/migration/versions/072_add_resource_view.py b/ckan/migration/versions/072_add_resource_view.py deleted file mode 100644 index 57d22236a1c..00000000000 --- a/ckan/migration/versions/072_add_resource_view.py +++ /dev/null @@ -1,26 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute(''' - BEGIN; - - CREATE TABLE resource_view ( - id text NOT NULL, - resource_id text, - title text, - description text, - view_type text NOT NULL, - "order" integer NOT NULL, - config text - ); - - ALTER TABLE resource_view - ADD CONSTRAINT resource_view_pkey PRIMARY KEY (id); - - ALTER TABLE resource_view - ADD CONSTRAINT resource_view_resource_id_fkey - FOREIGN KEY (resource_id) REFERENCES resource(id); - - COMMIT; - ''') diff --git a/ckan/migration/versions/073_011f51208be3_update_resource_view_resource_id_.py b/ckan/migration/versions/073_011f51208be3_update_resource_view_resource_id_.py new file mode 100644 index 00000000000..b8770af40b1 --- /dev/null +++ b/ckan/migration/versions/073_011f51208be3_update_resource_view_resource_id_.py @@ -0,0 +1,34 @@ +"""073 Update resource view resource_id_constraint + +Revision ID: 011f51208be3 +Revises: 08dcb9233ad7 +Create Date: 2018-09-04 18:49:14.072410 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '011f51208be3' +down_revision = '08dcb9233ad7' +branch_labels = None +depends_on = None + + +def upgrade(): + op.drop_constraint('resource_view_resource_id_fkey', 'resource_view') + op.create_foreign_key( + 'resource_view_resource_id_fkey', + 'resource_view', + 'resource', ['resource_id'], ['id'], + ondelete='CASCADE', + onupdate='CASCADE' + ) + + +def downgrade(): + op.drop_constraint('resource_view_resource_id_fkey', 'resource_view') + op.create_foreign_key( + 'resource_view_resource_id_fkey', 'resource_view', 'resource', + ['resource_id'], ['id'] + ) diff --git a/ckan/migration/versions/073_update_resource_view_resource_id_constraint.py b/ckan/migration/versions/073_update_resource_view_resource_id_constraint.py deleted file mode 100644 index 6a6d4e79cb7..00000000000 --- a/ckan/migration/versions/073_update_resource_view_resource_id_constraint.py +++ /dev/null @@ -1,17 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute(''' - BEGIN; - - ALTER TABLE resource_view - DROP CONSTRAINT resource_view_resource_id_fkey; - - ALTER TABLE resource_view - ADD CONSTRAINT resource_view_resource_id_fkey - FOREIGN KEY (resource_id) REFERENCES resource(id) - ON UPDATE CASCADE ON DELETE CASCADE; - - COMMIT; - ''') diff --git a/ckan/migration/versions/074_a4ca55f0f45e_remove_resource_groups.py b/ckan/migration/versions/074_a4ca55f0f45e_remove_resource_groups.py new file mode 100644 index 00000000000..07dc9107fd3 --- /dev/null +++ b/ckan/migration/versions/074_a4ca55f0f45e_remove_resource_groups.py @@ -0,0 +1,128 @@ +"""074 Remove resource groups + +Revision ID: a4ca55f0f45e +Revises: 011f51208be3 +Create Date: 2018-09-04 18:49:14.423978 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'a4ca55f0f45e' +down_revision = '011f51208be3' +branch_labels = None +depends_on = None + +resource_indexes = (( + 'resource_revision', (( + 'idx_resource_period_resource_group', + ('revision_timestamp', 'expired_timestamp', 'resource_group_id') + ), ) +), ( + 'resource_group_revision', ( + ( + 'idx_resource_group_period', + ('revision_timestamp', 'expired_timestamp', 'id') + ), + ( + 'idx_resource_group_period_package', + ('revision_timestamp', 'expired_timestamp', 'package_id') + ), + ('idx_resource_group_current', ('current', )), + ) +)) + + +def upgrade(): + op.add_column( + 'resource', + sa.Column( + 'package_id', sa.UnicodeText, nullable=False, server_default='' + ) + ) + op.drop_column('resource', 'resource_group_id') + op.add_column( + 'resource_revision', + sa.Column( + 'package_id', sa.UnicodeText, nullable=False, server_default='' + ) + ) + op.drop_column('resource_revision', 'resource_group_id') + + op.drop_table('resource_group_revision') + op.drop_table('resource_group') + + +def downgrade(): + op.create_table( + 'resource_group', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('package_id', sa.UnicodeText, sa.ForeignKey('package.id')), + sa.Column('label', sa.UnicodeText), + sa.Column('sort_order', sa.UnicodeText), + sa.Column('extras', sa.UnicodeText), + sa.Column('state', sa.UnicodeText), + sa.Column('revision_id', sa.UnicodeText, sa.ForeignKey('revision.id')), + ) + + op.create_table( + 'resource_group_revision', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('package_id', sa.UnicodeText, sa.ForeignKey('package.id')), + sa.Column('label', sa.UnicodeText), + sa.Column('sort_order', sa.UnicodeText), + sa.Column('extras', sa.UnicodeText), + sa.Column('state', sa.UnicodeText), + sa.Column( + 'revision_id', + sa.UnicodeText, + sa.ForeignKey('revision.id'), + primary_key=True + ), + sa.Column( + 'continuity_id', sa.UnicodeText, + sa.ForeignKey('resource_group.id') + ), sa.Column('expired_id', sa.UnicodeText), + sa.Column('revision_timestamp', sa.TIMESTAMP), + sa.Column('expired_timestamp', sa.TIMESTAMP), + sa.Column('current', sa.Boolean) + ) + + op.drop_column('resource', 'package_id') + op.drop_column('resource_revision', 'package_id') + + op.add_column( + 'resource', + sa.Column( + 'resource_group_id', + sa.UnicodeText, + nullable=False, + server_default='' + ) + ) + op.add_column( + 'resource_revision', + sa.Column( + 'resource_group_id', + sa.UnicodeText, + nullable=False, + server_default='' + ) + ) + op.create_index( + 'idx_resource_resource_group_id', 'resource_revision', + ['resource_group_id', 'current'] + ) + + for table, indexes in resource_indexes: + for index, fields in indexes: + op.create_index(index, table, fields) + op.create_foreign_key( + 'resource_resource_group_id_fkey', 'resource', 'resource_group', + ['resource_group_id'], ['id'] + ) + op.create_foreign_key( + 'resource_revision_resource_group_id_fkey', 'resource_revision', + 'resource_group', ['resource_group_id'], ['id'] + ) diff --git a/ckan/migration/versions/074_remove_resource_groups.py b/ckan/migration/versions/074_remove_resource_groups.py deleted file mode 100644 index 9a55dd192ec..00000000000 --- a/ckan/migration/versions/074_remove_resource_groups.py +++ /dev/null @@ -1,31 +0,0 @@ -# encoding: utf-8 - -import ckan.model - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - ALTER TABLE "resource" - ADD COLUMN "package_id" text NOT NULL DEFAULT ''; - UPDATE "resource" AS R - SET package_id = G.package_id - FROM "resource_group" AS G - WHERE R.resource_group_id = G.id; - ALTER TABLE "resource" DROP COLUMN "resource_group_id"; - - ALTER TABLE "resource_revision" - ADD COLUMN "package_id" text NOT NULL DEFAULT ''; - UPDATE "resource_revision" AS R - SET package_id = G.package_id - FROM "resource_group_revision" AS G - WHERE R.resource_group_id = G.id; - ALTER TABLE "resource_revision" DROP COLUMN "resource_group_id"; - - ALTER TABLE resource_group_revision - DROP CONSTRAINT resource_group_revision_continuity_id_fkey; - - DROP TABLE "resource_group_revision"; - DROP TABLE "resource_group"; - ''' - ) diff --git a/ckan/migration/versions/075_9cdc88c8896a_rename_view_plugins.py b/ckan/migration/versions/075_9cdc88c8896a_rename_view_plugins.py new file mode 100644 index 00000000000..3e6b766e068 --- /dev/null +++ b/ckan/migration/versions/075_9cdc88c8896a_rename_view_plugins.py @@ -0,0 +1,23 @@ +"""075 Rename view plugins + +Revision ID: 9cdc88c8896a +Revises: a4ca55f0f45e +Create Date: 2018-09-04 18:49:14.766120 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '9cdc88c8896a' +down_revision = 'a4ca55f0f45e' +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + pass diff --git a/ckan/migration/versions/075_rename_view_plugins.py b/ckan/migration/versions/075_rename_view_plugins.py deleted file mode 100644 index f23c4eb4d9b..00000000000 --- a/ckan/migration/versions/075_rename_view_plugins.py +++ /dev/null @@ -1,17 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - BEGIN; - - UPDATE resource_view - SET view_type = 'image_view' WHERE view_type = 'image'; - - UPDATE resource_view - SET view_type = 'webpage_view' WHERE view_type = 'webpage'; - - COMMIT; - ''' - ) diff --git a/ckan/migration/versions/076_59995aa965c0_rename_view_plugins_2.py b/ckan/migration/versions/076_59995aa965c0_rename_view_plugins_2.py new file mode 100644 index 00000000000..c9e178da24d --- /dev/null +++ b/ckan/migration/versions/076_59995aa965c0_rename_view_plugins_2.py @@ -0,0 +1,23 @@ +"""076 Rename view plugins 2 + +Revision ID: 59995aa965c0 +Revises: 9cdc88c8896a +Create Date: 2018-09-04 18:49:15.123438 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '59995aa965c0' +down_revision = '9cdc88c8896a' +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + pass diff --git a/ckan/migration/versions/076_rename_view_plugins_2.py b/ckan/migration/versions/076_rename_view_plugins_2.py deleted file mode 100644 index 278879e14c3..00000000000 --- a/ckan/migration/versions/076_rename_view_plugins_2.py +++ /dev/null @@ -1,17 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - BEGIN; - - UPDATE resource_view - SET view_type = 'text_view' WHERE view_type = 'text'; - - UPDATE resource_view - SET view_type = 'pdf_view' WHERE view_type = 'pdf'; - - COMMIT; - ''' - ) diff --git a/ckan/migration/versions/077_51171a04d86d_add_revisions_to_system_info.py b/ckan/migration/versions/077_51171a04d86d_add_revisions_to_system_info.py new file mode 100644 index 00000000000..bc23b1dbf04 --- /dev/null +++ b/ckan/migration/versions/077_51171a04d86d_add_revisions_to_system_info.py @@ -0,0 +1,57 @@ +"""077 Add revisions to system_info + +Revision ID: 51171a04d86d +Revises: 59995aa965c0 +Create Date: 2018-09-04 18:49:15.478074 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '51171a04d86d' +down_revision = '59995aa965c0' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column( + 'system_info', + sa.Column( + 'state', sa.UnicodeText, nullable=False, server_default='active' + ) + ) + op.add_column( + 'system_info_revision', + sa.Column( + 'state', sa.UnicodeText, nullable=False, server_default='active' + ) + ) + + op.add_column( + 'system_info_revision', sa.Column('expired_id', sa.UnicodeText) + ) + op.add_column( + 'system_info_revision', sa.Column('revision_timestamp', sa.TIMESTAMP) + ) + op.add_column( + 'system_info_revision', sa.Column('expired_timestamp', sa.TIMESTAMP) + ) + op.add_column('system_info_revision', sa.Column('current', sa.Boolean)) + + op.drop_constraint('system_info_revision_key_key', 'system_info_revision') + + +def downgrade(): + op.create_unique_constraint( + 'system_info_revision_key_key', 'system_info_revision', ['key'] + ) + + op.drop_column('system_info', 'state') + op.drop_column('system_info_revision', 'state') + + op.drop_column('system_info_revision', 'expired_id') + op.drop_column('system_info_revision', 'revision_timestamp') + op.drop_column('system_info_revision', 'expired_timestamp') + op.drop_column('system_info_revision', 'current') diff --git a/ckan/migration/versions/077_add_revisions_to_system_info.py b/ckan/migration/versions/077_add_revisions_to_system_info.py deleted file mode 100644 index 9516a9127c0..00000000000 --- a/ckan/migration/versions/077_add_revisions_to_system_info.py +++ /dev/null @@ -1,25 +0,0 @@ -# encoding: utf-8 - -import vdm.sqlalchemy - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - ALTER TABLE "system_info" - ADD COLUMN "state" text NOT NULL DEFAULT '{state}'; - - ALTER TABLE "system_info_revision" - ADD COLUMN "state" text NOT NULL DEFAULT '{state}'; - - ALTER TABLE system_info_revision - ADD COLUMN expired_id text, - ADD COLUMN revision_timestamp timestamp without time zone, - ADD COLUMN expired_timestamp timestamp without time zone, - ADD COLUMN current boolean; - - ALTER TABLE system_info_revision - DROP CONSTRAINT "system_info_revision_key_key"; - - '''.format(state=vdm.sqlalchemy.State.ACTIVE) - ) diff --git a/ckan/migration/versions/078_ae821876532a_remove_old_authz_model.py b/ckan/migration/versions/078_ae821876532a_remove_old_authz_model.py new file mode 100644 index 00000000000..8fa573e85c0 --- /dev/null +++ b/ckan/migration/versions/078_ae821876532a_remove_old_authz_model.py @@ -0,0 +1,109 @@ +"""078 Remove old authz model + +Revision ID: ae821876532a +Revises: 51171a04d86d +Create Date: 2018-09-04 18:49:15.812926 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'ae821876532a' +down_revision = '51171a04d86d' +branch_labels = None +depends_on = None + +indexes = ( + ('idx_uor_id', 'user_object_role', ['id']), + ('idx_uor_user_id', 'user_object_role', ['user_id']), + ('idx_uor_context', 'user_object_role', ['context']), + ('idx_uor_role', 'user_object_role', ['role']), + ('idx_uor_user_id_role', 'user_object_role', ['user_id', 'role']), + ('idx_ra_role', 'role_action', ['role']), + ('idx_ra_action', 'role_action', ['action']), + ('idx_ra_role_action', 'role_action', ['action', 'role']), +) + +def upgrade(): + op.drop_table('role_action') + op.drop_table('package_role') + op.drop_table('group_role') + op.drop_table('system_role') + op.drop_table('authorization_group_role') + op.drop_table('user_object_role') + + +def downgrade(): + + op.create_table( + 'user_object_role', sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('user_id', sa.UnicodeText, sa.ForeignKey('user.id')), + sa.Column('context', sa.UnicodeText, nullable=False), + sa.Column('role', sa.UnicodeText) + ) + + op.create_table( + 'authorization_group_role', + sa.Column( + 'user_object_role_id', + sa.UnicodeText, + sa.ForeignKey('user_object_role.id'), + primary_key=True + ), + sa.Column( + 'authorization_group_id', sa.UnicodeText, + sa.ForeignKey('authorization_group.id') + ) + ) + + op.create_table( + 'system_role', + sa.Column( + 'user_object_role_id', + sa.UnicodeText, + sa.ForeignKey('user_object_role.id'), + primary_key=True + ), + ) + op.create_table( + 'group_role', + sa.Column( + 'user_object_role_id', + sa.UnicodeText, + sa.ForeignKey('user_object_role.id'), + primary_key=True + ), + sa.Column('group_id', sa.UnicodeText, sa.ForeignKey('group.id')), + ) + + op.create_table( + 'package_role', + sa.Column( + 'user_object_role_id', + sa.UnicodeText, + sa.ForeignKey('user_object_role.id'), + primary_key=True + ), + sa.Column('package_id', sa.UnicodeText, sa.ForeignKey('package.id')), + ) + + op.create_table( + 'role_action', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('role', sa.UnicodeText), + sa.Column('context', sa.UnicodeText, nullable=False), + sa.Column('action', sa.UnicodeText), + ) + + op.add_column( + 'user_object_role', + sa.Column( + 'authorized_group_id', + sa.UnicodeText, + sa.ForeignKey('authorization_group.id'), + nullable=True + ) + ) + for name, table, columns in indexes: + op.create_index(name, table, columns) diff --git a/ckan/migration/versions/078_remove_old_authz_model.py b/ckan/migration/versions/078_remove_old_authz_model.py deleted file mode 100644 index a67679c698d..00000000000 --- a/ckan/migration/versions/078_remove_old_authz_model.py +++ /dev/null @@ -1,16 +0,0 @@ -# encoding: utf-8 - -import ckan.model - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - DROP TABLE "role_action"; - DROP TABLE "package_role"; - DROP TABLE "group_role"; - DROP TABLE "system_role"; - DROP TABLE "authorization_group_role"; - DROP TABLE "user_object_role"; - ''' - ) diff --git a/ckan/migration/versions/079_e0177a15d2c9_resource_revision_index.py b/ckan/migration/versions/079_e0177a15d2c9_resource_revision_index.py new file mode 100644 index 00000000000..c947363382e --- /dev/null +++ b/ckan/migration/versions/079_e0177a15d2c9_resource_revision_index.py @@ -0,0 +1,25 @@ +"""079 Resource revision index + +Revision ID: e0177a15d2c9 +Revises: ae821876532a +Create Date: 2018-09-04 18:49:16.198887 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'e0177a15d2c9' +down_revision = 'ae821876532a' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_index( + 'idx_resource_continuity_id', 'resource_revision', ['continuity_id'] + ) + + +def downgrade(): + op.drop_index('idx_resource_continuity_id', 'resource_revision') diff --git a/ckan/migration/versions/079_resource_revision_index.py b/ckan/migration/versions/079_resource_revision_index.py deleted file mode 100644 index aeabea8349e..00000000000 --- a/ckan/migration/versions/079_resource_revision_index.py +++ /dev/null @@ -1,10 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - CREATE INDEX idx_resource_continuity_id - ON resource_revision (continuity_id); - ''' - ) diff --git a/ckan/migration/versions/080_8224d872c64f_continuity_id_indexes.py b/ckan/migration/versions/080_8224d872c64f_continuity_id_indexes.py new file mode 100644 index 00000000000..76252c2cd8e --- /dev/null +++ b/ckan/migration/versions/080_8224d872c64f_continuity_id_indexes.py @@ -0,0 +1,39 @@ +"""080 Continuity id indexes + +Revision ID: 8224d872c64f +Revises: e0177a15d2c9 +Create Date: 2018-09-04 18:49:16.546952 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '8224d872c64f' +down_revision = 'e0177a15d2c9' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_index( + 'idx_member_continuity_id', 'member_revision', ['continuity_id'] + ) + op.create_index( + 'idx_package_tag_continuity_id', 'package_tag_revision', + ['continuity_id'] + ) + op.create_index( + 'idx_package_continuity_id', 'package_revision', ['continuity_id'] + ) + op.create_index( + 'idx_package_extra_continuity_id', 'package_extra_revision', + ['continuity_id'] + ) + + +def downgrade(): + op.drop_index('idx_member_continuity_id', 'member_revision') + op.drop_index('idx_package_tag_continuity_id', 'package_tag_revision') + op.drop_index('idx_package_continuity_id', 'package_revision') + op.drop_index('idx_package_extra_continuity_id', 'package_extra_revision') diff --git a/ckan/migration/versions/080_continuity_id_indexes.py b/ckan/migration/versions/080_continuity_id_indexes.py deleted file mode 100644 index 81641957707..00000000000 --- a/ckan/migration/versions/080_continuity_id_indexes.py +++ /dev/null @@ -1,16 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - CREATE INDEX idx_member_continuity_id - ON member_revision (continuity_id); - CREATE INDEX idx_package_tag_continuity_id - ON package_tag_revision (continuity_id); - CREATE INDEX idx_package_continuity_id - ON package_revision (continuity_id); - CREATE INDEX idx_package_extra_continuity_id - ON package_extra_revision (continuity_id); - ''' - ) diff --git a/ckan/migration/versions/081_a64cf4a79182_set_datastore_active.py b/ckan/migration/versions/081_a64cf4a79182_set_datastore_active.py new file mode 100644 index 00000000000..bb0ee315ff7 --- /dev/null +++ b/ckan/migration/versions/081_a64cf4a79182_set_datastore_active.py @@ -0,0 +1,24 @@ +"""081 Set datastore active + +Revision ID: a64cf4a79182 +Revises: 8224d872c64f +Create Date: 2018-09-04 18:49:16.896531 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'a64cf4a79182' +down_revision = '8224d872c64f' +branch_labels = None +depends_on = None + + +def upgrade(): + pass + + +def downgrade(): + pass diff --git a/ckan/migration/versions/081_set_datastore_active.py b/ckan/migration/versions/081_set_datastore_active.py deleted file mode 100644 index a8219800778..00000000000 --- a/ckan/migration/versions/081_set_datastore_active.py +++ /dev/null @@ -1,67 +0,0 @@ -# encoding: utf-8 - -import json -from sqlalchemy import create_engine -from sqlalchemy.sql import text -from sqlalchemy.exc import SQLAlchemyError -from ckan.common import config - - -def upgrade(migrate_engine): - - datastore_connection_url = config.get( - 'ckan.datastore.read_url', config.get('ckan.datastore.write_url')) - - if not datastore_connection_url: - return - - try: - datastore_engine = create_engine(datastore_connection_url) - except SQLAlchemyError: - return - - try: - datastore_connection = datastore_engine.connect() - except SQLAlchemyError: - datastore_engine.dispose() - return - - try: - - resources_in_datastore = datastore_connection.execute(''' - SELECT table_name - FROM information_schema.tables - WHERE table_schema = 'public' - AND table_name != '_table_metadata' - ''') - - if resources_in_datastore.rowcount: - - resources = migrate_engine.execute(''' - SELECT id, extras - FROM resource - WHERE id IN ({0}) AND extras IS NOT NULL - '''.format( - ','.join(['\'{0}\''.format(_id[0]) - for _id - in resources_in_datastore]) - ) - ) - if resources.rowcount: - params = [] - for resource in resources: - new_extras = json.loads(resource[1]) - new_extras.update({'datastore_active': True}) - params.append( - {'id': resource[0], - 'extras': json.dumps(new_extras)}) - - migrate_engine.execute( - text(''' - UPDATE resource - SET extras = :extras - WHERE id = :id'''), - params) - finally: - datastore_connection.close() - datastore_engine.dispose() diff --git a/ckan/migration/versions/082_8ea886d0ede4_create_index_creator_user_id.py b/ckan/migration/versions/082_8ea886d0ede4_create_index_creator_user_id.py new file mode 100644 index 00000000000..bb1bf48258b --- /dev/null +++ b/ckan/migration/versions/082_8ea886d0ede4_create_index_creator_user_id.py @@ -0,0 +1,25 @@ +"""082 Create index creator user_id + +Revision ID: 8ea886d0ede4 +Revises: a64cf4a79182 +Create Date: 2018-09-04 18:49:17.265729 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '8ea886d0ede4' +down_revision = 'a64cf4a79182' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_index( + 'idx_package_creator_user_id', 'package', ['creator_user_id'] + ) + + +def downgrade(): + op.drop_index('idx_package_creator_user_id', 'package') diff --git a/ckan/migration/versions/082_create_index_creator_user_id.py b/ckan/migration/versions/082_create_index_creator_user_id.py deleted file mode 100644 index 2229d902cbe..00000000000 --- a/ckan/migration/versions/082_create_index_creator_user_id.py +++ /dev/null @@ -1,10 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - CREATE INDEX idx_package_creator_user_id ON package - USING BTREE (creator_user_id); - ''' - ) diff --git a/ckan/migration/versions/083_f98d8fa2a7f7_remove_related_items.py b/ckan/migration/versions/083_f98d8fa2a7f7_remove_related_items.py new file mode 100644 index 00000000000..375c1b73743 --- /dev/null +++ b/ckan/migration/versions/083_f98d8fa2a7f7_remove_related_items.py @@ -0,0 +1,72 @@ +"""083 Remove related items + +Revision ID: f98d8fa2a7f7 +Revises: 8ea886d0ede4 +Create Date: 2018-09-04 18:49:17.615242 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'f98d8fa2a7f7' +down_revision = '8ea886d0ede4' +branch_labels = None +depends_on = None + +WARNING = """ + +WARNING: The 'related' tables were not deleted as they currently contain data. +Once you have archived the existing data or migrated the data to +ckanext-showcase, you can safely delete the 'related' and 'related_dataset' +tables using: + + psql ckan_default -c 'BEGIN; DROP TABLE related_dataset; \\ + DROP TABLE related; COMMIT;' + +""" + + +def upgrade(): + conn = op.get_bind() + existing = conn.execute("SELECT COUNT(*) FROM related;").fetchone() + if existing[0] > 0: + print(WARNING) + return + op.drop_table('related_dataset') + op.drop_table('related') + + +def downgrade(): + + op.create_table( + 'related', sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('type', sa.UnicodeText, nullable=False), + sa.Column('title', sa.UnicodeText), + sa.Column('description', sa.UnicodeText), + sa.Column('image_url', + sa.UnicodeText), sa.Column('url', sa.UnicodeText), + sa.Column('created', sa.TIMESTAMP), + sa.Column('owner_id', sa.UnicodeText), + sa.Column( + 'view_count', sa.Integer, nullable=False, server_default='0' + ), + sa.Column('featured', sa.Integer, nullable=False, server_default='0') + ) + op.create_table( + 'related_dataset', sa.Column('id', sa.UnicodeText, nullable=False), + sa.Column('dataset_id', sa.UnicodeText, nullable=False), + sa.Column('related_id', sa.UnicodeText, nullable=False), + sa.Column('status', sa.UnicodeText) + ) + op.create_primary_key('related_pkey', 'related', ['id']) + op.create_primary_key('related_dataset_pkey', 'related_dataset', ['id']) + + op.create_foreign_key( + 'related_dataset_dataset_id_fkey', 'related_dataset', 'package', + ['dataset_id'], ['id'] + ) + op.create_foreign_key( + 'related_dataset_related_id_fkey', 'related_dataset', 'related', + ['related_id'], ['id'] + ) diff --git a/ckan/migration/versions/083_remove_related_items.py b/ckan/migration/versions/083_remove_related_items.py deleted file mode 100644 index 0d1da775433..00000000000 --- a/ckan/migration/versions/083_remove_related_items.py +++ /dev/null @@ -1,28 +0,0 @@ -# encoding: utf-8 - -WARNING = """ - -WARNING: The 'related' tables were not deleted as they currently contain data. -Once you have archived the existing data or migrated the data to -ckanext-showcase, you can safely delete the 'related' and 'related_dataset' -tables using: - - psql ckan_default -c 'BEGIN; DROP TABLE related_dataset; \\ - DROP TABLE related; COMMIT;' - -""" - - -def upgrade(migrate_engine): - existing = migrate_engine.execute("SELECT COUNT(*) FROM related;")\ - .fetchone() - if existing[0] > 0: - print(WARNING) - return - - migrate_engine.execute(''' -BEGIN; -DROP TABLE related_dataset; -DROP TABLE related; -COMMIT; - ''') diff --git a/ckan/migration/versions/084_add_metadata_created.py b/ckan/migration/versions/084_add_metadata_created.py deleted file mode 100644 index 57347c54749..00000000000 --- a/ckan/migration/versions/084_add_metadata_created.py +++ /dev/null @@ -1,17 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute(''' - ALTER TABLE package_revision - ADD COLUMN metadata_created timestamp without time zone; - ALTER TABLE package - ADD COLUMN metadata_created timestamp without time zone; - - UPDATE package SET metadata_created= - (SELECT revision_timestamp - FROM package_revision - WHERE id=package.id - ORDER BY revision_timestamp ASC - LIMIT 1); - ''') diff --git a/ckan/migration/versions/084_d85ce5783688_add_metadata_created.py b/ckan/migration/versions/084_d85ce5783688_add_metadata_created.py new file mode 100644 index 00000000000..35a17a6a223 --- /dev/null +++ b/ckan/migration/versions/084_d85ce5783688_add_metadata_created.py @@ -0,0 +1,38 @@ +"""084 Add metadata created + +Revision ID: d85ce5783688 +Revises: f98d8fa2a7f7 +Create Date: 2018-09-04 18:49:17.957865 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'd85ce5783688' +down_revision = 'f98d8fa2a7f7' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column( + 'package_revision', sa.Column('metadata_created', sa.TIMESTAMP) + ) + op.add_column('package', sa.Column('metadata_created', sa.TIMESTAMP)) + conn = op.get_bind() + conn.execute( + ''' + UPDATE package SET metadata_created= + (SELECT revision_timestamp + FROM package_revision + WHERE id=package.id + ORDER BY revision_timestamp ASC + LIMIT 1); + ''' + ) + + +def downgrade(): + op.drop_column('package', 'metadata_created') + op.drop_column('package_revision', 'metadata_created') diff --git a/ckan/migration/versions/085_adjust_activity_timestamps.py b/ckan/migration/versions/085_adjust_activity_timestamps.py deleted file mode 100644 index ddcea2ece31..00000000000 --- a/ckan/migration/versions/085_adjust_activity_timestamps.py +++ /dev/null @@ -1,23 +0,0 @@ -# encoding: utf-8 - -import datetime - - -def upgrade(migrate_engine): - u""" - The script assumes that the current timestamp was - recorded with the server's current set timezone - """ - # choose a fixed date (within DST) so migration depends only on - # server time zone not the current daylight savings state - magic_timestamp = datetime.datetime(2016, 6, 20).toordinal() - - utc_date = datetime.datetime.utcfromtimestamp(magic_timestamp) - local_date = datetime.datetime.fromtimestamp(magic_timestamp) - - if utc_date == local_date: - return - - with migrate_engine.begin() as connection: - sql = u"update activity set timestamp = timestamp + (%s - %s);" - connection.execute(sql, utc_date, local_date) diff --git a/ckan/migration/versions/085_f9bf3d5c4b4d_adjust_activity_timestamps.py b/ckan/migration/versions/085_f9bf3d5c4b4d_adjust_activity_timestamps.py new file mode 100644 index 00000000000..c6ba60df91d --- /dev/null +++ b/ckan/migration/versions/085_f9bf3d5c4b4d_adjust_activity_timestamps.py @@ -0,0 +1,44 @@ +"""085 Adjust activity timestamps + +Revision ID: f9bf3d5c4b4d +Revises: d85ce5783688 +Create Date: 2018-09-04 18:49:18.307804 + +""" +import datetime +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'f9bf3d5c4b4d' +down_revision = 'd85ce5783688' +branch_labels = None +depends_on = None + + +def upgrade(): + magic_timestamp = datetime.datetime(2016, 6, 20).toordinal() + + utc_date = datetime.datetime.utcfromtimestamp(magic_timestamp) + local_date = datetime.datetime.fromtimestamp(magic_timestamp) + + if utc_date == local_date: + return + + connection = op.get_bind() + sql = u"update activity set timestamp = timestamp + (%s - %s);" + connection.execute(sql, utc_date, local_date) + + +def downgrade(): + magic_timestamp = datetime.datetime(2016, 6, 20).toordinal() + + utc_date = datetime.datetime.utcfromtimestamp(magic_timestamp) + local_date = datetime.datetime.fromtimestamp(magic_timestamp) + + if utc_date == local_date: + return + + connection = op.get_bind() + sql = u"update activity set timestamp = timestamp - (%s - %s);" + connection.execute(sql, utc_date, local_date) diff --git a/ckan/migration/versions/086_19663581b3bb_drop_openid_column.py b/ckan/migration/versions/086_19663581b3bb_drop_openid_column.py new file mode 100644 index 00000000000..00a110a9a17 --- /dev/null +++ b/ckan/migration/versions/086_19663581b3bb_drop_openid_column.py @@ -0,0 +1,24 @@ +"""086 Drop openid column + +Revision ID: 19663581b3bb +Revises: f9bf3d5c4b4d +Create Date: 2018-09-04 18:49:18.650337 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '19663581b3bb' +down_revision = 'f9bf3d5c4b4d' +branch_labels = None +depends_on = None + + +def upgrade(): + op.drop_column('user', 'openid') + + +def downgrade(): + op.add_column('user', sa.Column('openid', sa.UnicodeText)) + op.create_index('idx_openid', 'user', ['openid']) diff --git a/ckan/migration/versions/086_drop_openid_column.py b/ckan/migration/versions/086_drop_openid_column.py deleted file mode 100644 index 39c71b928b8..00000000000 --- a/ckan/migration/versions/086_drop_openid_column.py +++ /dev/null @@ -1,12 +0,0 @@ -# encoding: utf-8 - -from sqlalchemy import MetaData - - -def upgrade(migrate_engine): - metadata = MetaData() - metadata.bind = migrate_engine - migrate_engine.execute(''' -ALTER TABLE "user" - DROP COLUMN openid; - ''') diff --git a/ckan/migration/versions/087_ff1b303cab77_remove_old_authorization_tables.py b/ckan/migration/versions/087_ff1b303cab77_remove_old_authorization_tables.py new file mode 100644 index 00000000000..129cd84b225 --- /dev/null +++ b/ckan/migration/versions/087_ff1b303cab77_remove_old_authorization_tables.py @@ -0,0 +1,47 @@ +"""087 Remove old authorization tables + +Revision ID: ff1b303cab77 +Revises: 19663581b3bb +Create Date: 2018-09-04 18:49:18.998454 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ff1b303cab77' +down_revision = '19663581b3bb' +branch_labels = None +depends_on = None + + +def upgrade(): + op.drop_table('authorization_group_user') + op.drop_table('authorization_group') + +def downgrade(): + op.create_table( + 'authorization_group', + sa.Column('id', sa.UnicodeText, primary_key=True), + sa.Column('name', sa.UnicodeText), + sa.Column( + 'created', sa.DateTime, server_default=sa.func.current_timestamp() + ), + ) + op.create_table( + 'authorization_group_user', + sa.Column( + 'authorization_group_id', + sa.UnicodeText, + sa.ForeignKey('authorization_group.id'), + nullable=False + ), + sa.Column( + 'user_id', + sa.UnicodeText, + sa.ForeignKey('user.id'), + nullable=False + ), + sa.Column('id', sa.UnicodeText, primary_key=True) + ) diff --git a/ckan/migration/versions/087_remove_old_authorization_tables.py b/ckan/migration/versions/087_remove_old_authorization_tables.py deleted file mode 100644 index 5dbdb992be4..00000000000 --- a/ckan/migration/versions/087_remove_old_authorization_tables.py +++ /dev/null @@ -1,10 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' - DROP TABLE IF EXISTS "authorization_group_user"; - DROP TABLE IF EXISTS "authorization_group"; - ''' - ) diff --git a/ckan/migration/versions/__init__.py b/ckan/migration/versions/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/requirements.txt b/requirements.txt index beeb369c2e3..d99506fda8f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ # # pip-compile --output-file requirements.txt requirements.in # +alembic==1.0.0 argparse==1.4.0 # via ofs babel==2.3.4 beaker==1.10.0 # via pylons From c77d9d8f499240e0b180b4c4bb9ed082c1467965 Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Tue, 18 Sep 2018 18:28:15 +0300 Subject: [PATCH 02/33] Update CLI --- ckan/config/middleware/pylons_app.py | 2 +- ckan/controllers/api.py | 2 +- ckan/controllers/group.py | 2 +- ckan/controllers/package.py | 2 +- ckan/lib/cli.py | 10 +- ckan/migration/__init__.py | 8 + ckan/migration/env.py | 38 ++-- ...001_103676e0a497_create_existing_tables.py | 5 +- ..._86fdd8c54775_add_author_and_maintainer.py | 6 +- .../003_f22b4f5241a5_add_user_object.py | 6 +- .../004_f92ee205e46d_add_group_object.py | 7 +- ...5_12c2232c15f5_add_authorization_tables.py | 6 +- .../versions/006_c83955e7acb6_add_ratings.py | 6 +- .../007_1928d4af1cda_add_system_roles.py | 5 +- .../008_e8283ffb257e_update_vdm_ids.py | 9 +- ...09_b739a48de5c4_add_creation_timestamps.py | 5 +- .../010_a6f13bf14d0c_add_user_about.py | 5 +- ..._866f6370b4ac_add_package_search_vector.py | 5 +- .../012_e5ca33a5d445_add_resources.py | 5 +- .../versions/013_8a3a5af39797_add_hash.py | 5 +- .../versions/014_93519b684820_hash_2.py | 5 +- .../015_6d8ffebcaf54_remove_state_object.py | 5 +- .../016_37ada738328e_uuids_everywhere.py | 5 +- .../017_1250b2ff3e36_add_pkg_relationships.py | 5 +- .../018_05a0778051ca_adjust_licenses.py | 8 +- ...19_b2eb6f34a638_pkg_relationships_state.py | 5 +- .../020_69a0b0efc609_add_changeset.py | 5 +- ...021_765143af2ba3_postgresql_upgrade_sql.py | 5 +- .../022_7b324ca6c0dc_add_group_extras.py | 5 +- .../023_87fdd05f0744_add_harvesting.py | 5 +- ...024_12981fe12484_add_harvested_document.py | 5 +- ...5_b581622ad327_add_authorization_groups.py | 5 +- ...615b25af443_authorization_group_user_pk.py | 6 +- .../027_11e5745c6fc9_adjust_harvester.py | 5 +- ...cdd68fe9ba21_drop_harvest_source_status.py | 6 +- .../029_1bfdf4240915_version_groups.py | 5 +- ...b16cbf164c8a_additional_user_attributes.py | 5 +- ...1_1b05245167d6_move_openid_to_new_field.py | 6 +- ...1422d_add_extra_info_field_to_resources.py | 5 +- ...df15_auth_group_user_id_add_conditional.py | 5 +- .../034_6c600693af5b_resource_group_table.py | 11 +- ..._81148ccebd6c_harvesting_doc_versioning.py | 5 +- .../036_ecaa8b38782f_lockdown_roles.py | 6 +- .../037_edcf3b8c3c1b_role_anon_editor.py | 6 +- ...38_fd6622e3d964_delete_migration_tables.py | 8 +- ...9_cca459c76d45_add_expired_id_and_dates.py | 5 +- .../040_500a08f4818e_reset_key_on_user.py | 5 +- .../041_6817d4e3bdc3_resource_new_fields.py | 5 +- .../042_da65e2877034_user_revision_indexes.py | 9 +- .../043_bd38cd6502b2_drop_postgres_search.py | 5 +- .../044_4190eeeb8d73_add_task_status.py | 5 +- .../045_54e3f155d945_user_name_unique.py | 6 +- .../046_b69e9b80396f_drop_changesets.py | 5 +- ...83a7c406926_rename_package_group_member.py | 5 +- ...a7011172b3f_add_activity_streams_tables.py | 5 +- ..._e0c06c2177b5_add_group_approval_status.py | 5 +- ...050_01a6b058cb7f_term_translation_table.py | 5 +- .../051_a4fb0d85ced6_add_tag_vocabulary.py | 5 +- ...2_ba693d64c6d7_update_member_capacities.py | 6 +- .../053_9d051a099097_add_group_logo.py | 5 +- ..._da21b38da4db_add_resource_created_date.py | 6 +- ...db947bf_update_user_and_activity_detail.py | 6 +- .../056_11af3215ae89_add_related_table.py | 5 +- .../versions/057_660a5aae527e_tracking.py | 5 +- .../058_bd36d1826a5d_add_follower_tables.py | 5 +- ...9291bb46f352_add_related_count_and_flag.py | 5 +- .../060_31ad11c518fc_add_system_info_table.py | 5 +- ...1_338d460bc460_add_follower_group_table.py | 11 +- .../062_6deb2bbab394_add_dashboard_table.py | 5 +- .../versions/063_8b633852cb7a_org_changes.py | 5 +- ...4f8becd4919a_add_email_last_sent_column.py | 5 +- ...439e_add_email_notifications_preference.py | 5 +- .../066_ad16b3bd8cb6_default_package_type.py | 6 +- ...067_266c110eafec_turn_extras_to_strings.py | 6 +- ...8_e33a5f2b2a84_add_package_extras_index.py | 6 +- ...5cdb_resource_url_and_metadata_modified.py | 5 +- ...12fa7_add_activity_and_resource_indexes.py | 5 +- ...081ef73a_add_state_column_to_user_table.py | 5 +- .../072_08dcb9233ad7_add_resource_view.py | 5 +- ...08be3_update_resource_view_resource_id_.py | 6 +- ...074_a4ca55f0f45e_remove_resource_groups.py | 5 +- .../075_9cdc88c8896a_rename_view_plugins.py | 6 +- .../076_59995aa965c0_rename_view_plugins_2.py | 6 +- ...171a04d86d_add_revisions_to_system_info.py | 5 +- ...078_ae821876532a_remove_old_authz_model.py | 6 +- ...79_e0177a15d2c9_resource_revision_index.py | 6 +- .../080_8224d872c64f_continuity_id_indexes.py | 6 +- .../081_a64cf4a79182_set_datastore_active.py | 6 +- ...a886d0ede4_create_index_creator_user_id.py | 6 +- .../083_f98d8fa2a7f7_remove_related_items.py | 5 +- .../084_d85ce5783688_add_metadata_created.py | 5 +- ...f9bf3d5c4b4d_adjust_activity_timestamps.py | 5 +- .../086_19663581b3bb_drop_openid_column.py | 5 +- ...03cab77_remove_old_authorization_tables.py | 9 +- ...d397f70903_remove_migrate_version_table.py | 23 +++ ckan/model/__init__.py | 109 +++++++---- ckan/tests/legacy/test_coding_standards.py | 177 +++--------------- ckan/tests/test_coding_standards.py | 171 +++++++++-------- 98 files changed, 617 insertions(+), 418 deletions(-) create mode 100644 ckan/migration/versions/088_3ad397f70903_remove_migrate_version_table.py diff --git a/ckan/config/middleware/pylons_app.py b/ckan/config/middleware/pylons_app.py index 73b714509a7..bac6276972d 100644 --- a/ckan/config/middleware/pylons_app.py +++ b/ckan/config/middleware/pylons_app.py @@ -267,7 +267,7 @@ def execute_on_completion(application, config, callback): def inner(environ, start_response): try: result = application(environ, start_response) - except: + except Exception: callback(environ) raise # paste.fileapp converts non-file responses into list diff --git a/ckan/controllers/api.py b/ckan/controllers/api.py index 0093aed72e8..d73696174ff 100644 --- a/ckan/controllers/api.py +++ b/ckan/controllers/api.py @@ -415,7 +415,7 @@ def group_autocomplete(self): limit = request.params.get('limit', 20) try: limit = int(limit) - except: + except Exception: limit = 20 limit = min(50, limit) diff --git a/ckan/controllers/group.py b/ckan/controllers/group.py index 3bbe20fbad5..680329f6154 100644 --- a/ckan/controllers/group.py +++ b/ckan/controllers/group.py @@ -802,7 +802,7 @@ def history(self, id): revision_dict['timestamp']) try: dayHorizon = int(request.params.get('days')) - except: + except Exception: dayHorizon = 30 dayAge = (datetime.datetime.now() - revision_date).days if dayAge >= dayHorizon: diff --git a/ckan/controllers/package.py b/ckan/controllers/package.py index fb28d93aac1..6a000c07725 100644 --- a/ckan/controllers/package.py +++ b/ckan/controllers/package.py @@ -472,7 +472,7 @@ def history(self, id): revision_dict['timestamp']) try: dayHorizon = int(request.params.get('days')) - except: + except Exception: dayHorizon = 30 dayAge = (datetime.datetime.now() - revision_date).days if dayAge >= dayHorizon: diff --git a/ckan/lib/cli.py b/ckan/lib/cli.py index aecc40c2f2e..f9499833eb7 100644 --- a/ckan/lib/cli.py +++ b/ckan/lib/cli.py @@ -351,7 +351,8 @@ class ManageDb(CkanCommand): def command(self): cmd = self.args[0] - self._load_config(cmd!='upgrade') + self._load_config(cmd != 'upgrade') + import ckan.model as model import ckan.lib.search as search @@ -375,10 +376,9 @@ def command(self): if self.verbose: print('Cleaning DB: SUCCESS') elif cmd == 'upgrade': - if len(self.args) > 1: - model.repo.upgrade_db(self.args[1]) - else: - model.repo.upgrade_db() + model.repo.upgrade_db(*self.args[1:]) + elif cmd == 'downgrade': + model.repo.downgrade_db(*self.args[1:]) elif cmd == 'version': self.version() elif cmd == 'create-from-model': diff --git a/ckan/migration/__init__.py b/ckan/migration/__init__.py index e69de29bb2d..912ce6b7da9 100644 --- a/ckan/migration/__init__.py +++ b/ckan/migration/__init__.py @@ -0,0 +1,8 @@ +# encoding: utf-8 + + +def skip_based_on_legacy_engine_version(op, filename): + conf = op.get_context().config + version = conf.get_main_option(u'sqlalchemy_migrate_version') + if version: + return int(version) >= int(filename.split(u'_', 1)[0]) diff --git a/ckan/migration/env.py b/ckan/migration/env.py index 1b451f47470..fe181a6908c 100644 --- a/ckan/migration/env.py +++ b/ckan/migration/env.py @@ -1,7 +1,11 @@ +# encoding: utf-8 + from __future__ import with_statement from alembic import context from sqlalchemy import engine_from_config, pool -from logging.config import fileConfig +# from logging.config import fileConfig +from ckan.model import init_model +from ckan.model.meta import metadata # this is the Alembic Config object, which provides # access to the values within the .ini file in use. @@ -9,14 +13,12 @@ # Interpret the config file for Python logging. # This line sets up loggers basically. -fileConfig(config.config_file_name) +# fileConfig(config.config_file_name) # add your model's MetaData object here # for 'autogenerate' support # from myapp import mymodel # target_metadata = mymodel.Base.metadata -from ckan.model import init_model -from ckan.model.meta import metadata target_metadata = metadata # other values from the config, defined by the needs of env.py, @@ -37,9 +39,10 @@ def run_migrations_offline(): script output. """ - url = config.get_main_option("sqlalchemy.url") + url = config.get_main_option(u"sqlalchemy.url") context.configure( - url=url, target_metadata=target_metadata, literal_binds=True) + url=url, target_metadata=target_metadata, literal_binds=True + ) with context.begin_transaction(): context.run_migrations() @@ -54,18 +57,17 @@ def run_migrations_online(): """ connectable = engine_from_config( config.get_section(config.config_ini_section), - prefix='sqlalchemy.', - poolclass=pool.NullPool) - with connectable.connect() as connection: - init_model(connection) - - context.configure( - connection=connection, - target_metadata=target_metadata - ) - - with context.begin_transaction(): - context.run_migrations() + prefix=u'sqlalchemy.', + poolclass=pool.NullPool + ) + connection = connectable.connect() + init_model(connection) + + context.configure(connection=connection, target_metadata=target_metadata) + + with context.begin_transaction(): + context.run_migrations() + if context.is_offline_mode(): run_migrations_offline() diff --git a/ckan/migration/versions/001_103676e0a497_create_existing_tables.py b/ckan/migration/versions/001_103676e0a497_create_existing_tables.py index 45b5ed93ee0..4e1b2552d2d 100644 --- a/ckan/migration/versions/001_103676e0a497_create_existing_tables.py +++ b/ckan/migration/versions/001_103676e0a497_create_existing_tables.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """Create existing tables Revision ID: 103676e0a497 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '103676e0a497' down_revision = None @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'state', diff --git a/ckan/migration/versions/002_86fdd8c54775_add_author_and_maintainer.py b/ckan/migration/versions/002_86fdd8c54775_add_author_and_maintainer.py index b31b01e7daa..0bc66fc52fd 100644 --- a/ckan/migration/versions/002_86fdd8c54775_add_author_and_maintainer.py +++ b/ckan/migration/versions/002_86fdd8c54775_add_author_and_maintainer.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """Add author and maintainer Revision ID: 86fdd8c54775 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '86fdd8c54775' down_revision = '103676e0a497' @@ -23,6 +24,9 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return + for column in _columns: op.add_column('package', sa.Column(column, sa.UnicodeText)) op.add_column('package_revision', sa.Column(column, sa.UnicodeText)) diff --git a/ckan/migration/versions/003_f22b4f5241a5_add_user_object.py b/ckan/migration/versions/003_f22b4f5241a5_add_user_object.py index d874d014d2c..f95670b19b9 100644 --- a/ckan/migration/versions/003_f22b4f5241a5_add_user_object.py +++ b/ckan/migration/versions/003_f22b4f5241a5_add_user_object.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """Add user object Revision ID: f22b4f5241a5 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'f22b4f5241a5' down_revision = '86fdd8c54775' @@ -16,6 +17,9 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return + op.create_table( 'user', sa.Column('id', sa.UnicodeText, primary_key=True), sa.Column('name', sa.UnicodeText), sa.Column('apikey', sa.UnicodeText) diff --git a/ckan/migration/versions/004_f92ee205e46d_add_group_object.py b/ckan/migration/versions/004_f92ee205e46d_add_group_object.py index fb833544ef9..606edd70da5 100644 --- a/ckan/migration/versions/004_f92ee205e46d_add_group_object.py +++ b/ckan/migration/versions/004_f92ee205e46d_add_group_object.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """Add group object Revision ID: f92ee205e46d @@ -5,11 +6,9 @@ Create Date: 2018-09-04 17:22:50.675045 """ -import uuid - from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'f92ee205e46d' down_revision = 'f22b4f5241a5' @@ -18,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'group', diff --git a/ckan/migration/versions/005_12c2232c15f5_add_authorization_tables.py b/ckan/migration/versions/005_12c2232c15f5_add_authorization_tables.py index db146351be5..0ad3179aede 100644 --- a/ckan/migration/versions/005_12c2232c15f5_add_authorization_tables.py +++ b/ckan/migration/versions/005_12c2232c15f5_add_authorization_tables.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """005 Add authorization tables Revision ID: 12c2232c15f5 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '12c2232c15f5' down_revision = 'f92ee205e46d' @@ -16,6 +17,9 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return + op.create_table( 'role_action', sa.Column('id', sa.UnicodeText, primary_key=True), diff --git a/ckan/migration/versions/006_c83955e7acb6_add_ratings.py b/ckan/migration/versions/006_c83955e7acb6_add_ratings.py index b71585cd76e..f97d13b112c 100644 --- a/ckan/migration/versions/006_c83955e7acb6_add_ratings.py +++ b/ckan/migration/versions/006_c83955e7acb6_add_ratings.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """006 Add ratings Revision ID: c83955e7acb6 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'c83955e7acb6' down_revision = '12c2232c15f5' @@ -16,6 +17,9 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return + op.create_table( 'rating', sa.Column('id', sa.UnicodeText, primary_key=True), diff --git a/ckan/migration/versions/007_1928d4af1cda_add_system_roles.py b/ckan/migration/versions/007_1928d4af1cda_add_system_roles.py index dafc500053e..f59e3b85629 100644 --- a/ckan/migration/versions/007_1928d4af1cda_add_system_roles.py +++ b/ckan/migration/versions/007_1928d4af1cda_add_system_roles.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """007 Add system roles Revision ID: 1928d4af1cda @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '1928d4af1cda' down_revision = 'c83955e7acb6' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'system_role', sa.Column( diff --git a/ckan/migration/versions/008_e8283ffb257e_update_vdm_ids.py b/ckan/migration/versions/008_e8283ffb257e_update_vdm_ids.py index 02e4850ce80..dcfa4d1bd8d 100644 --- a/ckan/migration/versions/008_e8283ffb257e_update_vdm_ids.py +++ b/ckan/migration/versions/008_e8283ffb257e_update_vdm_ids.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """008 Update vdm ids Revision ID: e8283ffb257e @@ -9,7 +10,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'e8283ffb257e' down_revision = '1928d4af1cda' @@ -23,9 +24,13 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return for table in foreign_tables: op.drop_column(table, 'revision_id') - op.alter_column('revision', 'id', type_=sa.UnicodeText, server_default=None) + op.alter_column( + 'revision', 'id', type_=sa.UnicodeText, server_default=None + ) for table in foreign_tables: op.add_column( table, diff --git a/ckan/migration/versions/009_b739a48de5c4_add_creation_timestamps.py b/ckan/migration/versions/009_b739a48de5c4_add_creation_timestamps.py index a1574896d08..0158a482145 100644 --- a/ckan/migration/versions/009_b739a48de5c4_add_creation_timestamps.py +++ b/ckan/migration/versions/009_b739a48de5c4_add_creation_timestamps.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """009 Add creation timestamps Revision ID: b739a48de5c4 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'b739a48de5c4' down_revision = 'e8283ffb257e' @@ -18,6 +19,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return for table in domain_obj_names: op.add_column(table, sa.Column('created', sa.TIMESTAMP)) diff --git a/ckan/migration/versions/010_a6f13bf14d0c_add_user_about.py b/ckan/migration/versions/010_a6f13bf14d0c_add_user_about.py index d791cda98c4..589d3112fb4 100644 --- a/ckan/migration/versions/010_a6f13bf14d0c_add_user_about.py +++ b/ckan/migration/versions/010_a6f13bf14d0c_add_user_about.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """010 Add user about Revision ID: a6f13bf14d0c @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'a6f13bf14d0c' down_revision = 'b739a48de5c4' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column('user', sa.Column('about', sa.Text)) diff --git a/ckan/migration/versions/011_866f6370b4ac_add_package_search_vector.py b/ckan/migration/versions/011_866f6370b4ac_add_package_search_vector.py index cb337f0b158..3b6f60efaff 100644 --- a/ckan/migration/versions/011_866f6370b4ac_add_package_search_vector.py +++ b/ckan/migration/versions/011_866f6370b4ac_add_package_search_vector.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """011 Add package search vector Revision ID: 866f6370b4ac @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '866f6370b4ac' down_revision = 'a6f13bf14d0c' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'package_search', sa.Column( diff --git a/ckan/migration/versions/012_e5ca33a5d445_add_resources.py b/ckan/migration/versions/012_e5ca33a5d445_add_resources.py index bcb2ef9c80a..e75b5150d38 100644 --- a/ckan/migration/versions/012_e5ca33a5d445_add_resources.py +++ b/ckan/migration/versions/012_e5ca33a5d445_add_resources.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """012 Add resources Revision ID: e5ca33a5d445 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'e5ca33a5d445' down_revision = '866f6370b4ac' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'package_resource', sa.Column('id', sa.Integer, primary_key=True), diff --git a/ckan/migration/versions/013_8a3a5af39797_add_hash.py b/ckan/migration/versions/013_8a3a5af39797_add_hash.py index 0c288e12314..86ee631cde5 100644 --- a/ckan/migration/versions/013_8a3a5af39797_add_hash.py +++ b/ckan/migration/versions/013_8a3a5af39797_add_hash.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """013 Add hash Revision ID: 8a3a5af39797 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '8a3a5af39797' down_revision = 'e5ca33a5d445' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column('package_resource', sa.Column('hash', sa.UnicodeText)) diff --git a/ckan/migration/versions/014_93519b684820_hash_2.py b/ckan/migration/versions/014_93519b684820_hash_2.py index d9f16989de1..b6c82620041 100644 --- a/ckan/migration/versions/014_93519b684820_hash_2.py +++ b/ckan/migration/versions/014_93519b684820_hash_2.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """014 Hash 2 Revision ID: 93519b684820 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '93519b684820' down_revision = '8a3a5af39797' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column( 'package_resource_revision', sa.Column('hash', sa.UnicodeText) ) diff --git a/ckan/migration/versions/015_6d8ffebcaf54_remove_state_object.py b/ckan/migration/versions/015_6d8ffebcaf54_remove_state_object.py index 9d1988fefd0..8f3cadddb89 100644 --- a/ckan/migration/versions/015_6d8ffebcaf54_remove_state_object.py +++ b/ckan/migration/versions/015_6d8ffebcaf54_remove_state_object.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """015 Remove state_object Revision ID: 6d8ffebcaf54 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '6d8ffebcaf54' down_revision = '93519b684820' @@ -22,6 +23,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return for table_name in stateful_tables: op.add_column(table_name, sa.Column('state', sa.UnicodeText)) op.drop_column(table_name, 'state_id') diff --git a/ckan/migration/versions/016_37ada738328e_uuids_everywhere.py b/ckan/migration/versions/016_37ada738328e_uuids_everywhere.py index 75ef15f8591..7ccc609fe4b 100644 --- a/ckan/migration/versions/016_37ada738328e_uuids_everywhere.py +++ b/ckan/migration/versions/016_37ada738328e_uuids_everywhere.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """016 Uuids everywhere Revision ID: 37ada738328e @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '37ada738328e' down_revision = '6d8ffebcaf54' @@ -50,6 +51,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return for table, column in foreign_keys: op.drop_column(table, column) for table in continuity: diff --git a/ckan/migration/versions/017_1250b2ff3e36_add_pkg_relationships.py b/ckan/migration/versions/017_1250b2ff3e36_add_pkg_relationships.py index 767f9feb7ac..9d606d7a6dc 100644 --- a/ckan/migration/versions/017_1250b2ff3e36_add_pkg_relationships.py +++ b/ckan/migration/versions/017_1250b2ff3e36_add_pkg_relationships.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """017 Add pkg_relationships Revision ID: 1250b2ff3e36 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '1250b2ff3e36' down_revision = '37ada738328e' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'package_relationship', diff --git a/ckan/migration/versions/018_05a0778051ca_adjust_licenses.py b/ckan/migration/versions/018_05a0778051ca_adjust_licenses.py index b8c72272284..5f52be55a30 100644 --- a/ckan/migration/versions/018_05a0778051ca_adjust_licenses.py +++ b/ckan/migration/versions/018_05a0778051ca_adjust_licenses.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """018 Adjust licenses Revision ID: 05a0778051ca @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '05a0778051ca' down_revision = '1250b2ff3e36' @@ -18,6 +19,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return for table in tables: op.drop_column(table, 'license_id') op.add_column(table, sa.Column('license_id', sa.UnicodeText)) @@ -29,8 +32,7 @@ def downgrade(): op.create_table( 'license', sa.Column('id', sa.Integer, primary_key=True, nullable=False), - sa.Column('name', sa.Unicode(100)), - sa.Column('state', sa.UnicodeText) + sa.Column('name', sa.Unicode(100)), sa.Column('state', sa.UnicodeText) ) for table in tables: op.drop_column(table, 'license_id') diff --git a/ckan/migration/versions/019_b2eb6f34a638_pkg_relationships_state.py b/ckan/migration/versions/019_b2eb6f34a638_pkg_relationships_state.py index 9fd7f1dba87..ad23e8c7e24 100644 --- a/ckan/migration/versions/019_b2eb6f34a638_pkg_relationships_state.py +++ b/ckan/migration/versions/019_b2eb6f34a638_pkg_relationships_state.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """019 Pkg relationships_state Revision ID: b2eb6f34a638 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'b2eb6f34a638' down_revision = '05a0778051ca' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column('package_relationship', sa.Column('state', sa.UnicodeText)) op.add_column( 'package_relationship_revision', sa.Column('state', sa.UnicodeText) diff --git a/ckan/migration/versions/020_69a0b0efc609_add_changeset.py b/ckan/migration/versions/020_69a0b0efc609_add_changeset.py index e8335313a23..e8fc4db68f2 100644 --- a/ckan/migration/versions/020_69a0b0efc609_add_changeset.py +++ b/ckan/migration/versions/020_69a0b0efc609_add_changeset.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """020 Add changeset Revision ID: 69a0b0efc609 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '69a0b0efc609' down_revision = 'b2eb6f34a638' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'changeset', sa.Column('id', sa.UnicodeText, primary_key=True), diff --git a/ckan/migration/versions/021_765143af2ba3_postgresql_upgrade_sql.py b/ckan/migration/versions/021_765143af2ba3_postgresql_upgrade_sql.py index e5b468af436..babdd7c8199 100644 --- a/ckan/migration/versions/021_765143af2ba3_postgresql_upgrade_sql.py +++ b/ckan/migration/versions/021_765143af2ba3_postgresql_upgrade_sql.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """021 Postgresql upgrade.sql Revision ID: 765143af2ba3 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '765143af2ba3' down_revision = '69a0b0efc609' @@ -93,6 +94,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return for name, table, columns in indexes: op.create_index(name, table, columns) diff --git a/ckan/migration/versions/022_7b324ca6c0dc_add_group_extras.py b/ckan/migration/versions/022_7b324ca6c0dc_add_group_extras.py index d7230ca9000..ec46bf5a4ce 100644 --- a/ckan/migration/versions/022_7b324ca6c0dc_add_group_extras.py +++ b/ckan/migration/versions/022_7b324ca6c0dc_add_group_extras.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """022 Add group_extras Revision ID: 7b324ca6c0dc @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '7b324ca6c0dc' down_revision = '765143af2ba3' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'group_extra', sa.Column('id', sa.UnicodeText, primary_key=True), diff --git a/ckan/migration/versions/023_87fdd05f0744_add_harvesting.py b/ckan/migration/versions/023_87fdd05f0744_add_harvesting.py index e7cb28f1afe..6b5889a70a3 100644 --- a/ckan/migration/versions/023_87fdd05f0744_add_harvesting.py +++ b/ckan/migration/versions/023_87fdd05f0744_add_harvesting.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """023 Add harvesting Revision ID: 87fdd05f0744 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '87fdd05f0744' down_revision = '7b324ca6c0dc' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'harvest_source', sa.Column('id', sa.UnicodeText, primary_key=True), diff --git a/ckan/migration/versions/024_12981fe12484_add_harvested_document.py b/ckan/migration/versions/024_12981fe12484_add_harvested_document.py index a4ecc117e9f..7ea7a11c578 100644 --- a/ckan/migration/versions/024_12981fe12484_add_harvested_document.py +++ b/ckan/migration/versions/024_12981fe12484_add_harvested_document.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """024 Add harvested_document Revision ID: 12981fe12484 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '12981fe12484' down_revision = '87fdd05f0744' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'harvested_document', sa.Column('id', sa.UnicodeText, primary_key=True), diff --git a/ckan/migration/versions/025_b581622ad327_add_authorization_groups.py b/ckan/migration/versions/025_b581622ad327_add_authorization_groups.py index 0c78a31c4f7..fe4b1e9eed5 100644 --- a/ckan/migration/versions/025_b581622ad327_add_authorization_groups.py +++ b/ckan/migration/versions/025_b581622ad327_add_authorization_groups.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """025 Add authorization groups Revision ID: b581622ad327 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'b581622ad327' down_revision = '12981fe12484' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'authorization_group', sa.Column('id', sa.UnicodeText, primary_key=True), diff --git a/ckan/migration/versions/026_3615b25af443_authorization_group_user_pk.py b/ckan/migration/versions/026_3615b25af443_authorization_group_user_pk.py index a15ceecfcdd..7af7c45da37 100644 --- a/ckan/migration/versions/026_3615b25af443_authorization_group_user_pk.py +++ b/ckan/migration/versions/026_3615b25af443_authorization_group_user_pk.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """026 Authorization group user pk Revision ID: 3615b25af443 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '3615b25af443' down_revision = 'b581622ad327' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return pass diff --git a/ckan/migration/versions/027_11e5745c6fc9_adjust_harvester.py b/ckan/migration/versions/027_11e5745c6fc9_adjust_harvester.py index 8c445bc851d..c1b76833eba 100644 --- a/ckan/migration/versions/027_11e5745c6fc9_adjust_harvester.py +++ b/ckan/migration/versions/027_11e5745c6fc9_adjust_harvester.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """027 Adjust harvester Revision ID: 11e5745c6fc9 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '11e5745c6fc9' down_revision = '3615b25af443' @@ -18,6 +19,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column(table, sa.Column('guid', sa.UnicodeText, server_default=u'')) op.add_column( table, diff --git a/ckan/migration/versions/028_cdd68fe9ba21_drop_harvest_source_status.py b/ckan/migration/versions/028_cdd68fe9ba21_drop_harvest_source_status.py index f41b7d2af9c..e11eea43d17 100644 --- a/ckan/migration/versions/028_cdd68fe9ba21_drop_harvest_source_status.py +++ b/ckan/migration/versions/028_cdd68fe9ba21_drop_harvest_source_status.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """028 Drop harvest_source_status Revision ID: cdd68fe9ba21 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'cdd68fe9ba21' down_revision = '11e5745c6fc9' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.alter_column('harvest_source', 'status', nullable=False) diff --git a/ckan/migration/versions/029_1bfdf4240915_version_groups.py b/ckan/migration/versions/029_1bfdf4240915_version_groups.py index e7a72103aaa..b62ec6ddcf7 100644 --- a/ckan/migration/versions/029_1bfdf4240915_version_groups.py +++ b/ckan/migration/versions/029_1bfdf4240915_version_groups.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """029 Version groups Revision ID: 1bfdf4240915 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '1bfdf4240915' down_revision = 'cdd68fe9ba21' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'group_revision', sa.Column('id', sa.UnicodeText, primary_key=True), sa.Column('name', sa.UnicodeText, nullable=False), diff --git a/ckan/migration/versions/030_b16cbf164c8a_additional_user_attributes.py b/ckan/migration/versions/030_b16cbf164c8a_additional_user_attributes.py index d918934c70d..8999eb2d509 100644 --- a/ckan/migration/versions/030_b16cbf164c8a_additional_user_attributes.py +++ b/ckan/migration/versions/030_b16cbf164c8a_additional_user_attributes.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """030 Additional user_attributes Revision ID: b16cbf164c8a @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'b16cbf164c8a' down_revision = '1bfdf4240915' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column('user', sa.Column('openid', sa.UnicodeText)) op.add_column('user', sa.Column('password', sa.UnicodeText)) op.add_column('user', sa.Column('fullname', sa.UnicodeText)) diff --git a/ckan/migration/versions/031_1b05245167d6_move_openid_to_new_field.py b/ckan/migration/versions/031_1b05245167d6_move_openid_to_new_field.py index ad5d579dafa..d301563c6fc 100644 --- a/ckan/migration/versions/031_1b05245167d6_move_openid_to_new_field.py +++ b/ckan/migration/versions/031_1b05245167d6_move_openid_to_new_field.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """031 Move openid to new_field Revision ID: 1b05245167d6 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '1b05245167d6' down_revision = 'b16cbf164c8a' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return pass diff --git a/ckan/migration/versions/032_d89e0731422d_add_extra_info_field_to_resources.py b/ckan/migration/versions/032_d89e0731422d_add_extra_info_field_to_resources.py index 7ad8607049e..0daae5d617d 100644 --- a/ckan/migration/versions/032_d89e0731422d_add_extra_info_field_to_resources.py +++ b/ckan/migration/versions/032_d89e0731422d_add_extra_info_field_to_resources.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """032 Add extra info field_to_resources Revision ID: d89e0731422d @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'd89e0731422d' down_revision = '1b05245167d6' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column('package_resource', sa.Column('extras', sa.UnicodeText)) op.add_column( 'package_resource_revision', sa.Column('extras', sa.UnicodeText) diff --git a/ckan/migration/versions/033_6da92ef2df15_auth_group_user_id_add_conditional.py b/ckan/migration/versions/033_6da92ef2df15_auth_group_user_id_add_conditional.py index a2feaa1037f..a9e53fdc45a 100644 --- a/ckan/migration/versions/033_6da92ef2df15_auth_group_user_id_add_conditional.py +++ b/ckan/migration/versions/033_6da92ef2df15_auth_group_user_id_add_conditional.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """033 Auth group user id_add_conditional Revision ID: 6da92ef2df15 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '6da92ef2df15' down_revision = 'd89e0731422d' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column('authorization_group_user', sa.Column('id', sa.UnicodeText)) op.create_primary_key( 'authorization_group_user_pkey', 'authorization_group_user', ['id'] diff --git a/ckan/migration/versions/034_6c600693af5b_resource_group_table.py b/ckan/migration/versions/034_6c600693af5b_resource_group_table.py index 8696b41193d..c79a1240aa2 100644 --- a/ckan/migration/versions/034_6c600693af5b_resource_group_table.py +++ b/ckan/migration/versions/034_6c600693af5b_resource_group_table.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """034 Resource group table Revision ID: 6c600693af5b @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '6c600693af5b' down_revision = '6da92ef2df15' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'resource_group', sa.Column('id', sa.UnicodeText, primary_key=True), @@ -59,7 +62,8 @@ def upgrade(): op.rename_table('package_resource_revision', 'resource_revision') op.execute('ALTER INDEX package_resource_pkey RENAME TO resource_pkey') op.execute( - 'ALTER INDEX package_resource_revision_pkey RENAME TO resource_revision_pkey' + 'ALTER INDEX package_resource_revision_pkey ' + 'RENAME TO resource_revision_pkey' ) op.drop_constraint( @@ -113,7 +117,8 @@ def downgrade(): op.rename_table('resource', 'package_resource') op.execute('ALTER INDEX resource_pkey RENAME TO package_resource_pkey') op.execute( - 'ALTER INDEX resource_revision_pkey RENAME TO package_resource_revision_pkey' + 'ALTER INDEX resource_revision_pkey ' + 'RENAME TO package_resource_revision_pkey' ) op.alter_column( diff --git a/ckan/migration/versions/035_81148ccebd6c_harvesting_doc_versioning.py b/ckan/migration/versions/035_81148ccebd6c_harvesting_doc_versioning.py index 71fddce62d0..a2b76d0348f 100644 --- a/ckan/migration/versions/035_81148ccebd6c_harvesting_doc_versioning.py +++ b/ckan/migration/versions/035_81148ccebd6c_harvesting_doc_versioning.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """035 Harvesting doc versioning Revision ID: 81148ccebd6c @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '81148ccebd6c' down_revision = '6c600693af5b' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'harvested_document_revision', sa.Column('id', sa.UnicodeText, nullable=False), diff --git a/ckan/migration/versions/036_ecaa8b38782f_lockdown_roles.py b/ckan/migration/versions/036_ecaa8b38782f_lockdown_roles.py index c37f1ba7957..9210267f4e8 100644 --- a/ckan/migration/versions/036_ecaa8b38782f_lockdown_roles.py +++ b/ckan/migration/versions/036_ecaa8b38782f_lockdown_roles.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """036 Lockdown roles Revision ID: ecaa8b38782f @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'ecaa8b38782f' down_revision = '81148ccebd6c' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return pass diff --git a/ckan/migration/versions/037_edcf3b8c3c1b_role_anon_editor.py b/ckan/migration/versions/037_edcf3b8c3c1b_role_anon_editor.py index 09f9e3cb7e1..6be9677d1fe 100644 --- a/ckan/migration/versions/037_edcf3b8c3c1b_role_anon_editor.py +++ b/ckan/migration/versions/037_edcf3b8c3c1b_role_anon_editor.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """037 Role anon_editor Revision ID: edcf3b8c3c1b @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'edcf3b8c3c1b' down_revision = 'ecaa8b38782f' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return pass diff --git a/ckan/migration/versions/038_fd6622e3d964_delete_migration_tables.py b/ckan/migration/versions/038_fd6622e3d964_delete_migration_tables.py index 6ef7589caf4..8127d17b74d 100644 --- a/ckan/migration/versions/038_fd6622e3d964_delete_migration_tables.py +++ b/ckan/migration/versions/038_fd6622e3d964_delete_migration_tables.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """038 Delete migration tables Revision ID: fd6622e3d964 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'fd6622e3d964' down_revision = 'edcf3b8c3c1b' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.drop_table('harvested_document_revision') op.drop_table('harvested_document') op.drop_table('harvesting_job') @@ -59,7 +62,8 @@ def downgrade(): sa.Column('package_id', sa.UnicodeText), sa.Column('state', sa.UnicodeText), sa.Column('revision_id', sa.UnicodeText, nullable=False), - sa.Column('guid', sa.UnicodeText), sa.Column('created', sa.TIMESTAMP), + sa.Column('guid', sa.UnicodeText), + sa.Column('created', sa.TIMESTAMP), ) op.create_table( diff --git a/ckan/migration/versions/039_cca459c76d45_add_expired_id_and_dates.py b/ckan/migration/versions/039_cca459c76d45_add_expired_id_and_dates.py index 0ddaf80778c..a2594f40aa1 100644 --- a/ckan/migration/versions/039_cca459c76d45_add_expired_id_and_dates.py +++ b/ckan/migration/versions/039_cca459c76d45_add_expired_id_and_dates.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """039 Add expired id and_dates Revision ID: cca459c76d45 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'cca459c76d45' down_revision = 'fd6622e3d964' @@ -130,6 +131,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return for table in tables: op.add_column(table, sa.Column('expired_id', sa.UnicodeText)) diff --git a/ckan/migration/versions/040_500a08f4818e_reset_key_on_user.py b/ckan/migration/versions/040_500a08f4818e_reset_key_on_user.py index 7cc2c0ef66e..e46191498fa 100644 --- a/ckan/migration/versions/040_500a08f4818e_reset_key_on_user.py +++ b/ckan/migration/versions/040_500a08f4818e_reset_key_on_user.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """040 Reset key on user Revision ID: 500a08f4818e @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '500a08f4818e' down_revision = 'cca459c76d45' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column('user', sa.Column('reset_key', sa.UnicodeText)) diff --git a/ckan/migration/versions/041_6817d4e3bdc3_resource_new_fields.py b/ckan/migration/versions/041_6817d4e3bdc3_resource_new_fields.py index 1fcdd72f884..699a0e1dc57 100644 --- a/ckan/migration/versions/041_6817d4e3bdc3_resource_new_fields.py +++ b/ckan/migration/versions/041_6817d4e3bdc3_resource_new_fields.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """041 Resource new fields Revision ID: 6817d4e3bdc3 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '6817d4e3bdc3' down_revision = '500a08f4818e' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return for table in ('resource', 'resource_revision'): op.add_column(table, sa.Column('name', sa.UnicodeText)) op.add_column(table, sa.Column('resource_type', sa.UnicodeText)) diff --git a/ckan/migration/versions/042_da65e2877034_user_revision_indexes.py b/ckan/migration/versions/042_da65e2877034_user_revision_indexes.py index 26e10d612b1..6870ee9b80a 100644 --- a/ckan/migration/versions/042_da65e2877034_user_revision_indexes.py +++ b/ckan/migration/versions/042_da65e2877034_user_revision_indexes.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """042 User revision indexes Revision ID: da65e2877034 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'da65e2877034' down_revision = '6817d4e3bdc3' @@ -16,12 +17,16 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_index('idx_revision_author', 'revision', ['author']) op.create_index('idx_openid', 'user', ['openid']) op.create_index( 'idx_user_name_index', 'user', [ sa.text( - '''(CASE WHEN ("user".fullname IS NULL OR "user".fullname = '') THEN "user".name ELSE "user".fullname END)''' + '(CASE WHEN ' + '("user".fullname IS NULL OR "user".fullname = \'\') ' + 'THEN "user".name ELSE "user".fullname END)' ) ] ) diff --git a/ckan/migration/versions/043_bd38cd6502b2_drop_postgres_search.py b/ckan/migration/versions/043_bd38cd6502b2_drop_postgres_search.py index fb7411a8cda..252b47d522b 100644 --- a/ckan/migration/versions/043_bd38cd6502b2_drop_postgres_search.py +++ b/ckan/migration/versions/043_bd38cd6502b2_drop_postgres_search.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """043 Drop postgres search Revision ID: bd38cd6502b2 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'bd38cd6502b2' down_revision = 'da65e2877034' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.drop_table('package_search') diff --git a/ckan/migration/versions/044_4190eeeb8d73_add_task_status.py b/ckan/migration/versions/044_4190eeeb8d73_add_task_status.py index eb3367b4ef7..9eafced4d73 100644 --- a/ckan/migration/versions/044_4190eeeb8d73_add_task_status.py +++ b/ckan/migration/versions/044_4190eeeb8d73_add_task_status.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """044 Add task status Revision ID: 4190eeeb8d73 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '4190eeeb8d73' down_revision = 'bd38cd6502b2' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'task_status', sa.Column('id', sa.UnicodeText, nullable=False), sa.Column('entity_id', sa.UnicodeText, nullable=False), diff --git a/ckan/migration/versions/045_54e3f155d945_user_name_unique.py b/ckan/migration/versions/045_54e3f155d945_user_name_unique.py index 42a7b006538..cdaf3671edf 100644 --- a/ckan/migration/versions/045_54e3f155d945_user_name_unique.py +++ b/ckan/migration/versions/045_54e3f155d945_user_name_unique.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """045 User name unique Revision ID: 54e3f155d945 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '54e3f155d945' down_revision = '4190eeeb8d73' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_unique_constraint('user_name_key', 'user', ['name']) diff --git a/ckan/migration/versions/046_b69e9b80396f_drop_changesets.py b/ckan/migration/versions/046_b69e9b80396f_drop_changesets.py index 062d2a2d9af..aa71661240a 100644 --- a/ckan/migration/versions/046_b69e9b80396f_drop_changesets.py +++ b/ckan/migration/versions/046_b69e9b80396f_drop_changesets.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """046 Drop changesets Revision ID: b69e9b80396f @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'b69e9b80396f' down_revision = '54e3f155d945' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.drop_table('change') op.drop_table('changemask') op.drop_table('changeset') diff --git a/ckan/migration/versions/047_883a7c406926_rename_package_group_member.py b/ckan/migration/versions/047_883a7c406926_rename_package_group_member.py index 7467535727a..28a74e478a1 100644 --- a/ckan/migration/versions/047_883a7c406926_rename_package_group_member.py +++ b/ckan/migration/versions/047_883a7c406926_rename_package_group_member.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """047 Rename package_group_member Revision ID: 883a7c406926 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '883a7c406926' down_revision = 'b69e9b80396f' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.rename_table('package_group', 'member') op.rename_table('package_group_revision', 'member_revision') diff --git a/ckan/migration/versions/048_4a7011172b3f_add_activity_streams_tables.py b/ckan/migration/versions/048_4a7011172b3f_add_activity_streams_tables.py index 95c201da4be..f618addd1b9 100644 --- a/ckan/migration/versions/048_4a7011172b3f_add_activity_streams_tables.py +++ b/ckan/migration/versions/048_4a7011172b3f_add_activity_streams_tables.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """048 Add activity streams tables Revision ID: 4a7011172b3f @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '4a7011172b3f' down_revision = '883a7c406926' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'activity', sa.Column('id', sa.UnicodeText, nullable=False), diff --git a/ckan/migration/versions/049_e0c06c2177b5_add_group_approval_status.py b/ckan/migration/versions/049_e0c06c2177b5_add_group_approval_status.py index 10717202768..0198878dbd9 100644 --- a/ckan/migration/versions/049_e0c06c2177b5_add_group_approval_status.py +++ b/ckan/migration/versions/049_e0c06c2177b5_add_group_approval_status.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """049 Add group approval status Revision ID: e0c06c2177b5 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'e0c06c2177b5' down_revision = '4a7011172b3f' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column('group', sa.Column('approval_status', sa.UnicodeText)) op.add_column( 'group_revision', sa.Column('approval_status', sa.UnicodeText) diff --git a/ckan/migration/versions/050_01a6b058cb7f_term_translation_table.py b/ckan/migration/versions/050_01a6b058cb7f_term_translation_table.py index 9894644156c..9f070c90d02 100644 --- a/ckan/migration/versions/050_01a6b058cb7f_term_translation_table.py +++ b/ckan/migration/versions/050_01a6b058cb7f_term_translation_table.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """050 Term translation table Revision ID: 01a6b058cb7f @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '01a6b058cb7f' down_revision = 'e0c06c2177b5' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'term_translation', sa.Column('term', sa.UnicodeText, nullable=False), sa.Column('term_translation', sa.UnicodeText, nullable=False), diff --git a/ckan/migration/versions/051_a4fb0d85ced6_add_tag_vocabulary.py b/ckan/migration/versions/051_a4fb0d85ced6_add_tag_vocabulary.py index 4557f84a4a2..c99ad4a4b75 100644 --- a/ckan/migration/versions/051_a4fb0d85ced6_add_tag_vocabulary.py +++ b/ckan/migration/versions/051_a4fb0d85ced6_add_tag_vocabulary.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """051 Add tag vocabulary Revision ID: a4fb0d85ced6 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'a4fb0d85ced6' down_revision = '01a6b058cb7f' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.drop_constraint('tag_name_key', 'tag') op.create_table( 'vocabulary', sa.Column('id', sa.UnicodeText, nullable=False), diff --git a/ckan/migration/versions/052_ba693d64c6d7_update_member_capacities.py b/ckan/migration/versions/052_ba693d64c6d7_update_member_capacities.py index 0a66b12607b..a5fd64565c2 100644 --- a/ckan/migration/versions/052_ba693d64c6d7_update_member_capacities.py +++ b/ckan/migration/versions/052_ba693d64c6d7_update_member_capacities.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """052 Update member capacities Revision ID: ba693d64c6d7 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'ba693d64c6d7' down_revision = 'a4fb0d85ced6' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return pass diff --git a/ckan/migration/versions/053_9d051a099097_add_group_logo.py b/ckan/migration/versions/053_9d051a099097_add_group_logo.py index e0219cfc481..ba83d1af583 100644 --- a/ckan/migration/versions/053_9d051a099097_add_group_logo.py +++ b/ckan/migration/versions/053_9d051a099097_add_group_logo.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """053 Add group logo Revision ID: 9d051a099097 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '9d051a099097' down_revision = 'ba693d64c6d7' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column('group', sa.Column('image_url', sa.UnicodeText)) op.add_column('group_revision', sa.Column('image_url', sa.UnicodeText)) diff --git a/ckan/migration/versions/054_da21b38da4db_add_resource_created_date.py b/ckan/migration/versions/054_da21b38da4db_add_resource_created_date.py index 0c33c3608eb..50ceb698617 100644 --- a/ckan/migration/versions/054_da21b38da4db_add_resource_created_date.py +++ b/ckan/migration/versions/054_da21b38da4db_add_resource_created_date.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """054 Add resource created date Revision ID: da21b38da4db @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'da21b38da4db' down_revision = '9d051a099097' @@ -16,6 +17,9 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return + op.add_column('resource', sa.Column('created', sa.TIMESTAMP)) op.add_column('resource_revision', sa.Column('created', sa.TIMESTAMP)) diff --git a/ckan/migration/versions/055_048f7db947bf_update_user_and_activity_detail.py b/ckan/migration/versions/055_048f7db947bf_update_user_and_activity_detail.py index e8d83abeafd..92ed5850245 100644 --- a/ckan/migration/versions/055_048f7db947bf_update_user_and_activity_detail.py +++ b/ckan/migration/versions/055_048f7db947bf_update_user_and_activity_detail.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """055 Update user and activity_detail Revision ID: 048f7db947bf @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '048f7db947bf' down_revision = 'da21b38da4db' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.alter_column('activity_detail', 'activity_id', nullable=True) op.alter_column('user', 'name', nullable=False) diff --git a/ckan/migration/versions/056_11af3215ae89_add_related_table.py b/ckan/migration/versions/056_11af3215ae89_add_related_table.py index ce048574c9d..b9f92ffab60 100644 --- a/ckan/migration/versions/056_11af3215ae89_add_related_table.py +++ b/ckan/migration/versions/056_11af3215ae89_add_related_table.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """056 Add related table Revision ID: 11af3215ae89 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '11af3215ae89' down_revision = '048f7db947bf' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'related', sa.Column('id', sa.UnicodeText, nullable=False), sa.Column('type', sa.UnicodeText, nullable=False), diff --git a/ckan/migration/versions/057_660a5aae527e_tracking.py b/ckan/migration/versions/057_660a5aae527e_tracking.py index 9cadfe72fcc..c3c7a09cd2c 100644 --- a/ckan/migration/versions/057_660a5aae527e_tracking.py +++ b/ckan/migration/versions/057_660a5aae527e_tracking.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """057 Tracking Revision ID: 660a5aae527e @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '660a5aae527e' down_revision = '11af3215ae89' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'tracking_raw', sa.Column('user_key', sa.String(100), nullable=False), sa.Column('url', sa.UnicodeText, nullable=False), diff --git a/ckan/migration/versions/058_bd36d1826a5d_add_follower_tables.py b/ckan/migration/versions/058_bd36d1826a5d_add_follower_tables.py index a1f5a28742e..78cef1d6fec 100644 --- a/ckan/migration/versions/058_bd36d1826a5d_add_follower_tables.py +++ b/ckan/migration/versions/058_bd36d1826a5d_add_follower_tables.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """058 Add follower tables Revision ID: bd36d1826a5d @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'bd36d1826a5d' down_revision = '660a5aae527e' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'user_following_dataset', sa.Column('follower_id', sa.UnicodeText, nullable=False), diff --git a/ckan/migration/versions/059_9291bb46f352_add_related_count_and_flag.py b/ckan/migration/versions/059_9291bb46f352_add_related_count_and_flag.py index 8371a37a0c7..b75fb1b6061 100644 --- a/ckan/migration/versions/059_9291bb46f352_add_related_count_and_flag.py +++ b/ckan/migration/versions/059_9291bb46f352_add_related_count_and_flag.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """059 Add related count and_flag Revision ID: 9291bb46f352 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '9291bb46f352' down_revision = 'bd36d1826a5d' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column( 'related', sa.Column( diff --git a/ckan/migration/versions/060_31ad11c518fc_add_system_info_table.py b/ckan/migration/versions/060_31ad11c518fc_add_system_info_table.py index 5639f9302da..ba3d7a57217 100644 --- a/ckan/migration/versions/060_31ad11c518fc_add_system_info_table.py +++ b/ckan/migration/versions/060_31ad11c518fc_add_system_info_table.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """060 Add system info table Revision ID: 31ad11c518fc @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '31ad11c518fc' down_revision = '9291bb46f352' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'system_info', diff --git a/ckan/migration/versions/061_338d460bc460_add_follower_group_table.py b/ckan/migration/versions/061_338d460bc460_add_follower_group_table.py index a3a9185fa5a..624d17243b6 100644 --- a/ckan/migration/versions/061_338d460bc460_add_follower_group_table.py +++ b/ckan/migration/versions/061_338d460bc460_add_follower_group_table.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """061 Add follower group_table Revision ID: 338d460bc460 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '338d460bc460' down_revision = '31ad11c518fc' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'user_following_group', sa.Column('follower_id', sa.UnicodeText, nullable=False), @@ -30,16 +33,14 @@ def upgrade(): op.create_foreign_key( 'user_following_group_user_id_fkey', 'user_following_group', - 'user', ['follower_id'], - ['id'], + 'user', ['follower_id'], ['id'], onupdate='CASCADE', ondelete='CASCADE' ) op.create_foreign_key( 'user_following_group_group_id_fkey', 'user_following_group', - 'group', ['object_id'], - ['id'], + 'group', ['object_id'], ['id'], onupdate='CASCADE', ondelete='CASCADE' ) diff --git a/ckan/migration/versions/062_6deb2bbab394_add_dashboard_table.py b/ckan/migration/versions/062_6deb2bbab394_add_dashboard_table.py index 8d3e063b17c..86b77f20400 100644 --- a/ckan/migration/versions/062_6deb2bbab394_add_dashboard_table.py +++ b/ckan/migration/versions/062_6deb2bbab394_add_dashboard_table.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """062 Add dashboard table Revision ID: 6deb2bbab394 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '6deb2bbab394' down_revision = '338d460bc460' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'dashboard', sa.Column('user_id', sa.UnicodeText, nullable=False), sa.Column('activity_stream_last_viewed', sa.TIMESTAMP, nullable=False) diff --git a/ckan/migration/versions/063_8b633852cb7a_org_changes.py b/ckan/migration/versions/063_8b633852cb7a_org_changes.py index 3569ccbc35b..b02e08505e6 100644 --- a/ckan/migration/versions/063_8b633852cb7a_org_changes.py +++ b/ckan/migration/versions/063_8b633852cb7a_org_changes.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """063 Org changes Revision ID: 8b633852cb7a @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '8b633852cb7a' down_revision = '6deb2bbab394' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column( 'user', sa.Column('sysadmin', sa.Boolean, server_default='FALSE') diff --git a/ckan/migration/versions/064_4f8becd4919a_add_email_last_sent_column.py b/ckan/migration/versions/064_4f8becd4919a_add_email_last_sent_column.py index 96c571df8f4..6f8f6c89fbe 100644 --- a/ckan/migration/versions/064_4f8becd4919a_add_email_last_sent_column.py +++ b/ckan/migration/versions/064_4f8becd4919a_add_email_last_sent_column.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """064 Add email_last_sent_column Revision ID: 4f8becd4919a @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '4f8becd4919a' down_revision = '8b633852cb7a' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column( 'dashboard', sa.Column( diff --git a/ckan/migration/versions/065_1fab0bc6439e_add_email_notifications_preference.py b/ckan/migration/versions/065_1fab0bc6439e_add_email_notifications_preference.py index aa594e63be8..1fb44518cb8 100644 --- a/ckan/migration/versions/065_1fab0bc6439e_add_email_notifications_preference.py +++ b/ckan/migration/versions/065_1fab0bc6439e_add_email_notifications_preference.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """065 Add email notifications preference Revision ID: 1fab0bc6439e @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '1fab0bc6439e' down_revision = '4f8becd4919a' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column( 'user', sa.Column( diff --git a/ckan/migration/versions/066_ad16b3bd8cb6_default_package_type.py b/ckan/migration/versions/066_ad16b3bd8cb6_default_package_type.py index dd56a043af1..f6e319074d6 100644 --- a/ckan/migration/versions/066_ad16b3bd8cb6_default_package_type.py +++ b/ckan/migration/versions/066_ad16b3bd8cb6_default_package_type.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """066 Default package type Revision ID: ad16b3bd8cb6 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'ad16b3bd8cb6' down_revision = '1fab0bc6439e' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return pass diff --git a/ckan/migration/versions/067_266c110eafec_turn_extras_to_strings.py b/ckan/migration/versions/067_266c110eafec_turn_extras_to_strings.py index edbc2cdc496..153ab6fed78 100644 --- a/ckan/migration/versions/067_266c110eafec_turn_extras_to_strings.py +++ b/ckan/migration/versions/067_266c110eafec_turn_extras_to_strings.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """067 Turn extras to strings Revision ID: 266c110eafec @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '266c110eafec' down_revision = 'ad16b3bd8cb6' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return pass diff --git a/ckan/migration/versions/068_e33a5f2b2a84_add_package_extras_index.py b/ckan/migration/versions/068_e33a5f2b2a84_add_package_extras_index.py index d6f27a06268..b27a4353e8f 100644 --- a/ckan/migration/versions/068_e33a5f2b2a84_add_package_extras_index.py +++ b/ckan/migration/versions/068_e33a5f2b2a84_add_package_extras_index.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """068 Add package extras index Revision ID: e33a5f2b2a84 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'e33a5f2b2a84' down_revision = '266c110eafec' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_index( 'idx_package_extra_package_id', 'package_extra_revision', ['package_id', 'current'] diff --git a/ckan/migration/versions/069_e7524c675cdb_resource_url_and_metadata_modified.py b/ckan/migration/versions/069_e7524c675cdb_resource_url_and_metadata_modified.py index 1137d615f92..42cc39528f7 100644 --- a/ckan/migration/versions/069_e7524c675cdb_resource_url_and_metadata_modified.py +++ b/ckan/migration/versions/069_e7524c675cdb_resource_url_and_metadata_modified.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """069 Resource url and metadata_modified Revision ID: e7524c675cdb @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'e7524c675cdb' down_revision = 'e33a5f2b2a84' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column('resource', sa.Column('url_type', sa.UnicodeText)) op.add_column('resource_revision', sa.Column('url_type', sa.UnicodeText)) diff --git a/ckan/migration/versions/070_cfb544112fa7_add_activity_and_resource_indexes.py b/ckan/migration/versions/070_cfb544112fa7_add_activity_and_resource_indexes.py index 3498045a108..745d2a39ed6 100644 --- a/ckan/migration/versions/070_cfb544112fa7_add_activity_and_resource_indexes.py +++ b/ckan/migration/versions/070_cfb544112fa7_add_activity_and_resource_indexes.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """070 Add activity and resource_indexes Revision ID: cfb544112fa7 @@ -6,7 +7,7 @@ """ from alembic import op -import sqlalchemy as sa +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'cfb544112fa7' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_index( 'idx_activity_user_id', 'activity', ['user_id', 'timestamp'] ) diff --git a/ckan/migration/versions/071_c16f081ef73a_add_state_column_to_user_table.py b/ckan/migration/versions/071_c16f081ef73a_add_state_column_to_user_table.py index 930a826b23b..0f272f8a450 100644 --- a/ckan/migration/versions/071_c16f081ef73a_add_state_column_to_user_table.py +++ b/ckan/migration/versions/071_c16f081ef73a_add_state_column_to_user_table.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """071 Add state column to_user_table Revision ID: c16f081ef73a @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'c16f081ef73a' down_revision = 'cfb544112fa7' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column( 'user', sa.Column( diff --git a/ckan/migration/versions/072_08dcb9233ad7_add_resource_view.py b/ckan/migration/versions/072_08dcb9233ad7_add_resource_view.py index 45d992e7821..fa722b2fd54 100644 --- a/ckan/migration/versions/072_08dcb9233ad7_add_resource_view.py +++ b/ckan/migration/versions/072_08dcb9233ad7_add_resource_view.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """072 Add resource view Revision ID: 08dcb9233ad7 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '08dcb9233ad7' down_revision = 'c16f081ef73a' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_table( 'resource_view', sa.Column('id', sa.UnicodeText, nullable=False), diff --git a/ckan/migration/versions/073_011f51208be3_update_resource_view_resource_id_.py b/ckan/migration/versions/073_011f51208be3_update_resource_view_resource_id_.py index b8770af40b1..fa288586d27 100644 --- a/ckan/migration/versions/073_011f51208be3_update_resource_view_resource_id_.py +++ b/ckan/migration/versions/073_011f51208be3_update_resource_view_resource_id_.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """073 Update resource view resource_id_constraint Revision ID: 011f51208be3 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '011f51208be3' down_revision = '08dcb9233ad7' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.drop_constraint('resource_view_resource_id_fkey', 'resource_view') op.create_foreign_key( 'resource_view_resource_id_fkey', diff --git a/ckan/migration/versions/074_a4ca55f0f45e_remove_resource_groups.py b/ckan/migration/versions/074_a4ca55f0f45e_remove_resource_groups.py index 07dc9107fd3..0a4c5b1e6ad 100644 --- a/ckan/migration/versions/074_a4ca55f0f45e_remove_resource_groups.py +++ b/ckan/migration/versions/074_a4ca55f0f45e_remove_resource_groups.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """074 Remove resource groups Revision ID: a4ca55f0f45e @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'a4ca55f0f45e' down_revision = '011f51208be3' @@ -35,6 +36,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column( 'resource', sa.Column( diff --git a/ckan/migration/versions/075_9cdc88c8896a_rename_view_plugins.py b/ckan/migration/versions/075_9cdc88c8896a_rename_view_plugins.py index 3e6b766e068..f26a92152c2 100644 --- a/ckan/migration/versions/075_9cdc88c8896a_rename_view_plugins.py +++ b/ckan/migration/versions/075_9cdc88c8896a_rename_view_plugins.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """075 Rename view plugins Revision ID: 9cdc88c8896a @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '9cdc88c8896a' down_revision = 'a4ca55f0f45e' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return pass diff --git a/ckan/migration/versions/076_59995aa965c0_rename_view_plugins_2.py b/ckan/migration/versions/076_59995aa965c0_rename_view_plugins_2.py index c9e178da24d..df891af17bd 100644 --- a/ckan/migration/versions/076_59995aa965c0_rename_view_plugins_2.py +++ b/ckan/migration/versions/076_59995aa965c0_rename_view_plugins_2.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """076 Rename view plugins 2 Revision ID: 59995aa965c0 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '59995aa965c0' down_revision = '9cdc88c8896a' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return pass diff --git a/ckan/migration/versions/077_51171a04d86d_add_revisions_to_system_info.py b/ckan/migration/versions/077_51171a04d86d_add_revisions_to_system_info.py index bc23b1dbf04..73157e417a5 100644 --- a/ckan/migration/versions/077_51171a04d86d_add_revisions_to_system_info.py +++ b/ckan/migration/versions/077_51171a04d86d_add_revisions_to_system_info.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """077 Add revisions to system_info Revision ID: 51171a04d86d @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '51171a04d86d' down_revision = '59995aa965c0' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column( 'system_info', sa.Column( diff --git a/ckan/migration/versions/078_ae821876532a_remove_old_authz_model.py b/ckan/migration/versions/078_ae821876532a_remove_old_authz_model.py index 8fa573e85c0..a3c79c4601f 100644 --- a/ckan/migration/versions/078_ae821876532a_remove_old_authz_model.py +++ b/ckan/migration/versions/078_ae821876532a_remove_old_authz_model.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """078 Remove old authz model Revision ID: ae821876532a @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'ae821876532a' down_revision = '51171a04d86d' @@ -25,7 +26,10 @@ ('idx_ra_role_action', 'role_action', ['action', 'role']), ) + def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.drop_table('role_action') op.drop_table('package_role') op.drop_table('group_role') diff --git a/ckan/migration/versions/079_e0177a15d2c9_resource_revision_index.py b/ckan/migration/versions/079_e0177a15d2c9_resource_revision_index.py index c947363382e..d1690c95469 100644 --- a/ckan/migration/versions/079_e0177a15d2c9_resource_revision_index.py +++ b/ckan/migration/versions/079_e0177a15d2c9_resource_revision_index.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """079 Resource revision index Revision ID: e0177a15d2c9 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'e0177a15d2c9' down_revision = 'ae821876532a' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_index( 'idx_resource_continuity_id', 'resource_revision', ['continuity_id'] ) diff --git a/ckan/migration/versions/080_8224d872c64f_continuity_id_indexes.py b/ckan/migration/versions/080_8224d872c64f_continuity_id_indexes.py index 76252c2cd8e..b70ed56ef93 100644 --- a/ckan/migration/versions/080_8224d872c64f_continuity_id_indexes.py +++ b/ckan/migration/versions/080_8224d872c64f_continuity_id_indexes.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """080 Continuity id indexes Revision ID: 8224d872c64f @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '8224d872c64f' down_revision = 'e0177a15d2c9' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_index( 'idx_member_continuity_id', 'member_revision', ['continuity_id'] ) diff --git a/ckan/migration/versions/081_a64cf4a79182_set_datastore_active.py b/ckan/migration/versions/081_a64cf4a79182_set_datastore_active.py index bb0ee315ff7..b17b4b6fda1 100644 --- a/ckan/migration/versions/081_a64cf4a79182_set_datastore_active.py +++ b/ckan/migration/versions/081_a64cf4a79182_set_datastore_active.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """081 Set datastore active Revision ID: a64cf4a79182 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'a64cf4a79182' @@ -17,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return pass diff --git a/ckan/migration/versions/082_8ea886d0ede4_create_index_creator_user_id.py b/ckan/migration/versions/082_8ea886d0ede4_create_index_creator_user_id.py index bb1bf48258b..8fcf2777c3f 100644 --- a/ckan/migration/versions/082_8ea886d0ede4_create_index_creator_user_id.py +++ b/ckan/migration/versions/082_8ea886d0ede4_create_index_creator_user_id.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """082 Create index creator user_id Revision ID: 8ea886d0ede4 @@ -6,8 +7,7 @@ """ from alembic import op -import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '8ea886d0ede4' down_revision = 'a64cf4a79182' @@ -16,6 +16,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.create_index( 'idx_package_creator_user_id', 'package', ['creator_user_id'] ) diff --git a/ckan/migration/versions/083_f98d8fa2a7f7_remove_related_items.py b/ckan/migration/versions/083_f98d8fa2a7f7_remove_related_items.py index 375c1b73743..8321f7943ab 100644 --- a/ckan/migration/versions/083_f98d8fa2a7f7_remove_related_items.py +++ b/ckan/migration/versions/083_f98d8fa2a7f7_remove_related_items.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """083 Remove related items Revision ID: f98d8fa2a7f7 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'f98d8fa2a7f7' down_revision = '8ea886d0ede4' @@ -28,6 +29,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return conn = op.get_bind() existing = conn.execute("SELECT COUNT(*) FROM related;").fetchone() if existing[0] > 0: diff --git a/ckan/migration/versions/084_d85ce5783688_add_metadata_created.py b/ckan/migration/versions/084_d85ce5783688_add_metadata_created.py index 35a17a6a223..7e78c915f16 100644 --- a/ckan/migration/versions/084_d85ce5783688_add_metadata_created.py +++ b/ckan/migration/versions/084_d85ce5783688_add_metadata_created.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """084 Add metadata created Revision ID: d85ce5783688 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'd85ce5783688' down_revision = 'f98d8fa2a7f7' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.add_column( 'package_revision', sa.Column('metadata_created', sa.TIMESTAMP) ) diff --git a/ckan/migration/versions/085_f9bf3d5c4b4d_adjust_activity_timestamps.py b/ckan/migration/versions/085_f9bf3d5c4b4d_adjust_activity_timestamps.py index c6ba60df91d..3a7787b3409 100644 --- a/ckan/migration/versions/085_f9bf3d5c4b4d_adjust_activity_timestamps.py +++ b/ckan/migration/versions/085_f9bf3d5c4b4d_adjust_activity_timestamps.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """085 Adjust activity timestamps Revision ID: f9bf3d5c4b4d @@ -8,7 +9,7 @@ import datetime from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'f9bf3d5c4b4d' down_revision = 'd85ce5783688' @@ -17,6 +18,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return magic_timestamp = datetime.datetime(2016, 6, 20).toordinal() utc_date = datetime.datetime.utcfromtimestamp(magic_timestamp) diff --git a/ckan/migration/versions/086_19663581b3bb_drop_openid_column.py b/ckan/migration/versions/086_19663581b3bb_drop_openid_column.py index 00a110a9a17..9106d9e322b 100644 --- a/ckan/migration/versions/086_19663581b3bb_drop_openid_column.py +++ b/ckan/migration/versions/086_19663581b3bb_drop_openid_column.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """086 Drop openid column Revision ID: 19663581b3bb @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = '19663581b3bb' down_revision = 'f9bf3d5c4b4d' @@ -16,6 +17,8 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.drop_column('user', 'openid') diff --git a/ckan/migration/versions/087_ff1b303cab77_remove_old_authorization_tables.py b/ckan/migration/versions/087_ff1b303cab77_remove_old_authorization_tables.py index 129cd84b225..055efa47b98 100644 --- a/ckan/migration/versions/087_ff1b303cab77_remove_old_authorization_tables.py +++ b/ckan/migration/versions/087_ff1b303cab77_remove_old_authorization_tables.py @@ -1,3 +1,4 @@ +# encoding: utf-8 """087 Remove old authorization tables Revision ID: ff1b303cab77 @@ -7,7 +8,7 @@ """ from alembic import op import sqlalchemy as sa - +from ckan.migration import skip_based_on_legacy_engine_version # revision identifiers, used by Alembic. revision = 'ff1b303cab77' @@ -17,9 +18,12 @@ def upgrade(): + if skip_based_on_legacy_engine_version(op, __name__): + return op.drop_table('authorization_group_user') op.drop_table('authorization_group') + def downgrade(): op.create_table( 'authorization_group', @@ -42,6 +46,5 @@ def downgrade(): sa.UnicodeText, sa.ForeignKey('user.id'), nullable=False - ), - sa.Column('id', sa.UnicodeText, primary_key=True) + ), sa.Column('id', sa.UnicodeText, primary_key=True) ) diff --git a/ckan/migration/versions/088_3ad397f70903_remove_migrate_version_table.py b/ckan/migration/versions/088_3ad397f70903_remove_migrate_version_table.py new file mode 100644 index 00000000000..84b34cb2cc4 --- /dev/null +++ b/ckan/migration/versions/088_3ad397f70903_remove_migrate_version_table.py @@ -0,0 +1,23 @@ +# encoding: utf-8 +"""Remove migrate version table + +Revision ID: 3ad397f70903 +Revises: ff1b303cab77 +Create Date: 2018-09-18 18:16:50.083513 + +""" +from alembic import op + +# revision identifiers, used by Alembic. +revision = '3ad397f70903' +down_revision = 'ff1b303cab77' +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute('DROP TABLE IF EXISTS migrate_version') + + +def downgrade(): + pass diff --git a/ckan/model/__init__.py b/ckan/model/__init__.py index 714d779c868..22152b638bf 100644 --- a/ckan/model/__init__.py +++ b/ckan/model/__init__.py @@ -5,12 +5,21 @@ import re from datetime import datetime from time import sleep +from os.path import splitext from six import text_type import vdm.sqlalchemy from vdm.sqlalchemy.base import SQLAlchemySession from sqlalchemy import MetaData, __version__ as sqav, Table from sqlalchemy.util import OrderedDict +from sqlalchemy.exc import ProgrammingError + +from alembic.command import ( + upgrade as alembic_upgrade, + downgrade as alembic_downgrade, + current as alembic_current +) +from alembic.config import Config as AlembicConfig import meta from meta import ( @@ -136,14 +145,11 @@ import ckan.migration -log = logging.getLogger(__name__) +log = logging.getLogger(__name__) DB_CONNECT_RETRIES = 10 -# set up in init_model after metadata is bound -version_table = None - def init_model(engine): '''Call me before using any of the tables or classes in the model''' @@ -156,8 +162,7 @@ def init_model(engine): import sqlalchemy.exc for i in reversed(range(DB_CONNECT_RETRIES)): try: - global version_table - version_table = Table('migrate_version', meta.metadata, autoload=True) + Table('alembic_version', meta.metadata, autoload=True) break except sqlalchemy.exc.NoSuchTableError: break @@ -169,7 +174,8 @@ def init_model(engine): class Repository(vdm.sqlalchemy.Repository): - migrate_repository = ckan.migration.__path__[0] + _repo_path, _dot_repo_name = splitext(ckan.migration.__name__) + migrate_repository = _repo_path + ':' + _dot_repo_name[1:] # note: tables_created value is not sustained between instantiations # so only useful for tests. The alternative is to use @@ -217,11 +223,6 @@ def create_db(self): self.metadata.create_all(bind=self.metadata.bind) log.info('Database tables created') - def latest_migration_version(self): - import migrate.versioning.api as mig - version = mig.version(self.migrate_repository) - return version - def rebuild_db(self): '''Clean and init the db''' if self.tables_created_and_initialised: @@ -245,44 +246,80 @@ def delete_all(self): else: tables = reversed(self.metadata.sorted_tables) for table in tables: - if table.name == 'migrate_version': + if table.name == 'alembic_version': continue connection.execute('delete from "%s"' % table.name) self.session.commit() log.info('Database table data deleted') - def setup_migration_version_control(self, version=None): - import migrate.exceptions - import migrate.versioning.api as mig - # set up db version control (if not already) + def reset_alembic_output(self): + self._alembic_output = [] + + def add_alembic_output(self, *args): + self._alembic_output.append(args) + + def take_alembic_output(self, with_reset=True): + output = self._alembic_output + self._alembic_config = [] + return output + + def setup_migration_version_control(self): + self.reset_alembic_output() + alembic_config = AlembicConfig() + alembic_config.set_main_option( + "script_location", self.migrate_repository + ) + alembic_config.set_main_option( + "sqlalchemy.url", str(self.metadata.bind.url) + ) try: - mig.version_control(self.metadata.bind, - self.migrate_repository, version) - except migrate.exceptions.DatabaseAlreadyControlledError: - pass + sqlalchemy_migrate_version = self.metadata.bind.execute( + u'select version from migrate_version' + ).scalar() + except ProgrammingError: + sqlalchemy_migrate_version = 0 + alembic_config.set_main_option( + "sqlalchemy_migrate_version", str(sqlalchemy_migrate_version) + ) + alembic_config.print_stdout = self.add_alembic_output + + self.alembic_config = alembic_config - def upgrade_db(self, version=None): + def downgrade_db(self, version='base'): + self.setup_migration_version_control() + alembic_downgrade(self.alembic_config, version) + log.info(u'CKAN database version set to: %s', version) + + def upgrade_db(self, version='head'): '''Upgrade db using sqlalchemy migrations. @param version: version to upgrade to (if None upgrade to latest) ''' - assert meta.engine.name in ('postgres', 'postgresql'), \ - 'Database migration - only Postgresql engine supported (not %s).' \ - % meta.engine.name - import migrate.versioning.api as mig + _assert_engine_msg = ( + u'Database migration - only Postgresql engine supported (not %s).' + ) % meta.engine.name + assert meta.engine.name in ( + u'postgres', u'postgresql' + ), _assert_engine_msg self.setup_migration_version_control() - version_before = mig.db_version(self.metadata.bind, self.migrate_repository) - mig.upgrade(self.metadata.bind, self.migrate_repository, version=version) - version_after = mig.db_version(self.metadata.bind, self.migrate_repository) + try: + alembic_current(self.alembic_config) + version_before = self.take_alembic_output()[0][0] + except (TypeError, IndexError): + # alembic is not initialized yet + version_before = 'base' + alembic_upgrade(self.alembic_config, version) + alembic_current(self.alembic_config) + + version_after = self.take_alembic_output()[0][0] if version_after != version_before: - log.info('CKAN database version upgraded: %s -> %s', version_before, version_after) + log.info( + u'CKAN database version upgraded: %s -> %s', + version_before, + version_after + ) else: - log.info('CKAN database version remains as: %s', version_after) - - ##this prints the diffs in a readable format - ##import pprint - ##from migrate.versioning.schemadiff import getDiffOfModelAgainstDatabase - ##pprint.pprint(getDiffOfModelAgainstDatabase(self.metadata, self.metadata.bind).colDiffs) + log.info(u'CKAN database version remains as: %s', version_after) def are_tables_created(self): meta.metadata = MetaData(self.metadata.bind) diff --git a/ckan/tests/legacy/test_coding_standards.py b/ckan/tests/legacy/test_coding_standards.py index 871a75d84a3..0fb255ee153 100644 --- a/ckan/tests/legacy/test_coding_standards.py +++ b/ckan/tests/legacy/test_coding_standards.py @@ -229,93 +229,31 @@ class TestImportStar(object): # import * is bad for many reasons and should be avoided. IMPORT_STAR_BLACKLIST_FILES = [ - 'ckan/migration/versions/001_add_existing_tables.py', - 'ckan/migration/versions/002_add_author_and_maintainer.py', - 'ckan/migration/versions/003_add_user_object.py', - 'ckan/migration/versions/004_add_group_object.py', - 'ckan/migration/versions/005_add_authorization_tables.py', - 'ckan/migration/versions/006_add_ratings.py', - 'ckan/migration/versions/007_add_system_roles.py', - 'ckan/migration/versions/008_update_vdm_ids.py', - 'ckan/migration/versions/009_add_creation_timestamps.py', - 'ckan/migration/versions/010_add_user_about.py', - 'ckan/migration/versions/011_add_package_search_vector.py', - 'ckan/migration/versions/012_add_resources.py', - 'ckan/migration/versions/013_add_hash.py', - 'ckan/migration/versions/014_hash_2.py', - 'ckan/migration/versions/015_remove_state_object.py', - 'ckan/migration/versions/016_uuids_everywhere.py', - 'ckan/migration/versions/017_add_pkg_relationships.py', - 'ckan/migration/versions/018_adjust_licenses.py', - 'ckan/migration/versions/019_pkg_relationships_state.py', - 'ckan/migration/versions/020_add_changeset.py', - 'ckan/migration/versions/022_add_group_extras.py', - 'ckan/migration/versions/023_add_harvesting.py', - 'ckan/migration/versions/024_add_harvested_document.py', - 'ckan/migration/versions/025_add_authorization_groups.py', - 'ckan/migration/versions/026_authorization_group_user_pk.py', - 'ckan/migration/versions/027_adjust_harvester.py', - 'ckan/migration/versions/028_drop_harvest_source_status.py', - 'ckan/migration/versions/029_version_groups.py', - 'ckan/migration/versions/030_additional_user_attributes.py', - 'ckan/migration/versions/031_move_openid_to_new_field.py', - 'ckan/migration/versions/032_add_extra_info_field_to_resources.py', - 'ckan/migration/versions/033_auth_group_user_id_add_conditional.py', - 'ckan/migration/versions/034_resource_group_table.py', - 'ckan/migration/versions/035_harvesting_doc_versioning.py', - 'ckan/migration/versions/036_lockdown_roles.py', - 'ckan/migration/versions/037_role_anon_editor.py', - 'ckan/migration/versions/038_delete_migration_tables.py', - 'ckan/migration/versions/039_add_expired_id_and_dates.py', - 'ckan/migration/versions/040_reset_key_on_user.py', - 'ckan/migration/versions/041_resource_new_fields.py', - 'ckan/migration/versions/042_user_revision_indexes.py', - 'ckan/migration/versions/043_drop_postgres_search.py', - 'ckan/migration/versions/044_add_task_status.py', - 'ckan/migration/versions/045_user_name_unique.py', - 'ckan/migration/versions/046_drop_changesets.py', - 'ckan/migration/versions/047_rename_package_group_member.py', - 'ckan/migration/versions/048_add_activity_streams_tables.py', - 'ckan/migration/versions/049_add_group_approval_status.py', - 'ckan/migration/versions/050_term_translation_table.py', - 'ckan/migration/versions/051_add_tag_vocabulary.py', - 'ckan/migration/versions/052_update_member_capacities.py', - 'ckan/migration/versions/053_add_group_logo.py', - 'ckan/migration/versions/056_add_related_table.py', - 'ckan/migration/versions/057_tracking.py', - 'ckan/migration/versions/058_add_follower_tables.py', - 'ckan/migration/versions/059_add_related_count_and_flag.py', - 'ckan/migration/versions/060_add_system_info_table.py', - 'ckan/migration/versions/061_add_follower__group_table.py', - 'ckan/migration/versions/062_add_dashboard_table.py', - 'ckan/migration/versions/063_org_changes.py', - 'ckan/migration/versions/064_add_email_last_sent_column.py', - 'ckan/migration/versions/065_add_email_notifications_preference.py', - 'ckan/plugins/__init__.py', - 'ckan/tests/legacy/functional/api/base.py', - 'ckan/tests/legacy/functional/api/test_api.py', - 'ckan/tests/legacy/functional/api/test_misc.py', - 'ckan/tests/legacy/functional/api/test_package_search.py', - 'ckan/tests/legacy/functional/api/test_resource_search.py', - 'ckan/tests/legacy/functional/api/test_revision_search.py', - 'ckan/tests/legacy/functional/test_group.py', - 'ckan/tests/legacy/functional/test_home.py', - 'ckan/tests/legacy/functional/test_package.py', - 'ckan/tests/legacy/functional/test_package_relationships.py', - 'ckan/tests/legacy/functional/test_tag.py', - 'ckan/tests/legacy/lib/test_helpers.py', - 'ckan/tests/legacy/lib/test_resource_search.py', - 'ckan/tests/legacy/lib/test_tag_search.py', - 'ckan/tests/legacy/misc/test_sync.py', - 'ckan/tests/legacy/models/test_extras.py', - 'ckan/tests/legacy/models/test_misc.py', - 'ckan/tests/legacy/models/test_package.py', - 'ckan/tests/legacy/models/test_package_relationships.py', - 'ckan/tests/legacy/models/test_purge_revision.py', - 'ckan/tests/legacy/models/test_resource.py', - 'ckan/tests/legacy/models/test_revision.py', - 'ckan/tests/legacy/models/test_user.py', - 'fabfile.py', + u'ckan/plugins/__init__.py', + u'ckan/tests/legacy/functional/api/base.py', + u'ckan/tests/legacy/functional/api/test_api.py', + u'ckan/tests/legacy/functional/api/test_misc.py', + u'ckan/tests/legacy/functional/api/test_package_search.py', + u'ckan/tests/legacy/functional/api/test_resource_search.py', + u'ckan/tests/legacy/functional/api/test_revision_search.py', + u'ckan/tests/legacy/functional/test_group.py', + u'ckan/tests/legacy/functional/test_home.py', + u'ckan/tests/legacy/functional/test_package.py', + u'ckan/tests/legacy/functional/test_package_relationships.py', + u'ckan/tests/legacy/functional/test_tag.py', + u'ckan/tests/legacy/lib/test_helpers.py', + u'ckan/tests/legacy/lib/test_resource_search.py', + u'ckan/tests/legacy/lib/test_tag_search.py', + u'ckan/tests/legacy/misc/test_sync.py', + u'ckan/tests/legacy/models/test_extras.py', + u'ckan/tests/legacy/models/test_misc.py', + u'ckan/tests/legacy/models/test_package.py', + u'ckan/tests/legacy/models/test_package_relationships.py', + u'ckan/tests/legacy/models/test_purge_revision.py', + u'ckan/tests/legacy/models/test_resource.py', + u'ckan/tests/legacy/models/test_revision.py', + u'ckan/tests/legacy/models/test_user.py', + u'fabfile.py', ] fails = {} passes = [] @@ -414,71 +352,6 @@ class TestPep8(object): 'ckan/logic/auth/update.py', 'ckan/logic/converters.py', 'ckan/logic/validators.py', - 'ckan/migration/versions/001_add_existing_tables.py', - 'ckan/migration/versions/002_add_author_and_maintainer.py', - 'ckan/migration/versions/003_add_user_object.py', - 'ckan/migration/versions/004_add_group_object.py', - 'ckan/migration/versions/005_add_authorization_tables.py', - 'ckan/migration/versions/006_add_ratings.py', - 'ckan/migration/versions/007_add_system_roles.py', - 'ckan/migration/versions/008_update_vdm_ids.py', - 'ckan/migration/versions/009_add_creation_timestamps.py', - 'ckan/migration/versions/010_add_user_about.py', - 'ckan/migration/versions/011_add_package_search_vector.py', - 'ckan/migration/versions/012_add_resources.py', - 'ckan/migration/versions/013_add_hash.py', - 'ckan/migration/versions/014_hash_2.py', - 'ckan/migration/versions/015_remove_state_object.py', - 'ckan/migration/versions/016_uuids_everywhere.py', - 'ckan/migration/versions/017_add_pkg_relationships.py', - 'ckan/migration/versions/018_adjust_licenses.py', - 'ckan/migration/versions/019_pkg_relationships_state.py', - 'ckan/migration/versions/020_add_changeset.py', - 'ckan/migration/versions/022_add_group_extras.py', - 'ckan/migration/versions/023_add_harvesting.py', - 'ckan/migration/versions/024_add_harvested_document.py', - 'ckan/migration/versions/025_add_authorization_groups.py', - 'ckan/migration/versions/026_authorization_group_user_pk.py', - 'ckan/migration/versions/027_adjust_harvester.py', - 'ckan/migration/versions/028_drop_harvest_source_status.py', - 'ckan/migration/versions/029_version_groups.py', - 'ckan/migration/versions/030_additional_user_attributes.py', - 'ckan/migration/versions/031_move_openid_to_new_field.py', - 'ckan/migration/versions/032_add_extra_info_field_to_resources.py', - 'ckan/migration/versions/033_auth_group_user_id_add_conditional.py', - 'ckan/migration/versions/034_resource_group_table.py', - 'ckan/migration/versions/035_harvesting_doc_versioning.py', - 'ckan/migration/versions/036_lockdown_roles.py', - 'ckan/migration/versions/037_role_anon_editor.py', - 'ckan/migration/versions/038_delete_migration_tables.py', - 'ckan/migration/versions/039_add_expired_id_and_dates.py', - 'ckan/migration/versions/040_reset_key_on_user.py', - 'ckan/migration/versions/041_resource_new_fields.py', - 'ckan/migration/versions/042_user_revision_indexes.py', - 'ckan/migration/versions/043_drop_postgres_search.py', - 'ckan/migration/versions/044_add_task_status.py', - 'ckan/migration/versions/045_user_name_unique.py', - 'ckan/migration/versions/046_drop_changesets.py', - 'ckan/migration/versions/047_rename_package_group_member.py', - 'ckan/migration/versions/048_add_activity_streams_tables.py', - 'ckan/migration/versions/049_add_group_approval_status.py', - 'ckan/migration/versions/050_term_translation_table.py', - 'ckan/migration/versions/051_add_tag_vocabulary.py', - 'ckan/migration/versions/052_update_member_capacities.py', - 'ckan/migration/versions/053_add_group_logo.py', - 'ckan/migration/versions/054_add_resource_created_date.py', - 'ckan/migration/versions/055_update_user_and_activity_detail.py', - 'ckan/migration/versions/056_add_related_table.py', - 'ckan/migration/versions/057_tracking.py', - 'ckan/migration/versions/058_add_follower_tables.py', - 'ckan/migration/versions/059_add_related_count_and_flag.py', - 'ckan/migration/versions/060_add_system_info_table.py', - 'ckan/migration/versions/061_add_follower__group_table.py', - 'ckan/migration/versions/062_add_dashboard_table.py', - 'ckan/migration/versions/063_org_changes.py', - 'ckan/migration/versions/064_add_email_last_sent_column.py', - 'ckan/migration/versions/065_add_email_notifications_preference.py', - 'ckan/migration/versions/067_turn_extras_to_strings.py', 'ckan/misc.py', 'ckan/model/__init__.py', 'ckan/model/activity.py', diff --git a/ckan/tests/test_coding_standards.py b/ckan/tests/test_coding_standards.py index 1c4252c046e..3bf80090219 100644 --- a/ckan/tests/test_coding_standards.py +++ b/ckan/tests/test_coding_standards.py @@ -315,89 +315,94 @@ def find_unprefixed_string_literals(filename): u'ckan/logic/schema.py', u'ckan/logic/validators.py', u'ckan/migration/manage.py', - u'ckan/migration/versions/001_add_existing_tables.py', - u'ckan/migration/versions/002_add_author_and_maintainer.py', - u'ckan/migration/versions/003_add_user_object.py', - u'ckan/migration/versions/004_add_group_object.py', - u'ckan/migration/versions/005_add_authorization_tables.py', - u'ckan/migration/versions/006_add_ratings.py', - u'ckan/migration/versions/007_add_system_roles.py', - u'ckan/migration/versions/008_update_vdm_ids.py', - u'ckan/migration/versions/009_add_creation_timestamps.py', - u'ckan/migration/versions/010_add_user_about.py', - u'ckan/migration/versions/011_add_package_search_vector.py', - u'ckan/migration/versions/012_add_resources.py', - u'ckan/migration/versions/013_add_hash.py', - u'ckan/migration/versions/014_hash_2.py', - u'ckan/migration/versions/015_remove_state_object.py', - u'ckan/migration/versions/016_uuids_everywhere.py', - u'ckan/migration/versions/017_add_pkg_relationships.py', - u'ckan/migration/versions/018_adjust_licenses.py', - u'ckan/migration/versions/019_pkg_relationships_state.py', - u'ckan/migration/versions/020_add_changeset.py', - u'ckan/migration/versions/022_add_group_extras.py', - u'ckan/migration/versions/023_add_harvesting.py', - u'ckan/migration/versions/024_add_harvested_document.py', - u'ckan/migration/versions/025_add_authorization_groups.py', - u'ckan/migration/versions/026_authorization_group_user_pk.py', - u'ckan/migration/versions/027_adjust_harvester.py', - u'ckan/migration/versions/028_drop_harvest_source_status.py', - u'ckan/migration/versions/029_version_groups.py', - u'ckan/migration/versions/030_additional_user_attributes.py', - u'ckan/migration/versions/031_move_openid_to_new_field.py', - u'ckan/migration/versions/032_add_extra_info_field_to_resources.py', - u'ckan/migration/versions/033_auth_group_user_id_add_conditional.py', - u'ckan/migration/versions/034_resource_group_table.py', - u'ckan/migration/versions/035_harvesting_doc_versioning.py', - u'ckan/migration/versions/036_lockdown_roles.py', - u'ckan/migration/versions/037_role_anon_editor.py', - u'ckan/migration/versions/038_delete_migration_tables.py', - u'ckan/migration/versions/039_add_expired_id_and_dates.py', - u'ckan/migration/versions/040_reset_key_on_user.py', - u'ckan/migration/versions/041_resource_new_fields.py', - u'ckan/migration/versions/042_user_revision_indexes.py', - u'ckan/migration/versions/043_drop_postgres_search.py', - u'ckan/migration/versions/044_add_task_status.py', - u'ckan/migration/versions/045_user_name_unique.py', - u'ckan/migration/versions/046_drop_changesets.py', - u'ckan/migration/versions/047_rename_package_group_member.py', - u'ckan/migration/versions/048_add_activity_streams_tables.py', - u'ckan/migration/versions/049_add_group_approval_status.py', - u'ckan/migration/versions/050_term_translation_table.py', - u'ckan/migration/versions/051_add_tag_vocabulary.py', - u'ckan/migration/versions/052_update_member_capacities.py', - u'ckan/migration/versions/053_add_group_logo.py', - u'ckan/migration/versions/054_add_resource_created_date.py', - u'ckan/migration/versions/055_update_user_and_activity_detail.py', - u'ckan/migration/versions/056_add_related_table.py', - u'ckan/migration/versions/057_tracking.py', - u'ckan/migration/versions/058_add_follower_tables.py', - u'ckan/migration/versions/059_add_related_count_and_flag.py', - u'ckan/migration/versions/060_add_system_info_table.py', - u'ckan/migration/versions/061_add_follower__group_table.py', - u'ckan/migration/versions/062_add_dashboard_table.py', - u'ckan/migration/versions/063_org_changes.py', - u'ckan/migration/versions/064_add_email_last_sent_column.py', - u'ckan/migration/versions/065_add_email_notifications_preference.py', - u'ckan/migration/versions/066_default_package_type.py', - u'ckan/migration/versions/067_turn_extras_to_strings.py', - u'ckan/migration/versions/068_add_package_extras_index.py', - u'ckan/migration/versions/069_resource_url_and_metadata_modified.py', - u'ckan/migration/versions/070_add_activity_and_resource_indexes.py', - u'ckan/migration/versions/071_add_state_column_to_user_table.py', - u'ckan/migration/versions/072_add_resource_view.py', - u'ckan/migration/versions/073_update_resource_view_resource_id_constraint.py', - u'ckan/migration/versions/074_remove_resource_groups.py', - u'ckan/migration/versions/075_rename_view_plugins.py', - u'ckan/migration/versions/076_rename_view_plugins_2.py', - u'ckan/migration/versions/077_add_revisions_to_system_info.py', - u'ckan/migration/versions/078_remove_old_authz_model.py', - u'ckan/migration/versions/079_resource_revision_index.py', - u'ckan/migration/versions/080_continuity_id_indexes.py', - u'ckan/migration/versions/081_set_datastore_active.py', - u'ckan/migration/versions/082_create_index_creator_user_id.py', - u'ckan/migration/versions/083_remove_related_items.py', - u'ckan/migration/versions/084_add_metadata_created.py', + u'ckan/migration/versions/001_103676e0a497_create_existing_tables.py', + u'ckan/migration/versions/002_86fdd8c54775_add_author_and_maintainer.py', + u'ckan/migration/versions/003_f22b4f5241a5_add_user_object.py', + u'ckan/migration/versions/004_f92ee205e46d_add_group_object.py', + u'ckan/migration/versions/005_12c2232c15f5_add_authorization_tables.py', + u'ckan/migration/versions/006_c83955e7acb6_add_ratings.py', + u'ckan/migration/versions/007_1928d4af1cda_add_system_roles.py', + u'ckan/migration/versions/008_e8283ffb257e_update_vdm_ids.py', + u'ckan/migration/versions/009_b739a48de5c4_add_creation_timestamps.py', + u'ckan/migration/versions/010_a6f13bf14d0c_add_user_about.py', + u'ckan/migration/versions/011_866f6370b4ac_add_package_search_vector.py', + u'ckan/migration/versions/012_e5ca33a5d445_add_resources.py', + u'ckan/migration/versions/013_8a3a5af39797_add_hash.py', + u'ckan/migration/versions/014_93519b684820_hash_2.py', + u'ckan/migration/versions/015_6d8ffebcaf54_remove_state_object.py', + u'ckan/migration/versions/016_37ada738328e_uuids_everywhere.py', + u'ckan/migration/versions/017_1250b2ff3e36_add_pkg_relationships.py', + u'ckan/migration/versions/018_05a0778051ca_adjust_licenses.py', + u'ckan/migration/versions/019_b2eb6f34a638_pkg_relationships_state.py', + u'ckan/migration/versions/020_69a0b0efc609_add_changeset.py', + u'ckan/migration/versions/021_765143af2ba3_postgresql_upgrade_sql.py', + u'ckan/migration/versions/022_7b324ca6c0dc_add_group_extras.py', + u'ckan/migration/versions/023_87fdd05f0744_add_harvesting.py', + u'ckan/migration/versions/024_12981fe12484_add_harvested_document.py', + u'ckan/migration/versions/025_b581622ad327_add_authorization_groups.py', + u'ckan/migration/versions/026_3615b25af443_authorization_group_user_pk.py', + u'ckan/migration/versions/027_11e5745c6fc9_adjust_harvester.py', + u'ckan/migration/versions/028_cdd68fe9ba21_drop_harvest_source_status.py', + u'ckan/migration/versions/029_1bfdf4240915_version_groups.py', + u'ckan/migration/versions/030_b16cbf164c8a_additional_user_attributes.py', + u'ckan/migration/versions/031_1b05245167d6_move_openid_to_new_field.py', + u'ckan/migration/versions/032_d89e0731422d_add_extra_info_field_to_resources.py', + u'ckan/migration/versions/033_6da92ef2df15_auth_group_user_id_add_conditional.py', + u'ckan/migration/versions/034_6c600693af5b_resource_group_table.py', + u'ckan/migration/versions/035_81148ccebd6c_harvesting_doc_versioning.py', + u'ckan/migration/versions/036_ecaa8b38782f_lockdown_roles.py', + u'ckan/migration/versions/037_edcf3b8c3c1b_role_anon_editor.py', + u'ckan/migration/versions/038_fd6622e3d964_delete_migration_tables.py', + u'ckan/migration/versions/039_cca459c76d45_add_expired_id_and_dates.py', + u'ckan/migration/versions/040_500a08f4818e_reset_key_on_user.py', + u'ckan/migration/versions/041_6817d4e3bdc3_resource_new_fields.py', + u'ckan/migration/versions/042_da65e2877034_user_revision_indexes.py', + u'ckan/migration/versions/043_bd38cd6502b2_drop_postgres_search.py', + u'ckan/migration/versions/044_4190eeeb8d73_add_task_status.py', + u'ckan/migration/versions/045_54e3f155d945_user_name_unique.py', + u'ckan/migration/versions/046_b69e9b80396f_drop_changesets.py', + u'ckan/migration/versions/047_883a7c406926_rename_package_group_member.py', + u'ckan/migration/versions/048_4a7011172b3f_add_activity_streams_tables.py', + u'ckan/migration/versions/049_e0c06c2177b5_add_group_approval_status.py', + u'ckan/migration/versions/050_01a6b058cb7f_term_translation_table.py', + u'ckan/migration/versions/051_a4fb0d85ced6_add_tag_vocabulary.py', + u'ckan/migration/versions/052_ba693d64c6d7_update_member_capacities.py', + u'ckan/migration/versions/053_9d051a099097_add_group_logo.py', + u'ckan/migration/versions/054_da21b38da4db_add_resource_created_date.py', + u'ckan/migration/versions/055_048f7db947bf_update_user_and_activity_detail.py', + u'ckan/migration/versions/056_11af3215ae89_add_related_table.py', + u'ckan/migration/versions/057_660a5aae527e_tracking.py', + u'ckan/migration/versions/058_bd36d1826a5d_add_follower_tables.py', + u'ckan/migration/versions/059_9291bb46f352_add_related_count_and_flag.py', + u'ckan/migration/versions/060_31ad11c518fc_add_system_info_table.py', + u'ckan/migration/versions/061_338d460bc460_add_follower_group_table.py', + u'ckan/migration/versions/062_6deb2bbab394_add_dashboard_table.py', + u'ckan/migration/versions/063_8b633852cb7a_org_changes.py', + u'ckan/migration/versions/064_4f8becd4919a_add_email_last_sent_column.py', + u'ckan/migration/versions/065_1fab0bc6439e_add_email_notifications_preference.py', + u'ckan/migration/versions/066_ad16b3bd8cb6_default_package_type.py', + u'ckan/migration/versions/067_266c110eafec_turn_extras_to_strings.py', + u'ckan/migration/versions/068_e33a5f2b2a84_add_package_extras_index.py', + u'ckan/migration/versions/069_e7524c675cdb_resource_url_and_metadata_modified.py', + u'ckan/migration/versions/070_cfb544112fa7_add_activity_and_resource_indexes.py', + u'ckan/migration/versions/071_c16f081ef73a_add_state_column_to_user_table.py', + u'ckan/migration/versions/072_08dcb9233ad7_add_resource_view.py', + u'ckan/migration/versions/073_011f51208be3_update_resource_view_resource_id_.py', + u'ckan/migration/versions/074_a4ca55f0f45e_remove_resource_groups.py', + u'ckan/migration/versions/075_9cdc88c8896a_rename_view_plugins.py', + u'ckan/migration/versions/076_59995aa965c0_rename_view_plugins_2.py', + u'ckan/migration/versions/077_51171a04d86d_add_revisions_to_system_info.py', + u'ckan/migration/versions/078_ae821876532a_remove_old_authz_model.py', + u'ckan/migration/versions/079_e0177a15d2c9_resource_revision_index.py', + u'ckan/migration/versions/080_8224d872c64f_continuity_id_indexes.py', + u'ckan/migration/versions/081_a64cf4a79182_set_datastore_active.py', + u'ckan/migration/versions/082_8ea886d0ede4_create_index_creator_user_id.py', + u'ckan/migration/versions/083_f98d8fa2a7f7_remove_related_items.py', + u'ckan/migration/versions/084_d85ce5783688_add_metadata_created.py', + u'ckan/migration/versions/085_f9bf3d5c4b4d_adjust_activity_timestamps.py', + u'ckan/migration/versions/086_19663581b3bb_drop_openid_column.py', + u'ckan/migration/versions/087_ff1b303cab77_remove_old_authorization_tables.py', + u'ckan/migration/versions/088_3ad397f70903_remove_migrate_version_table.py', u'ckan/model/__init__.py', u'ckan/model/activity.py', u'ckan/model/core.py', From 1dee1bb323f8608121c255663278775d3e2a4b70 Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Fri, 21 Sep 2018 11:29:57 +0300 Subject: [PATCH 03/33] Suggested improvements and comments --- ckan/migration/__init__.py | 14 ++++++++++++++ ckan/migration/alembic.ini | 10 +++++++++- ...88_3ad397f70903_remove_migrate_version_table.py | 13 +++++++++++++ ckan/model/__init__.py | 5 +++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/ckan/migration/__init__.py b/ckan/migration/__init__.py index 912ce6b7da9..1b0bbb92874 100644 --- a/ckan/migration/__init__.py +++ b/ckan/migration/__init__.py @@ -2,6 +2,20 @@ def skip_based_on_legacy_engine_version(op, filename): + u'''Safe way to update instances sqlalchemy-migrate migrations applied. + + CKAN `db upgrade\init` command is trying to obtain current version + of sqlalchemy-migrate migrations from database. In that case, we + are going to compare existing version from DB with alembic + migration script's prefix in filename which defines corresponding + version of sqlalchemy-migrate script. We need this, because + alembic uses string ids instead of incremental numbers for + identifying current migration version. If alembic script's version + is less than version of currently applied sqlalchemy migration, + than it just marked as applied, but no SQL queries will be + actually executed. Thus there are no difference between updating + existing portals and initializing new ones. + ''' conf = op.get_context().config version = conf.get_main_option(u'sqlalchemy_migrate_version') if version: diff --git a/ckan/migration/alembic.ini b/ckan/migration/alembic.ini index eb2da491029..23cd14af58e 100644 --- a/ckan/migration/alembic.ini +++ b/ckan/migration/alembic.ini @@ -35,7 +35,15 @@ script_location = . # are written from script.py.mako # output_encoding = utf-8 -sqlalchemy.url = postgresql://ckan_default:root@localhost/ckan_alembic +# This value does not affects CKAN commands, but developers are able +# to execute alembic commands(i.e. `alembic heads`, `alembic +# revision`) directly from this folder with line bellow. If it +# configured to correct values, migrations can even be applied(but it +# strongly discouraged - use CKAN's upgrade command instead). This +# functionality is considered as internal, so don't rely on it, +# because it may be removed in future. Use official CKAN commands +# rather than direct interactions with alembic +sqlalchemy.url = postgresql://ckan_default:pass@localhost/ckan_default # Logging configuration diff --git a/ckan/migration/versions/088_3ad397f70903_remove_migrate_version_table.py b/ckan/migration/versions/088_3ad397f70903_remove_migrate_version_table.py index 84b34cb2cc4..a4e797de891 100644 --- a/ckan/migration/versions/088_3ad397f70903_remove_migrate_version_table.py +++ b/ckan/migration/versions/088_3ad397f70903_remove_migrate_version_table.py @@ -16,8 +16,21 @@ def upgrade(): + '''Drop version table, created by sqlalchemy-migrate. + + There is a chance, that we are initializing a new instance and + there is no `migrate_version` table, so DO NOT remove `IF EXISTS` + clause. + ''' op.execute('DROP TABLE IF EXISTS migrate_version') def downgrade(): + '''We aren't going to recreate `migrate_version` here. + + There is a chance, that this table even never was created for + target database. This migration tries to seamlessly upgrade + existing instance from usage of sqlalchemy-migrate to alembic. And + we don't want to downgrade to sqlalchemy-migrate back again. + ''' pass diff --git a/ckan/model/__init__.py b/ckan/model/__init__.py index 22152b638bf..6136bf3dcb0 100644 --- a/ckan/model/__init__.py +++ b/ckan/model/__init__.py @@ -278,9 +278,14 @@ def setup_migration_version_control(self): ).scalar() except ProgrammingError: sqlalchemy_migrate_version = 0 + + # this value is used for graceful upgrade from + # sqlalchemy-migrate to alembic alembic_config.set_main_option( "sqlalchemy_migrate_version", str(sqlalchemy_migrate_version) ) + # This is an interceptor for alembic output. Otherwise, + # everything will be printed to stdout alembic_config.print_stdout = self.add_alembic_output self.alembic_config = alembic_config From a3fb862ceaae848b757da7c3aab9c00b947f7766 Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Thu, 28 Mar 2019 13:51:25 +0200 Subject: [PATCH 04/33] CLI. Implement `datapusher` command --- ckan/cli/cli.py | 6 ++- ckan/cli/datapusher.py | 101 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 ckan/cli/datapusher.py diff --git a/ckan/cli/cli.py b/ckan/cli/cli.py index 236196c88c6..e61f0429d53 100644 --- a/ckan/cli/cli.py +++ b/ckan/cli/cli.py @@ -4,7 +4,10 @@ import click -from ckan.cli import click_config_option, db, load_config, search_index, server +from ckan.cli import ( + click_config_option, db, load_config, search_index, server, + datapusher, +) from ckan.config.middleware import make_app log = logging.getLogger(__name__) @@ -28,3 +31,4 @@ def ckan(ctx, config, *args, **kwargs): ckan.add_command(server.run) ckan.add_command(db.db) ckan.add_command(search_index.search_index) +ckan.add_command(datapusher.datapusher) diff --git a/ckan/cli/datapusher.py b/ckan/cli/datapusher.py new file mode 100644 index 00000000000..65d02e79e23 --- /dev/null +++ b/ckan/cli/datapusher.py @@ -0,0 +1,101 @@ +# encoding: utf-8 + +from __future__ import print_function + +import logging + +import click + +import ckan.model as model +import ckan.plugins.toolkit as tk +import ckanext.datastore.backend as datastore_backend +from ckan.cli import error_shout + +log = logging.getLogger(__name__) + +question = ( + u"Data in any datastore resource that isn't in their source files " + u"(e.g. data added using the datastore API) will be permanently " + u"lost. Are you sure you want to proceed?" +) +requires_confirmation = click.option( + u'--yes', u'-y', is_flag=True, help=u'Always answer yes to questions' +) + + +def confirm(yes): + if yes: + return + click.confirm(question, abort=True) + + +@click.group() +def datapusher(): + u'''Perform commands in the datapusher. + ''' + + +@datapusher.command() +@requires_confirmation +def resubmit(yes): + u'''Resubmit udated datastore resources. + ''' + confirm(yes) + + resource_ids = datastore_backend.get_all_resources_ids_in_datastore() + _submit(resource_ids) + + +@datapusher.command() +@click.argument(u'package', required=False) +@requires_confirmation +def submit(package, yes): + u'''Submits resources from package. + + If no package ID/name specified, submits all resources from all + packages. + ''' + confirm(yes) + + if not package: + ids = tk.get_action(u'package_list')({ + u'model': model, + u'ignore_auth': True + }, {}) + else: + ids = [package] + + for id in ids: + package_show = tk.get_action(u'package_show') + try: + pkg = package_show({ + u'model': model, + u'ignore_auth': True + }, {u'id': id}) + except Exception as e: + error_shout(e) + error_shout(u"Package '{}' was not found".format(package)) + raise click.Abort() + if not pkg[u'resources']: + continue + resource_ids = [r[u'id'] for r in pkg[u'resources']] + _submit(resource_ids) + + +def _submit(resources): + click.echo(u'Submitting {} datastore resources'.format(len(resources))) + user = tk.get_action(u'get_site_user')({ + u'model': model, + u'ignore_auth': True + }, {}) + datapusher_submit = tk.get_action(u'datapusher_submit') + for id in resources: + click.echo(u'Submitting {}...'.format(id), nl=False) + data_dict = { + u'resource_id': id, + u'ignore_hash': True, + } + if datapusher_submit({u'user': user[u'name']}, data_dict): + click.echo(u'OK') + else: + click.echo(u'Fail') From d53bd945659cc6d6e5b30cc25e4107299278d220 Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Thu, 28 Mar 2019 14:30:09 +0200 Subject: [PATCH 05/33] CLI. Implement `dataset` command --- ckan/cli/cli.py | 6 +++- ckan/cli/dataset.py | 87 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 ckan/cli/dataset.py diff --git a/ckan/cli/cli.py b/ckan/cli/cli.py index 236196c88c6..b6950e9575a 100644 --- a/ckan/cli/cli.py +++ b/ckan/cli/cli.py @@ -4,7 +4,10 @@ import click -from ckan.cli import click_config_option, db, load_config, search_index, server +from ckan.cli import ( + click_config_option, db, load_config, search_index, server, + dataset, +) from ckan.config.middleware import make_app log = logging.getLogger(__name__) @@ -28,3 +31,4 @@ def ckan(ctx, config, *args, **kwargs): ckan.add_command(server.run) ckan.add_command(db.db) ckan.add_command(search_index.search_index) +ckan.add_command(dataset.dataset) diff --git a/ckan/cli/dataset.py b/ckan/cli/dataset.py new file mode 100644 index 00000000000..f62056a47e0 --- /dev/null +++ b/ckan/cli/dataset.py @@ -0,0 +1,87 @@ +# encoding: utf-8 + +import logging +import pprint + +import click +from six import text_type + +import ckan.logic as logic +import ckan.model as model + +log = logging.getLogger(__name__) + + +@click.group() +def dataset(): + u'''Manage datasets + ''' + + +@dataset.command() +@click.argument(u'package') +def show(package): + u'''Shows dataset properties. + ''' + dataset = _get_dataset(package) + click.echo(pprint.pformat(dataset.as_dict())) + + +@dataset.command() +def list(): + u'''Lists datasets. + ''' + click.echo(u'Datasets:') + datasets = model.Session.query(model.Package) + click.echo(u'count = %i' % datasets.count()) + for dataset in datasets: + state = ( + u'(%s)' % dataset.state + ) if dataset.state != u'active' else u'' + + click.echo( + u'%s %s %s' % + (click.style(dataset.id, bold=True), dataset.name, state) + ) + + +@dataset.command() +@click.argument(u'package') +def delete(package): + u'''Changes dataset state to 'deleted'. + ''' + dataset = _get_dataset(package) + old_state = dataset.state + + model.repo.new_revision() + dataset.delete() + model.repo.commit_and_remove() + dataset = _get_dataset(package) + click.echo( + u'%s %s -> %s' % ( + dataset.name, click.style(old_state, fg=u'red'), + click.style(dataset.state, fg=u'green') + ) + ) + + +@dataset.command() +@click.argument(u'package') +def purge(package): + u'''Removes dataset from db entirely. + ''' + dataset = _get_dataset(package) + name = dataset.name + + site_user = logic.get_action(u'get_site_user')({u'ignore_auth': True}, {}) + context = {u'user': site_user[u'name']} + logic.get_action(u'dataset_purge')(context, {u'id': package}) + click.echo(u'%s purged' % name) + + +def _get_dataset(package): + dataset = model.Package.get(text_type(package)) + assert dataset, u'Could not find dataset matching reference: {}'.format( + package + ) + return dataset From bce72d9e24410699d2307e6e8916513bbaf3d5ab Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Fri, 29 Mar 2019 14:30:26 +0200 Subject: [PATCH 06/33] CLI. Implement `datastore` command --- ckan/cli/cli.py | 7 ++- ckan/cli/datastore.py | 126 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 ckan/cli/datastore.py diff --git a/ckan/cli/cli.py b/ckan/cli/cli.py index 236196c88c6..ee129219f5b 100644 --- a/ckan/cli/cli.py +++ b/ckan/cli/cli.py @@ -4,9 +4,13 @@ import click -from ckan.cli import click_config_option, db, load_config, search_index, server +from ckan.cli import ( + click_config_option, db, load_config, search_index, server, + datastore, +) from ckan.config.middleware import make_app + log = logging.getLogger(__name__) @@ -28,3 +32,4 @@ def ckan(ctx, config, *args, **kwargs): ckan.add_command(server.run) ckan.add_command(db.db) ckan.add_command(search_index.search_index) +ckan.add_command(datastore.datastore) diff --git a/ckan/cli/datastore.py b/ckan/cli/datastore.py new file mode 100644 index 00000000000..ba0df55000e --- /dev/null +++ b/ckan/cli/datastore.py @@ -0,0 +1,126 @@ +# encoding: utf-8 + +import logging +import os +import re + +import click + +from ckan.cli import error_shout +from ckan.common import config + +import ckanext.datastore as datastore_module +from ckanext.datastore.backend.postgres import identifier +from ckanext.datastore.controller import DUMP_FORMATS, dump_to + +log = logging.getLogger(__name__) + + +@click.group() +def datastore(): + u'''Perform commands to set up the datastore. + ''' + + +@datastore.command( + u'set-permissions', + short_help=u'Generate SQL for permission configuration.' +) +def set_permissions(): + u'''Emit an SQL script that will set the permissions for the datastore + users as configured in your configuration file.''' + + write_url = parse_db_config(u'ckan.datastore.write_url') + read_url = parse_db_config(u'ckan.datastore.read_url') + db_url = parse_db_config(u'sqlalchemy.url') + + # Basic validation that read and write URLs reference the same database. + # This obviously doesn't check they're the same database (the hosts/ports + # could be different), but it's better than nothing, I guess. + + if write_url[u'db_name'] != read_url[u'db_name']: + click.secho( + u'The datastore write_url and read_url must refer to the same ' + u'database!', + fg=u'red', + bold=True + ) + raise click.Abort() + + sql = permissions_sql( + maindb=db_url[u'db_name'], + datastoredb=write_url[u'db_name'], + mainuser=db_url[u'db_user'], + writeuser=write_url[u'db_user'], + readuser=read_url[u'db_user'] + ) + + click.echo(sql) + + +def permissions_sql(maindb, datastoredb, mainuser, writeuser, readuser): + template_filename = os.path.join( + os.path.dirname(datastore_module.__file__), u'set_permissions.sql' + ) + with open(template_filename) as fp: + template = fp.read() + return template.format( + maindb=identifier(maindb), + datastoredb=identifier(datastoredb), + mainuser=identifier(mainuser), + writeuser=identifier(writeuser), + readuser=identifier(readuser) + ) + + +@datastore.command() +@click.argument(u'resource-id', nargs=1) +@click.argument( + u'output-file', + type=click.File(u'wb'), + default=click.get_binary_stream(u'stdout') +) +@click.option(u'--format', default=u'csv', type=click.Choice(DUMP_FORMATS)) +@click.option(u'--offset', type=click.IntRange(0, None), default=0) +@click.option(u'--limit', type=click.IntRange(0)) +@click.option(u'--bom', is_flag=True) # FIXME: options based on format +@click.pass_context +def dump(ctx, resource_id, output_file, format, offset, limit, bom): + u'''Dump a datastore resource. + ''' + flask_app = ctx.obj.app.apps[u'flask_app']._wsgi_app + with flask_app.test_request_context(): + dump_to( + resource_id, + output_file, + fmt=format, + offset=offset, + limit=limit, + options={u'bom': bom}, + sort=u'_id', + search_params={} + ) + + +def parse_db_config(config_key=u'sqlalchemy.url'): + u''' Takes a config key for a database connection url and parses it into + a dictionary. Expects a url like: + + 'postgres://tester:pass@localhost/ckantest3' + ''' + url = config[config_key] + regex = [ + u'^\\s*(?P\\w*)', u'://', u'(?P[^:]*)', u':?', + u'(?P[^@]*)', u'@', u'(?P[^/:]*)', u':?', + u'(?P[^/]*)', u'/', u'(?P[\\w.-]*)' + ] + db_details_match = re.match(''.join(regex), url) + if not db_details_match: + click.secho( + u'Could not extract db details from url: %r' % url, + fg=u'red', + bold=True + ) + raise click.Abort() + db_details = db_details_match.groupdict() + return db_details From 2cd903c43f0ad87a089b101b0de5158cac6fa979 Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Tue, 2 Apr 2019 12:43:11 +0300 Subject: [PATCH 07/33] Fix literals --- ckan/cli/datastore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ckan/cli/datastore.py b/ckan/cli/datastore.py index ba0df55000e..276f4ab7cd0 100644 --- a/ckan/cli/datastore.py +++ b/ckan/cli/datastore.py @@ -114,7 +114,7 @@ def parse_db_config(config_key=u'sqlalchemy.url'): u'(?P[^@]*)', u'@', u'(?P[^/:]*)', u':?', u'(?P[^/]*)', u'/', u'(?P[\\w.-]*)' ] - db_details_match = re.match(''.join(regex), url) + db_details_match = re.match(u''.join(regex), url) if not db_details_match: click.secho( u'Could not extract db details from url: %r' % url, From 31202ac967b750204409fd7fe66648a77d553023 Mon Sep 17 00:00:00 2001 From: amercader Date: Fri, 26 Apr 2019 15:48:38 +0200 Subject: [PATCH 08/33] [#4747] Pin pastescript to avoid requirements conflict Latest versions require Paste>=3.0 which is not compatible with our pinned version. The upgrade in PasteDeploy should be all right as there are only changes in documentation between the two versions AFAICT --- requirements.in | 1 + requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/requirements.in b/requirements.in index a471c9623e7..df97b5b6bff 100644 --- a/requirements.in +++ b/requirements.in @@ -12,6 +12,7 @@ ofs==0.4.2 Pairtree==0.7.1-T passlib==1.6.5 paste==1.7.5.1 +PasteScript==2.0.2 polib==1.0.7 psycopg2==2.7.3.2 python-magic==0.4.15 diff --git a/requirements.txt b/requirements.txt index f9c38940f4e..1f1ab74b63b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,8 +28,8 @@ ofs==0.4.2 pairtree==0.7.1-t passlib==1.6.5 paste==1.7.5.1 -pastedeploy==1.5.2 # via pastescript, pylons -pastescript==2.0.2 # via pylons +pastedeploy==2.0.1 # via pastescript, pylons +pastescript==2.0.2 pbr==5.1.3 # via sqlalchemy-migrate polib==1.0.7 psycopg2==2.7.3.2 From e26895608412d19d83f1522a72983433417ff96e Mon Sep 17 00:00:00 2001 From: amercader Date: Fri, 26 Apr 2019 15:51:59 +0200 Subject: [PATCH 09/33] Upgrade requirements These all look fine. The major change I see is redis but as rq is the only one using it and it comes from them I assume everything will work fine. --- requirements.txt | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1f1ab74b63b..500e28c0f6d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,23 +6,23 @@ # argparse==1.4.0 # via ofs babel==2.3.4 -beaker==1.10.0 # via pylons +beaker==1.10.1 # via pylons bleach==3.0.2 -certifi==2018.10.15 # via requests +certifi==2019.3.9 # via requests chardet==3.0.4 # via requests click==6.7 -decorator==4.3.0 # via pylons, sqlalchemy-migrate +decorator==4.4.0 # via pylons, sqlalchemy-migrate fanstatic==0.12 flask-babel==0.11.2 flask==0.12.4 formencode==1.3.1 # via pylons funcsigs==1.0.2 # via beaker -idna==2.7 # via requests -itsdangerous==0.24 # via flask +idna==2.8 # via requests +itsdangerous==1.1.0 # via flask jinja2==2.10.1 -mako==1.0.7 # via pylons +mako==1.0.9 # via pylons markdown==2.6.7 -markupsafe==1.0 # via jinja2, mako, webhelpers +markupsafe==1.1.1 # via jinja2, mako, webhelpers nose==1.3.7 # via pylons ofs==0.4.2 pairtree==0.7.1-t @@ -33,14 +33,14 @@ pastescript==2.0.2 pbr==5.1.3 # via sqlalchemy-migrate polib==1.0.7 psycopg2==2.7.3.2 -pygments==2.2.0 # via weberror +pygments==2.3.1 # via weberror pylons==0.9.7 pysolr==3.6.0 -python-dateutil==2.7.3 +python-dateutil==2.8.0 python-magic==0.4.15 pytz==2016.7 pyutilib.component.core==4.6.4 -redis==2.10.6 # via rq +redis==3.2.1 # via rq repoze.lru==0.7 # via routes repoze.who-friendlyform==1.0.8 repoze.who==2.3 @@ -48,19 +48,19 @@ requests==2.21.0 routes==1.13 rq==0.6.0 simplejson==3.10.0 -six==1.11.0 # via bleach, pastescript, python-dateutil, pyutilib.component.core, sqlalchemy-migrate +six==1.12.0 # via bleach, pastescript, python-dateutil, pyutilib.component.core, sqlalchemy-migrate sqlalchemy-migrate==0.12.0 sqlalchemy==1.1.11 sqlparse==0.2.2 tempita==0.5.2 # via pylons, sqlalchemy-migrate, weberror tzlocal==1.3 unicodecsv==0.14.1 -urllib3==1.24 # via requests +urllib3==1.24.2 # via requests vdm==0.14 webencodings==0.5.1 # via bleach weberror==0.13.1 # via pylons webhelpers==1.3 webob==1.0.8 webtest==1.4.3 -werkzeug==0.14.1 # via flask +werkzeug==0.15.2 # via flask zope.interface==4.3.2 From 4de1ad8cdcd303e437d14008005d83df680609fd Mon Sep 17 00:00:00 2001 From: amercader Date: Mon, 29 Apr 2019 12:56:22 +0200 Subject: [PATCH 10/33] [#4747] Pin Werkzeug After upgrading Werkzeug to 0.15.2 we got the following failures: AssertionError: Environmental variable PATH_INFO is not a string: (value: u'/ckan-admin/reset_config') This is webtest complaining that the test request environ used in some functional tests has a unicode value for environ['PATH_INFO']. Modern versions of WebTest ensure that the url passed is a string, but sadly the version we are stuck with only does so for GET requests (We are stuck with this version of WebTest because newer versions have a higher WebOb requirement which conflicts with our Pylons requirement). We could ensure on our side that the urls provided to webtest are strings but that would involve either 1. Change all app.post() calls in tests to app.post(str(url)) 2. Change url_for itself to always return a sting, which obviously is not a great solution. Having Werkzeug pinned is not ideal though so we either find a workaround or speed Pylons removal (allowing us to upgrade webob/webtest) --- requirements.in | 1 + requirements.txt | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/requirements.in b/requirements.in index df97b5b6bff..6d36f6b74e8 100644 --- a/requirements.in +++ b/requirements.in @@ -36,4 +36,5 @@ vdm==0.14 WebHelpers==1.3 WebOb==1.0.8 WebTest==1.4.3 # need to pin this so that Pylons does not install a newer version that conflicts with WebOb==1.0.8 +werkzeug==0.14.1 zope.interface==4.3.2 diff --git a/requirements.txt b/requirements.txt index 500e28c0f6d..e9539feb541 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,7 +30,7 @@ passlib==1.6.5 paste==1.7.5.1 pastedeploy==2.0.1 # via pastescript, pylons pastescript==2.0.2 -pbr==5.1.3 # via sqlalchemy-migrate +pbr==5.2.0 # via sqlalchemy-migrate polib==1.0.7 psycopg2==2.7.3.2 pygments==2.3.1 # via weberror @@ -62,5 +62,5 @@ weberror==0.13.1 # via pylons webhelpers==1.3 webob==1.0.8 webtest==1.4.3 -werkzeug==0.15.2 # via flask +werkzeug==0.14.1 zope.interface==4.3.2 From b7ebf541129697aeef3765e0f52249eac77cd9bb Mon Sep 17 00:00:00 2001 From: amercader Date: Tue, 30 Apr 2019 10:53:08 +0200 Subject: [PATCH 11/33] [#4747] Upgrade RQ Upgrading redis to 3.x caused errors because of an old RQ version. Rather than pinning an old version of redis, upgrade RQ. I went through the list of backwards incompatible changes and didn't see anything relevant (There's mention of renaming the `timeout` to `job_timeout` parameter but that's on `enqueue`, and we use `enqueu_call`) --- requirements.in | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.in b/requirements.in index 6d36f6b74e8..975138c26f1 100644 --- a/requirements.in +++ b/requirements.in @@ -25,7 +25,7 @@ repoze.who-friendlyform==1.0.8 repoze.who==2.3 requests==2.21.0 Routes==1.13 -rq==0.6.0 +rq==1.0 simplejson==3.10.0 sqlalchemy-migrate==0.12.0 SQLAlchemy==1.1.11 diff --git a/requirements.txt b/requirements.txt index e9539feb541..a1e4ca37a31 100644 --- a/requirements.txt +++ b/requirements.txt @@ -46,7 +46,7 @@ repoze.who-friendlyform==1.0.8 repoze.who==2.3 requests==2.21.0 routes==1.13 -rq==0.6.0 +rq==1.0 simplejson==3.10.0 six==1.12.0 # via bleach, pastescript, python-dateutil, pyutilib.component.core, sqlalchemy-migrate sqlalchemy-migrate==0.12.0 From 7bce39e399776489c71baa5e04381916b2c1f129 Mon Sep 17 00:00:00 2001 From: Alex Harding Date: Wed, 1 May 2019 15:53:35 -0400 Subject: [PATCH 12/33] Updating .items() calls to provide multi=True for use with tags coming from requests --- ckan/lib/helpers.py | 8 ++++---- ckan/views/dataset.py | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/ckan/lib/helpers.py b/ckan/lib/helpers.py index e11dfdd9134..ac3ef90d969 100644 --- a/ckan/lib/helpers.py +++ b/ckan/lib/helpers.py @@ -1009,7 +1009,7 @@ def get_facet_items_dict( for facet_item in search_facets.get(facet)['items']: if not len(facet_item['name'].strip()): continue - if not (facet, facet_item['name']) in request.params.items(): + if not (facet, facet_item['name']) in request.params.items(multi=True): facets.append(dict(active=False, **facet_item)) elif not exclude_active: facets.append(dict(active=True, **facet_item)) @@ -1045,7 +1045,7 @@ def has_more_facets(facet, search_facets, limit=None, exclude_active=False): for facet_item in search_facets.get(facet)['items']: if not len(facet_item['name'].strip()): continue - if not (facet, facet_item['name']) in request.params.items(): + if not (facet, facet_item['name']) in request.params.items(multi=True): facets.append(dict(active=False, **facet_item)) elif not exclude_active: facets.append(dict(active=True, **facet_item)) @@ -1833,7 +1833,7 @@ def add_url_param(alternative_url=None, controller=None, action=None, instead. ''' - params_nopage = [(k, v) for k, v in request.params.items() if k != 'page'] + params_nopage = [(k, v) for k, v in request.params.items(multi=True) if k != 'page'] params = set(params_nopage) if new_params: params |= set(new_params.items()) @@ -1868,7 +1868,7 @@ def remove_url_param(key, value=None, replace=None, controller=None, else: keys = key - params_nopage = [(k, v) for k, v in request.params.items() if k != 'page'] + params_nopage = [(k, v) for k, v in request.params.items(multi=True) if k != 'page'] params = list(params_nopage) if value: params.remove((keys[0], value)) diff --git a/ckan/views/dataset.py b/ckan/views/dataset.py index 7af0d49cd53..b0ccd42d8b5 100644 --- a/ckan/views/dataset.py +++ b/ckan/views/dataset.py @@ -209,7 +209,7 @@ def search(package_type): extra_vars[u'fields_grouped'] = fields_grouped = {} search_extras = {} fq = u'' - for (param, value) in request.args.items(): + for (param, value) in request.args.items(multi=True): if param not in [u'q', u'page', u'sort'] \ and len(value) and not param.startswith(u'_'): if not param.startswith(u'ext_'): @@ -297,7 +297,6 @@ def search(package_type): ) extra_vars[u'search_facets'] = query[u'search_facets'] extra_vars[u'page'].items = query[u'results'] - except SearchQueryError as se: # User's search parameters are invalid, in such a way that is not # achievable with the web interface, so return a proper error to @@ -319,7 +318,6 @@ def search(package_type): # FIXME: try to avoid using global variables g.search_facets_limits = {} - for facet in extra_vars[u'search_facets'].keys(): try: limit = int( From a2eba8479c938802d1630036e0f26895b48e6f0b Mon Sep 17 00:00:00 2001 From: Alex Harding Date: Thu, 2 May 2019 12:12:10 -0400 Subject: [PATCH 13/33] Breaking up line to avoid line length issue in Pep8 --- ckan/lib/helpers.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ckan/lib/helpers.py b/ckan/lib/helpers.py index ac3ef90d969..931ce5d5bc0 100644 --- a/ckan/lib/helpers.py +++ b/ckan/lib/helpers.py @@ -1833,7 +1833,10 @@ def add_url_param(alternative_url=None, controller=None, action=None, instead. ''' - params_nopage = [(k, v) for k, v in request.params.items(multi=True) if k != 'page'] + params_nopage = [ + (k, v)for k, v in request.params.items(multi=True) + if k != 'page' + ] params = set(params_nopage) if new_params: params |= set(new_params.items()) @@ -1868,7 +1871,10 @@ def remove_url_param(key, value=None, replace=None, controller=None, else: keys = key - params_nopage = [(k, v) for k, v in request.params.items(multi=True) if k != 'page'] + params_nopage = [ + (k, v) for k, v in request.params.items(multi=True) + if k != 'page' + ] params = list(params_nopage) if value: params.remove((keys[0], value)) From 624edf934d27a7a98a821361beccd414e642b93e Mon Sep 17 00:00:00 2001 From: Alex Harding Date: Thu, 2 May 2019 12:23:47 -0400 Subject: [PATCH 14/33] Fixing trailing spaces --- ckan/lib/helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ckan/lib/helpers.py b/ckan/lib/helpers.py index 931ce5d5bc0..27af0df6325 100644 --- a/ckan/lib/helpers.py +++ b/ckan/lib/helpers.py @@ -1834,7 +1834,7 @@ def add_url_param(alternative_url=None, controller=None, action=None, ''' params_nopage = [ - (k, v)for k, v in request.params.items(multi=True) + (k, v)for k, v in request.params.items(multi=True) if k != 'page' ] params = set(params_nopage) @@ -1873,7 +1873,7 @@ def remove_url_param(key, value=None, replace=None, controller=None, params_nopage = [ (k, v) for k, v in request.params.items(multi=True) - if k != 'page' + if k != 'page' ] params = list(params_nopage) if value: From e1eee9a05310d616f476bc1ee41c41f37f7a57ab Mon Sep 17 00:00:00 2001 From: David Read Date: Fri, 3 May 2019 12:43:20 +0100 Subject: [PATCH 15/33] No need to print migration message on fresh ckan install (eg travis) --- .../089_package_activity_migration_check.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/ckan/migration/versions/089_package_activity_migration_check.py b/ckan/migration/versions/089_package_activity_migration_check.py index 01757ad9b46..aed0a797e61 100644 --- a/ckan/migration/versions/089_package_activity_migration_check.py +++ b/ckan/migration/versions/089_package_activity_migration_check.py @@ -16,17 +16,23 @@ def upgrade(migrate_engine): should run the package activity migration, so that the Activity Stream can display the detailed history of datasets: - python migrate_package_activity.py -c /etc/ckan/production.ini + python migrate_package_activity.py -c /etc/ckan/production.ini Once you've done that, the detailed history is visible in Activity Stream to *admins only*. However you are encouraged to make it available to the public, by setting this in production.ini: - ckan.auth.public_activity_stream_detail = true + ckan.auth.public_activity_stream_detail = true More information about all of this is here: https://github.com/ckan/ckan/wiki/Migrate-package-activity '''.format(num_unmigrated=num_unmigrated_dataset_activities)) else: - print(u'You have no unmigrated package activities - you do not need to' - 'run migrate_package_activity.py.') + # there are no unmigrated package activities + are_any_datasets = bool( + migrate_engine.execute(u'SELECT id FROM PACKAGE LIMIT 1').rowcount) + # no need to tell the user if there are no datasets - this could just + # be a fresh CKAN install + if are_any_datasets: + print(u'You have no unmigrated package activities - you do not ' + 'need to run migrate_package_activity.py.') From f56f5e68aaabea4e66b2a2fb0b5de887f312decd Mon Sep 17 00:00:00 2001 From: David Read Date: Fri, 3 May 2019 20:14:11 +0100 Subject: [PATCH 16/33] Overhaul CKAN extension Travis template * add tests for multiple CKAN versions * add fix for psycopg2 error with CKAN<2.8 * add correct setuptools version for CKAN==2.7 * `--allow-all-external` option was deprecated and removed in pip 10 * SOLR's config sed command is moved, to travis-build.bash, with the other setup, and in line with ckanext-dcat * flake8's simple checks for syntax is moved from a travis job to travis-run.sh, because it runs in 0.5s, but setting up the VM for the job takes 30-60s, so might as well just run it at the start of the test jobs. The point is to fail fast. This requires the addition of 'set -ex' in the . * add strict flake8 linting - this is perhaps a matter of taste, but as a practice it's more popular than ever now, and it's always easiest to do it from the beginning of an extension's life. --- .../template/+dot+travis.yml_tmpl | 42 ++++++++++++++++--- .../template/bin/travis-build.bash_tmpl | 34 ++++++++++++--- .../template/bin/travis-run.sh_tmpl | 9 ++-- .../template/dev-requirements.txt_tmpl | 1 + 4 files changed, 71 insertions(+), 15 deletions(-) diff --git a/ckan/pastertemplates/template/+dot+travis.yml_tmpl b/ckan/pastertemplates/template/+dot+travis.yml_tmpl index a05c2992369..7d9dad1e2f6 100644 --- a/ckan/pastertemplates/template/+dot+travis.yml_tmpl +++ b/ckan/pastertemplates/template/+dot+travis.yml_tmpl @@ -1,14 +1,44 @@ language: python sudo: required + +# use an older trusty image, because the newer images cause build errors with +# psycopg2 that comes with CKAN<2.8: +#  "Error: could not determine PostgreSQL version from '10.1'" +# see https://github.com/travis-ci/travis-ci/issues/8897 +dist: trusty +group: deprecated-2017Q4 + +# matrix python: - - "2.7" + - 2.7 +env: + - CKANVERSION=master + - CKANVERSION=2.7 + - CKANVERSION=2.8 + +# tests services: - - postgresql - - redis-server + - postgresql + - redis-server install: - - bash bin/travis-build.bash - - pip install coveralls + - bash bin/travis-build.bash + - pip install coveralls script: sh bin/travis-run.sh after_success: - - coveralls + - coveralls +# additional jobs +matrix: + include: + - name: "Flake8 on Python 3.7" + dist: xenial # required for Python 3.7 + cache: pip + install: pip install flake8 + script: + - flake8 --version + - flake8 . --count --max-complexity=10 --max-line-length=127 --statistics --exclude ckan,{{ project }} + python: 3.7 + # overwrite matrix + env: + - FLAKE8=true + - CKANVERSION=master diff --git a/ckan/pastertemplates/template/bin/travis-build.bash_tmpl b/ckan/pastertemplates/template/bin/travis-build.bash_tmpl index ae36e7313ad..55fa2dbc896 100755 --- a/ckan/pastertemplates/template/bin/travis-build.bash_tmpl +++ b/ckan/pastertemplates/template/bin/travis-build.bash_tmpl @@ -10,22 +10,44 @@ sudo apt-get install solr-jetty echo "Installing CKAN and its Python dependencies..." git clone https://github.com/ckan/ckan cd ckan -export latest_ckan_release_branch=`git branch --all | grep remotes/origin/release-v | sort -r | sed 's/remotes\/origin\///g' | head -n 1` -echo "CKAN branch: $latest_ckan_release_branch" -git checkout $latest_ckan_release_branch +if [ $CKANVERSION == 'master' ] +then + echo "CKAN version: master" +else + CKAN_TAG=$(git tag | grep ^ckan-$CKANVERSION | sort --version-sort | tail -n 1) + git checkout $CKAN_TAG + echo "CKAN version: ${CKAN_TAG#ckan-}" +fi + +# install the recommended version of setuptools +if [ -f requirement-setuptools.txt ] +then + echo "Updating setuptools..." + pip install -r requirement-setuptools.txt +fi + +if [ $CKANVERSION == '2.7' ] +then + echo "Installing setuptools" + pip install setuptools==39.0.1 +fi + python setup.py develop -pip install -r requirements.txt --allow-all-external -pip install -r dev-requirements.txt --allow-all-external +pip install -r requirements.txt +pip install -r dev-requirements.txt cd - echo "Creating the PostgreSQL user and database..." sudo -u postgres psql -c "CREATE USER ckan_default WITH PASSWORD 'pass';" sudo -u postgres psql -c 'CREATE DATABASE ckan_test WITH OWNER ckan_default;' -echo "SOLR config..." +echo "Setting up Solr..." # Solr is multicore for tests on ckan master, but it's easier to run tests on # Travis single-core. See https://github.com/ckan/ckan/issues/2972 sed -i -e 's/solr_url.*/solr_url = http:\/\/127.0.0.1:8983\/solr/' ckan/test-core.ini +printf "NO_START=0\nJETTY_HOST=127.0.0.1\nJETTY_PORT=8983\nJAVA_HOME=$JAVA_HOME" | sudo tee /etc/default/jetty +sudo cp ckan/ckan/config/solr/schema.xml /etc/solr/conf/schema.xml +sudo service jetty restart echo "Initialising the database..." cd ckan diff --git a/ckan/pastertemplates/template/bin/travis-run.sh_tmpl b/ckan/pastertemplates/template/bin/travis-run.sh_tmpl index b737690eeb5..56e9548c07d 100755 --- a/ckan/pastertemplates/template/bin/travis-run.sh_tmpl +++ b/ckan/pastertemplates/template/bin/travis-run.sh_tmpl @@ -1,8 +1,9 @@ #!/bin/sh -e +set -ex -echo "NO_START=0\nJETTY_HOST=127.0.0.1\nJETTY_PORT=8983\nJAVA_HOME=$JAVA_HOME" | sudo tee /etc/default/jetty -sudo cp ckan/ckan/config/solr/schema.xml /etc/solr/conf/schema.xml -sudo service jetty restart +flake8 --version +# stop the build if there are Python syntax errors or undefined names +flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics --exclude ckan,{{ project }} nosetests --ckan \ --nologcapture \ @@ -13,3 +14,5 @@ nosetests --ckan \ --cover-erase \ --cover-tests +# strict linting +flake8 . --count --max-complexity=10 --max-line-length=127 --statistics --exclude ckan,{{ project }} diff --git a/ckan/pastertemplates/template/dev-requirements.txt_tmpl b/ckan/pastertemplates/template/dev-requirements.txt_tmpl index e69de29bb2d..66cb8c06c14 100644 --- a/ckan/pastertemplates/template/dev-requirements.txt_tmpl +++ b/ckan/pastertemplates/template/dev-requirements.txt_tmpl @@ -0,0 +1 @@ +flake8 # for the travis build From bcd17efb6aade5fe2ae82c7b172e94a8464687c2 Mon Sep 17 00:00:00 2001 From: Jinil Lee Date: Sat, 4 May 2019 09:43:17 +0900 Subject: [PATCH 17/33] internal server error occurs when admin deletes its own account --- ckan/views/user.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ckan/views/user.py b/ckan/views/user.py index c2715e5b402..70ff8acd667 100644 --- a/ckan/views/user.py +++ b/ckan/views/user.py @@ -425,8 +425,12 @@ def delete(id): except logic.NotAuthorized: msg = _(u'Unauthorized to delete user with id "{user_id}".') base.abort(403, msg.format(user_id=id)) - user_index = h.url_for(u'user.index') - return h.redirect_to(user_index) + + if g.userobj.id == id: + return logout() + else: + user_index = h.url_for(u'user.index') + return h.redirect_to(user_index) def generate_apikey(id=None): From 12a5ae432f527b050d735e8e5ca7731b2abb4bf3 Mon Sep 17 00:00:00 2001 From: David Read Date: Sat, 4 May 2019 22:21:49 +0100 Subject: [PATCH 18/33] Replace "httpretty" with "responses" --- ckanext/datapusher/tests/test.py | 61 +++++---------------- ckanext/datapusher/tests/test_interfaces.py | 14 ++--- ckanext/resourceproxy/tests/test_proxy.py | 34 ++++++------ dev-requirements.txt | 2 +- 4 files changed, 35 insertions(+), 76 deletions(-) diff --git a/ckanext/datapusher/tests/test.py b/ckanext/datapusher/tests/test.py index b3caaa739a0..3bc2bf69dd2 100644 --- a/ckanext/datapusher/tests/test.py +++ b/ckanext/datapusher/tests/test.py @@ -9,49 +9,13 @@ import ckan.tests.legacy as tests from ckan.tests import helpers import ckanext.datastore.backend.postgres as db -import httpretty -import httpretty.core +import responses import nose import sqlalchemy.orm as orm from ckan.common import config from ckanext.datastore.tests.helpers import rebuild_all_dbs, set_url_type -class HTTPrettyFix(httpretty.core.fakesock.socket): - """ - Monkey-patches HTTPretty with a fix originally suggested in PR #161 - from 2014 (still open). - - Versions of httpretty < 0.8.10 use a bufsize of 16 *bytes*, and - an infinite timeout. This makes httpretty unbelievably slow, and because - the httpretty decorator monkey patches *all* requests (like solr), - the performance impact is massive. - - While this is fixed in versions >= 0.8.10, newer versions of HTTPretty - break SOLR and other database wrappers (See #265). - """ - def __init__(self, *args, **kwargs): - super(HTTPrettyFix, self).__init__(*args, **kwargs) - self._bufsize = 4096 - - original_socket = self.truesock - self.truesock.settimeout(3) - - # We also patch the "real" socket itself to prevent HTTPretty - # from changing it to infinite which it tries to do in real_sendall. - class SetTimeoutPatch(object): - def settimeout(self, *args, **kwargs): - pass - - def __getattr__(self, attr): - return getattr(original_socket, attr) - - self.truesock = SetTimeoutPatch() - - -httpretty.core.fakesock.socket = HTTPrettyFix - - class TestDatastoreCreate(): sysadmin_user = None normal_user = None @@ -95,14 +59,15 @@ def test_create_ckan_resource_in_package(self): self.app, 'resource_show', id=res_dict['result']['resource_id']) assert res['url'].endswith('/datastore/dump/' + res['id']), res - @httpretty.activate + @responses.activate def test_providing_res_with_url_calls_datapusher_correctly(self): config['datapusher.url'] = 'http://datapusher.ckan.org' - httpretty.HTTPretty.register_uri( - httpretty.HTTPretty.POST, + responses.add( + responses.POST, 'http://datapusher.ckan.org/job', content_type='application/json', body=json.dumps({'job_id': 'foo', 'job_key': 'bar'})) + responses.add_passthru(config['solr_url']) package = model.Package.get('annakarenina') @@ -115,17 +80,17 @@ def test_providing_res_with_url_calls_datapusher_correctly(self): assert len(package.resources) == 4, len(package.resources) resource = package.resources[3] - data = json.loads(httpretty.last_request().body) + data = json.loads(responses.calls[-1].request.body) assert data['metadata']['resource_id'] == resource.id, data assert not data['metadata'].get('ignore_hash'), data assert data['result_url'].endswith('/action/datapusher_hook'), data assert data['result_url'].startswith('http://'), data - @httpretty.activate + @responses.activate def test_pass_the_received_ignore_hash_param_to_the_datapusher(self): config['datapusher.url'] = 'http://datapusher.ckan.org' - httpretty.HTTPretty.register_uri( - httpretty.HTTPretty.POST, + responses.add( + responses.POST, 'http://datapusher.ckan.org/job', content_type='application/json', body=json.dumps({'job_id': 'foo', 'job_key': 'bar'})) @@ -139,7 +104,7 @@ def test_pass_the_received_ignore_hash_param_to_the_datapusher(self): ignore_hash=True ) - data = json.loads(httpretty.last_request().body) + data = json.loads(responses.calls[-1].request.body) assert data['metadata']['ignore_hash'], data def test_cant_provide_resource_and_resource_id(self): @@ -157,10 +122,10 @@ def test_cant_provide_resource_and_resource_id(self): assert res_dict['error']['__type'] == 'Validation Error' - @httpretty.activate + @responses.activate def test_send_datapusher_creates_task(self): - httpretty.HTTPretty.register_uri( - httpretty.HTTPretty.POST, + responses.add( + responses.POST, 'http://datapusher.ckan.org/job', content_type='application/json', body=json.dumps({'job_id': 'foo', 'job_key': 'bar'})) diff --git a/ckanext/datapusher/tests/test_interfaces.py b/ckanext/datapusher/tests/test_interfaces.py index afb7007c57c..17084aa7d0e 100644 --- a/ckanext/datapusher/tests/test_interfaces.py +++ b/ckanext/datapusher/tests/test_interfaces.py @@ -1,7 +1,7 @@ # encoding: utf-8 import json -import httpretty +import responses import nose import sys import datetime @@ -20,12 +20,6 @@ from ckanext.datastore.tests.helpers import rebuild_all_dbs -# avoid hanging tests https://github.com/gabrielfalcao/HTTPretty/issues/34 -if sys.version_info < (2, 7, 0): - import socket - socket.setdefaulttimeout(1) - - class FakeDataPusherPlugin(p.SingletonPlugin): p.implements(p.IConfigurable, inherit=True) p.implements(interfaces.IDataPusher, inherit=True) @@ -69,11 +63,11 @@ def teardown_class(cls): p.unload('datapusher') p.unload('test_datapusher_plugin') - @httpretty.activate + @responses.activate @raises(p.toolkit.ObjectNotFound) def test_send_datapusher_creates_task(self): - httpretty.HTTPretty.register_uri( - httpretty.HTTPretty.POST, + responses.add( + responses.POST, 'http://datapusher.ckan.org/job', content_type='application/json', body=json.dumps({'job_id': 'foo', 'job_key': 'bar'})) diff --git a/ckanext/resourceproxy/tests/test_proxy.py b/ckanext/resourceproxy/tests/test_proxy.py index 386e4245276..2d062433a54 100644 --- a/ckanext/resourceproxy/tests/test_proxy.py +++ b/ckanext/resourceproxy/tests/test_proxy.py @@ -3,7 +3,8 @@ import requests import unittest import json -import httpretty +import responses +import six from ckan.tests.helpers import _get_test_app from ckan.common import config @@ -68,15 +69,13 @@ def setUp(self): self.url = 'http://www.ckan.org/static/example.json' self.data_dict = set_resource_url(self.url) - def register(self, *args, **kwargs): - httpretty.HTTPretty.register_uri(httpretty.HTTPretty.GET, *args, - **kwargs) - httpretty.HTTPretty.register_uri(httpretty.HTTPretty.HEAD, *args, - **kwargs) + def mock_out_urls(self, *args, **kwargs): + responses.add(responses.GET, *args, **kwargs) + responses.add(responses.HEAD, *args, **kwargs) - @httpretty.activate + @responses.activate def test_resource_proxy_on_200(self): - self.register( + self.mock_out_urls( self.url, content_type='application/json', body=JSON_STRING) @@ -86,9 +85,9 @@ def test_resource_proxy_on_200(self): assert result.status_code == 200, result.status_code assert "yes, I'm proxied" in result.content, result.content - @httpretty.activate + @responses.activate def test_resource_proxy_on_404(self): - self.register( + self.mock_out_urls( self.url, body="I'm not here", content_type='application/json', @@ -105,12 +104,12 @@ def test_resource_proxy_on_404(self): assert result.status_int == 409, result.status assert '404' in result.body - @httpretty.activate + @responses.activate def test_large_file(self): cl = controller.MAX_FILE_SIZE + 1 - self.register( + self.mock_out_urls( self.url, - content_length=cl, + headers={'Content-Length': six.text_type(cl)}, body='c' * cl) proxied_url = proxy.get_proxified_resource_url(self.data_dict) @@ -118,12 +117,12 @@ def test_large_file(self): assert result.status_int == 409, result.status assert 'too large' in result.body, result.body - @httpretty.activate + @responses.activate def test_large_file_streaming(self): cl = controller.MAX_FILE_SIZE + 1 - self.register( + self.mock_out_urls( self.url, - streaming=True, + stream=True, body='c' * cl) proxied_url = proxy.get_proxified_resource_url(self.data_dict) @@ -131,8 +130,9 @@ def test_large_file_streaming(self): assert result.status_int == 409, result.status assert 'too large' in result.body, result.body - @httpretty.activate + @responses.activate def test_invalid_url(self): + responses.add_passthru(config['solr_url']) self.data_dict = set_resource_url('http:invalid_url') proxied_url = proxy.get_proxified_resource_url(self.data_dict) diff --git a/dev-requirements.txt b/dev-requirements.txt index 99e95b0737c..670fc871f04 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -5,7 +5,7 @@ coveralls #Let Unpinned - Requires latest coveralls docutils==0.12 factory-boy==2.1.1 Flask-DebugToolbar==0.10.1 -httpretty==0.8.3 +responses==0.10.6 mock==2.0.0 pycodestyle==2.5.0 pip-tools==2.0.2 From d982da04620978900063a5196f70dde7080dd8d9 Mon Sep 17 00:00:00 2001 From: Alex Harding Date: Mon, 6 May 2019 13:59:21 -0400 Subject: [PATCH 19/33] Adding test for multiple tags --- ckan/tests/controllers/test_package.py | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/ckan/tests/controllers/test_package.py b/ckan/tests/controllers/test_package.py index fa89bb00064..4b34213efa7 100644 --- a/ckan/tests/controllers/test_package.py +++ b/ckan/tests/controllers/test_package.py @@ -1531,6 +1531,36 @@ def test_search_page_results_tag(self): assert_equal(len(ds_titles), 1) assert_true('Dataset One' in ds_titles) + + def test_search_page_results_tags(self): + '''Searching with a tag returns expected results.''' + app = self._get_test_app() + factories.Dataset(name="dataset-one", title='Dataset One', + tags=[ + {'name': 'my-tag-1'}, + {'name': 'my-tag-2'}, + {'name': 'my-tag-3'}, + ]) + factories.Dataset(name="dataset-two", title='Dataset Two') + factories.Dataset(name="dataset-three", title='Dataset Three') + + search_url = url_for('dataset.search') + search_response = app.get(search_url) + params = '/dataset/?tags=my-tag-1&tags=my-tag-2&tags=my-tag-3' + assert_true(params in search_response) + + tag_search_response = app.get(params) + + assert_true('1 dataset found' in tag_search_response) + + search_response_html = BeautifulSoup(tag_search_response.body) + ds_titles = search_response_html.select('.dataset-list ' + '.dataset-item ' + '.dataset-heading a') + ds_titles = [n.string for n in ds_titles] + + assert_equal(len(ds_titles), 3) + assert_true('Dataset One' in ds_titles) def test_search_page_results_private(self): '''Private datasets don't show up in dataset search results.''' From a1611354a70e3bf290e1299b20866d69a64d4e76 Mon Sep 17 00:00:00 2001 From: Alex Harding Date: Mon, 6 May 2019 14:34:29 -0400 Subject: [PATCH 20/33] Fixing test to remove unnecessary call --- ckan/tests/controllers/test_package.py | 8 ++------ contrib/docker/docker-compose.yml | 10 ++++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ckan/tests/controllers/test_package.py b/ckan/tests/controllers/test_package.py index 4b34213efa7..534efff5b28 100644 --- a/ckan/tests/controllers/test_package.py +++ b/ckan/tests/controllers/test_package.py @@ -1531,9 +1531,9 @@ def test_search_page_results_tag(self): assert_equal(len(ds_titles), 1) assert_true('Dataset One' in ds_titles) - + def test_search_page_results_tags(self): - '''Searching with a tag returns expected results.''' + '''Searching with a tag returns expected results with multiple tags''' app = self._get_test_app() factories.Dataset(name="dataset-one", title='Dataset One', tags=[ @@ -1544,11 +1544,7 @@ def test_search_page_results_tags(self): factories.Dataset(name="dataset-two", title='Dataset Two') factories.Dataset(name="dataset-three", title='Dataset Three') - search_url = url_for('dataset.search') - search_response = app.get(search_url) params = '/dataset/?tags=my-tag-1&tags=my-tag-2&tags=my-tag-3' - assert_true(params in search_response) - tag_search_response = app.get(params) assert_true('1 dataset found' in tag_search_response) diff --git a/contrib/docker/docker-compose.yml b/contrib/docker/docker-compose.yml index 1a94f53b04a..60bcc5aa6a6 100644 --- a/contrib/docker/docker-compose.yml +++ b/contrib/docker/docker-compose.yml @@ -41,6 +41,16 @@ services: - ckan_config:/etc/ckan - ckan_home:/usr/lib/ckan - ckan_storage:/var/lib/ckan + - '../../ckanext/:/usr/lib/ckan/venv/src/ckan/ckanext/' + - '../../production.ini:/etc/ckan/production.ini' + # Uncommenting the following 4 lines allows one to attach to the ckan container and interact with pdb sessions + - ../../ckan/:/usr/lib/ckan/venv/src/ckan/ckan/ + stdin_open: true + tty: true + command: ["ckan-paster", "serve", "--reload", "/etc/ckan/production.ini"] + + + datapusher: container_name: datapusher From b42b9173e0e145bc8c4454dd9eae8d040061e65b Mon Sep 17 00:00:00 2001 From: Alex Harding Date: Mon, 6 May 2019 14:53:35 -0400 Subject: [PATCH 21/33] fixing test to look for filtered pills --- ckan/tests/controllers/test_package.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ckan/tests/controllers/test_package.py b/ckan/tests/controllers/test_package.py index 534efff5b28..bd6de87e292 100644 --- a/ckan/tests/controllers/test_package.py +++ b/ckan/tests/controllers/test_package.py @@ -1550,13 +1550,8 @@ def test_search_page_results_tags(self): assert_true('1 dataset found' in tag_search_response) search_response_html = BeautifulSoup(tag_search_response.body) - ds_titles = search_response_html.select('.dataset-list ' - '.dataset-item ' - '.dataset-heading a') - ds_titles = [n.string for n in ds_titles] - + ds_titles = search_response_html.select('.filtered pill') assert_equal(len(ds_titles), 3) - assert_true('Dataset One' in ds_titles) def test_search_page_results_private(self): '''Private datasets don't show up in dataset search results.''' From 126c45624f8dfd0f1dbcf6341e5322b62decef65 Mon Sep 17 00:00:00 2001 From: Alex Harding Date: Mon, 6 May 2019 15:17:54 -0400 Subject: [PATCH 22/33] shortening test to just look for filtered --- ckan/tests/controllers/test_package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ckan/tests/controllers/test_package.py b/ckan/tests/controllers/test_package.py index bd6de87e292..033b6c62043 100644 --- a/ckan/tests/controllers/test_package.py +++ b/ckan/tests/controllers/test_package.py @@ -1550,7 +1550,7 @@ def test_search_page_results_tags(self): assert_true('1 dataset found' in tag_search_response) search_response_html = BeautifulSoup(tag_search_response.body) - ds_titles = search_response_html.select('.filtered pill') + ds_titles = search_response_html.select('.filtered') assert_equal(len(ds_titles), 3) def test_search_page_results_private(self): From 1cee623573b62650ee3b065df2b4b3dca41979e9 Mon Sep 17 00:00:00 2001 From: Alex Harding Date: Mon, 6 May 2019 15:33:59 -0400 Subject: [PATCH 23/33] Removing local-specific docker dev code --- contrib/docker/docker-compose.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/contrib/docker/docker-compose.yml b/contrib/docker/docker-compose.yml index 60bcc5aa6a6..1a94f53b04a 100644 --- a/contrib/docker/docker-compose.yml +++ b/contrib/docker/docker-compose.yml @@ -41,16 +41,6 @@ services: - ckan_config:/etc/ckan - ckan_home:/usr/lib/ckan - ckan_storage:/var/lib/ckan - - '../../ckanext/:/usr/lib/ckan/venv/src/ckan/ckanext/' - - '../../production.ini:/etc/ckan/production.ini' - # Uncommenting the following 4 lines allows one to attach to the ckan container and interact with pdb sessions - - ../../ckan/:/usr/lib/ckan/venv/src/ckan/ckan/ - stdin_open: true - tty: true - command: ["ckan-paster", "serve", "--reload", "/etc/ckan/production.ini"] - - - datapusher: container_name: datapusher From d4beb31282b885cbc06f880b38efa793b492a704 Mon Sep 17 00:00:00 2001 From: Alex Harding Date: Tue, 7 May 2019 15:52:04 -0400 Subject: [PATCH 24/33] Re-running CI --- ckan/tests/controllers/test_package.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ckan/tests/controllers/test_package.py b/ckan/tests/controllers/test_package.py index 033b6c62043..1f64a862ec8 100644 --- a/ckan/tests/controllers/test_package.py +++ b/ckan/tests/controllers/test_package.py @@ -1534,6 +1534,7 @@ def test_search_page_results_tag(self): def test_search_page_results_tags(self): '''Searching with a tag returns expected results with multiple tags''' + app = self._get_test_app() factories.Dataset(name="dataset-one", title='Dataset One', tags=[ From 8d287550cf3c41907364492feec493434d28a044 Mon Sep 17 00:00:00 2001 From: cclauss Date: Wed, 8 May 2019 12:06:14 +0200 Subject: [PATCH 25/33] Travis CI: Add more flake8 tests As requested in #4792 [__flake8 --select=E9,F63,F72,F82__](http://flake8.pycqa.org/en/latest/user/error-codes.html) will run all E9xx tests + all F63x tests + all F72x tests + all F82x tests. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0531a077fef..376350d8472 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ flake8-steps: &flake8-steps before_script: - flake8 --version # stop the build if there are Python syntax errors or undefined names - - flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics --exclude ./ckan/include/rjsmin.py + - flake8 . --count --select=E9,F63,F72,F82 --show-source --statistics --exclude ./ckan/include/rjsmin.py # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics script: From 6468d7c7d524059602ae49d5fee64293e53b9146 Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Thu, 9 May 2019 14:29:58 +0300 Subject: [PATCH 26/33] Update PR with new migrations and Click CLI --- ckan/cli/db.py | 61 ++++++++++++++----- ..._delete_extrase_which_are_deleted_state.py | 40 ++++++++++++ ...8_delete_extras_which_are_deleted_state.py | 14 ----- ...0926e_package_activity_migration_check.py} | 42 ++++++++++--- ...0dcd44de4b_delete_migrate_version_table.py | 37 +++++++++++ ckan/model/__init__.py | 18 +++--- 6 files changed, 168 insertions(+), 44 deletions(-) create mode 100644 ckan/migration/versions/088_3537d5420e0e_delete_extrase_which_are_deleted_state.py delete mode 100644 ckan/migration/versions/088_delete_extras_which_are_deleted_state.py rename ckan/migration/versions/{089_package_activity_migration_check.py => 089_23c92480926e_package_activity_migration_check.py} (54%) create mode 100644 ckan/migration/versions/090_980dcd44de4b_delete_migrate_version_table.py diff --git a/ckan/cli/db.py b/ckan/cli/db.py index 860668cfd64..fa52434ecfe 100644 --- a/ckan/cli/db.py +++ b/ckan/cli/db.py @@ -1,7 +1,8 @@ # encoding: utf-8 +import os import logging - +import ckan.migration as migration_repo import click from ckan.cli import error_shout @@ -44,8 +45,8 @@ def cleandb(): @db.command(u'upgrade', short_help=u'Upgrade the database') -@click.option(u'-v', u'--version', help=u'Migration version') -def updatedb(version=None): +@click.option(u'-v', u'--version', help=u'Migration version', default=u'head') +def updatedb(version): u'''Upgrading the database''' try: import ckan.model as model @@ -56,17 +57,49 @@ def updatedb(version=None): click.secho(u'Upgrading DB: SUCCESS', fg=u'green', bold=True) -@db.command(u'version', short_help=u'Returns current version of data schema') -def version(): - u'''Return current version''' - log.info(u"Returning current DB version") +@db.command(u'downgrade', short_help=u'Downgrade the database') +@click.option(u'-v', u'--version', help=u'Migration version', default=u'base') +def downgradedb(version): + u'''Upgrading the database''' try: - from ckan.model import Session - ver = Session.execute(u'select version from ' - u'migrate_version;').fetchall() - click.secho( - u"Latest data schema version: {0}".format(ver[0][0]), - bold=True - ) + import ckan.model as model + model.repo.downgrade_db(version) except Exception as e: error_shout(e) + else: + click.secho(u'Downgrading DB: SUCCESS', fg=u'green', bold=True) + + +@db.command(u'version', short_help=u'Returns current version of data schema') +@click.option(u'--hash', is_flag=True) +def version(hash): + u'''Return current version''' + log.info(u"Returning current DB version") + import ckan.model as model + model.repo.setup_migration_version_control() + current = model.repo.current_version() + if not hash: + current = _version_hash_to_ordinal(current) + click.secho( + u'Current DB version: {}'.format(current), + fg=u'green', bold=True + ) + + +def _version_hash_to_ordinal(version): + if u'base' == version: + return 0 + versions_dir = os.path.join( + os.path.dirname(migration_repo.__file__), u'versions' + ) + versions = sorted(os.listdir(versions_dir)) + + # latest version looks like `123abc (head)` + if version.endswith('(head)'): + return int(versions[-1].split(u'_')[0]) + for name in versions: + if version in name: + return int(name.split(u'_')[0]) + error_shout(u'Version `{}` was not found in {}'.format( + version, versions_dir + )) diff --git a/ckan/migration/versions/088_3537d5420e0e_delete_extrase_which_are_deleted_state.py b/ckan/migration/versions/088_3537d5420e0e_delete_extrase_which_are_deleted_state.py new file mode 100644 index 00000000000..0631759c6a2 --- /dev/null +++ b/ckan/migration/versions/088_3537d5420e0e_delete_extrase_which_are_deleted_state.py @@ -0,0 +1,40 @@ +# encoding: utf-8 + +"""delete extrase which are deleted state + +Revision ID: 3537d5420e0e +Revises: ff1b303cab77 +Create Date: 2019-05-09 13:38:22.072361 + +""" +from alembic import op + +# revision identifiers, used by Alembic. +revision = '3537d5420e0e' +down_revision = 'ff1b303cab77' +branch_labels = None +depends_on = None + + +def upgrade(): + op.drop_constraint( + 'package_extra_revision_continuity_id_fkey', 'package_extra_revision' + ) + op.drop_constraint( + 'group_extra_revision_continuity_id_fkey', 'group_extra_revision' + ) + + conn = op.get_bind() + conn.execute('''DELETE FROM "package_extra" WHERE state='deleted';''') + conn.execute('''DELETE FROM "group_extra" WHERE state='deleted';''') + + +def downgrade(): + op.create_foreign_key( + 'package_extra_revision_continuity_id_fkey', 'package_extra_revision', + 'package_extra', ['continuity_id'], ['id'] + ) + op.create_foreign_key( + 'group_extra_revision_continuity_id_fkey', 'group_extra_revision', + 'group_extra', ['group_id'], ['id'] + ) diff --git a/ckan/migration/versions/088_delete_extras_which_are_deleted_state.py b/ckan/migration/versions/088_delete_extras_which_are_deleted_state.py deleted file mode 100644 index 7cf4a2c3752..00000000000 --- a/ckan/migration/versions/088_delete_extras_which_are_deleted_state.py +++ /dev/null @@ -1,14 +0,0 @@ -# encoding: utf-8 - - -def upgrade(migrate_engine): - migrate_engine.execute( - ''' -ALTER TABLE "package_extra_revision" - DROP CONSTRAINT IF EXISTS package_extra_revision_continuity_id_fkey; -ALTER TABLE "group_extra_revision" - DROP CONSTRAINT IF EXISTS group_extra_revision_continuity_id_fkey; -DELETE FROM "package_extra" WHERE state='deleted'; -DELETE FROM "group_extra" WHERE state='deleted'; - ''' - ) diff --git a/ckan/migration/versions/089_package_activity_migration_check.py b/ckan/migration/versions/089_23c92480926e_package_activity_migration_check.py similarity index 54% rename from ckan/migration/versions/089_package_activity_migration_check.py rename to ckan/migration/versions/089_23c92480926e_package_activity_migration_check.py index aed0a797e61..fdd67105247 100644 --- a/ckan/migration/versions/089_package_activity_migration_check.py +++ b/ckan/migration/versions/089_23c92480926e_package_activity_migration_check.py @@ -1,14 +1,31 @@ # encoding: utf-8 +"""package activity migration check +Revision ID: 23c92480926e +Revises: 3537d5420e0e +Create Date: 2019-05-09 13:39:17.486611 + +""" import sys +from alembic import op + from ckan.migration.migrate_package_activity import num_unmigrated +# revision identifiers, used by Alembic. +revision = '23c92480926e' +down_revision = '3537d5420e0e' +branch_labels = None +depends_on = None + + +def upgrade(): + conn = op.get_bind() + num_unmigrated_dataset_activities = num_unmigrated(conn) -def upgrade(migrate_engine): - num_unmigrated_dataset_activities = num_unmigrated(migrate_engine) if num_unmigrated_dataset_activities: - print(''' + print( + ''' NOTE: You have {num_unmigrated} unmigrated package activities. @@ -25,14 +42,23 @@ def upgrade(migrate_engine): ckan.auth.public_activity_stream_detail = true More information about all of this is here: - https://github.com/ckan/ckan/wiki/Migrate-package-activity - '''.format(num_unmigrated=num_unmigrated_dataset_activities)) + https://github.com/ckan/ckan/wiki/Migrate-package-activity'''.format( + num_unmigrated=num_unmigrated_dataset_activities + ) + ) else: # there are no unmigrated package activities are_any_datasets = bool( - migrate_engine.execute(u'SELECT id FROM PACKAGE LIMIT 1').rowcount) + conn.execute(u'SELECT id FROM PACKAGE LIMIT 1').rowcount + ) # no need to tell the user if there are no datasets - this could just # be a fresh CKAN install if are_any_datasets: - print(u'You have no unmigrated package activities - you do not ' - 'need to run migrate_package_activity.py.') + print( + u'You have no unmigrated package activities - you do not ' + 'need to run migrate_package_activity.py.' + ) + + +def downgrade(): + pass diff --git a/ckan/migration/versions/090_980dcd44de4b_delete_migrate_version_table.py b/ckan/migration/versions/090_980dcd44de4b_delete_migrate_version_table.py new file mode 100644 index 00000000000..9e9bfddd23f --- /dev/null +++ b/ckan/migration/versions/090_980dcd44de4b_delete_migrate_version_table.py @@ -0,0 +1,37 @@ +# encoding: utf-8 + +"""delete migrate version table + +Revision ID: 980dcd44de4b +Revises: 23c92480926e +Create Date: 2019-05-09 13:39:44.097930 + +""" +from alembic import op + +# revision identifiers, used by Alembic. +revision = '980dcd44de4b' +down_revision = '23c92480926e' +branch_labels = None +depends_on = None + + +def upgrade(): + '''Drop version table, created by sqlalchemy-migrate. + + There is a chance, that we are initializing a new instance and + there is no `migrate_version` table, so DO NOT remove `IF EXISTS` + clause. + ''' + op.execute('DROP TABLE IF EXISTS migrate_version') + + +def downgrade(): + '''We aren't going to recreate `migrate_version` here. + + There is a chance, that this table even never was created for + target database. This migration tries to seamlessly upgrade + existing instance from usage of sqlalchemy-migrate to alembic. And + we don't want to downgrade to sqlalchemy-migrate back again. + ''' + pass diff --git a/ckan/model/__init__.py b/ckan/model/__init__.py index 8c46b3b55cf..3641b81bde2 100644 --- a/ckan/model/__init__.py +++ b/ckan/model/__init__.py @@ -290,6 +290,14 @@ def setup_migration_version_control(self): self.alembic_config = alembic_config + def current_version(self): + try: + alembic_current(self.alembic_config) + return self.take_alembic_output()[0][0] + except (TypeError, IndexError): + # alembic is not initialized yet + return 'base' + def downgrade_db(self, version='base'): self.setup_migration_version_control() alembic_downgrade(self.alembic_config, version) @@ -307,16 +315,10 @@ def upgrade_db(self, version='head'): u'postgres', u'postgresql' ), _assert_engine_msg self.setup_migration_version_control() - try: - alembic_current(self.alembic_config) - version_before = self.take_alembic_output()[0][0] - except (TypeError, IndexError): - # alembic is not initialized yet - version_before = 'base' + version_before = self.current_version() alembic_upgrade(self.alembic_config, version) - alembic_current(self.alembic_config) + version_after = self.current_version() - version_after = self.take_alembic_output()[0][0] if version_after != version_before: log.info( u'CKAN database version upgraded: %s -> %s', From 2751c54788a6b76c54cdf54549473b12a4eb6778 Mon Sep 17 00:00:00 2001 From: Sergey Motornyuk Date: Thu, 9 May 2019 14:40:30 +0300 Subject: [PATCH 27/33] string literals --- ckan/cli/db.py | 2 +- ckan/migration/__init__.py | 2 +- ..._delete_extrase_which_are_deleted_state.py | 22 +++++++++---------- ...80926e_package_activity_migration_check.py | 6 ++--- ...0dcd44de4b_delete_migrate_version_table.py | 10 ++++----- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/ckan/cli/db.py b/ckan/cli/db.py index fa52434ecfe..cbdf7c81439 100644 --- a/ckan/cli/db.py +++ b/ckan/cli/db.py @@ -95,7 +95,7 @@ def _version_hash_to_ordinal(version): versions = sorted(os.listdir(versions_dir)) # latest version looks like `123abc (head)` - if version.endswith('(head)'): + if version.endswith(u'(head)'): return int(versions[-1].split(u'_')[0]) for name in versions: if version in name: diff --git a/ckan/migration/__init__.py b/ckan/migration/__init__.py index 1b0bbb92874..6684dc32332 100644 --- a/ckan/migration/__init__.py +++ b/ckan/migration/__init__.py @@ -4,7 +4,7 @@ def skip_based_on_legacy_engine_version(op, filename): u'''Safe way to update instances sqlalchemy-migrate migrations applied. - CKAN `db upgrade\init` command is trying to obtain current version + CKAN `db upgrade/init` command is trying to obtain current version of sqlalchemy-migrate migrations from database. In that case, we are going to compare existing version from DB with alembic migration script's prefix in filename which defines corresponding diff --git a/ckan/migration/versions/088_3537d5420e0e_delete_extrase_which_are_deleted_state.py b/ckan/migration/versions/088_3537d5420e0e_delete_extrase_which_are_deleted_state.py index 0631759c6a2..71a0c97ad83 100644 --- a/ckan/migration/versions/088_3537d5420e0e_delete_extrase_which_are_deleted_state.py +++ b/ckan/migration/versions/088_3537d5420e0e_delete_extrase_which_are_deleted_state.py @@ -1,5 +1,4 @@ # encoding: utf-8 - """delete extrase which are deleted state Revision ID: 3537d5420e0e @@ -10,31 +9,32 @@ from alembic import op # revision identifiers, used by Alembic. -revision = '3537d5420e0e' -down_revision = 'ff1b303cab77' +revision = u'3537d5420e0e' +down_revision = u'ff1b303cab77' branch_labels = None depends_on = None def upgrade(): op.drop_constraint( - 'package_extra_revision_continuity_id_fkey', 'package_extra_revision' + u'package_extra_revision_continuity_id_fkey', u'package_extra_revision' ) op.drop_constraint( - 'group_extra_revision_continuity_id_fkey', 'group_extra_revision' + u'group_extra_revision_continuity_id_fkey', u'group_extra_revision' ) conn = op.get_bind() - conn.execute('''DELETE FROM "package_extra" WHERE state='deleted';''') - conn.execute('''DELETE FROM "group_extra" WHERE state='deleted';''') + conn.execute(u'''DELETE FROM "package_extra" WHERE state='deleted';''') + conn.execute(u'''DELETE FROM "group_extra" WHERE state='deleted';''') def downgrade(): op.create_foreign_key( - 'package_extra_revision_continuity_id_fkey', 'package_extra_revision', - 'package_extra', ['continuity_id'], ['id'] + u'package_extra_revision_continuity_id_fkey', + u'package_extra_revision', u'package_extra', [u'continuity_id'], + [u'id'] ) op.create_foreign_key( - 'group_extra_revision_continuity_id_fkey', 'group_extra_revision', - 'group_extra', ['group_id'], ['id'] + u'group_extra_revision_continuity_id_fkey', u'group_extra_revision', + u'group_extra', [u'group_id'], [u'id'] ) diff --git a/ckan/migration/versions/089_23c92480926e_package_activity_migration_check.py b/ckan/migration/versions/089_23c92480926e_package_activity_migration_check.py index fdd67105247..aa77e59180f 100644 --- a/ckan/migration/versions/089_23c92480926e_package_activity_migration_check.py +++ b/ckan/migration/versions/089_23c92480926e_package_activity_migration_check.py @@ -13,8 +13,8 @@ from ckan.migration.migrate_package_activity import num_unmigrated # revision identifiers, used by Alembic. -revision = '23c92480926e' -down_revision = '3537d5420e0e' +revision = u'23c92480926e' +down_revision = u'3537d5420e0e' branch_labels = None depends_on = None @@ -25,7 +25,7 @@ def upgrade(): if num_unmigrated_dataset_activities: print( - ''' + u''' NOTE: You have {num_unmigrated} unmigrated package activities. diff --git a/ckan/migration/versions/090_980dcd44de4b_delete_migrate_version_table.py b/ckan/migration/versions/090_980dcd44de4b_delete_migrate_version_table.py index 9e9bfddd23f..18a942d160f 100644 --- a/ckan/migration/versions/090_980dcd44de4b_delete_migrate_version_table.py +++ b/ckan/migration/versions/090_980dcd44de4b_delete_migrate_version_table.py @@ -10,24 +10,24 @@ from alembic import op # revision identifiers, used by Alembic. -revision = '980dcd44de4b' -down_revision = '23c92480926e' +revision = u'980dcd44de4b' +down_revision = u'23c92480926e' branch_labels = None depends_on = None def upgrade(): - '''Drop version table, created by sqlalchemy-migrate. + u'''Drop version table, created by sqlalchemy-migrate. There is a chance, that we are initializing a new instance and there is no `migrate_version` table, so DO NOT remove `IF EXISTS` clause. ''' - op.execute('DROP TABLE IF EXISTS migrate_version') + op.execute(u'DROP TABLE IF EXISTS migrate_version') def downgrade(): - '''We aren't going to recreate `migrate_version` here. + u'''We aren't going to recreate `migrate_version` here. There is a chance, that this table even never was created for target database. This migration tries to seamlessly upgrade From 983d0f7e84be83a58283a43dd5a804c0ff63b065 Mon Sep 17 00:00:00 2001 From: Jinil Lee Date: Thu, 9 May 2019 23:13:47 +0900 Subject: [PATCH 28/33] Facet filtering does not work in 'group.read' or 'organization.read' pages fixing parameter is not included when redirecting --- ckan/views/group.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ckan/views/group.py b/ckan/views/group.py index e920e2841f6..4e94ade34f9 100644 --- a/ckan/views/group.py +++ b/ckan/views/group.py @@ -466,8 +466,10 @@ def read(group_type, is_organization, id=None, limit=20): # if the user specified a group id, redirect to the group name if data_dict['id'] == group_dict['id'] and \ data_dict['id'] != group_dict['name']: - return h.redirect_to(u'{}.read'.format(group_type), - id=group_dict['name']) + return h.redirect_to( + h.add_url_param( + controller=group_type, action=u'read', + extras=dict(id=group_dict['name']))) # TODO: Remove # ckan 2.9: Adding variables that were removed from c object for From b68a836a416127bb119722d0a75b296d865fd32b Mon Sep 17 00:00:00 2001 From: David Read Date: Fri, 10 May 2019 12:06:27 +0100 Subject: [PATCH 29/33] Modernize package model tests * The rest of ckan/tests/legacy/models/test_package.py will go with the revisioning. * tag.by_name() is deprecated because it doesnt seem used anywhere and is broken - missing a join in the query, so the Tag.name filter does nothing. * tag.search_by_name() is deprecated because it isn't used in core ckan. I think some sites will have a tag search, but they should really have the code in their own repo, so we're giving them warning. --- ckan/model/tag.py | 12 ++- ckan/tests/legacy/models/test_extras.py | 46 --------- ckan/tests/legacy/models/test_package.py | 116 ----------------------- ckan/tests/model/test_package.py | 102 ++++++++++++++++++++ ckan/tests/model/test_package_extra.py | 54 +++++++++++ ckan/tests/model/test_tags.py | 69 ++++++++++++++ 6 files changed, 234 insertions(+), 165 deletions(-) delete mode 100644 ckan/tests/legacy/models/test_extras.py create mode 100644 ckan/tests/model/test_package.py create mode 100644 ckan/tests/model/test_package_extra.py create mode 100644 ckan/tests/model/test_tags.py diff --git a/ckan/model/tag.py b/ckan/model/tag.py index 92f7bef8699..368cd2215ec 100644 --- a/ckan/model/tag.py +++ b/ckan/model/tag.py @@ -14,6 +14,7 @@ import activity import ckan # this import is needed import ckan.lib.dictization +import ckan.lib.maintain as maintain __all__ = ['tag_table', 'package_tag_table', 'Tag', 'PackageTag', 'package_tag_revision_table', @@ -140,8 +141,11 @@ def get(cls, tag_id_or_name, vocab_id_or_name=None): # Todo: Make sure tag names can't be changed to look like tag IDs? @classmethod + @maintain.deprecated() def search_by_name(cls, search_term, vocab_id_or_name=None): - '''Return all tags whose names contain a given string. + '''DEPRECATED + + Return all tags whose names contain a given string. By default only free tags (tags which do not belong to any vocabulary) are returned. If the optional argument ``vocab_id_or_name`` is given @@ -231,11 +235,13 @@ def __repr__(self): s = u'' % (self.package.name, self.tag.name) return s.encode('utf8') - @classmethod + @maintain.deprecated() def by_name(self, package_name, tag_name, vocab_id_or_name=None, autoflush=True): - '''Return the PackageTag for the given package and tag names, or None. + '''DEPRECATED (and broken - missing the join to Tag) + + Return the PackageTag for the given package and tag names, or None. By default only PackageTags for free tags (tags which do not belong to any vocabulary) are returned. If the optional argument diff --git a/ckan/tests/legacy/models/test_extras.py b/ckan/tests/legacy/models/test_extras.py deleted file mode 100644 index a9801b0f2e7..00000000000 --- a/ckan/tests/legacy/models/test_extras.py +++ /dev/null @@ -1,46 +0,0 @@ -# encoding: utf-8 - -from ckan.tests.legacy import * - -import ckan.model as model - -class TestExtras: - @classmethod - def setup_class(self): - CreateTestData.create() - - @classmethod - def teardown_class(self): - model.repo.rebuild_db() - - def test_1(self): - startrev = model.repo.youngest_revision().id - pkg = model.Package.by_name(u'warandpeace') - assert pkg is not None - - rev = model.repo.new_revision() - pkg._extras[u'country'] = model.PackageExtra(key=u'country', value='us') - pkg.extras[u'xxx'] = u'yyy' - pkg.extras[u'format'] = u'rdf' - model.repo.commit_and_remove() - - # now test it is saved - rev1 = model.repo.youngest_revision().id - samepkg = model.Package.by_name(u'warandpeace') - assert len(samepkg._extras) == 3, samepkg._extras - assert samepkg.extras[u'country'] == 'us' - assert samepkg.extras[u'format'] == 'rdf' - model.Session.remove() - - # now delete an extra - samepkg = model.Package.by_name(u'warandpeace') - model.repo.new_revision() - del samepkg.extras[u'country'] - model.repo.commit_and_remove() - - samepkg = model.Package.by_name(u'warandpeace') - assert len(samepkg._extras) == 2 - assert len(samepkg.extras) == 2 - extra = model.Session.query(model.PackageExtra).filter_by(key=u'country').first() - assert not extra, extra - model.Session.remove() diff --git a/ckan/tests/legacy/models/test_package.py b/ckan/tests/legacy/models/test_package.py index 7576f5ec934..35866cb9d2c 100644 --- a/ckan/tests/legacy/models/test_package.py +++ b/ckan/tests/legacy/models/test_package.py @@ -66,38 +66,6 @@ def test_basic_revisioning(self): assert package.all_revisions[1].revision_id == revision_id assert package.all_revisions[1].revision_timestamp == timestamp - def test_create_package(self): - package = model.Package.by_name(self.name) - assert package.name == self.name - assert package.notes == self.notes - assert package.license.id == u'odc-by' - assert package.license.title == u'Open Data Commons Attribution License', package.license.title - - def test_update_package(self): - newnotes = u'Written by Beethoven' - author = u'jones' - - rev2 = model.repo.new_revision() - pkg = model.Package.by_name(self.name) - pkg.notes = newnotes - rev2.author = u'jones' - model.Session.commit() - try: - model.Session.expunge_all() - except AttributeError: # sqlalchemy 0.4 - model.Session.clear() - outpkg = model.Package.by_name(self.name) - assert outpkg.notes == newnotes - assert len(outpkg.all_revisions) > 0 - assert outpkg.all_revisions[0].revision.author == author - - def test_package_license(self): - # Check unregistered license_id causes license to be 'None'. - package = model.Package.by_name(self.name) - package.license_id = u'zzzzzzz' - assert package.license == None - model.Session.remove() # forget change - def test_as_dict(self): pkg = model.Package.by_name(self.name) out = pkg.as_dict() @@ -111,72 +79,6 @@ def test_as_dict(self): assert_equal(out['notes_rendered'], '

A great package like package:pollution_stats

') -class TestPackageWithTags: - """ - WARNING: with sqlite these tests may fail (depending on the order they are - run in) as sqlite does not support ForeignKeys properly. - """ - # Todo: Remove comment, since it pertains to sqlite, which CKAN doesn't support? - - @classmethod - def setup_class(self): - model.repo.init_db() - rev1 = model.repo.new_revision() - self.tagname = u'test tag m2m!' - self.tagname2 = u'testtagm2m2' - self.tagname3 = u'test tag3!' - self.pkgname = u'testpkgm2m' - pkg = model.Package(name=self.pkgname) - self.tag = model.Tag(name=self.tagname) - self.tag2 = model.Tag(name=self.tagname2) - pkg2tag = model.PackageTag(package=pkg, tag=self.tag) - pkg.add_tag(self.tag2) - model.Session.add_all([pkg,self.tag,self.tag2,pkg2tag]) - model.Session.commit() - self.pkg2tag_id = pkg2tag.id - self.rev = rev1 - - @classmethod - def teardown_class(self): - model.repo.rebuild_db() - - def test_1(self): - pkg = model.Package.by_name(self.pkgname) - assert len(pkg.get_tags()) == 2 - # pkg2tag = model.Session.query(model.PackageTag).get(self.pkg2tag_id) - # assert pkg2tag.package.name == self.pkgname - - def test_tags(self): - pkg = model.Package.by_name(self.pkgname) - # TODO: go back to this - # 2 default packages each with 2 tags so we have 2 + 4 - all = model.Session.query(model.Tag).all() - assert len(all) == 3, all - - def test_add_tag_by_name(self): - rev = model.repo.new_revision() - pkg = model.Package.by_name(self.pkgname) - pkg.add_tag_by_name(self.tagname3) - model.Session.commit() - try: - model.Session.expunge_all() - except AttributeError: # sqlalchemy 0.4 - model.Session.clear() - outpkg = model.Package.by_name(self.pkgname) - assert len(outpkg.get_tags()) == 3 - t1 = model.Tag.by_name(self.tagname) - assert len(t1.package_tags) == 1 - - def test_add_tag_by_name_existing(self): - try: - model.Session.expunge_all() - except AttributeError: # sqlalchemy 0.4 - model.Session.clear() - pkg = model.Package.by_name(self.pkgname) - assert len(pkg.get_tags()) == 3, len(pkg.get_tags()) - pkg.add_tag_by_name(self.tagname) - assert len(pkg.get_tags()) == 3 - class TestPackageTagSearch: @classmethod @@ -354,21 +256,3 @@ def teardown_class(self): def test_1_all_revisions(self): assert len(self.pkg1.all_revisions) == 3, self.pkg1.all_revisions assert len(self.pkg1.all_related_revisions) == 6, self.pkg1.all_related_revisions - - -class TestPackagePurge: - @classmethod - def setup_class(self): - CreateTestData.create() - @classmethod - def teardown_class(self): - model.repo.rebuild_db() - def test_purge(self): - pkgs = model.Session.query(model.Package).all() - for p in pkgs: - p.purge() - model.Session.commit() - pkgs = model.Session.query(model.Package).all() - assert len(pkgs) == 0 - - diff --git a/ckan/tests/model/test_package.py b/ckan/tests/model/test_package.py new file mode 100644 index 00000000000..f6bdd082ebe --- /dev/null +++ b/ckan/tests/model/test_package.py @@ -0,0 +1,102 @@ +# encoding: utf-8 + +from nose.tools import assert_equal + +from ckan import model +from ckan.tests import helpers, factories + + +class TestPackage(object): + + def setup(self): + helpers.reset_db() + + def test_create(self): + # Demonstrate creating a package. + # + # In practice this is done by a combination of: + # * ckan.logic.action.create:package_create + # * ckan.lib.dictization.model_save.py:package_dict_save + # etc + + model.repo.new_revision() + + pkg = model.Package(name=u'test-package') + pkg.notes = u'Some notes' + pkg.author = u'bob' + pkg.license_id = u'odc-by' + + model.Session.add(pkg) + model.Session.commit() + model.Session.remove() + + pkg = model.Package.by_name(u'test-package') + assert_equal(pkg.notes, u'Some notes') + assert_equal(pkg.author, u'bob') + assert_equal(pkg.license_id, u'odc-by') + assert_equal(pkg.license.title, + u'Open Data Commons Attribution License') + + def test_update(self): + dataset = factories.Dataset() + pkg = model.Package.by_name(dataset['name']) + + model.repo.new_revision() + pkg.author = u'bob' + model.Session.commit() + model.Session.remove() + + pkg = model.Package.by_name(dataset['name']) + assert_equal(pkg.author, u'bob') + + def test_delete(self): + group = factories.Group() + dataset = factories.Dataset( + groups=[{u'id': group['id']}], + tags=[{u'name': u'science'}], + extras=[{u'key': u'subject', u'value': u'science'}], + ) + pkg = model.Package.by_name(dataset['name']) + + model.repo.new_revision() + pkg.delete() + model.Session.commit() + model.Session.remove() + + pkg = model.Package.by_name(dataset['name']) + assert_equal(pkg.state, u'deleted') + # it is removed from the group + group = model.Group.get(group['id']) + assert_equal([p.name for p in group.packages()], []) + # other related objects don't change + package_extra = model.Session.query(model.PackageExtra).all()[0] + assert_equal(package_extra.state, u'active') + package_tag = model.Session.query(model.PackageTag).all()[0] + assert_equal(package_tag.state, u'active') + tag = model.Session.query(model.Tag).all()[0] + assert_equal([p.name for p in tag.packages], [dataset['name']]) + + def test_purge(self): + group = factories.Group() + dataset = factories.Dataset( + groups=[{u'id': group['id']}], + tags=[{u'name': u'science'}], + extras=[{u'key': u'subject', u'value': u'science'}], + ) + pkg = model.Package.by_name(dataset['name']) + + model.repo.new_revision() + pkg.purge() + model.Session.commit() + model.Session.remove() + + assert not model.Session.query(model.Package).all() + # the purge cascades to some objects + assert not model.Session.query(model.PackageExtra).all() + assert not model.Session.query(model.PackageTag).all() + # tag object remains, just not attached to the package + tag = model.Session.query(model.Tag).all()[0] + assert_equal(tag.packages, []) + # group object remains, just not attached to the package + group = model.Group.get(group['id']) + assert_equal(group.packages(), []) diff --git a/ckan/tests/model/test_package_extra.py b/ckan/tests/model/test_package_extra.py new file mode 100644 index 00000000000..459d9cb89c3 --- /dev/null +++ b/ckan/tests/model/test_package_extra.py @@ -0,0 +1,54 @@ +# encoding: utf-8 + +from nose.tools import assert_equal + +from ckan import model +from ckan.tests import helpers, factories + + +class TestPackage(object): + + def setup(self): + helpers.reset_db() + + def test_create_extras(self): + model.repo.new_revision() + + pkg = model.Package(name=u'test-package') + + # method 1 + extra1 = model.PackageExtra(key=u'subject', value=u'science') + pkg._extras[u'subject'] = extra1 + + # method 2 + pkg.extras[u'accuracy'] = u'metre' + + model.Session.add_all([pkg]) + model.Session.commit() + model.Session.remove() + + pkg = model.Package.by_name(u'test-package') + assert_equal( + pkg.extras, + {u'subject': u'science', + u'accuracy': u'metre'} + ) + + def test_delete_extras(self): + + dataset = factories.Dataset(extras=[ + {u'key': u'subject', u'value': u'science'}, + {u'key': u'accuracy', u'value': u'metre'}] + ) + pkg = model.Package.by_name(dataset['name']) + + model.repo.new_revision() + del pkg.extras[u'subject'] + model.Session.commit() + model.Session.remove() + + pkg = model.Package.by_name(dataset['name']) + assert_equal( + pkg.extras, + {u'accuracy': u'metre'} + ) diff --git a/ckan/tests/model/test_tags.py b/ckan/tests/model/test_tags.py new file mode 100644 index 00000000000..42ca6bf3107 --- /dev/null +++ b/ckan/tests/model/test_tags.py @@ -0,0 +1,69 @@ +# encoding: utf-8 + +from nose.tools import assert_equal + +from ckan import model +from ckan.tests import helpers, factories + + +class TestPackage(object): + + def setup(self): + helpers.reset_db() + + def test_create_package_with_tags(self): + model.repo.new_revision() + + pkg = model.Package(name=u'test-package') + + # method 1 + tag1 = model.Tag(name=u'science') + package_tag1 = model.PackageTag(package=pkg, tag=tag1) + pkg.package_tag_all[:] = [package_tag1] + + # method 2 + tag2 = model.Tag(name=u'geology') + package_tag2 = model.PackageTag(package=pkg, tag=tag2) + pkg.add_tag(tag2) + + # method 3 + pkg.add_tag_by_name(u'energy') + + model.Session.add_all([pkg, package_tag1, package_tag2]) + model.Session.commit() + model.Session.remove() + + pkg = model.Package.by_name(u'test-package') + assert_equal( + set([tag.name for tag in pkg.get_tags()]), + set([u'science', u'geology', u'energy']) + ) + + def test_delete_tag(self): + dataset = factories.Dataset(tags=[{u'name': u'science'}, + {u'name': u'geology'}, + {u'name': u'energy'}]) + pkg = model.Package.by_name(dataset['name']) + + model.repo.new_revision() + + # method 1 - unused by ckan core + tag = model.Tag.by_name(u'science') + pkg.remove_tag(tag) + + # method 2 + package_tag = \ + model.Session.query(model.PackageTag) \ + .join(model.Tag) \ + .filter(model.Tag.name == u'geology') \ + .one() + package_tag.state = u'deleted' + + model.Session.commit() + model.Session.remove() + + pkg = model.Package.by_name(dataset['name']) + assert_equal( + set([tag.name for tag in pkg.get_tags()]), + set(['energy']) + ) From 97093dc87e84fa6e3b2b528251ea03ce32376393 Mon Sep 17 00:00:00 2001 From: amercader Date: Fri, 10 May 2019 15:18:14 +0200 Subject: [PATCH 30/33] [#4779] Remove Boostrap 2 templates option Leave the config option and mechanism to switch templates in place in case we re-use in the future, but only accepting the current values. --- ckan/config/deployment.ini_tmpl | 4 ---- ckan/config/environment.py | 8 ++++---- doc/maintaining/configuration.rst | 22 ++++------------------ 3 files changed, 8 insertions(+), 26 deletions(-) diff --git a/ckan/config/deployment.ini_tmpl b/ckan/config/deployment.ini_tmpl index 0ed97f60336..767d81e86a2 100644 --- a/ckan/config/deployment.ini_tmpl +++ b/ckan/config/deployment.ini_tmpl @@ -119,10 +119,6 @@ ckan.views.default_views = image_view text_view recline_view ## Front-End Settings -# Uncomment following configuration to enable using of Bootstrap 2 -#ckan.base_public_folder = public-bs2 -#ckan.base_templates_folder = templates-bs2 - ckan.site_title = CKAN ckan.site_logo = /base/images/ckan-logo.png ckan.site_description = diff --git a/ckan/config/environment.py b/ckan/config/environment.py index 963d7e5d726..2beaed1fad1 100644 --- a/ckan/config/environment.py +++ b/ckan/config/environment.py @@ -76,14 +76,14 @@ def find_controller(self, controller): # Pylons paths root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - valid_base_public_folder_names = ['public', 'public-bs2'] + valid_base_public_folder_names = ['public'] static_files = app_conf.get('ckan.base_public_folder', 'public') app_conf['ckan.base_public_folder'] = static_files if static_files not in valid_base_public_folder_names: raise CkanConfigurationException( 'You provided an invalid value for ckan.base_public_folder. ' - 'Possible values are: "public" and "public-bs2".' + 'Possible values are: "public".' ) log.info('Loading static files from %s' % static_files) @@ -248,14 +248,14 @@ def update_config(): config['pylons.h'] = helpers.helper_functions # Templates and CSS loading from configuration - valid_base_templates_folder_names = ['templates', 'templates-bs2'] + valid_base_templates_folder_names = ['templates'] templates = config.get('ckan.base_templates_folder', 'templates') config['ckan.base_templates_folder'] = templates if templates not in valid_base_templates_folder_names: raise CkanConfigurationException( 'You provided an invalid value for ckan.base_templates_folder. ' - 'Possible values are: "templates" and "templates-bs2".' + 'Possible values are: "templates".' ) jinja2_templates_path = os.path.join(root, templates) diff --git a/doc/maintaining/configuration.rst b/doc/maintaining/configuration.rst index df30d5abf93..ec396afe5fa 100644 --- a/doc/maintaining/configuration.rst +++ b/doc/maintaining/configuration.rst @@ -1430,15 +1430,8 @@ Example:: Default value: ``public`` This config option is used to configure the base folder for static files used -by CKAN core. It's used to determine which version of Bootstrap to be used. -It accepts two values: ``public`` (Bootstrap 3, the default value from CKAN -2.8 onwards) and ``public-bs2`` (Bootstrap 2, used until CKAN 2.7). - -It must be used in conjunction with :ref:`ckan.base_templates_folder` in order -for it to properly function. Also, you can't use for example Bootstrap 3 for -static files and Bootstrap 2 for templates or vice versa. - -.. note:: Starting with CKAN 2.8, Bootstrap 3 will be used as a default. +by CKAN core. It is currently unused and it only accepts one value: ``public`` +(Bootstrap 3, the default value from CKAN 2.8 onwards). .. _ckan.base_templates_folder: @@ -1452,15 +1445,8 @@ Example:: Default value: ``templates`` This config option is used to configure the base folder for templates used -by CKAN core. It's used to determine which version of Bootstrap to be used. -It accepts two values: ``templates`` (Bootstrap 3, the default value from CKAN -2.8 onwards) and ``templates-bs2`` (Bootstrap 2, used until CKAN 2.7). - -It must be used in conjunction with :ref:`ckan.base_public_folder` in order -for it to properly function. Also, you can't use for example Bootstrap 3 for -templates and Bootstrap 2 for static files or vice versa. - -.. note:: Starting with CKAN 2.8, Bootstrap 3 will be used as a default. +by CKAN core. It is currently unused and it only accepts one vaue: ``templates`` +(Bootstrap 3, the default value from CKAN 2.8 onwards). .. end_config-theming From c136ed1400c3445fdffe0d2474970fa68297e230 Mon Sep 17 00:00:00 2001 From: amercader Date: Fri, 10 May 2019 15:20:00 +0200 Subject: [PATCH 31/33] [#4779] [#4779] Remove Bootstrap 2 templates --- ckan/public-bs2/base/css/.gitignore | 1 - ckan/public-bs2/base/css/fuchsia.css | 9520 -------------- ckan/public-bs2/base/css/green.css | 9520 -------------- ckan/public-bs2/base/css/main.css | 9520 -------------- ckan/public-bs2/base/css/maroon.css | 9520 -------------- ckan/public-bs2/base/css/red.css | 9520 -------------- ckan/public-bs2/base/i18n/.gitignore | 6 - .../base/images/background-tag-ie7.png | Bin 1271 -> 0 bytes .../public-bs2/base/images/background-tag.png | Bin 993 -> 0 bytes .../base/images/background-tile.png | Bin 225 -> 0 bytes ckan/public-bs2/base/images/bg.png | Bin 3911 -> 0 bytes .../base/images/breadcrumb-slash-ie7.png | Bin 3050 -> 0 bytes .../base/images/ckan-logo-footer.png | Bin 435 -> 0 bytes .../base/images/ckan-logo-white.svg | 28 - ckan/public-bs2/base/images/ckan-logo.png | Bin 626 -> 0 bytes ckan/public-bs2/base/images/ckan-logo.svg | 25 - ckan/public-bs2/base/images/ckan.ico | Bin 1150 -> 0 bytes .../images/dashboard-followee-related.png | Bin 2794 -> 0 bytes ckan/public-bs2/base/images/dotted.png | Bin 74 -> 0 bytes ckan/public-bs2/base/images/editing.png | Bin 203 -> 0 bytes .../base/images/full-width-nav-right.png | Bin 99 -> 0 bytes .../base/images/icon-search-27x26.png | Bin 318 -> 0 bytes .../base/images/loading-spinner.gif | Bin 1849 -> 0 bytes ckan/public-bs2/base/images/nav-active.png | Bin 227 -> 0 bytes ckan/public-bs2/base/images/nav.png | Bin 2742 -> 0 bytes ckan/public-bs2/base/images/od_80x15_blue.png | Bin 163 -> 0 bytes .../base/images/placeholder-200x125.png | Bin 435 -> 0 bytes .../base/images/placeholder-420x220.png | Bin 895 -> 0 bytes .../base/images/placeholder-680x400.png | Bin 1532 -> 0 bytes .../base/images/placeholder-application.png | Bin 3772 -> 0 bytes .../base/images/placeholder-group.png | Bin 4033 -> 0 bytes .../base/images/placeholder-image.png | Bin 4663 -> 0 bytes .../base/images/placeholder-organization.png | Bin 3861 -> 0 bytes .../base/images/sprite-ckan-icons.png | Bin 13523 -> 0 bytes .../base/images/sprite-resource-icons.png | Bin 44581 -> 0 bytes .../base/images/table-seperator.png | Bin 82 -> 0 bytes ckan/public-bs2/base/javascript/client.js | 377 - ckan/public-bs2/base/javascript/i18n.js | 101 - ckan/public-bs2/base/javascript/main.js | 101 - ckan/public-bs2/base/javascript/module.js | 397 - .../javascript/modules/activity-stream.js | 119 - .../base/javascript/modules/api-info.js | 127 - .../base/javascript/modules/autocomplete.js | 275 - .../base/javascript/modules/basic-form.js | 24 - .../base/javascript/modules/confirm-action.js | 124 - .../base/javascript/modules/custom-fields.js | 102 - .../base/javascript/modules/dashboard.js | 86 - .../base/javascript/modules/data-viewer.js | 54 - .../javascript/modules/dataset-visibility.js | 32 - .../base/javascript/modules/follow.js | 78 - .../javascript/modules/followers-counter.js | 91 - .../base/javascript/modules/image-upload.js | 280 - .../base/javascript/modules/media-grid.js | 16 - .../javascript/modules/popover-context.js | 257 - .../base/javascript/modules/resource-form.js | 55 - .../javascript/modules/resource-reorder.js | 141 - .../modules/resource-upload-field.js | 280 - .../javascript/modules/resource-view-embed.js | 50 - .../modules/resource-view-filters-form.js | 104 - .../modules/resource-view-filters.js | 187 - .../modules/resource-view-reorder.js | 128 - .../base/javascript/modules/select-switch.js | 31 - .../base/javascript/modules/slug-preview.js | 79 - .../modules/table-selectable-rows.js | 95 - .../javascript/modules/table-toggle-more.js | 61 - ckan/public-bs2/base/javascript/notify.js | 71 - .../javascript/plugins/jquery.date-helpers.js | 82 - .../javascript/plugins/jquery.form-warning.js | 41 - .../plugins/jquery.images-loaded.js | 496 - .../base/javascript/plugins/jquery.inherit.js | 52 - .../base/javascript/plugins/jquery.masonry.js | 2501 ---- .../javascript/plugins/jquery.proxy-all.js | 47 - .../javascript/plugins/jquery.slug-preview.js | 80 - .../base/javascript/plugins/jquery.slug.js | 83 - .../javascript/plugins/jquery.truncator.js | 145 - .../javascript/plugins/jquery.url-helpers.js | 167 - ckan/public-bs2/base/javascript/pubsub.js | 139 - .../base/javascript/resource.config | 68 - ckan/public-bs2/base/javascript/sandbox.js | 131 - ckan/public-bs2/base/javascript/tracking.js | 21 - .../base/javascript/view-filters.js | 239 - ckan/public-bs2/base/less/activity.less | 126 - ckan/public-bs2/base/less/ckan.less | 142 - ckan/public-bs2/base/less/custom.less | 1 - ckan/public-bs2/base/less/dashboard.less | 130 - ckan/public-bs2/base/less/datapusher.less | 18 - ckan/public-bs2/base/less/dataset.less | 340 - ckan/public-bs2/base/less/dropdown.less | 14 - ckan/public-bs2/base/less/footer.less | 51 - ckan/public-bs2/base/less/forms.less | 806 -- ckan/public-bs2/base/less/group.less | 37 - ckan/public-bs2/base/less/homepage.less | 103 - ckan/public-bs2/base/less/icons.less | 206 - ckan/public-bs2/base/less/iehacks.less | 245 - ckan/public-bs2/base/less/layout.less | 251 - ckan/public-bs2/base/less/main.less | 60 - ckan/public-bs2/base/less/masthead.less | 225 - ckan/public-bs2/base/less/media.less | 153 - ckan/public-bs2/base/less/mixins.less | 153 - ckan/public-bs2/base/less/module.less | 229 - ckan/public-bs2/base/less/nav.less | 167 - ckan/public-bs2/base/less/profile.less | 6 - ckan/public-bs2/base/less/prose.less | 96 - ckan/public-bs2/base/less/resource-view.less | 22 - ckan/public-bs2/base/less/search.less | 123 - ckan/public-bs2/base/less/tables.less | 70 - ckan/public-bs2/base/less/toolbar.less | 145 - ckan/public-bs2/base/less/variables.less | 125 - ckan/public-bs2/base/test/index.html | 169 - ckan/public-bs2/base/test/primer/index.html | 647 - ckan/public-bs2/base/test/spec/ckan.spec.js | 70 - ckan/public-bs2/base/test/spec/client.spec.js | 405 - ckan/public-bs2/base/test/spec/i18n.spec.js | 116 - ckan/public-bs2/base/test/spec/module.spec.js | 418 - .../test/spec/modules/autocomplete.spec.js | 315 - .../base/test/spec/modules/basic-form.spec.js | 39 - .../test/spec/modules/confirm-action.spec.js | 118 - .../test/spec/modules/custom-fields.spec.js | 175 - .../spec/modules/followers-counter.spec.js | 186 - .../test/spec/modules/image-upload.spec.js | 65 - .../test/spec/modules/resource-form.spec.js | 74 - .../modules/resource-upload-field.spec.js | 290 - ckan/public-bs2/base/test/spec/notify.spec.js | 46 - .../spec/plugins/jquery.date-helpers.spec.js | 37 - .../spec/plugins/jquery.form-warning.spec.js | 42 - .../test/spec/plugins/jquery.inherit.spec.js | 46 - .../spec/plugins/jquery.proxy-all.spec.js | 60 - .../spec/plugins/jquery.slug-preview.spec.js | 65 - .../test/spec/plugins/jquery.slug.spec.js | 34 - .../spec/plugins/jquery.url-helpers.spec.js | 52 - ckan/public-bs2/base/test/spec/pubsub.spec.js | 92 - .../public-bs2/base/test/spec/sandbox.spec.js | 112 - .../base/test/spec/view-filters.spec.js | 233 - ckan/public-bs2/base/test/vendor/chai.js | 3464 ------ ckan/public-bs2/base/test/vendor/less.js | 3478 ------ ckan/public-bs2/base/test/vendor/mocha.css | 251 - ckan/public-bs2/base/test/vendor/mocha.js | 5428 -------- ckan/public-bs2/base/test/vendor/sinon.js | 4080 ------ ckan/public-bs2/base/vendor/bootstrap.js | 1824 --- ckan/public-bs2/base/vendor/bootstrap.min.js | 386 - .../img/glyphicons-halflings-white.png | Bin 8621 -> 0 bytes .../bootstrap/img/glyphicons-halflings.png | Bin 12586 -> 0 bytes .../base/vendor/bootstrap/js/bootstrap.js | 2280 ---- .../base/vendor/bootstrap/js/bootstrap.min.js | 6 - .../base/vendor/bootstrap/less/accordion.less | 34 - .../base/vendor/bootstrap/less/alerts.less | 79 - .../base/vendor/bootstrap/less/bootstrap.less | 63 - .../vendor/bootstrap/less/breadcrumbs.less | 24 - .../vendor/bootstrap/less/button-groups.less | 229 - .../base/vendor/bootstrap/less/buttons.less | 228 - .../base/vendor/bootstrap/less/carousel.less | 158 - .../base/vendor/bootstrap/less/close.less | 32 - .../base/vendor/bootstrap/less/code.less | 61 - .../bootstrap/less/component-animations.less | 22 - .../base/vendor/bootstrap/less/dropdowns.less | 248 - .../base/vendor/bootstrap/less/forms.less | 690 -- .../base/vendor/bootstrap/less/grid.less | 21 - .../base/vendor/bootstrap/less/hero-unit.less | 25 - .../vendor/bootstrap/less/labels-badges.less | 84 - .../base/vendor/bootstrap/less/layouts.less | 16 - .../base/vendor/bootstrap/less/media.less | 55 - .../base/vendor/bootstrap/less/mixins.less | 702 -- .../base/vendor/bootstrap/less/modals.less | 95 - .../base/vendor/bootstrap/less/navbar.less | 497 - .../base/vendor/bootstrap/less/navs.less | 409 - .../base/vendor/bootstrap/less/pager.less | 43 - .../vendor/bootstrap/less/pagination.less | 123 - .../base/vendor/bootstrap/less/popovers.less | 133 - .../vendor/bootstrap/less/progress-bars.less | 122 - .../base/vendor/bootstrap/less/reset.less | 216 - .../bootstrap/less/responsive-1200px-min.less | 28 - .../bootstrap/less/responsive-767px-max.less | 193 - .../less/responsive-768px-979px.less | 19 - .../bootstrap/less/responsive-navbar.less | 189 - .../bootstrap/less/responsive-utilities.less | 59 - .../vendor/bootstrap/less/responsive.less | 48 - .../vendor/bootstrap/less/scaffolding.less | 53 - .../base/vendor/bootstrap/less/sprites.less | 197 - .../base/vendor/bootstrap/less/tables.less | 244 - .../vendor/bootstrap/less/tests/buttons.html | 139 - .../vendor/bootstrap/less/tests/css-tests.css | 150 - .../bootstrap/less/tests/css-tests.html | 1399 --- .../less/tests/forms-responsive.html | 71 - .../vendor/bootstrap/less/tests/forms.html | 179 - .../less/tests/navbar-fixed-top.html | 104 - .../less/tests/navbar-static-top.html | 107 - .../vendor/bootstrap/less/tests/navbar.html | 107 - .../vendor/bootstrap/less/thumbnails.less | 53 - .../base/vendor/bootstrap/less/tooltip.less | 70 - .../base/vendor/bootstrap/less/type.less | 247 - .../base/vendor/bootstrap/less/utilities.less | 30 - .../base/vendor/bootstrap/less/variables.less | 301 - .../base/vendor/bootstrap/less/wells.less | 29 - .../vendor/font-awesome/css/font-awesome.css | 1338 -- .../font-awesome/css/font-awesome.min.css | 4 - .../vendor/font-awesome/fonts/FontAwesome.otf | Bin 62856 -> 0 bytes .../fonts/fontawesome-webfont.eot | Bin 38205 -> 0 bytes .../fonts/fontawesome-webfont.svg | 414 - .../fonts/fontawesome-webfont.ttf | Bin 80652 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 44432 -> 0 bytes .../font-awesome/less/bordered-pulled.less | 16 - .../base/vendor/font-awesome/less/core.less | 12 - .../base/vendor/font-awesome/less/extras.less | 2 - .../vendor/font-awesome/less/fixed-width.less | 6 - .../font-awesome/less/font-awesome.less | 17 - .../base/vendor/font-awesome/less/icons.less | 412 - .../base/vendor/font-awesome/less/larger.less | 13 - .../base/vendor/font-awesome/less/list.less | 19 - .../base/vendor/font-awesome/less/mixins.less | 20 - .../base/vendor/font-awesome/less/path.less | 14 - .../font-awesome/less/rotated-flipped.less | 9 - .../vendor/font-awesome/less/spinning.less | 30 - .../vendor/font-awesome/less/stacked.less | 20 - .../vendor/font-awesome/less/variables.less | 381 - ckan/public-bs2/base/vendor/html5.js | 7 - ckan/public-bs2/base/vendor/html5.min.js | 1 - ckan/public-bs2/base/vendor/jed.js | 1010 -- ckan/public-bs2/base/vendor/jed.min.js | 101 - .../jquery-fileupload/jquery.fileupload-ui.js | 702 -- .../jquery.fileupload-ui.min.js | 30 - .../jquery-fileupload/jquery.fileupload.js | 968 -- .../jquery.fileupload.min.js | 45 - .../jquery.iframe-transport.js | 171 - .../jquery.iframe-transport.min.js | 7 - ckan/public-bs2/base/vendor/jquery.js | 10253 ---------------- ckan/public-bs2/base/vendor/jquery.min.js | 4 - ckan/public-bs2/base/vendor/jquery.ui.core.js | 320 - .../public-bs2/base/vendor/jquery.ui.mouse.js | 169 - .../base/vendor/jquery.ui.sortable.js | 1285 -- .../base/vendor/jquery.ui.widget.js | 521 - .../base/vendor/moment-with-locales.js | 673 - .../base/vendor/polyfill-object-keys.js | 42 - ckan/public-bs2/base/vendor/resource.config | 51 - .../public-bs2/base/vendor/select2/.gitignore | 2 - .../base/vendor/select2/CONTRIBUTING.md | 107 - ckan/public-bs2/base/vendor/select2/LICENSE | 18 - ckan/public-bs2/base/vendor/select2/README.md | 115 - .../public-bs2/base/vendor/select2/bower.json | 8 - .../base/vendor/select2/component.json | 66 - .../base/vendor/select2/composer.json | 29 - .../base/vendor/select2/package.json | 20 - .../public-bs2/base/vendor/select2/release.sh | 79 - .../base/vendor/select2/select2-bootstrap.css | 87 - .../base/vendor/select2/select2-spinner.gif | Bin 1849 -> 0 bytes .../base/vendor/select2/select2.css | 692 -- .../base/vendor/select2/select2.jquery.json | 36 - .../public-bs2/base/vendor/select2/select2.js | 3729 ------ .../base/vendor/select2/select2.min.js | 23 - .../base/vendor/select2/select2.png | Bin 613 -> 0 bytes .../base/vendor/select2/select2_locale_ar.js | 19 - .../base/vendor/select2/select2_locale_az.js | 20 - .../base/vendor/select2/select2_locale_bg.js | 20 - .../base/vendor/select2/select2_locale_ca.js | 19 - .../base/vendor/select2/select2_locale_cs.js | 51 - .../base/vendor/select2/select2_locale_da.js | 19 - .../base/vendor/select2/select2_locale_de.js | 18 - .../base/vendor/select2/select2_locale_el.js | 19 - .../select2/select2_locale_en.js.template | 20 - .../base/vendor/select2/select2_locale_es.js | 19 - .../base/vendor/select2/select2_locale_et.js | 19 - .../base/vendor/select2/select2_locale_eu.js | 45 - .../base/vendor/select2/select2_locale_fa.js | 21 - .../base/vendor/select2/select2_locale_fi.js | 30 - .../base/vendor/select2/select2_locale_fr.js | 18 - .../base/vendor/select2/select2_locale_gl.js | 45 - .../base/vendor/select2/select2_locale_he.js | 19 - .../base/vendor/select2/select2_locale_hr.js | 24 - .../base/vendor/select2/select2_locale_hu.js | 17 - .../base/vendor/select2/select2_locale_id.js | 21 - .../base/vendor/select2/select2_locale_is.js | 17 - .../base/vendor/select2/select2_locale_it.js | 17 - .../base/vendor/select2/select2_locale_ja.js | 17 - .../base/vendor/select2/select2_locale_ka.js | 19 - .../base/vendor/select2/select2_locale_ko.js | 19 - .../base/vendor/select2/select2_locale_lt.js | 26 - .../base/vendor/select2/select2_locale_lv.js | 19 - .../base/vendor/select2/select2_locale_mk.js | 19 - .../base/vendor/select2/select2_locale_ms.js | 21 - .../base/vendor/select2/select2_locale_nb.js | 22 - .../base/vendor/select2/select2_locale_nl.js | 17 - .../base/vendor/select2/select2_locale_pl.js | 54 - .../vendor/select2/select2_locale_pt-BR.js | 18 - .../vendor/select2/select2_locale_pt-PT.js | 17 - .../base/vendor/select2/select2_locale_ro.js | 17 - .../base/vendor/select2/select2_locale_rs.js | 19 - .../base/vendor/select2/select2_locale_ru.js | 23 - .../base/vendor/select2/select2_locale_sk.js | 50 - .../base/vendor/select2/select2_locale_sv.js | 19 - .../base/vendor/select2/select2_locale_th.js | 19 - .../base/vendor/select2/select2_locale_tr.js | 20 - .../vendor/select2/select2_locale_ug-CN.js | 16 - .../base/vendor/select2/select2_locale_uk.js | 25 - .../base/vendor/select2/select2_locale_vi.js | 20 - .../vendor/select2/select2_locale_zh-CN.js | 16 - .../vendor/select2/select2_locale_zh-TW.js | 16 - .../base/vendor/select2/select2x2.png | Bin 845 -> 0 bytes .../activity_stream_email_notifications.text | 7 - .../activity_stream_items.html | 26 - ckan/templates-bs2/admin/base.html | 12 - ckan/templates-bs2/admin/config.html | 73 - ckan/templates-bs2/admin/confirm_reset.html | 13 - ckan/templates-bs2/admin/index.html | 26 - ckan/templates-bs2/admin/trash.html | 37 - .../ajax_snippets/custom_fields.html | 4 - .../ajax_snippets/follow_button.html | 1 - ckan/templates-bs2/base.html | 118 - ckan/templates-bs2/dataviewer/base.html | 16 - .../dataviewer/snippets/data_preview.html | 26 - .../dataviewer/snippets/no_preview.html | 16 - ckan/templates-bs2/development/primer.html | 95 - .../development/snippets/actions.html | 2 - .../development/snippets/breadcrumb.html | 7 - .../development/snippets/context.html | 24 - .../development/snippets/facet.html | 15 - .../development/snippets/form.html | 27 - .../development/snippets/form_stages.html | 30 - .../development/snippets/list.html | 14 - .../development/snippets/media_grid.html | 5 - .../development/snippets/module.html | 21 - .../development/snippets/nav.html | 14 - .../development/snippets/page_header.html | 11 - .../development/snippets/pagination.html | 11 - .../development/snippets/simple-input.html | 4 - ckan/templates-bs2/emails/invite_user.txt | 17 - .../emails/invite_user_subject.txt | 1 - ckan/templates-bs2/emails/reset_password.txt | 12 - .../emails/reset_password_subject.txt | 1 - .../error_document_template.html | 21 - ckan/templates-bs2/footer.html | 39 - ckan/templates-bs2/group/about.html | 20 - ckan/templates-bs2/group/activity_stream.html | 12 - ckan/templates-bs2/group/admins.html | 10 - ckan/templates-bs2/group/base_form_page.html | 15 - ckan/templates-bs2/group/confirm_delete.html | 21 - .../group/confirm_delete_member.html | 22 - ckan/templates-bs2/group/edit.html | 12 - ckan/templates-bs2/group/edit_base.html | 28 - ckan/templates-bs2/group/followers.html | 10 - ckan/templates-bs2/group/index.html | 43 - ckan/templates-bs2/group/member_new.html | 87 - ckan/templates-bs2/group/members.html | 38 - ckan/templates-bs2/group/new.html | 13 - ckan/templates-bs2/group/new_group_form.html | 25 - ckan/templates-bs2/group/read.html | 43 - ckan/templates-bs2/group/read_base.html | 29 - ckan/templates-bs2/group/snippets/feeds.html | 4 - .../group/snippets/group_form.html | 43 - .../group/snippets/group_item.html | 50 - .../group/snippets/group_list.html | 19 - ckan/templates-bs2/group/snippets/helper.html | 16 - ckan/templates-bs2/group/snippets/info.html | 50 - ckan/templates-bs2/header.html | 124 - ckan/templates-bs2/home/about.html | 24 - ckan/templates-bs2/home/index.html | 18 - ckan/templates-bs2/home/layout1.html | 37 - ckan/templates-bs2/home/layout2.html | 35 - ckan/templates-bs2/home/layout3.html | 23 - .../home/snippets/about_text.html | 20 - .../home/snippets/featured_group.html | 7 - .../home/snippets/featured_organization.html | 7 - .../templates-bs2/home/snippets/promoted.html | 27 - ckan/templates-bs2/home/snippets/search.html | 22 - ckan/templates-bs2/home/snippets/stats.html | 29 - ckan/templates-bs2/macros/autoform.html | 70 - ckan/templates-bs2/macros/form.html | 430 - ckan/templates-bs2/organization/about.html | 15 - .../organization/activity_stream.html | 12 - ckan/templates-bs2/organization/admins.html | 10 - .../organization/base_form_page.html | 10 - .../organization/bulk_process.html | 112 - .../organization/confirm_delete.html | 21 - .../organization/confirm_delete_member.html | 22 - ckan/templates-bs2/organization/edit.html | 6 - .../templates-bs2/organization/edit_base.html | 33 - ckan/templates-bs2/organization/index.html | 43 - .../organization/member_new.html | 90 - ckan/templates-bs2/organization/members.html | 43 - ckan/templates-bs2/organization/new.html | 17 - .../organization/new_organization_form.html | 25 - ckan/templates-bs2/organization/read.html | 46 - .../templates-bs2/organization/read_base.html | 30 - .../organization/snippets/feeds.html | 4 - .../organization/snippets/help.html | 17 - .../organization/snippets/helper.html | 15 - .../organization/snippets/info.html | 20 - .../snippets/organization_form.html | 43 - .../snippets/organization_item.html | 51 - .../snippets/organization_list.html | 19 - ckan/templates-bs2/package/activity.html | 12 - ckan/templates-bs2/package/base.html | 24 - .../templates-bs2/package/base_form_page.html | 36 - .../templates-bs2/package/confirm_delete.html | 22 - .../package/confirm_delete_resource.html | 21 - ckan/templates-bs2/package/edit.html | 7 - ckan/templates-bs2/package/edit_base.html | 23 - ckan/templates-bs2/package/edit_view.html | 24 - ckan/templates-bs2/package/followers.html | 10 - ckan/templates-bs2/package/group_list.html | 26 - ckan/templates-bs2/package/new.html | 10 - .../package/new_package_form.html | 28 - ckan/templates-bs2/package/new_resource.html | 24 - .../package/new_resource_not_draft.html | 21 - ckan/templates-bs2/package/new_view.html | 32 - ckan/templates-bs2/package/read.html | 56 - ckan/templates-bs2/package/read_base.html | 49 - ckan/templates-bs2/package/resource_edit.html | 14 - .../package/resource_edit_base.html | 41 - ckan/templates-bs2/package/resource_read.html | 234 - .../templates-bs2/package/resource_views.html | 30 - ckan/templates-bs2/package/resources.html | 31 - ckan/templates-bs2/package/search.html | 81 - .../package/snippets/additional_info.html | 91 - .../snippets/cannot_create_package.html | 27 - ckan/templates-bs2/package/snippets/info.html | 41 - .../snippets/new_package_breadcrumb.html | 2 - .../snippets/package_basic_fields.html | 118 - .../package/snippets/package_form.html | 48 - .../snippets/package_metadata_fields.html | 34 - .../package/snippets/resource_edit_form.html | 12 - .../package/snippets/resource_form.html | 85 - .../package/snippets/resource_help.html | 6 - .../package/snippets/resource_info.html | 21 - .../package/snippets/resource_item.html | 79 - .../package/snippets/resource_view.html | 77 - .../package/snippets/resource_view_embed.html | 9 - .../snippets/resource_view_filters.html | 7 - .../package/snippets/resource_views_list.html | 25 - .../snippets/resource_views_list_item.html | 18 - .../package/snippets/resources.html | 35 - .../package/snippets/resources_list.html | 35 - .../package/snippets/stages.html | 40 - ckan/templates-bs2/package/snippets/tags.html | 15 - .../package/snippets/view_form.html | 19 - .../package/snippets/view_form_filters.html | 48 - .../package/snippets/view_help.html | 6 - .../templates-bs2/package/view_edit_base.html | 55 - ckan/templates-bs2/page.html | 138 - ckan/templates-bs2/revision/__init__.py | 3 - ckan/templates-bs2/robots.txt | 11 - .../snippets/activities/added_tag.html | 14 - .../snippets/activities/changed_group.html | 13 - .../activities/changed_organization.html | 13 - .../snippets/activities/changed_package.html | 23 - .../snippets/activities/changed_resource.html | 14 - .../snippets/activities/changed_user.html | 12 - .../snippets/activities/deleted_group.html | 13 - .../activities/deleted_organization.html | 13 - .../snippets/activities/deleted_package.html | 13 - .../snippets/activities/deleted_resource.html | 14 - .../snippets/activities/fallback.html | 37 - .../snippets/activities/follow_dataset.html | 13 - .../snippets/activities/follow_group.html | 13 - .../snippets/activities/follow_user.html | 13 - .../snippets/activities/new_group.html | 13 - .../snippets/activities/new_organization.html | 13 - .../snippets/activities/new_package.html | 19 - .../snippets/activities/new_resource.html | 14 - .../snippets/activities/new_user.html | 12 - .../snippets/activities/removed_tag.html | 14 - .../snippets/activity_stream.html | 59 - .../snippets/additional_info.html | 25 - ckan/templates-bs2/snippets/context.html | 10 - .../snippets/context/dataset.html | 21 - .../templates-bs2/snippets/context/group.html | 21 - ckan/templates-bs2/snippets/context/user.html | 27 - .../snippets/custom_form_fields.html | 42 - .../snippets/datapreview_embed_dialog.html | 18 - .../snippets/datapusher_status.html | 14 - ckan/templates-bs2/snippets/debug.html | 63 - .../snippets/disqus_trackback.html | 4 - ckan/templates-bs2/snippets/facet_list.html | 95 - .../templates-bs2/snippets/follow_button.html | 16 - ckan/templates-bs2/snippets/group.html | 27 - ckan/templates-bs2/snippets/group_item.html | 33 - .../snippets/home_breadcrumb_item.html | 2 - .../snippets/language_selector.html | 13 - ckan/templates-bs2/snippets/license.html | 39 - .../snippets/local_friendly_datetime.html | 14 - ckan/templates-bs2/snippets/organization.html | 73 - .../snippets/organization_item.html | 32 - ckan/templates-bs2/snippets/package_grid.html | 30 - ckan/templates-bs2/snippets/package_item.html | 78 - ckan/templates-bs2/snippets/package_list.html | 27 - ckan/templates-bs2/snippets/popular.html | 4 - ckan/templates-bs2/snippets/private.html | 3 - ckan/templates-bs2/snippets/search_form.html | 90 - .../snippets/search_result_text.html | 45 - .../templates-bs2/snippets/simple_search.html | 17 - ckan/templates-bs2/snippets/social.html | 14 - ckan/templates-bs2/snippets/sort_by.html | 23 - ckan/templates-bs2/snippets/subscribe.html | 7 - ckan/templates-bs2/snippets/tag_list.html | 20 - ckan/templates-bs2/tag/index.html | 39 - .../tests/broken_helper_as_attribute.html | 5 - .../tests/broken_helper_as_item.html | 5 - ckan/templates-bs2/tests/flash_messages.html | 14 - .../tests/helper_as_attribute.html | 5 - ckan/templates-bs2/tests/helper_as_item.html | 5 - .../mock_json_resource_preview_template.html | 17 - .../tests/mock_resource_preview_template.html | 17 - ckan/templates-bs2/user/activity_stream.html | 12 - ckan/templates-bs2/user/dashboard.html | 46 - .../user/dashboard_datasets.html | 23 - ckan/templates-bs2/user/dashboard_groups.html | 26 - .../user/dashboard_organizations.html | 27 - ckan/templates-bs2/user/edit.html | 25 - ckan/templates-bs2/user/edit_base.html | 11 - ckan/templates-bs2/user/edit_user_form.html | 56 - ckan/templates-bs2/user/followers.html | 12 - ckan/templates-bs2/user/list.html | 33 - ckan/templates-bs2/user/login.html | 54 - ckan/templates-bs2/user/logout.html | 14 - ckan/templates-bs2/user/logout_first.html | 28 - ckan/templates-bs2/user/new.html | 33 - ckan/templates-bs2/user/new_user_form.html | 22 - ckan/templates-bs2/user/perform_reset.html | 45 - ckan/templates-bs2/user/read.html | 26 - ckan/templates-bs2/user/read_base.html | 105 - ckan/templates-bs2/user/request_reset.html | 40 - .../user/snippets/followee_dropdown.html | 47 - .../user/snippets/followers.html | 10 - .../user/snippets/login_form.html | 31 - .../user/snippets/recaptcha.html | 28 - .../user/snippets/user_search.html | 13 - 524 files changed, 125667 deletions(-) delete mode 100644 ckan/public-bs2/base/css/.gitignore delete mode 100644 ckan/public-bs2/base/css/fuchsia.css delete mode 100644 ckan/public-bs2/base/css/green.css delete mode 100644 ckan/public-bs2/base/css/main.css delete mode 100644 ckan/public-bs2/base/css/maroon.css delete mode 100644 ckan/public-bs2/base/css/red.css delete mode 100644 ckan/public-bs2/base/i18n/.gitignore delete mode 100644 ckan/public-bs2/base/images/background-tag-ie7.png delete mode 100644 ckan/public-bs2/base/images/background-tag.png delete mode 100644 ckan/public-bs2/base/images/background-tile.png delete mode 100644 ckan/public-bs2/base/images/bg.png delete mode 100644 ckan/public-bs2/base/images/breadcrumb-slash-ie7.png delete mode 100644 ckan/public-bs2/base/images/ckan-logo-footer.png delete mode 100644 ckan/public-bs2/base/images/ckan-logo-white.svg delete mode 100644 ckan/public-bs2/base/images/ckan-logo.png delete mode 100644 ckan/public-bs2/base/images/ckan-logo.svg delete mode 100644 ckan/public-bs2/base/images/ckan.ico delete mode 100644 ckan/public-bs2/base/images/dashboard-followee-related.png delete mode 100644 ckan/public-bs2/base/images/dotted.png delete mode 100644 ckan/public-bs2/base/images/editing.png delete mode 100644 ckan/public-bs2/base/images/full-width-nav-right.png delete mode 100644 ckan/public-bs2/base/images/icon-search-27x26.png delete mode 100644 ckan/public-bs2/base/images/loading-spinner.gif delete mode 100644 ckan/public-bs2/base/images/nav-active.png delete mode 100644 ckan/public-bs2/base/images/nav.png delete mode 100644 ckan/public-bs2/base/images/od_80x15_blue.png delete mode 100644 ckan/public-bs2/base/images/placeholder-200x125.png delete mode 100644 ckan/public-bs2/base/images/placeholder-420x220.png delete mode 100644 ckan/public-bs2/base/images/placeholder-680x400.png delete mode 100644 ckan/public-bs2/base/images/placeholder-application.png delete mode 100644 ckan/public-bs2/base/images/placeholder-group.png delete mode 100644 ckan/public-bs2/base/images/placeholder-image.png delete mode 100644 ckan/public-bs2/base/images/placeholder-organization.png delete mode 100644 ckan/public-bs2/base/images/sprite-ckan-icons.png delete mode 100644 ckan/public-bs2/base/images/sprite-resource-icons.png delete mode 100644 ckan/public-bs2/base/images/table-seperator.png delete mode 100644 ckan/public-bs2/base/javascript/client.js delete mode 100644 ckan/public-bs2/base/javascript/i18n.js delete mode 100644 ckan/public-bs2/base/javascript/main.js delete mode 100644 ckan/public-bs2/base/javascript/module.js delete mode 100644 ckan/public-bs2/base/javascript/modules/activity-stream.js delete mode 100644 ckan/public-bs2/base/javascript/modules/api-info.js delete mode 100644 ckan/public-bs2/base/javascript/modules/autocomplete.js delete mode 100644 ckan/public-bs2/base/javascript/modules/basic-form.js delete mode 100644 ckan/public-bs2/base/javascript/modules/confirm-action.js delete mode 100644 ckan/public-bs2/base/javascript/modules/custom-fields.js delete mode 100644 ckan/public-bs2/base/javascript/modules/dashboard.js delete mode 100644 ckan/public-bs2/base/javascript/modules/data-viewer.js delete mode 100644 ckan/public-bs2/base/javascript/modules/dataset-visibility.js delete mode 100644 ckan/public-bs2/base/javascript/modules/follow.js delete mode 100644 ckan/public-bs2/base/javascript/modules/followers-counter.js delete mode 100644 ckan/public-bs2/base/javascript/modules/image-upload.js delete mode 100644 ckan/public-bs2/base/javascript/modules/media-grid.js delete mode 100644 ckan/public-bs2/base/javascript/modules/popover-context.js delete mode 100644 ckan/public-bs2/base/javascript/modules/resource-form.js delete mode 100644 ckan/public-bs2/base/javascript/modules/resource-reorder.js delete mode 100644 ckan/public-bs2/base/javascript/modules/resource-upload-field.js delete mode 100644 ckan/public-bs2/base/javascript/modules/resource-view-embed.js delete mode 100644 ckan/public-bs2/base/javascript/modules/resource-view-filters-form.js delete mode 100644 ckan/public-bs2/base/javascript/modules/resource-view-filters.js delete mode 100644 ckan/public-bs2/base/javascript/modules/resource-view-reorder.js delete mode 100644 ckan/public-bs2/base/javascript/modules/select-switch.js delete mode 100644 ckan/public-bs2/base/javascript/modules/slug-preview.js delete mode 100644 ckan/public-bs2/base/javascript/modules/table-selectable-rows.js delete mode 100644 ckan/public-bs2/base/javascript/modules/table-toggle-more.js delete mode 100644 ckan/public-bs2/base/javascript/notify.js delete mode 100644 ckan/public-bs2/base/javascript/plugins/jquery.date-helpers.js delete mode 100644 ckan/public-bs2/base/javascript/plugins/jquery.form-warning.js delete mode 100644 ckan/public-bs2/base/javascript/plugins/jquery.images-loaded.js delete mode 100644 ckan/public-bs2/base/javascript/plugins/jquery.inherit.js delete mode 100644 ckan/public-bs2/base/javascript/plugins/jquery.masonry.js delete mode 100644 ckan/public-bs2/base/javascript/plugins/jquery.proxy-all.js delete mode 100644 ckan/public-bs2/base/javascript/plugins/jquery.slug-preview.js delete mode 100644 ckan/public-bs2/base/javascript/plugins/jquery.slug.js delete mode 100644 ckan/public-bs2/base/javascript/plugins/jquery.truncator.js delete mode 100644 ckan/public-bs2/base/javascript/plugins/jquery.url-helpers.js delete mode 100644 ckan/public-bs2/base/javascript/pubsub.js delete mode 100644 ckan/public-bs2/base/javascript/resource.config delete mode 100644 ckan/public-bs2/base/javascript/sandbox.js delete mode 100644 ckan/public-bs2/base/javascript/tracking.js delete mode 100644 ckan/public-bs2/base/javascript/view-filters.js delete mode 100644 ckan/public-bs2/base/less/activity.less delete mode 100644 ckan/public-bs2/base/less/ckan.less delete mode 100644 ckan/public-bs2/base/less/custom.less delete mode 100644 ckan/public-bs2/base/less/dashboard.less delete mode 100644 ckan/public-bs2/base/less/datapusher.less delete mode 100644 ckan/public-bs2/base/less/dataset.less delete mode 100644 ckan/public-bs2/base/less/dropdown.less delete mode 100644 ckan/public-bs2/base/less/footer.less delete mode 100644 ckan/public-bs2/base/less/forms.less delete mode 100644 ckan/public-bs2/base/less/group.less delete mode 100644 ckan/public-bs2/base/less/homepage.less delete mode 100644 ckan/public-bs2/base/less/icons.less delete mode 100644 ckan/public-bs2/base/less/iehacks.less delete mode 100644 ckan/public-bs2/base/less/layout.less delete mode 100644 ckan/public-bs2/base/less/main.less delete mode 100644 ckan/public-bs2/base/less/masthead.less delete mode 100644 ckan/public-bs2/base/less/media.less delete mode 100644 ckan/public-bs2/base/less/mixins.less delete mode 100644 ckan/public-bs2/base/less/module.less delete mode 100644 ckan/public-bs2/base/less/nav.less delete mode 100644 ckan/public-bs2/base/less/profile.less delete mode 100644 ckan/public-bs2/base/less/prose.less delete mode 100644 ckan/public-bs2/base/less/resource-view.less delete mode 100644 ckan/public-bs2/base/less/search.less delete mode 100644 ckan/public-bs2/base/less/tables.less delete mode 100644 ckan/public-bs2/base/less/toolbar.less delete mode 100644 ckan/public-bs2/base/less/variables.less delete mode 100644 ckan/public-bs2/base/test/index.html delete mode 100644 ckan/public-bs2/base/test/primer/index.html delete mode 100644 ckan/public-bs2/base/test/spec/ckan.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/client.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/i18n.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/module.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/modules/autocomplete.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/modules/basic-form.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/modules/confirm-action.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/modules/custom-fields.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/modules/followers-counter.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/modules/image-upload.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/modules/resource-form.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/modules/resource-upload-field.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/notify.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/plugins/jquery.date-helpers.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/plugins/jquery.form-warning.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/plugins/jquery.inherit.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/plugins/jquery.proxy-all.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/plugins/jquery.slug-preview.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/plugins/jquery.slug.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/plugins/jquery.url-helpers.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/pubsub.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/sandbox.spec.js delete mode 100644 ckan/public-bs2/base/test/spec/view-filters.spec.js delete mode 100644 ckan/public-bs2/base/test/vendor/chai.js delete mode 100644 ckan/public-bs2/base/test/vendor/less.js delete mode 100644 ckan/public-bs2/base/test/vendor/mocha.css delete mode 100644 ckan/public-bs2/base/test/vendor/mocha.js delete mode 100644 ckan/public-bs2/base/test/vendor/sinon.js delete mode 100644 ckan/public-bs2/base/vendor/bootstrap.js delete mode 100644 ckan/public-bs2/base/vendor/bootstrap.min.js delete mode 100644 ckan/public-bs2/base/vendor/bootstrap/img/glyphicons-halflings-white.png delete mode 100644 ckan/public-bs2/base/vendor/bootstrap/img/glyphicons-halflings.png delete mode 100644 ckan/public-bs2/base/vendor/bootstrap/js/bootstrap.js delete mode 100644 ckan/public-bs2/base/vendor/bootstrap/js/bootstrap.min.js delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/accordion.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/alerts.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/bootstrap.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/breadcrumbs.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/button-groups.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/buttons.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/carousel.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/close.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/code.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/component-animations.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/dropdowns.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/forms.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/grid.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/hero-unit.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/labels-badges.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/layouts.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/media.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/mixins.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/modals.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/navbar.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/navs.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/pager.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/pagination.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/popovers.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/progress-bars.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/reset.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/responsive-1200px-min.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/responsive-767px-max.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/responsive-768px-979px.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/responsive-navbar.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/responsive-utilities.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/responsive.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/scaffolding.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/sprites.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/tables.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/tests/buttons.html delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/tests/css-tests.css delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/tests/css-tests.html delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/tests/forms-responsive.html delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/tests/forms.html delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar-fixed-top.html delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar-static-top.html delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar.html delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/thumbnails.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/tooltip.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/type.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/utilities.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/variables.less delete mode 100755 ckan/public-bs2/base/vendor/bootstrap/less/wells.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/css/font-awesome.css delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/css/font-awesome.min.css delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/fonts/FontAwesome.otf delete mode 100755 ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.eot delete mode 100755 ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.svg delete mode 100755 ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.ttf delete mode 100755 ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.woff delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/bordered-pulled.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/core.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/extras.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/fixed-width.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/font-awesome.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/icons.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/larger.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/list.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/mixins.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/path.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/rotated-flipped.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/spinning.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/stacked.less delete mode 100644 ckan/public-bs2/base/vendor/font-awesome/less/variables.less delete mode 100644 ckan/public-bs2/base/vendor/html5.js delete mode 100644 ckan/public-bs2/base/vendor/html5.min.js delete mode 100755 ckan/public-bs2/base/vendor/jed.js delete mode 100644 ckan/public-bs2/base/vendor/jed.min.js delete mode 100644 ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload-ui.js delete mode 100644 ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload-ui.min.js delete mode 100644 ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload.js delete mode 100644 ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload.min.js delete mode 100644 ckan/public-bs2/base/vendor/jquery-fileupload/jquery.iframe-transport.js delete mode 100644 ckan/public-bs2/base/vendor/jquery-fileupload/jquery.iframe-transport.min.js delete mode 100644 ckan/public-bs2/base/vendor/jquery.js delete mode 100644 ckan/public-bs2/base/vendor/jquery.min.js delete mode 100755 ckan/public-bs2/base/vendor/jquery.ui.core.js delete mode 100755 ckan/public-bs2/base/vendor/jquery.ui.mouse.js delete mode 100755 ckan/public-bs2/base/vendor/jquery.ui.sortable.js delete mode 100755 ckan/public-bs2/base/vendor/jquery.ui.widget.js delete mode 100644 ckan/public-bs2/base/vendor/moment-with-locales.js delete mode 100644 ckan/public-bs2/base/vendor/polyfill-object-keys.js delete mode 100644 ckan/public-bs2/base/vendor/resource.config delete mode 100644 ckan/public-bs2/base/vendor/select2/.gitignore delete mode 100644 ckan/public-bs2/base/vendor/select2/CONTRIBUTING.md delete mode 100644 ckan/public-bs2/base/vendor/select2/LICENSE delete mode 100644 ckan/public-bs2/base/vendor/select2/README.md delete mode 100644 ckan/public-bs2/base/vendor/select2/bower.json delete mode 100644 ckan/public-bs2/base/vendor/select2/component.json delete mode 100644 ckan/public-bs2/base/vendor/select2/composer.json delete mode 100644 ckan/public-bs2/base/vendor/select2/package.json delete mode 100755 ckan/public-bs2/base/vendor/select2/release.sh delete mode 100644 ckan/public-bs2/base/vendor/select2/select2-bootstrap.css delete mode 100644 ckan/public-bs2/base/vendor/select2/select2-spinner.gif delete mode 100644 ckan/public-bs2/base/vendor/select2/select2.css delete mode 100644 ckan/public-bs2/base/vendor/select2/select2.jquery.json delete mode 100644 ckan/public-bs2/base/vendor/select2/select2.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2.min.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2.png delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_ar.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_az.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_bg.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_ca.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_cs.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_da.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_de.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_el.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_en.js.template delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_es.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_et.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_eu.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_fa.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_fi.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_fr.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_gl.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_he.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_hr.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_hu.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_id.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_is.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_it.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_ja.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_ka.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_ko.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_lt.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_lv.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_mk.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_ms.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_nb.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_nl.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_pl.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_pt-BR.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_pt-PT.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_ro.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_rs.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_ru.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_sk.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_sv.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_th.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_tr.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_ug-CN.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_uk.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_vi.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_zh-CN.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2_locale_zh-TW.js delete mode 100644 ckan/public-bs2/base/vendor/select2/select2x2.png delete mode 100644 ckan/templates-bs2/activity_streams/activity_stream_email_notifications.text delete mode 100644 ckan/templates-bs2/activity_streams/activity_stream_items.html delete mode 100644 ckan/templates-bs2/admin/base.html delete mode 100644 ckan/templates-bs2/admin/config.html delete mode 100644 ckan/templates-bs2/admin/confirm_reset.html delete mode 100644 ckan/templates-bs2/admin/index.html delete mode 100644 ckan/templates-bs2/admin/trash.html delete mode 100644 ckan/templates-bs2/ajax_snippets/custom_fields.html delete mode 100644 ckan/templates-bs2/ajax_snippets/follow_button.html delete mode 100644 ckan/templates-bs2/base.html delete mode 100644 ckan/templates-bs2/dataviewer/base.html delete mode 100644 ckan/templates-bs2/dataviewer/snippets/data_preview.html delete mode 100644 ckan/templates-bs2/dataviewer/snippets/no_preview.html delete mode 100644 ckan/templates-bs2/development/primer.html delete mode 100644 ckan/templates-bs2/development/snippets/actions.html delete mode 100644 ckan/templates-bs2/development/snippets/breadcrumb.html delete mode 100644 ckan/templates-bs2/development/snippets/context.html delete mode 100644 ckan/templates-bs2/development/snippets/facet.html delete mode 100644 ckan/templates-bs2/development/snippets/form.html delete mode 100644 ckan/templates-bs2/development/snippets/form_stages.html delete mode 100644 ckan/templates-bs2/development/snippets/list.html delete mode 100644 ckan/templates-bs2/development/snippets/media_grid.html delete mode 100644 ckan/templates-bs2/development/snippets/module.html delete mode 100644 ckan/templates-bs2/development/snippets/nav.html delete mode 100644 ckan/templates-bs2/development/snippets/page_header.html delete mode 100644 ckan/templates-bs2/development/snippets/pagination.html delete mode 100644 ckan/templates-bs2/development/snippets/simple-input.html delete mode 100644 ckan/templates-bs2/emails/invite_user.txt delete mode 100644 ckan/templates-bs2/emails/invite_user_subject.txt delete mode 100644 ckan/templates-bs2/emails/reset_password.txt delete mode 100644 ckan/templates-bs2/emails/reset_password_subject.txt delete mode 100644 ckan/templates-bs2/error_document_template.html delete mode 100644 ckan/templates-bs2/footer.html delete mode 100644 ckan/templates-bs2/group/about.html delete mode 100644 ckan/templates-bs2/group/activity_stream.html delete mode 100644 ckan/templates-bs2/group/admins.html delete mode 100644 ckan/templates-bs2/group/base_form_page.html delete mode 100644 ckan/templates-bs2/group/confirm_delete.html delete mode 100644 ckan/templates-bs2/group/confirm_delete_member.html delete mode 100644 ckan/templates-bs2/group/edit.html delete mode 100644 ckan/templates-bs2/group/edit_base.html delete mode 100644 ckan/templates-bs2/group/followers.html delete mode 100644 ckan/templates-bs2/group/index.html delete mode 100644 ckan/templates-bs2/group/member_new.html delete mode 100644 ckan/templates-bs2/group/members.html delete mode 100644 ckan/templates-bs2/group/new.html delete mode 100644 ckan/templates-bs2/group/new_group_form.html delete mode 100644 ckan/templates-bs2/group/read.html delete mode 100644 ckan/templates-bs2/group/read_base.html delete mode 100644 ckan/templates-bs2/group/snippets/feeds.html delete mode 100644 ckan/templates-bs2/group/snippets/group_form.html delete mode 100644 ckan/templates-bs2/group/snippets/group_item.html delete mode 100644 ckan/templates-bs2/group/snippets/group_list.html delete mode 100644 ckan/templates-bs2/group/snippets/helper.html delete mode 100644 ckan/templates-bs2/group/snippets/info.html delete mode 100644 ckan/templates-bs2/header.html delete mode 100644 ckan/templates-bs2/home/about.html delete mode 100644 ckan/templates-bs2/home/index.html delete mode 100644 ckan/templates-bs2/home/layout1.html delete mode 100644 ckan/templates-bs2/home/layout2.html delete mode 100644 ckan/templates-bs2/home/layout3.html delete mode 100644 ckan/templates-bs2/home/snippets/about_text.html delete mode 100644 ckan/templates-bs2/home/snippets/featured_group.html delete mode 100644 ckan/templates-bs2/home/snippets/featured_organization.html delete mode 100644 ckan/templates-bs2/home/snippets/promoted.html delete mode 100644 ckan/templates-bs2/home/snippets/search.html delete mode 100644 ckan/templates-bs2/home/snippets/stats.html delete mode 100644 ckan/templates-bs2/macros/autoform.html delete mode 100644 ckan/templates-bs2/macros/form.html delete mode 100644 ckan/templates-bs2/organization/about.html delete mode 100644 ckan/templates-bs2/organization/activity_stream.html delete mode 100644 ckan/templates-bs2/organization/admins.html delete mode 100644 ckan/templates-bs2/organization/base_form_page.html delete mode 100644 ckan/templates-bs2/organization/bulk_process.html delete mode 100644 ckan/templates-bs2/organization/confirm_delete.html delete mode 100644 ckan/templates-bs2/organization/confirm_delete_member.html delete mode 100644 ckan/templates-bs2/organization/edit.html delete mode 100644 ckan/templates-bs2/organization/edit_base.html delete mode 100644 ckan/templates-bs2/organization/index.html delete mode 100644 ckan/templates-bs2/organization/member_new.html delete mode 100644 ckan/templates-bs2/organization/members.html delete mode 100644 ckan/templates-bs2/organization/new.html delete mode 100644 ckan/templates-bs2/organization/new_organization_form.html delete mode 100644 ckan/templates-bs2/organization/read.html delete mode 100644 ckan/templates-bs2/organization/read_base.html delete mode 100644 ckan/templates-bs2/organization/snippets/feeds.html delete mode 100644 ckan/templates-bs2/organization/snippets/help.html delete mode 100644 ckan/templates-bs2/organization/snippets/helper.html delete mode 100644 ckan/templates-bs2/organization/snippets/info.html delete mode 100644 ckan/templates-bs2/organization/snippets/organization_form.html delete mode 100644 ckan/templates-bs2/organization/snippets/organization_item.html delete mode 100644 ckan/templates-bs2/organization/snippets/organization_list.html delete mode 100644 ckan/templates-bs2/package/activity.html delete mode 100644 ckan/templates-bs2/package/base.html delete mode 100644 ckan/templates-bs2/package/base_form_page.html delete mode 100644 ckan/templates-bs2/package/confirm_delete.html delete mode 100644 ckan/templates-bs2/package/confirm_delete_resource.html delete mode 100644 ckan/templates-bs2/package/edit.html delete mode 100644 ckan/templates-bs2/package/edit_base.html delete mode 100644 ckan/templates-bs2/package/edit_view.html delete mode 100644 ckan/templates-bs2/package/followers.html delete mode 100644 ckan/templates-bs2/package/group_list.html delete mode 100644 ckan/templates-bs2/package/new.html delete mode 100644 ckan/templates-bs2/package/new_package_form.html delete mode 100644 ckan/templates-bs2/package/new_resource.html delete mode 100644 ckan/templates-bs2/package/new_resource_not_draft.html delete mode 100644 ckan/templates-bs2/package/new_view.html delete mode 100644 ckan/templates-bs2/package/read.html delete mode 100644 ckan/templates-bs2/package/read_base.html delete mode 100644 ckan/templates-bs2/package/resource_edit.html delete mode 100644 ckan/templates-bs2/package/resource_edit_base.html delete mode 100644 ckan/templates-bs2/package/resource_read.html delete mode 100644 ckan/templates-bs2/package/resource_views.html delete mode 100644 ckan/templates-bs2/package/resources.html delete mode 100644 ckan/templates-bs2/package/search.html delete mode 100644 ckan/templates-bs2/package/snippets/additional_info.html delete mode 100644 ckan/templates-bs2/package/snippets/cannot_create_package.html delete mode 100644 ckan/templates-bs2/package/snippets/info.html delete mode 100644 ckan/templates-bs2/package/snippets/new_package_breadcrumb.html delete mode 100644 ckan/templates-bs2/package/snippets/package_basic_fields.html delete mode 100644 ckan/templates-bs2/package/snippets/package_form.html delete mode 100644 ckan/templates-bs2/package/snippets/package_metadata_fields.html delete mode 100644 ckan/templates-bs2/package/snippets/resource_edit_form.html delete mode 100644 ckan/templates-bs2/package/snippets/resource_form.html delete mode 100644 ckan/templates-bs2/package/snippets/resource_help.html delete mode 100644 ckan/templates-bs2/package/snippets/resource_info.html delete mode 100644 ckan/templates-bs2/package/snippets/resource_item.html delete mode 100644 ckan/templates-bs2/package/snippets/resource_view.html delete mode 100644 ckan/templates-bs2/package/snippets/resource_view_embed.html delete mode 100644 ckan/templates-bs2/package/snippets/resource_view_filters.html delete mode 100644 ckan/templates-bs2/package/snippets/resource_views_list.html delete mode 100644 ckan/templates-bs2/package/snippets/resource_views_list_item.html delete mode 100644 ckan/templates-bs2/package/snippets/resources.html delete mode 100644 ckan/templates-bs2/package/snippets/resources_list.html delete mode 100644 ckan/templates-bs2/package/snippets/stages.html delete mode 100644 ckan/templates-bs2/package/snippets/tags.html delete mode 100644 ckan/templates-bs2/package/snippets/view_form.html delete mode 100644 ckan/templates-bs2/package/snippets/view_form_filters.html delete mode 100644 ckan/templates-bs2/package/snippets/view_help.html delete mode 100644 ckan/templates-bs2/package/view_edit_base.html delete mode 100644 ckan/templates-bs2/page.html delete mode 100644 ckan/templates-bs2/revision/__init__.py delete mode 100644 ckan/templates-bs2/robots.txt delete mode 100644 ckan/templates-bs2/snippets/activities/added_tag.html delete mode 100644 ckan/templates-bs2/snippets/activities/changed_group.html delete mode 100644 ckan/templates-bs2/snippets/activities/changed_organization.html delete mode 100644 ckan/templates-bs2/snippets/activities/changed_package.html delete mode 100644 ckan/templates-bs2/snippets/activities/changed_resource.html delete mode 100644 ckan/templates-bs2/snippets/activities/changed_user.html delete mode 100644 ckan/templates-bs2/snippets/activities/deleted_group.html delete mode 100644 ckan/templates-bs2/snippets/activities/deleted_organization.html delete mode 100644 ckan/templates-bs2/snippets/activities/deleted_package.html delete mode 100644 ckan/templates-bs2/snippets/activities/deleted_resource.html delete mode 100644 ckan/templates-bs2/snippets/activities/fallback.html delete mode 100644 ckan/templates-bs2/snippets/activities/follow_dataset.html delete mode 100644 ckan/templates-bs2/snippets/activities/follow_group.html delete mode 100644 ckan/templates-bs2/snippets/activities/follow_user.html delete mode 100644 ckan/templates-bs2/snippets/activities/new_group.html delete mode 100644 ckan/templates-bs2/snippets/activities/new_organization.html delete mode 100644 ckan/templates-bs2/snippets/activities/new_package.html delete mode 100644 ckan/templates-bs2/snippets/activities/new_resource.html delete mode 100644 ckan/templates-bs2/snippets/activities/new_user.html delete mode 100644 ckan/templates-bs2/snippets/activities/removed_tag.html delete mode 100644 ckan/templates-bs2/snippets/activity_stream.html delete mode 100644 ckan/templates-bs2/snippets/additional_info.html delete mode 100644 ckan/templates-bs2/snippets/context.html delete mode 100644 ckan/templates-bs2/snippets/context/dataset.html delete mode 100644 ckan/templates-bs2/snippets/context/group.html delete mode 100644 ckan/templates-bs2/snippets/context/user.html delete mode 100644 ckan/templates-bs2/snippets/custom_form_fields.html delete mode 100644 ckan/templates-bs2/snippets/datapreview_embed_dialog.html delete mode 100644 ckan/templates-bs2/snippets/datapusher_status.html delete mode 100644 ckan/templates-bs2/snippets/debug.html delete mode 100644 ckan/templates-bs2/snippets/disqus_trackback.html delete mode 100644 ckan/templates-bs2/snippets/facet_list.html delete mode 100644 ckan/templates-bs2/snippets/follow_button.html delete mode 100644 ckan/templates-bs2/snippets/group.html delete mode 100644 ckan/templates-bs2/snippets/group_item.html delete mode 100644 ckan/templates-bs2/snippets/home_breadcrumb_item.html delete mode 100644 ckan/templates-bs2/snippets/language_selector.html delete mode 100644 ckan/templates-bs2/snippets/license.html delete mode 100644 ckan/templates-bs2/snippets/local_friendly_datetime.html delete mode 100644 ckan/templates-bs2/snippets/organization.html delete mode 100644 ckan/templates-bs2/snippets/organization_item.html delete mode 100644 ckan/templates-bs2/snippets/package_grid.html delete mode 100644 ckan/templates-bs2/snippets/package_item.html delete mode 100644 ckan/templates-bs2/snippets/package_list.html delete mode 100644 ckan/templates-bs2/snippets/popular.html delete mode 100644 ckan/templates-bs2/snippets/private.html delete mode 100644 ckan/templates-bs2/snippets/search_form.html delete mode 100644 ckan/templates-bs2/snippets/search_result_text.html delete mode 100644 ckan/templates-bs2/snippets/simple_search.html delete mode 100644 ckan/templates-bs2/snippets/social.html delete mode 100644 ckan/templates-bs2/snippets/sort_by.html delete mode 100644 ckan/templates-bs2/snippets/subscribe.html delete mode 100644 ckan/templates-bs2/snippets/tag_list.html delete mode 100644 ckan/templates-bs2/tag/index.html delete mode 100644 ckan/templates-bs2/tests/broken_helper_as_attribute.html delete mode 100644 ckan/templates-bs2/tests/broken_helper_as_item.html delete mode 100644 ckan/templates-bs2/tests/flash_messages.html delete mode 100644 ckan/templates-bs2/tests/helper_as_attribute.html delete mode 100644 ckan/templates-bs2/tests/helper_as_item.html delete mode 100644 ckan/templates-bs2/tests/mock_json_resource_preview_template.html delete mode 100644 ckan/templates-bs2/tests/mock_resource_preview_template.html delete mode 100644 ckan/templates-bs2/user/activity_stream.html delete mode 100644 ckan/templates-bs2/user/dashboard.html delete mode 100644 ckan/templates-bs2/user/dashboard_datasets.html delete mode 100644 ckan/templates-bs2/user/dashboard_groups.html delete mode 100644 ckan/templates-bs2/user/dashboard_organizations.html delete mode 100644 ckan/templates-bs2/user/edit.html delete mode 100644 ckan/templates-bs2/user/edit_base.html delete mode 100644 ckan/templates-bs2/user/edit_user_form.html delete mode 100644 ckan/templates-bs2/user/followers.html delete mode 100644 ckan/templates-bs2/user/list.html delete mode 100644 ckan/templates-bs2/user/login.html delete mode 100644 ckan/templates-bs2/user/logout.html delete mode 100644 ckan/templates-bs2/user/logout_first.html delete mode 100644 ckan/templates-bs2/user/new.html delete mode 100644 ckan/templates-bs2/user/new_user_form.html delete mode 100644 ckan/templates-bs2/user/perform_reset.html delete mode 100644 ckan/templates-bs2/user/read.html delete mode 100644 ckan/templates-bs2/user/read_base.html delete mode 100644 ckan/templates-bs2/user/request_reset.html delete mode 100644 ckan/templates-bs2/user/snippets/followee_dropdown.html delete mode 100644 ckan/templates-bs2/user/snippets/followers.html delete mode 100644 ckan/templates-bs2/user/snippets/login_form.html delete mode 100644 ckan/templates-bs2/user/snippets/recaptcha.html delete mode 100644 ckan/templates-bs2/user/snippets/user_search.html diff --git a/ckan/public-bs2/base/css/.gitignore b/ckan/public-bs2/base/css/.gitignore deleted file mode 100644 index 5be98f3eed9..00000000000 --- a/ckan/public-bs2/base/css/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*debug.css diff --git a/ckan/public-bs2/base/css/fuchsia.css b/ckan/public-bs2/base/css/fuchsia.css deleted file mode 100644 index b5c44dccedf..00000000000 --- a/ckan/public-bs2/base/css/fuchsia.css +++ /dev/null @@ -1,9520 +0,0 @@ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -a:hover, -a:active { - outline: 0; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - /* Responsive images (ensure images don't scale beyond their parents) */ - max-width: 100%; - /* Part 1: Set a maxium relative to the parent */ - width: auto\9; - /* IE7-8 need help adjusting responsive images */ - height: auto; - /* Part 2: Scale the height according to the width, otherwise you get stretching */ - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} -#map_canvas img, -.google-maps img { - max-width: none; -} -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} -button, -input { - *overflow: visible; - line-height: normal; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -textarea { - overflow: auto; - vertical-align: top; -} -@media print { - * { - text-shadow: none !important; - color: #000 !important; - 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) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.clearfix:after { - clear: both; -} -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -body { - margin: 0; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #444; - background-color: #eee; -} -a { - color: #E73892; - text-decoration: none; -} -a:hover, -a:focus { - color: #bc176c; - text-decoration: underline; -} -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, -.row:after { - display: table; - content: ""; - line-height: 0; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.span12 { - width: 940px; -} -.span11 { - width: 860px; -} -.span10 { - width: 780px; -} -.span9 { - width: 700px; -} -.span8 { - width: 620px; -} -.span7 { - width: 540px; -} -.span6 { - width: 460px; -} -.span5 { - width: 380px; -} -.span4 { - width: 300px; -} -.span3 { - width: 220px; -} -.span2 { - width: 140px; -} -.span1 { - width: 60px; -} -.offset12 { - margin-left: 980px; -} -.offset11 { - margin-left: 900px; -} -.offset10 { - margin-left: 820px; -} -.offset9 { - margin-left: 740px; -} -.offset8 { - margin-left: 660px; -} -.offset7 { - margin-left: 580px; -} -.offset6 { - margin-left: 500px; -} -.offset5 { - margin-left: 420px; -} -.offset4 { - margin-left: 340px; -} -.offset3 { - margin-left: 260px; -} -.offset2 { - margin-left: 180px; -} -.offset1 { - margin-left: 100px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.row-fluid:after { - clear: both; -} -.row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.12765957%; - *margin-left: 2.07446809%; -} -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.12765957%; -} -.row-fluid .span12 { - width: 100%; - *width: 99.94680851%; -} -.row-fluid .span11 { - width: 91.4893617%; - *width: 91.43617021%; -} -.row-fluid .span10 { - width: 82.9787234%; - *width: 82.92553191%; -} -.row-fluid .span9 { - width: 74.46808511%; - *width: 74.41489362%; -} -.row-fluid .span8 { - width: 65.95744681%; - *width: 65.90425532%; -} -.row-fluid .span7 { - width: 57.44680851%; - *width: 57.39361702%; -} -.row-fluid .span6 { - width: 48.93617021%; - *width: 48.88297872%; -} -.row-fluid .span5 { - width: 40.42553191%; - *width: 40.37234043%; -} -.row-fluid .span4 { - width: 31.91489362%; - *width: 31.86170213%; -} -.row-fluid .span3 { - width: 23.40425532%; - *width: 23.35106383%; -} -.row-fluid .span2 { - width: 14.89361702%; - *width: 14.84042553%; -} -.row-fluid .span1 { - width: 6.38297872%; - *width: 6.32978723%; -} -.row-fluid .offset12 { - margin-left: 104.25531915%; - *margin-left: 104.14893617%; -} -.row-fluid .offset12:first-child { - margin-left: 102.12765957%; - *margin-left: 102.0212766%; -} -.row-fluid .offset11 { - margin-left: 95.74468085%; - *margin-left: 95.63829787%; -} -.row-fluid .offset11:first-child { - margin-left: 93.61702128%; - *margin-left: 93.5106383%; -} -.row-fluid .offset10 { - margin-left: 87.23404255%; - *margin-left: 87.12765957%; -} -.row-fluid .offset10:first-child { - margin-left: 85.10638298%; - *margin-left: 85%; -} -.row-fluid .offset9 { - margin-left: 78.72340426%; - *margin-left: 78.61702128%; -} -.row-fluid .offset9:first-child { - margin-left: 76.59574468%; - *margin-left: 76.4893617%; -} -.row-fluid .offset8 { - margin-left: 70.21276596%; - *margin-left: 70.10638298%; -} -.row-fluid .offset8:first-child { - margin-left: 68.08510638%; - *margin-left: 67.9787234%; -} -.row-fluid .offset7 { - margin-left: 61.70212766%; - *margin-left: 61.59574468%; -} -.row-fluid .offset7:first-child { - margin-left: 59.57446809%; - *margin-left: 59.46808511%; -} -.row-fluid .offset6 { - margin-left: 53.19148936%; - *margin-left: 53.08510638%; -} -.row-fluid .offset6:first-child { - margin-left: 51.06382979%; - *margin-left: 50.95744681%; -} -.row-fluid .offset5 { - margin-left: 44.68085106%; - *margin-left: 44.57446809%; -} -.row-fluid .offset5:first-child { - margin-left: 42.55319149%; - *margin-left: 42.44680851%; -} -.row-fluid .offset4 { - margin-left: 36.17021277%; - *margin-left: 36.06382979%; -} -.row-fluid .offset4:first-child { - margin-left: 34.04255319%; - *margin-left: 33.93617021%; -} -.row-fluid .offset3 { - margin-left: 27.65957447%; - *margin-left: 27.55319149%; -} -.row-fluid .offset3:first-child { - margin-left: 25.53191489%; - *margin-left: 25.42553191%; -} -.row-fluid .offset2 { - margin-left: 19.14893617%; - *margin-left: 19.04255319%; -} -.row-fluid .offset2:first-child { - margin-left: 17.0212766%; - *margin-left: 16.91489362%; -} -.row-fluid .offset1 { - margin-left: 10.63829787%; - *margin-left: 10.53191489%; -} -.row-fluid .offset1:first-child { - margin-left: 8.5106383%; - *margin-left: 8.40425532%; -} -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} -.container:before, -.container:after { - display: table; - content: ""; - line-height: 0; -} -.container:after { - clear: both; -} -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.container-fluid:after { - clear: both; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} -small { - font-size: 85%; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -cite { - font-style: normal; -} -.muted { - color: #999; -} -a.muted:hover, -a.muted:focus { - color: #808080; -} -.text-warning { - color: #c09853; -} -a.text-warning:hover, -a.text-warning:focus { - color: #a47e3c; -} -.text-error { - color: #b55457; -} -a.text-error:hover, -a.text-error:focus { - color: #954143; -} -.text-info { - color: #3a87ad; -} -a.text-info:hover, -a.text-info:focus { - color: #2d6987; -} -.text-success { - color: #468847; -} -a.text-success:hover, -a.text-success:focus { - color: #356635; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999; -} -h1, -h2, -h3 { - line-height: 40px; -} -h1 { - font-size: 38.5px; -} -h2 { - font-size: 31.5px; -} -h3 { - font-size: 24.5px; -} -h4 { - font-size: 17.5px; -} -h5 { - font-size: 14px; -} -h6 { - font-size: 11.9px; -} -h1 small { - font-size: 24.5px; -} -h2 small { - font-size: 17.5px; -} -h3 small { - font-size: 14px; -} -h4 small { - font-size: 14px; -} -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eee; -} -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -li { - line-height: 20px; -} -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding-left: 5px; - padding-right: 5px; -} -dl { - margin-bottom: 20px; -} -dt, -dd { - line-height: 20px; -} -dt { - font-weight: bold; -} -dd { - margin-left: 10px; -} -.dl-horizontal { - *zoom: 1; -} -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - content: ""; - line-height: 0; -} -.dl-horizontal:after { - clear: both; -} -.dl-horizontal dt { - float: left; - width: 160px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.dl-horizontal dd { - margin-left: 180px; -} -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eee; - border-bottom: 1px solid #fff; -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999; -} -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eee; -} -blockquote p { - margin-bottom: 0; - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} -blockquote small { - display: block; - line-height: 20px; - color: #999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eee; - border-left: 0; -} -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} -blockquote.pull-right small:before { - content: ''; -} -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; - white-space: nowrap; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -pre.prettyprint { - margin-bottom: 20px; -} -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -form { - margin: 0 0 20px; -} -fieldset { - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -legend small { - font-size: 15px; - color: #999; -} -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} -input, -button, -select, -textarea { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} -label { - display: block; - margin-bottom: 5px; -} -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"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - vertical-align: middle; -} -input, -textarea, -.uneditable-input { - width: 206px; -} -textarea { - height: auto; -} -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"], -.uneditable-input { - background-color: #fff; - border: 1px solid #ccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear .2s, box-shadow linear .2s; - -moz-transition: border linear .2s, box-shadow linear .2s; - -o-transition: border linear .2s, box-shadow linear .2s; - transition: border linear .2s, box-shadow linear .2s; -} -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - *margin-top: 0; - /* IE7 */ - margin-top: 1px \9; - /* IE8-9 */ - line-height: normal; -} -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} -select, -input[type="file"] { - height: 30px; - /* 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: 30px; -} -select { - width: 220px; - border: 1px solid #ccc; - background-color: #fff; -} -select[multiple], -select[size] { - height: auto; -} -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.uneditable-input, -.uneditable-textarea { - color: #999; - background-color: #fcfcfc; - border-color: #ccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} -.uneditable-textarea { - width: auto; - height: auto; -} -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999; -} -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999; -} -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999; -} -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} -input, -textarea, -.uneditable-input { - margin-left: 0; -} -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} -.controls-row { - *zoom: 1; -} -.controls-row:before, -.controls-row:after { - display: table; - content: ""; - line-height: 0; -} -.controls-row:after { - clear: both; -} -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eee; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b55457; -} -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b55457; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b55457; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #954143; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; -} -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b55457; - background-color: #f8f0f0; - border-color: #b55457; -} -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} -.form-actions:before, -.form-actions:after { - display: table; - content: ""; - line-height: 0; -} -.form-actions:after { - clear: both; -} -.help-block, -.help-inline { - color: #6a6a6a; -} -.help-block { - display: block; - margin-bottom: 10px; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - vertical-align: middle; - padding-left: 5px; -} -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - vertical-align: middle; - font-size: 0; - white-space: nowrap; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 14px; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #fff; - background-color: #eee; - border: 1px solid #ccc; -} -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -/* Allow for input prepend/append in search forms */ -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} -.control-group { - margin-bottom: 10px; -} -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; - line-height: 0; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} -.form-horizontal .controls:first-child { - *padding-left: 180px; -} -.form-horizontal .help-block { - margin-bottom: 0; -} -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} -.form-horizontal .form-actions { - padding-left: 180px; -} -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} -.table { - width: 100%; - margin-bottom: 20px; -} -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table th { - font-weight: bold; -} -.table thead th { - vertical-align: bottom; -} -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #eee; -} -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #ddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.table-bordered th, -.table-bordered td { - border-left: 1px solid #ddd; -} -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; -} -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; -} -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; - border-bottom-left-radius: 0; -} -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; - border-bottom-right-radius: 0; -} -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; -} -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: #f5f5f5; -} -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} -.table tbody tr.success > td { - background-color: #dff0d8; -} -.table tbody tr.error > td { - background-color: #f8f0f0; -} -.table tbody tr.warning > td { - background-color: #fcf8e3; -} -.table tbody tr.info > td { - background-color: #d9edf7; -} -.table-hover tbody tr.success:hover > td { - background-color: #d0e9c6; -} -.table-hover tbody tr.error:hover > td { - background-color: #f0dfe0; -} -.table-hover tbody tr.warning:hover > td { - background-color: #faf2cc; -} -.table-hover tbody tr.info:hover > td { - background-color: #c4e3f3; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle { - *margin-bottom: -3px; -} -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - text-decoration: none; - color: #fff; - background-color: #e62f8d; - background-image: -moz-linear-gradient(top, #E73892, #e42186); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#E73892), to(#e42186)); - background-image: -webkit-linear-gradient(top, #E73892, #e42186); - background-image: -o-linear-gradient(top, #E73892, #e42186); - background-image: linear-gradient(to bottom, #E73892, #e42186); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe73892', endColorstr='#ffe42186', GradientType=0); -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - outline: 0; - background-color: #e62f8d; - background-image: -moz-linear-gradient(top, #E73892, #e42186); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#E73892), to(#e42186)); - background-image: -webkit-linear-gradient(top, #E73892, #e42186); - background-image: -o-linear-gradient(top, #E73892, #e42186); - background-image: linear-gradient(to bottom, #E73892, #e42186); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe73892', endColorstr='#ffe42186', GradientType=0); -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - cursor: default; -} -.open { - *z-index: 1000; -} -.open > .dropdown-menu { - display: block; -} -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000; - content: ""; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -.dropdown-submenu { - position: relative; -} -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} -.dropdown-submenu > a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #cccccc; - margin-top: 5px; - margin-right: -10px; -} -.dropdown-submenu:hover > a:after { - border-left-color: #fff; -} -.dropdown-submenu.pull-left { - float: none; -} -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} -.dropdown .dropdown-menu .nav-header { - padding-left: 20px; - padding-right: 20px; -} -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.btn { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding: 4px 12px; - margin-bottom: 0; - font-size: 14px; - line-height: 20px; - text-align: center; - vertical-align: middle; - cursor: pointer; - color: #333; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #ffffff, #eaeaea); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#eaeaea)); - background-image: -webkit-linear-gradient(top, #ffffff, #eaeaea); - background-image: -o-linear-gradient(top, #ffffff, #eaeaea); - background-image: linear-gradient(to bottom, #ffffff, #eaeaea); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeaeaea', GradientType=0); - border-color: #eaeaea #eaeaea #c4c4c4; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #eaeaea; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - border: 1px solid #ccc; - *border: 0; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *margin-left: .3em; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); -} -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333; - background-color: #eaeaea; - *background-color: #dddddd; -} -.btn:active, -.btn.active { - background-color: #d1d1d1 \9; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; - padding-left: 0; - padding-right: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} -.btn-primary { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ea53a1; - background-image: -moz-linear-gradient(top, #ec66ab, #E73892); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ec66ab), to(#E73892)); - background-image: -webkit-linear-gradient(top, #ec66ab, #E73892); - background-image: -o-linear-gradient(top, #ec66ab, #E73892); - background-image: linear-gradient(to bottom, #ec66ab, #E73892); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec66ab', endColorstr='#ffe73892', GradientType=0); - border-color: #E73892 #E73892 #bc176c; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #E73892; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #fff; - background-color: #E73892; - *background-color: #e42186; -} -.btn-primary:active, -.btn-primary.active { - background-color: #d31979 \9; -} -.btn-warning { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #f89406; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #fff; - background-color: #f89406; - *background-color: #df8505; -} -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #bd362f; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #fff; - background-color: #bd362f; - *background-color: #a9302a; -} -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #51a351; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #fff; - background-color: #51a351; - *background-color: #499249; -} -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} -.btn-info { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #2f96b4; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #fff; - background-color: #2f96b4; - *background-color: #2a85a0; -} -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} -.btn-inverse { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - background-image: -moz-linear-gradient(top, #444, #222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444), to(#222)); - background-image: -webkit-linear-gradient(top, #444, #222); - background-image: -o-linear-gradient(top, #444, #222); - background-image: linear-gradient(to bottom, #444, #222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - border-color: #222 #222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #222; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #fff; - background-color: #222; - *background-color: #151515; -} -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-link { - border-color: transparent; - cursor: pointer; - color: #E73892; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-link:hover, -.btn-link:focus { - color: #bc176c; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #333; - text-decoration: none; -} -.btn-group { - position: relative; - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - font-size: 0; - vertical-align: middle; - white-space: nowrap; - *margin-left: .3em; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - margin-left: 5px; -} -.btn-toolbar { - font-size: 0; - margin-top: 10px; - margin-bottom: 10px; -} -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group > .btn + .btn { - margin-left: -1px; -} -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} -.btn-group > .btn-mini { - font-size: 10.5px; -} -.btn-group > .btn-small { - font-size: 11.9px; -} -.btn-group > .btn-large { - font-size: 17.5px; -} -.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; -} -.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; -} -.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; -} -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-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); - -moz-box-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); - box-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); - *padding-top: 5px; - *padding-bottom: 5px; -} -.btn-group > .btn-mini + .dropdown-toggle { - padding-left: 5px; - padding-right: 5px; - *padding-top: 2px; - *padding-bottom: 2px; -} -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} -.btn-group > .btn-large + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; - *padding-top: 7px; - *padding-bottom: 7px; -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn-group.open .btn.dropdown-toggle { - background-color: #eaeaea; -} -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #E73892; -} -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222; -} -.btn .caret { - margin-top: 8px; - margin-left: 0; -} -.btn-large .caret { - margin-top: 6px; -} -.btn-large .caret { - border-left-width: 5px; - border-right-width: 5px; - border-top-width: 5px; -} -.btn-mini .caret, -.btn-small .caret { - margin-top: 8px; -} -.dropup .btn-large .caret { - border-bottom-width: 5px; -} -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group-vertical > .btn + .btn { - margin-left: 0; - margin-top: -1px; -} -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.alert, -.alert h4 { - color: #c09853; -} -.alert h4 { - margin: 0; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #468847; -} -.alert-success h4 { - color: #468847; -} -.alert-danger, -.alert-error { - background-color: #f8f0f0; - border-color: #c6898b; - color: #b55457; -} -.alert-danger h4, -.alert-error h4 { - color: #b55457; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #3a87ad; -} -.alert-info h4 { - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 20px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li > a > img { - max-width: none; -} -.nav > .pull-right { - float: right; -} -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} -.nav li + .nav-header { - margin-top: 9px; -} -.nav-list { - padding-left: 15px; - padding-right: 15px; - 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, 0.5); -} -.nav-list > li > a { - padding: 3px 15px; -} -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #E73892; -} -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.nav-tabs, -.nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; - line-height: 0; -} -.nav-tabs:after, -.nav-pills:after { - clear: both; -} -.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; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - margin-bottom: -1px; -} -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - border-color: #eee #eee #ddd; -} -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #555; - background-color: #eee; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #fff; - background-color: #E73892; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.nav .dropdown-toggle .caret { - border-top-color: #E73892; - border-bottom-color: #E73892; - margin-top: 6px; -} -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #bc176c; - border-bottom-color: #bc176c; -} -/* move down carets for tabs */ -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #fff; - background-color: #999; - border-color: #999; -} -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #fff; - border-bottom-color: #fff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, -.tabbable:after { - display: table; - content: ""; - line-height: 0; -} -.tabbable:after { - clear: both; -} -.tab-content { - overflow: auto; -} -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} -.tab-content > .active, -.pill-content > .active { - display: block; -} -.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 { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} -.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-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #eee #ddd #eee #eee; -} -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #fff; -} -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #eee #eee #eee #ddd; -} -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #fff; -} -.nav > .disabled > a { - color: #999; -} -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - cursor: default; -} -.navbar { - overflow: visible; - margin-bottom: 20px; - *position: relative; - *z-index: 2; -} -.navbar-inner { - min-height: 40px; - padding-left: 20px; - padding-right: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - *zoom: 1; -} -.navbar-inner:before, -.navbar-inner:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-inner:after { - clear: both; -} -.navbar .container { - width: auto; -} -.nav-collapse.collapse { - height: auto; - overflow: visible; -} -.navbar .brand { - float: left; - display: block; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777; -} -.navbar-link { - color: #777; -} -.navbar-link:hover, -.navbar-link:focus { - color: #333; -} -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-left: 1px solid #f2f2f2; - border-right: 1px solid #ffffff; -} -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} -.navbar-search .search-query { - margin-bottom: 0; - padding: 4px 14px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.navbar-static-top { - position: static; - margin-bottom: 0; -} -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-left: 0; - padding-right: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; - width: 100%; - *width: 99.94680851%; - width: 926px; -} -.navbar-fixed-top { - top: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1); - -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1); - box-shadow: 0 1px 10px rgba(0,0,0,.1); -} -.navbar-fixed-bottom { - bottom: 0; -} -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1); - -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1); - box-shadow: 0 -1px 10px rgba(0,0,0,.1); -} -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} -.navbar .nav > li { - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - background-color: transparent; - color: #333; - text-decoration: none; -} -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #e5e5e5; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); -} -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #fff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.navbar .nav > li > .dropdown-menu: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, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .nav > li > .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - border-top: 7px solid #ccc; - border-top-color: rgba(0, 0, 0, 0.2); - border-bottom: 0; - bottom: -7px; - top: auto; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - border-top: 6px solid #fff; - border-bottom: 0; - bottom: -6px; - top: auto; -} -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #333; - border-bottom-color: #333; -} -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #e5e5e5; - color: #555; -} -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777; - border-bottom-color: #777; -} -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - left: auto; - right: 0; -} -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - left: auto; - right: 12px; -} -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - left: auto; - right: 13px; -} -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - left: auto; - right: 100%; - margin-left: 0; - margin-right: -1px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); - border-color: #252525; -} -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #fff; -} -.navbar-inverse .brand { - color: #999; -} -.navbar-inverse .navbar-text { - color: #999; -} -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - background-color: transparent; - color: #fff; -} -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #fff; - background-color: #111111; -} -.navbar-inverse .navbar-link { - color: #999; -} -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #fff; -} -.navbar-inverse .divider-vertical { - border-left-color: #111111; - border-right-color: #222222; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #111111; - color: #fff; -} -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999; - border-bottom-color: #999; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .navbar-search .search-query { - color: #fff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333; - text-shadow: 0 1px 0 #fff; - background-color: #fff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-inverse .btn-navbar { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #040404; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #fff; - background-color: #040404; - *background-color: #000000; -} -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - text-shadow: 0 1px 0 #fff; -} -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} -.breadcrumb > .active { - color: #999; -} -.pagination { - margin: 20px 0; -} -.pagination ul { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-left: 0; - margin-bottom: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} -.pagination ul > li { - display: inline; -} -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; - border-left-width: 0; -} -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999; - cursor: default; -} -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #999; - background-color: transparent; - cursor: default; -} -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -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; -} -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -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; -} -.pagination-centered { - text-align: center; -} -.pagination-right { - text-align: right; -} -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -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; -} -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -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; -} -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-top-left-radius: 3px; - -moz-border-radius-topleft: 3px; - border-top-left-radius: 3px; - -webkit-border-bottom-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - border-bottom-left-radius: 3px; -} -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - -moz-border-radius-topright: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - -moz-border-radius-bottomright: 3px; - border-bottom-right-radius: 3px; -} -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} -.pager { - margin: 20px 0; - list-style: none; - text-align: center; - *zoom: 1; -} -.pager:before, -.pager:after { - display: table; - content: ""; - line-height: 0; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #f5f5f5; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999; - background-color: #fff; - cursor: default; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #fff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; - outline: none; -} -.modal.fade { - -webkit-transition: opacity .3s linear, top .3s ease-out; - -moz-transition: opacity .3s linear, top .3s ease-out; - -o-transition: opacity .3s linear, top .3s ease-out; - transition: opacity .3s linear, top .3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 10%; -} -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} -.modal-header .close { - margin-top: 2px; -} -.modal-header h3 { - margin: 0; - line-height: 30px; -} -.modal-body { - position: relative; - overflow-y: auto; - max-height: 400px; - padding: 15px; -} -.modal-form { - margin-bottom: 0; -} -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #fff; - -moz-box-shadow: inset 0 1px 0 #fff; - box-shadow: inset 0 1px 0 #fff; - *zoom: 1; -} -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; - line-height: 0; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.tooltip { - position: absolute; - z-index: 1030; - display: block; - visibility: visible; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -3px; - padding: 5px 0; -} -.tooltip.right { - margin-left: 3px; - padding: 0 5px; -} -.tooltip.bottom { - margin-top: 3px; - padding: 5px 0; -} -.tooltip.left { - margin-left: -3px; - padding: 0 5px; -} -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; - line-height: 0; -} -.thumbnails:after { - clear: both; -} -.row-fluid .thumbnails { - margin-left: 0; -} -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #E73892; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} -.thumbnail > img { - display: block; - max-width: 100%; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; - color: #555; -} -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #fff; - vertical-align: baseline; - white-space: nowrap; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #999; -} -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.badge { - padding-left: 9px; - padding-right: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} -.label:empty, -.badge:empty { - display: none; -} -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label-important, -.badge-important { - background-color: #b55457; -} -.label-important[href], -.badge-important[href] { - background-color: #954143; -} -.label-warning, -.badge-warning { - background-color: #f89406; -} -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} -.label-success, -.badge-success { - background-color: #468847; -} -.label-success[href], -.badge-success[href] { - background-color: #356635; -} -.label-info, -.badge-info { - background-color: #3a87ad; -} -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} -.label-inverse, -.badge-inverse { - background-color: #333; -} -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} -.btn-mini .label, -.btn-mini .badge { - top: 0; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 100%; - color: #fff; - float: left; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); -} -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.accordion { - margin-bottom: 20px; -} -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.accordion-heading { - border-bottom: 0; -} -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} -.accordion-toggle { - cursor: pointer; -} -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} -.carousel-inner { - overflow: hidden; - width: 100%; - position: relative; -} -.carousel-inner > .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.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: #fff; - text-align: center; - background: #222; - border: 3px solid #fff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.carousel-control.right { - left: auto; - right: 15px; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); - border-radius: 5px; -} -.carousel-indicators .active { - background-color: #fff; -} -.carousel-caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 15px; - background: #333; - background: rgba(0, 0, 0, 0.75); -} -.carousel-caption h4, -.carousel-caption p { - color: #fff; - line-height: 20px; -} -.carousel-caption h4 { - margin: 0 0 5px; -} -.carousel-caption p { - margin-bottom: 0; -} -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - color: inherit; - letter-spacing: -1px; -} -.hero-unit li { - line-height: 30px; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - background-color: #fff; - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - white-space: normal; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.popover-title:empty { - display: none; -} -.popover-content { - padding: 9px 14px; -} -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover .arrow { - border-width: 11px; -} -.popover .arrow:after { - border-width: 10px; - content: ""; -} -.popover.top .arrow { - left: 50%; - margin-left: -11px; - border-bottom-width: 0; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - bottom: -11px; -} -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-bottom-width: 0; - border-top-color: #fff; -} -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-left-width: 0; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); -} -.popover.right .arrow:after { - left: 1px; - bottom: -10px; - border-left-width: 0; - border-right-color: #fff; -} -.popover.bottom .arrow { - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - top: -11px; -} -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); -} -.popover.left .arrow:after { - right: 1px; - border-right-width: 0; - border-left-color: #fff; - bottom: -10px; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} -.affix { - position: fixed; -} -/*! - * Bootstrap Responsive v2.3.2 - * - * 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. - */ -@-ms-viewport { - width: device-width; -} -.hidden { - display: none; - visibility: hidden; -} -.visible-phone { - display: none !important; -} -.visible-tablet { - display: none !important; -} -.hidden-desktop { - display: none !important; -} -.visible-desktop { - display: inherit !important; -} -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - line-height: 0; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - line-height: 0; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.76243094%; - *margin-left: 2.70923945%; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.76243094%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851%; - } - .row-fluid .span11 { - width: 91.43646409%; - *width: 91.3832726%; - } - .row-fluid .span10 { - width: 82.87292818%; - *width: 82.81973669%; - } - .row-fluid .span9 { - width: 74.30939227%; - *width: 74.25620078%; - } - .row-fluid .span8 { - width: 65.74585635%; - *width: 65.69266486%; - } - .row-fluid .span7 { - width: 57.18232044%; - *width: 57.12912895%; - } - .row-fluid .span6 { - width: 48.61878453%; - *width: 48.56559304%; - } - .row-fluid .span5 { - width: 40.05524862%; - *width: 40.00205713%; - } - .row-fluid .span4 { - width: 31.49171271%; - *width: 31.43852122%; - } - .row-fluid .span3 { - width: 22.9281768%; - *width: 22.87498531%; - } - .row-fluid .span2 { - width: 14.36464088%; - *width: 14.31144939%; - } - .row-fluid .span1 { - width: 5.80110497%; - *width: 5.74791348%; - } - .row-fluid .offset12 { - margin-left: 105.52486188%; - *margin-left: 105.4184789%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243094%; - *margin-left: 102.65604796%; - } - .row-fluid .offset11 { - margin-left: 96.96132597%; - *margin-left: 96.85494299%; - } - .row-fluid .offset11:first-child { - margin-left: 94.19889503%; - *margin-left: 94.09251205%; - } - .row-fluid .offset10 { - margin-left: 88.39779006%; - *margin-left: 88.29140708%; - } - .row-fluid .offset10:first-child { - margin-left: 85.63535912%; - *margin-left: 85.52897614%; - } - .row-fluid .offset9 { - margin-left: 79.83425414%; - *margin-left: 79.72787116%; - } - .row-fluid .offset9:first-child { - margin-left: 77.0718232%; - *margin-left: 76.96544023%; - } - .row-fluid .offset8 { - margin-left: 71.27071823%; - *margin-left: 71.16433525%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729%; - *margin-left: 68.40190431%; - } - .row-fluid .offset7 { - margin-left: 62.70718232%; - *margin-left: 62.60079934%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138%; - *margin-left: 59.8383684%; - } - .row-fluid .offset6 { - margin-left: 54.14364641%; - *margin-left: 54.03726343%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121547%; - *margin-left: 51.27483249%; - } - .row-fluid .offset5 { - margin-left: 45.5801105%; - *margin-left: 45.47372752%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767956%; - *margin-left: 42.71129658%; - } - .row-fluid .offset4 { - margin-left: 37.01657459%; - *margin-left: 36.91019161%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414365%; - *margin-left: 34.14776067%; - } - .row-fluid .offset3 { - margin-left: 28.45303867%; - *margin-left: 28.3466557%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773%; - *margin-left: 25.58422476%; - } - .row-fluid .offset2 { - margin-left: 19.88950276%; - *margin-left: 19.78311978%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182%; - *margin-left: 17.02068884%; - } - .row-fluid .offset1 { - margin-left: 11.32596685%; - *margin-left: 11.21958387%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591%; - *margin-left: 8.45715293%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} -@media (max-width: 767px) { - body { - padding-left: 20px; - padding-right: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-left: -20px; - margin-right: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - clear: none; - width: auto; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - float: none; - display: block; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - left: 20px; - right: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-left: 10px; - padding-right: 10px; - } - .media .pull-left, - .media .pull-right { - float: none; - display: block; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - left: 10px; - right: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-left: 10px; - padding-right: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .nav > li > a:focus, - .nav-collapse .dropdown-menu a:hover, - .nav-collapse .dropdown-menu a:focus { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .nav > li > a:focus, - .navbar-inverse .nav-collapse .dropdown-menu a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:focus { - background-color: #111111; - } - .nav-collapse.in .btn-group { - margin-top: 5px; - padding: 0; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - float: none; - display: none; - max-width: none; - margin: 0 15px; - padding: 0; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - overflow: hidden; - height: 0; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-left: 10px; - padding-right: 10px; - } -} -@media (min-width: 979px + 1) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} -.break-word { - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.tag { - display: inline-block; - margin-bottom: 4px; - color: #111; - background-color: #f6f6f6; - padding: 1px 10px; - border: 1px solid #dddddd; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} -a.tag:hover { - text-decoration: none; - color: #fff; - background-color: #ec66ab; - border: 1px solid #e73892; - -webkit-box-shadow: inset 0 1px 0 #f293c4; - -moz-box-shadow: inset 0 1px 0 #f293c4; - box-shadow: inset 0 1px 0 #f293c4; -} -.pill { - display: inline-block; - background-color: #6f8890; - color: #FFF; - padding: 2px 10px 1px 10px; - margin-right: 5px; - font-weight: normal; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.pill a { - color: #FFF; -} -.pill a.remove { - font-size: 11px; -} -.unstyled { - margin: 0; - list-style: none; -} -.simple-item { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.simple-item:last-of-type { - border-bottom: 0; -} -.simple-list { - *zoom: 1; - margin: 0; - list-style: none; -} -.simple-list:before, -.simple-list:after { - display: table; - content: ""; - line-height: 0; -} -.simple-list:after { - clear: both; -} -.simple-list > li { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.simple-list > li:last-of-type { - border-bottom: 0; -} -.simple-list .ckan-icon { - position: relative; - top: 0px; -} -.module-narrow .simple-list > li { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.listing li { - text-align: right; - margin-bottom: 5px; -} -.listing .key { - clear: right; - font-weight: bold; -} -.js .tab-content { - display: none; -} -.js .tab-content.active { - display: block; -} -.box { - background-color: #FFF; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); -} -.module { - margin: 20px 0; -} -.module-heading { - *zoom: 1; - margin: 0; - padding: 7px 25px; - font-size: 14px; - line-height: 1.3; - background-color: #f6f6f6; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; -} -.module-heading:before, -.module-heading:after { - display: table; - content: ""; - line-height: 0; -} -.module-heading:after { - clear: both; -} -.module-content { - padding: 0 25px; - margin: 20px 0; -} -@media (min-width: 768px) { - .span9 div.module-content { - padding-left: 10px; - } -} -.module-content:first-child { - margin-top: 0; - padding-top: 20px; -} -.module-content:last-child { - margin-bottom: 0; - padding-bottom: 20px; -} -.module-content > :last-child { - margin-bottom: 0; -} -.module:first-child .module-heading { - -webkit-border-radius: 3px 0 0 0; - -moz-border-radius: 3px 0 0 0; - border-radius: 3px 0 0 0; - border-top-width: 0; -} -.module:last-child { - margin-bottom: 20px; -} -.module-footer { - padding: 7px 25px 7px; - margin: 0; - border-top: 1px dotted #ddd; -} -.module .read-more { - font-weight: bold; - color: #000; -} -.module-content .pagination { - margin-left: -25px; - margin-right: -25px; - margin-bottom: -20px; -} -.module .pagination > ul { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - border: 0; -} -.module .pagination li a { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - padding-top: 7px; - padding-bottom: 7px; -} -.module .pagination li:first-child a, -.module .pagination li:last-child a { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.module-content-shallow { - padding: 0; - margin-top: 10px; - padding-bottom: 10px; -} -.module h1 { - margin-bottom: 20px; -} -.module-shallow .module-content { - padding: 10px; - margin: 0; -} -.module-shallow .module-tags { - margin-top: 0; - margin-bottom: 0; -} -.module-shallow .module-content:first-child { - padding-top: 10px; -} -.module-shallow .module-content:last-child { - padding-bottom: 10px; -} -.module-narrow .module-heading, -.module-narrow .module-content, -.module-narrow .module-footer { - padding-left: 15px; - padding-right: 15px; -} -.module-grid { - margin: 0; - list-style: none; - *zoom: 1; - margin: 0 -25px; - padding-bottom: 15px; - background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; - border-width: 1px 0; -} -.module-grid:before, -.module-grid:after { - display: table; - content: ""; - line-height: 0; -} -.module-grid:after { - clear: both; -} -.module-item { - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - float: left; - margin-left: 20px; - width: 460px; - padding-top: 10px; - padding-bottom: 10px; - padding-right: 50px; - overflow: hidden; - position: relative; -} -.module-item span.count { - color: #999; -} -.module-item .media-image { - margin-bottom: 5px; -} -.module-item .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; -} -.module-item:hover { - z-index: 1; -} -.module-item:hover .media-edit { - opacity: 1; -} -.module-item.first { - clear: left; -} -.group .content img { - margin: 0 -5px 5px; - max-width: initial; -} -.group .content h3 { - font-size: 14px; - line-height: 1.3; -} -.group-listing { - margin-left: -20px; -} -.ckanext-datapreview { - position: relative; - clear: both; - padding-top: 15px; - margin-top: 0; -} -.ckanext-datapreview > iframe { - min-height: 650px; -} -.ckanext-datapreview > img { - max-height: 500px; - max-width: 100%; - overflow: hidden; -} -.package-info h4 { - margin-bottom: 10px; -} -.module-resource { - background-color: #fff; - border-bottom: 1px solid #ddd; - margin-top: 0; - margin-bottom: 0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.module-resource .actions { - position: relative; - float: right; - top: -10px; - right: -15px; -} -.module .module-tags { - padding-bottom: 8px; -} -.secondary .module:first-child, -.primary .module:first-child { - margin-top: 0; -} -.no-nav .module:last-child { - margin-top: 0; -} -.module-image { - float: left; - width: 50px; - height: 50px; - line-height: 50px; - text-align: center; - margin-right: 15px; -} -.module-image img { - max-width: 50px; - max-height: 50px; - vertical-align: middle; -} -.banner { - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - -webkit-transform-origin: center center; - -moz-transform-origin: center center; - -ms-transform-origin: center center; - -o-transform-origin: center center; - transform-origin: center center; - position: absolute; - top: 15px; - right: -35px; - width: 80px; - color: #fff; - background-color: #E73892; - padding: 1px 20px; - font-size: 11px; - text-align: center; - text-transform: uppercase; -} -.media-grid { - margin: 0; - list-style: none; - *zoom: 1; - margin: 0 -25px; - padding-bottom: 15px; - background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; - border-width: 1px 0; -} -.media-grid:before, -.media-grid:after { - display: table; - content: ""; - line-height: 0; -} -.media-grid:after { - clear: both; -} -@media (min-width: 768px) { - .media-grid { - margin-left: -27px; - } - .module-content .wide .media-grid { - margin-left: -25px; - } -} -.media-item { - position: relative; - float: left; - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.media-item span.count { - color: #999; -} -.media-item .media-image { - margin-bottom: 5px; -} -.media-item .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; -} -.media-item:hover { - z-index: 1; -} -.media-item:hover .media-edit { - opacity: 1; -} -.media-view { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: 1px solid #ddd; - overflow: hidden; - -webkit-transition: all 0.2s ease-in; - -moz-transition: all 0.2s ease-in; - -o-transition: all 0.2s ease-in; - transition: all 0.2s ease-in; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.media-view:hover, -.media-view.hovered { - border-color: #E73892; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); -} -.media-view:hover .banner, -.media-view.hovered .banner { - background-color: #E73892; -} -.media-view span { - display: none; -} -.media-view .banner { - display: block; - background-color: #b7b7b7; - -webkit-transition: background-color 0.2s ease-in; - -moz-transition: background-color 0.2s ease-in; - -o-transition: background-color 0.2s ease-in; - transition: background-color 0.2s ease-in; -} -.media-image { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.media-heading { - font-size: 18px; - line-height: 1.3; - margin: 5px 0; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.media-overlay { - position: relative; - min-height: 35px; -} -.media-overlay .media-heading { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 12px 10px; - margin: 0; - background-color: #000; - background-color: rgba(0, 0, 0, 0.8); - font-size: 13px; - color: #fff; - z-index: 1; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.media-overlay .media-image { - float: none; - display: block; - margin-right: 0; -} -.media-item.is-expander .truncator-link { - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; - position: absolute; - z-index: 10; - left: 15px; - bottom: 15px; - opacity: 0; -} -.media-item.is-expander:hover { - padding-bottom: 35px; -} -.media-item.is-expander:hover .truncator-link { - opacity: 1; -} -.wide .media-item { - width: 186px; -} -.nav-simple, -.nav-aside { - *zoom: 1; - margin: 0; - list-style: none; - padding-bottom: 0; -} -.nav-simple:before, -.nav-aside:before, -.nav-simple:after, -.nav-aside:after { - display: table; - content: ""; - line-height: 0; -} -.nav-simple:after, -.nav-aside:after { - clear: both; -} -.nav-simple > li, -.nav-aside > li { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.nav-simple > li:last-of-type, -.nav-aside > li:last-of-type { - border-bottom: 0; -} -.nav-simple .ckan-icon, -.nav-aside .ckan-icon { - position: relative; - top: 0px; -} -.nav-aside { - border-top: 1px dotted #DDD; - border-bottom: 1px dotted #DDD; - margin-bottom: 15px; -} -.nav-item > a, -.nav-aside li a { - color: #333; - font-size: 14px; - line-height: 20px; - margin: -7px -25px; - padding: 7px 25px; -} -.nav-item.active, -.nav-aside li.active { - background-color: #f6f6f6; -} -.nav-item.active > a, -.nav-aside li.active a { - position: relative; - color: #FFF; - background-color: #8CA0A6; -} -.nav-item.active > a:hover, -.nav-aside li.active a:hover { - color: #FFF; - background-color: #8CA0A6; -} -@media (min-width: 768px) { - .nav-item.active > a:before, - .nav-aside li.active a:before { - content: ' '; - position: absolute; - top: 0; - right: -6px; - width: 6px; - height: 34px; - background-image: url("../../../base/images/nav-active.png?1"); - } -} -.nav-item.active > a span, -.nav-aside li.active a span { - white-space: nowrap; - overflow: hidden; - display: block; -} -.module-narrow .nav-item > a, -.module-narrow .nav-aside li a { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.module-narrow .nav-item.image, -.module-narrow .nav-aside li.image { - position: relative; -} -.module-narrow .nav-item.image > a, -.module-narrow .nav-aside li.image a { - padding-left: 42px; - padding-right: 42px; -} -.module-narrow .nav-item.image > img, -.module-narrow .nav-aside li.image img { - position: absolute; - top: 50%; - left: 15px; - width: 20px; - height: 20px; - margin-top: -10px; - z-index: 2; -} -.nav-facet .nav-item > a:hover:after, -.nav-facet .nav-item.active > a:after { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} -.nav-facet .nav-item > a:hover:after { - width: 17px; - height: 17px; - background-position: -17px -16px; -} -.nav-facet .nav-item.active > a:after { - width: 17px; - height: 17px; - background-position: 0px -16px; - right: 3px; -} -.user-list { - margin: 0; - list-style: none; -} -.user-list li { - margin: 0 0 10px 0; -} -.user-list .gravatar { - vertical-align: -4px; - margin-right: 3px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.nav-facet-tertiary { - margin: 10px 0; -} -.nav-facet-tertiary .module-heading { - margin-bottom: 5px; - padding: 8px 12px; - border-bottom-width: 0; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-facet-tertiary .module-heading i { - display: none; -} -.nav-facet-tertiary .module-footer { - padding: 8px 12px; - border-top-width: 0; -} -.nav-facet-tertiary .module-footer a { - font-weight: normal; - color: #8C8C8C; -} -.nav-facet-tertiary .nav { - margin-bottom: 0; -} -.nav-facet-tertiary .module-content.empty { - padding: 8px 12px; - margin-top: 0; -} -.nav-facet-tertiary .nav li.active { - position: relative; -} -.nav-facet-tertiary .nav li.active > a:hover:after, -.nav-facet-tertiary .nav li.active > a:after { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - width: 17px; - height: 17px; - background-position: 0px -16px; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} -.nav-simple > .nav-btn { - padding-left: 0; - padding-right: 0; - text-align: center; -} -.nav-simple > .nav-btn .btn { - display: inline-block; -} -.js .js-hide { - display: none; -} -.js .js-hide.active { - display: block; -} -.btn, -label { - font-weight: bold; -} -.btn-rounded { - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - padding-left: 15px; - padding-right: 15px; -} -label { - cursor: pointer; - font-size: 14px; -} -label:after { - content: ":"; -} -label.radio:after, -label.checkbox:after { - content: ""; -} -input[type=radio], -input[type=checkbox] { - position: relative; - top: 7px; - padding: 0; - margin: 0; -} -input[type=radio].checkbox-onown, -input[type=checkbox].checkbox-onown { - top: 0; -} -select { - padding: 4px; -} -textarea { - max-width: 100%; -} -.control-group .btn { - position: relative; - top: -2px; -} -.control-full input, -.control-full select, -.control-full textarea { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - height: auto; - width: 100%; -} -.control-medium input, -.control-medium select, -.control-medium textarea { - width: 320px; -} -@media (max-width: 768px) { - .control-medium input, - .control-medium select, - .control-medium textarea { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 28px; - } -} -.control-large input, -.control-large .control-label { - font-size: 17.5px; - line-height: 30px; -} -.control-large input { - height: 41px; -} -.control-required { - color: #c6898b; -} -.form-actions .control-required-message { - float: left; - margin-left: 20px; - margin-bottom: 0; - line-height: 30px; -} -.form-actions .control-required-message:first-child { - margin-left: 0; -} -.form-actions { - background: none; - margin-left: -25px; - margin-right: -25px; - margin-bottom: 0; - padding-bottom: 0; -} -@media (min-width: 768px) { - .form-actions { - text-align: right; - } -} -.form-actions .action-info { - line-height: 2; - text-align: left; - color: #707070; - margin: 0; -} -@media (min-width: 768px) { - .form-actions .action-info { - float: left; - width: 50%; - } -} -.form-actions .action-info.small { - font-size: 11px; - line-height: 1.2; -} -@media (max-width: 768px) { - .form-actions .btn { - margin-top: 5px; - } -} -.form-horizontal .control-label { - width: 120px; -} -@media (min-width: 768px) { - .form-horizontal .controls { - margin-left: 130px; - } -} -.form-horizontal .info-block { - position: relative; - display: block; - font-size: 11px; - color: #aaa; - line-height: 1.3; - margin-top: 6px; -} -.form-horizontal .info-help { - padding: 6px 0; -} -.form-horizontal .info-help:before { - display: none; -} -.form-horizontal .info-help-tight { - margin-top: -10px; -} -@media (min-width: 980px) { - .form-horizontal .info-block { - padding: 6px 0 6px 0; - } - .form-horizontal .info-inline { - float: right; - width: 265px; - margin-top: 0; - padding-bottom: 0; - } -} -.form-horizontal .control-medium .info-block.info-inline { - width: 165px; -} -.form-horizontal .info-block:before { - font-size: 2.2em; - position: absolute; - left: 0; - top: 2px; -} -.form-horizontal .info-inline:before { - top: 8px; -} -.info-block .icon-large, -.info-inline .icon-large { - float: left; - font-size: 22px; - margin-right: 15px; -} -.form-horizontal .info-block a { - color: #aaa; - text-decoration: underline; -} -.form-horizontal .form-actions { - padding-left: 25px; - padding-right: 25px; -} -.form-inline input { - padding-bottom: 9px; -} -.form-inline select { - margin-top: 0; -} -.form-inline .btn { - margin-left: 5px; -} -.form-narrow label { - margin-bottom: 0; -} -.form-narrow select { - width: 100%; -} -.form-narrow .form-actions { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px 0; -} -.form-select label { - margin-right: 5px; -} -.simple-input label, -.simple-input button { - display: none; -} -.simple-input .field { - position: relative; -} -.simple-input .field-bordered { - border-bottom: 1px dotted #ddd; -} -.simple-input .field input { - width: 100%; - height: auto; - margin: 0 -7px; - padding: 7px 5px; -} -.simple-input .field .btn-search { - position: absolute; - display: block; - height: 17px; - width: 17px; - padding: 0; - top: 50%; - right: 0; - margin-top: -10px; - background-color: transparent; - border: none; - color: #999; - -webkit-transition: color 0.2s ease-in; - -moz-transition: color 0.2s ease-in; - -o-transition: color 0.2s ease-in; - transition: color 0.2s ease-in; -} -.simple-input .field .btn-search:hover { - color: #000; -} -.editor textarea { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - border-bottom: none; -} -.editor .editor-info-block { - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - display: block; - float: none; - padding: 4px 10px; - background: #ebebeb; - width: auto; - border: 1px solid #ccc; - border-top: none; - font-size: 11px; - color: #282828; -} -.editor .editor-info-block a { - color: #E73892; - text-decoration: none; -} -@media (max-width: 768px) { - [data-module="custom-fields"] .input-prepend .add-on { - display: block; - } -} -@media (max-width: 480px) { - [data-module="custom-fields"] .input-prepend { - width: 100%; - } - [data-module="custom-fields"] .control-custom input { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 28px; - } -} -.control-custom { - font-size: 0; -} -.control-custom label { - margin-bottom: 0; -} -.control-custom input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - width: 140px; -} -.control-custom input:last-of-type { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.control-custom .checkbox { - display: inline-block; - margin-left: 5px; -} -.control-custom .checkbox input { - width: auto; -} -.control-custom.disabled label, -.control-custom.disabled input { - color: #aaa; - text-decoration: line-through; - text-shadow: none; -} -.control-custom.disabled input { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - background-color: #f3f3f3; -} -.control-custom.disabled .checkbox { - color: #444; - text-decoration: none; -} -.control-custom .checkbox.btn { - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; - position: relative; - top: 0; - left: 5px; - height: 1px; - width: 9px; - padding: 3px 8px; - line-height: 18px; -} -.control-custom .checkbox.btn span { - display: none; - width: 30px; -} -.control-custom .checkbox.btn:before { - position: relative; - top: 1px; - left: -1px; - color: #fff; -} -.control-custom .checkbox.btn input { - display: none; -} -.control-custom.disabled .checkbox.btn { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ea53a1; - background-image: -moz-linear-gradient(top, #ec66ab, #E73892); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ec66ab), to(#E73892)); - background-image: -webkit-linear-gradient(top, #ec66ab, #E73892); - background-image: -o-linear-gradient(top, #ec66ab, #E73892); - background-image: linear-gradient(to bottom, #ec66ab, #E73892); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec66ab', endColorstr='#ffe73892', GradientType=0); - border-color: #E73892 #E73892 #bc176c; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #E73892; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.control-custom.disabled .checkbox.btn:hover, -.control-custom.disabled .checkbox.btn:focus, -.control-custom.disabled .checkbox.btn:active, -.control-custom.disabled .checkbox.btn.active, -.control-custom.disabled .checkbox.btn.disabled, -.control-custom.disabled .checkbox.btn[disabled] { - color: #fff; - background-color: #E73892; - *background-color: #e42186; -} -.control-custom.disabled .checkbox.btn:active, -.control-custom.disabled .checkbox.btn.active { - background-color: #d31979 \9; -} -.control-custom.disabled .checkbox.btn .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.alert-danger a, -.alert-error a { - color: #b55457; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea, -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - border-color: #c6898b; -} -.error-inline { - color: #b55457; -} -.error-block, -.error-inline { - font-size: 12px; -} -.error-block { - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - display: block; - padding: 6px 8px 3px; - background: #c6898b; - margin: -3px 0 0; - color: #fff; - width: 208px; -} -.control-medium .error-block { - width: 318px; -} -.control-full .error-block { - width: auto; -} -.control-group.error .input-prepend .error-block, -.control-custom.error .error-block { - width: auto; -} -.control-custom.error .error-block { - width: 401px; -} -.control-select.error .error-block { - width: 196px; -} -.stages { - margin: 0; - list-style: none; - *zoom: 1; - color: #aeaeae; - counter-reset: stage; - margin: -20px -25px 20px; - overflow: hidden; -} -.stages:before, -.stages:after { - display: table; - content: ""; - line-height: 0; -} -.stages:after { - clear: both; -} -.stages li { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - line-height: 27px; - counter-increment: stage; - width: 50%; - background-color: #EDEDED; - float: left; - padding: 10px 20px; - position: relative; - z-index: 0; -} -.stages li:before { - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; - content: counter(stage); - display: inline-block; - width: 27px; - height: 27px; - margin-right: 5px; - font-weight: bold; - text-align: center; - color: #fff; - background-color: #aeaeae; - z-index: 1; -} -.stages li:after { - left: 0; - border: solid rgba(237, 237, 237, 0); - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-top-color: #EDEDED; - border-bottom-color: #EDEDED; - border-width: 29px; - top: 50%; - margin-top: -29px; - margin-left: -30px; -} -.stages li.last { - position: relative; - right: -1px; -} -.stages li.last, -.stages li.last .highlight { - -webkit-border-radius: 0 3px 0 0; - -moz-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0; -} -.stages li.first:after { - content: none; - border: none; -} -.stages li.active:after { - border-color: rgba(140, 198, 138, 0); - border-top-color: #8cc68a; - border-bottom-color: #8cc68a; -} -.stages li.complete:after { - border-color: rgba(197, 226, 196, 0); - border-top-color: #c5e2c4; - border-bottom-color: #c5e2c4; -} -.stages.stage-3 li.complete:first-child:after { - content: none; -} -.stages li.active, -.stages li.complete { - background: none; -} -.stages li.active:before { - color: #8cc68a; - background: #fff; -} -.stages li.complete:before { - color: #c5e2c4; - background: #eef6ed; -} -.stages li .highlight { - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - width: 100%; - padding: 10px 52px; - border: none; - text-align: left; - text-decoration: none; - line-height: 27px; - z-index: -1; -} -@media (max-width: 768px) { - .stages li .highlight { - text-indent: -9999px; - } -} -.stages li.active .highlight { - color: #fff; - background: #8cc68a; -} -.stages li.complete .highlight { - color: #eef6ed; - background: #c5e2c4; -} -.alert > :last-child { - margin-bottom: 0; -} -.slug-preview { - font-size: 14px; - line-height: 1.5; - margin-top: 5px; - margin-left: 10px; -} -.slug-preview-value { - background-color: #faedcf; - margin-right: 3px; -} -.resource-upload-field { - position: relative; - overflow: hidden; - display: inline-block; - vertical-align: bottom; -} -.resource-upload-field label { - z-index: 0; -} -.resource-upload-field input { - opacity: 0; - filter: alpha(opacity=0); - position: absolute; - top: 0; - right: 0; - z-index: 1; - margin: 0; - border: solid transparent; - border-width: 100px 0 0 200px; - cursor: pointer; - direction: ltr; - -moz-transform: translate(-300px, 0) scale(4); -} -.resource-upload-field.loading { - display: inline-block; - background: url("../../../base/images/loading-spinner.gif") no-repeat center right; - padding-right: 5px; -} -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - font-size: 14px; -} -.select2-container-multi .select2-choices .select2-search-field input { - height: 29px; -} -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - padding-left: 10px; -} -.select2-container { - margin-top: 1px; -} -.select2-container-multi { - margin-top: 0; -} -.select2-container-multi .select2-choices .select2-search-choice { - padding: 5px 8px 5px 22px; -} -.select2-container-multi.select2-container .select2-choices { - padding-top: 3px; - padding-bottom: 3px; -} -.select2-search-choice-close, -.select2-container-multi .select2-search-choice-close { - top: 6px; - left: 5px; -} -.select2-container-multi .select2-choices { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; - background-color: #fff; - border: 1px solid #ccc; -} -.select2-container-active .select2-choices, -.select2-container-multi.select2-container-active .select2-choices { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -.select2-container-multi .select2-drop { - margin-top: -2px; -} -.select2-container .select2-results li { - line-height: 18px; - padding-top: 4px; - padding-bottom: 4px; -} -.control-full .select2-container { - max-width: 100%; -} -.control-group.error .select2-container input:focus, -.control-group.error .select2-container select:focus, -.control-group.error .select2-container textarea:focus { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.js .image-upload #field-image-url { - padding-right: 90px; -} -.js .image-upload #field-image-upload { - cursor: pointer; - position: absolute; - z-index: 1; - opacity: 0; - filter: alpha(opacity=0); -} -.js .image-upload .controls { - position: relative; -} -.js .image-upload .btn { - position: relative; - top: 0; - margin-right: 10px; -} -.js .image-upload .btn.hover { - color: #333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.js .image-upload .btn-remove-url { - position: absolute; - margin-right: 0; - top: 4px; - right: 5px; - padding: 0 12px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.js .image-upload .btn-remove-url .icon-remove { - margin-right: 0; -} -.add-member-form .control-label { - width: 100%; - text-align: left; -} -.add-member-form .controls { - margin-left: auto; -} -.add-member-or { - float: left; - margin-top: 75px; - width: 7%; - text-align: center; - text-transform: uppercase; - color: #999; - font-weight: bold; -} -.add-member-form .row-fluid .control-group { - float: left; - width: 45%; -} -.add-member-form .row-fluid .select2-container, -.add-member-form .row-fluid input { - width: 100% !important; -} -#recaptcha_table { - table-layout: inherit; - line-height: 1; -} -.dataset-item { - border-bottom: 1px dotted #ddd; - padding-bottom: 20px; - margin-bottom: 20px; -} -@media (max-width: 768px) { - .dataset-item { - word-wrap: break-word; - } -} -.dataset-item:last-of-type { - border-bottom: none; - margin-bottom: 0; - padding-bottom: 0; -} -.dataset-heading { - font-size: 16px; - margin-top: 0; - margin-bottom: 8px; - line-height: 1.3; -} -.dataset-heading a { - color: #333; -} -.dataset-heading .label { - position: relative; - top: -1px; -} -.dataset-private { - margin-right: 10px; - text-transform: uppercase; -} -.dataset-private .icon-lock { - width: 9px; -} -.dataset-private.pull-right { - margin-right: 0; -} -.dataset-resources { - margin-top: 8px; -} -.dataset-resources li { - display: inline; -} -.dataset-resources li a { - background-color: #aaa; -} -.dataset-heading .popular { - top: 0; -} -.resource-list { - margin: 0; - list-style: none; - margin: -10px -10px 10px -10px; -} -.resource-item { - position: relative; - padding: 10px 10px 10px 60px; - margin-bottom: 0px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.resource-item:hover { - background-color: #eee; -} -.resource-item .heading { - color: #000; - font-size: 14px; - font-weight: bold; -} -.resource-item .format-label { - position: absolute; - top: 10px; - left: 10px; -} -.resource-item .description { - font-size: 12px; - margin-bottom: 0; - min-height: 12px; -} -.resource-item .btn-group { - position: absolute; - top: 14px; - right: 10px; -} -@media (max-width: 768px) { - .resource-item .btn-group { - display: none; - } -} -.resource-list.reordering .resource-item { - border: 1px solid #ddd; - margin-bottom: 10px; - cursor: move; -} -.resource-list.reordering .resource-item .handle { - display: block; - position: absolute; - color: #888; - left: -31px; - top: 50%; - margin-top: -15px; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - border: 1px solid #ddd; - border-width: 1px 0 1px 1px; - background-color: #fff; - -webkit-border-radius: 20px 0 0 20px; - -moz-border-radius: 20px 0 0 20px; - border-radius: 20px 0 0 20px; -} -.resource-list.reordering .resource-item .handle:hover { - text-decoration: none; -} -.resource-list.reordering .resource-item:hover .handle { - background-color: #eee; -} -.resource-list.reordering .resource-item.ui-sortable-helper { - background-color: #eee; - border: 1px solid #E73892; -} -.resource-list.reordering .resource-item.ui-sortable-helper .handle { - background-color: #eee; - border-color: #E73892; - color: #333; -} -.resource-item .handle { - display: none; -} -.tag-list { - margin: 0; - list-style: none; - padding: 10px 10px 5px 10px; -} -.tag-list li { - display: inline-block; - margin-right: 5px; -} -.tag-list li:last-child { - margin-right: 0; -} -.additional-info td, -.additional-info th { - width: 50%; -} -.label[data-format=html], -.label[data-format*=html] { - background-color: #55a1ce; -} -.label[data-format=json], -.label[data-format*=json] { - background-color: #ef7100; -} -.label[data-format=xml], -.label[data-format*=xml] { - background-color: #ef7100; -} -.label[data-format=text], -.label[data-format*=text] { - background-color: #74cbec; -} -.label[data-format=csv], -.label[data-format*=csv] { - background-color: #dfb100; -} -.label[data-format=xls], -.label[data-format*=xls] { - background-color: #2db55d; -} -.label[data-format=zip], -.label[data-format*=zip] { - background-color: #686868; -} -.label[data-format=api], -.label[data-format*=api] { - background-color: #ec96be; -} -.label[data-format=pdf], -.label[data-format*=pdf] { - background-color: #e0051e; -} -.label[data-format=rdf], -.label[data-format*=rdf], -.label[data-format*=nquad], -.label[data-format*=ntriples], -.label[data-format*=turtle] { - background-color: #0b4498; -} -.view-list { - margin: 0; - list-style: none; -} -.view-list li { - position: relative; - margin-bottom: 10px; -} -.view-list li a { - display: block; - min-height: 50px; - padding: 10px; - border: 1px solid #ddd; - overflow: hidden; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.view-list li a .icon { - float: left; - width: 50px; - height: 50px; - overflow: hidden; - margin-right: 10px; - color: #444; - background-color: #eee; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.view-list li a .icon i { - display: block; - text-align: center; - font-size: 28px; - line-height: 50px; -} -.view-list li a h3 { - color: #000; - font-weight: bold; - font-size: 16px; - margin: 0 0 3px 0; -} -.view-list li a p { - margin: 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - color: #444; -} -.view-list li a.active, -.view-list li a:hover { - text-decoration: none; - border-color: #E73892; -} -.view-list li a.active .icon, -.view-list li a:hover .icon { - background-color: #E73892; - color: #f6f6f6; -} -.view-list li .arrow { - position: absolute; - display: none; - border: 8px solid transparent; - border-top-color: #E73892; - left: 50%; - bottom: -15px; - margin-left: -4px; -} -.view-list li.active a { - text-decoration: none; - border-color: #E73892; -} -.view-list li.active a .icon { - background-color: #E73892; - color: #f6f6f6; -} -.view-list li.active .arrow { - display: block; -} -.view-list.stacked { - overflow-y: hidden; - overflow-x: auto; - height: 100px; - white-space: nowrap; -} -.view-list.stacked li { - display: inline-block; - width: 250px; - margin-right: 10px; -} -.view-list.stacked li:last-child { - margin-right: 0; -} -.view-list.stacked::-webkit-scrollbar { - width: 7px; - height: 7px; -} -.view-list.stacked::-webkit-scrollbar-track { - border-radius: 10px; - background-color: #f6f6f6; -} -.view-list.stacked::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color: #c3c3c3; -} -.view-list.stacked::-webkit-scrollbar-thumb:hover { - background-color: #E73892; -} -.resource-view { - margin-top: 20px; -} -.search-form { - margin-bottom: 20px; - padding-bottom: 25px; - border-bottom: 1px dotted #ddd; -} -.search-form .search-input { - position: relative; - margin-bottom: 20px; -} -.search-form .search-input input { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - width: 100%; - height: auto; -} -.search-form .search-input button { - cursor: pointer; - display: block; - position: absolute; - top: 50%; - margin-top: 1px; - right: 10px; - height: 20px; - padding: 0; - border: none; - background: transparent; -} -.search-form .search-input button span { - display: none; -} -.search-form .search-input button i { - color: #ccc; - -webkit-transition: color 0.2s ease-in; - -moz-transition: color 0.2s ease-in; - -o-transition: color 0.2s ease-in; - transition: color 0.2s ease-in; -} -.search-form .search-input button:hover i { - color: #000; -} -.search-form .search-input.search-giant input { - font-size: 16px; - padding: 15px; -} -.search-form .search-input.search-giant button { - margin-top: -4px; - right: 15px; - height: 30px; -} -.search-form .search-input.search-giant button i { - font-size: 28px; - width: 28px; -} -.search-form .control-order-by label, -.search-form .control-order-by select { - display: inline; -} -.search-form .control-order-by select { - width: 160px; - margin: 0; -} -.search-form h2 { - font-size: 24px; - line-height: 1.3; - color: #000; - margin-bottom: 0; - margin-top: 20px; -} -.search-form .filter-list { - color: #444; - line-height: 32px; - margin: 10px 0 0 0; -} -.search-form .filter-list .pill { - line-height: 21px; -} -.search-form .filter-list .extra { - margin-top: 10px; - font-size: 18px; - font-weight: normal; - color: #000; -} -.search-form.no-bottom-border { - border-bottom-width: 0; - margin-bottom: 0; -} -.tertiary .control-order-by { - float: none; - margin: 0; -} -.tertiary .control-order-by label { - display: block; - margin-bottom: 5px; - font-weight: normal; - font-size: 12px; -} -.tertiary .control-order-by select { - display: block; - font-size: 12px; - width: 100%; -} -.tertiary .search-input { - margin-bottom: 10px; -} -@media (min-width: 980px) { - .search-form .control-order-by { - float: right; - margin-left: 15px; - } - .tertiary .search-form .control-order-by { - float: none; - margin: 0; - } -} -.group .media-vertical .image { - margin: 0 -5px 5px; -} -.group-list:nth-child(odd) { - clear: left; -} -.group-list .module-heading { - padding-top: 15px; - padding-bottom: 15px; -} -.group-list .dataset-content { - min-height: 54px; -} -.group-list .module-heading h3 { - margin-bottom: 2px; -} -.group-list .module-heading h3 a { - color: #333; -} -.group-list .module-heading .media-image { - overflow: hidden; - max-height: 60px; -} -.group-list .module-heading .media-image img { - max-width: 85px; -} -.toolbar { - *zoom: 1; - position: relative; - margin-bottom: 10px; - padding: 5px 0; -} -.toolbar:before, -.toolbar:after { - display: table; - content: ""; - line-height: 0; -} -.toolbar:after { - clear: both; -} -.page_primary_action { - margin-bottom: 20px; -} -.toolbar .breadcrumb { - *zoom: 1; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - position: relative; - float: left; - margin: 0; - padding: 0; - border: none; - background: none; - font-size: 20px; - line-height: 1.3; -} -.toolbar .breadcrumb:before, -.toolbar .breadcrumb:after { - display: table; - content: ""; - line-height: 0; -} -.toolbar .breadcrumb:after { - clear: both; -} -.toolbar .breadcrumb li:after { - content: " / "; -} -.toolbar .breadcrumb li.active:after { - content: ""; -} -.toolbar .breadcrumb li:last-of-type:after { - content: ""; -} -.toolbar .home a { - text-decoration: none; -} -.toolbar .home span { - display: none; -} -.toolbar .breadcrumb a { - color: #505050; -} -@media (max-width: 767px) { - .toolbar .breadcrumb { - color: #fff; - text-shadow: none; - } - .toolbar .breadcrumb .home { - display: none; - } - .toolbar .breadcrumb a { - color: #fff; - text-shadow: none; - } -} -.toolbar .breadcrumb .active a, -.toolbar .breadcrumb a.active { - font-weight: bold; -} -.actions { - margin: 0; - list-style: none; - position: absolute; - top: 10px; - right: 10px; - z-index: 1; -} -.actions li { - display: inline-block; - margin-right: 5px; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.actions li:last-of-type { - margin-right: 0; -} -.hide-heading { - display: none; -} -.page-header { - *zoom: 1; - border-bottom: 1px solid #ddd; - background-color: #f6f6f6; - -webkit-border-radius: 0 3px 0 0; - -moz-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0; -} -.page-header:before, -.page-header:after { - display: table; - content: ""; - line-height: 0; -} -.page-header:after { - clear: both; -} -.page-header .nav-tabs { - float: left; - margin-bottom: -1px; -} -.page-header .nav-tabs li.active a, -.page-header .nav-tabs a:hover { - background-color: #fff; -} -.page-header .content_action { - float: right; - margin-top: -5px; - margin-right: -7px; -} -.no-nav .page-header { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.nav-tabs-plain { - padding: 0 25px; -} -.nav-tabs-plain > .active > a, -.nav-tabs-plain > .active > a:hover { - background-color: #fff; -} -@media (min-width: 768px) { - .span9 .page-header { - margin-left: -17px; - } -} -@media (max-width: 768px) { - .page-header .nav-tabs { - margin: 5px 10px 10px -5px; - border: none; - } - .page-header .nav-tabs > li { - float: none; - } - .page-header .nav-tabs > li a { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .page-header .nav-tabs > .active > a, - .page-header .nav-tabs > .active > a:hover, - .page-header .nav-tabs > .active > a:focus { - border-bottom-color: #dddddd; - } -} -h1 { - font-size: 28px; -} -h2 { - font-size: 21px; -} -h3 { - font-size: 18px; -} -h4 { - font-size: 14px; -} -h1, -h2, -h3, -h4 { - line-height: 1.5; -} -h1 small, -h2 small, -h3 small, -h4 small { - font-size: 14px; -} -.prose h1, -.prose heading-1 h2, -.prose heading-2 { - margin-bottom: 15px; -} -.prose h3, -.prose heading-3 { - margin-bottom: 10px; -} -.table-chunky td, -.table-chunky th { - padding: 12px 15px; - font-size: 12px; -} -.table-chunky thead th, -.table-chunky thead td { - color: #fff; - background-color: #aaa; - padding-top: 10px; - padding-bottom: 10px; -} -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: transparent; -} -.table-striped tbody tr:nth-child(even) td, -.table-striped tbody tr:nth-child(even) th { - background-color: #f2f2f2; -} -.table-chunky.table-bordered { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} -.table-chunky.table-bordered thead:first-child tr:first-child th:first-child, -.table-chunky.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 2px; - -moz-border-radius-topleft: 2px; - border-top-left-radius: 2px; -} -.table-chunky.table-bordered thead:first-child tr:first-child th:last-child, -.table-chunky.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 2px; - -moz-border-radius-topright: 2px; - border-top-right-radius: 2px; -} -.table-chunky.table-bordered thead:last-child tr:last-child th:first-child, -.table-chunky.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 2px; - -moz-border-radius: 0 0 0 2px; - border-radius: 0 0 0 2px; - -webkit-border-bottom-left-radius: 2px; - -moz-border-radius-bottomleft: 2px; - border-bottom-left-radius: 2px; -} -.table-chunky.table-bordered thead:last-child tr:last-child th:last-child, -.table-chunky.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 2px; - -moz-border-radius-bottomright: 2px; - border-bottom-right-radius: 2px; -} -.ellipsis { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.ckan-icon { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; -} -.ckan-icon-fb { - width: 16px; - height: 16px; - background-position: 0px 0; -} -.ckan-icon-gplus { - width: 16px; - height: 16px; - background-position: -16px 0; -} -.ckan-icon-twitter { - width: 16px; - height: 16px; - background-position: -32px 0; -} -.ckan-icon-email { - width: 16px; - height: 16px; - background-position: -48px 0; -} -.ckan-icon-share { - width: 16px; - height: 16px; - background-position: -64px 0; -} -.ckan-icon-feed { - width: 16px; - height: 16px; - background-position: -80px 0; -} -.ckan-icon-calendar { - width: 16px; - height: 16px; - background-position: -96px 0; -} -.ckan-icon-file { - width: 16px; - height: 16px; - background-position: -112px 0; -} -.ckan-icon-lock { - width: 16px; - height: 16px; - background-position: -128px 0; -} -.ckan-icon-link-file { - width: 16px; - height: 16px; - background-position: -144px 0; -} -.ckan-icon-link-plugin { - width: 16px; - height: 16px; - background-position: -160px 0; -} -.ckan-icon-upload-file { - width: 16px; - height: 16px; - background-position: -176px 0; -} -.ckan-icon-callout { - width: 16px; - height: 16px; - background-position: -192px 0; -} -.ckan-icon-circle-cross { - width: 17px; - height: 17px; - background-position: 0px -16px; -} -.ckan-icon-circle-add { - width: 17px; - height: 17px; - background-position: -17px -16px; -} -.ckan-icon-flame { - width: 17px; - height: 17px; - background-position: -34px -16px; -} -.ckan-icon-search { - width: 17px; - height: 17px; - background-position: -51px -16px; -} -.ckan-icon-large-lock { - width: 20px; - height: 20px; - background-position: 0px -33px; -} -.ckan-icon-photo { - width: 20px; - height: 20px; - background-position: -20px -33px; -} -.ckan-icon-add { - width: 20px; - height: 20px; - background-position: -40px -33px; -} -.ckan-icon-home { - width: 20px; - height: 20px; - background-position: -60px -33px; -} -.ckan-icon-rewind { - width: 20px; - height: 20px; - background-position: -80px -33px; -} -.ckan-icon-tools { - width: 20px; - height: 20px; - background-position: -100px -33px; -} -.ckan-icon-flag { - width: 20px; - height: 20px; - background-position: -120px -33px; -} -.ckan-icon-clipboard { - width: 20px; - height: 20px; - background-position: -140px -33px; -} -.ckan-icon-share { - width: 20px; - height: 20px; - background-position: -160px -33px; -} -.ckan-icon-info { - width: 20px; - height: 20px; - background-position: -180px -33px; -} -.ckan-icon-download { - width: 20px; - height: 20px; - background-position: -200px -33px; -} -.ckan-icon-star { - width: 20px; - height: 20px; - background-position: -220px -33px; -} -.ckan-icon-info-flat { - width: 20px; - height: 20px; - background-position: -240px -33px; -} -.ckan-icon-tag { - width: 20px; - height: 20px; - background-position: -260px -33px; -} -.ckan-icon-plus { - width: 20px; - height: 20px; - background-position: -280px -33px; - width: 16px; -} -.ckan-icon-head { - width: 20px; - height: 20px; - background-position: -300px -33px; -} -.ckan-icon-arrow-e { - width: 20px; - height: 20px; - background-position: -320px -33px; - width: 16px; -} -.ckan-icon-bookmark { - width: 25px; - height: 25px; - background-position: 0px -53px; -} -.format-label { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - text-indent: -900em; - background: url("../../../base/images/sprite-resource-icons.png") no-repeat 0 0; -} -.format-label { - width: 32px; - height: 35px; - background-position: 0px -62px; -} -.format-label[data-format=rdf], -.format-label[data-format*=rdf] { - width: 32px; - height: 35px; - background-position: -32px -62px; -} -.format-label[data-format=pdf], -.format-label[data-format*=pdf] { - width: 32px; - height: 35px; - background-position: -64px -62px; -} -.format-label[data-format=api], -.format-label[data-format*=api] { - width: 32px; - height: 35px; - background-position: -96px -62px; -} -.format-label[data-format=zip], -.format-label[data-format*=zip] { - width: 32px; - height: 35px; - background-position: -128px -62px; -} -.format-label[data-format=xls], -.format-label[data-format*=xls] { - width: 32px; - height: 35px; - background-position: -160px -62px; -} -.format-label[data-format=csv], -.format-label[data-format*=csv] { - width: 32px; - height: 35px; - background-position: -192px -62px; -} -.format-label[data-format=txt], -.format-label[data-format*=txt] { - width: 32px; - height: 35px; - background-position: -224px -62px; -} -.format-label[data-format=xml], -.format-label[data-format*=xml] { - width: 32px; - height: 35px; - background-position: -256px -62px; -} -.format-label[data-format=json], -.format-label[data-format*=json] { - width: 32px; - height: 35px; - background-position: -288px -62px; -} -.format-label[data-format=html], -.format-label[data-format*=html] { - width: 32px; - height: 35px; - background-position: -320px -62px; -} -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - text-align: right; - font-size: 14px; - line-height: 1; - width: 14px; -} -.btn [class^="icon-"], -.nav [class^="icon-"], -.module-heading [class^="icon-"], -.dropdown [class^="icon-"], -.btn [class*=" icon-"], -.nav [class*=" icon-"], -.module-heading [class*=" icon-"], -.dropdown [class*=" icon-"] { - margin-right: 4px; -} -.info-block [class^="icon-"], -.info-block [class*=" icon-"] { - float: left; - font-size: 28px; - width: 28px; - margin-right: 5px; - margin-top: 2px; -} -.breadcrumb .home .icon-home { - font-size: 24px; - width: 24px; - vertical-align: -1px; -} -.info-block-small [class^="icon-"], -.info-block-small [class*=" icon-"] { - font-size: 14px; - width: 14px; - margin-top: 1px; -} -.nav-tabs .fa:last-child, -.module-heading .fa:last-child, -.btn .fa:last-child { - margin-right: 3px; -} -.wrapper { - *zoom: 1; - background-color: #FFF; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - position: relative; - background-color: #fff; - margin-bottom: 20px; - margin-left: 0; -} -.wrapper:before, -.wrapper:after { - display: table; - content: ""; - line-height: 0; -} -.wrapper:after { - clear: both; -} -@media (min-width: 768px) { - .wrapper { - background-image: url("../../../base/images/nav.png"); - background-repeat: repeat-y; - background-position: -54px 0px; - } -} -@media (min-width: 980px) { - .wrapper { - background-position: 0px 0px; - } -} -.wrapper.no-nav { - background-image: none; -} -[role=main], -.main { - position: relative; - padding-bottom: 20px; -} -@media (min-width: 768px) { - [role=main], - .main { - padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); - } -} -[role=main] { - min-height: 350px; -} -.main:after, -[role=main]:after { - bottom: 0; - border-top-width: 1px; -} -[role=main] .primary { - float: right; - margin-left: 0; -} -[role=main] .secondary { - margin-left: 0; -} -/* Filters modal */ -.no-text .text { - display: none; -} -.js body.filters-modal { - overflow: hidden; -} -.show-filters.btn, -.hide-filters { - display: none; -} -@media (max-width: 768px) { - .wrapper { - margin: 0 -20px; - border-width: 0; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - } - .js [role=main] .secondary .filters { - display: none; - position: fixed; - overflow: auto; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 1; - padding: 10px; - background-color: #000000; - background-color: rgba(0, 0, 0, 0.5); - } - .js body.filters-modal .secondary .filters { - display: block; - } - .js [role=main] .secondary .filters > div { - background-color: #fff; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - overflow: hidden; - } - .js [role=main] .secondary .filters > div .module-footer { - display: none; - } - .js body.filters-modal .secondary .filters .hide-filters { - display: inline-block; - position: absolute; - top: 14px; - right: 17px; - opacity: 0.6; - } - .js body.filters-modal .secondary .filters .hide-filters i { - font-size: 18px; - } - .js .show-filters.btn { - display: inline-block; - } -} -.primary > :last-child, -.secondary > :last-child { - margin-bottom: 0; -} -.primary .primary { - float: left; - width: 467px; - margin-left: 0; - margin-bottom: 20px; -} -.primary .primary h1:first-child, -.primary .primary h2:first-child, -.primary .primary h3:first-child, -.primary .primary h4:first-child { - margin-top: 0; -} -.primary .tertiary { - float: left; - width: 180px; - margin-left: 18px; - margin-bottom: 20px; -} -@media (min-width: 768px) { - .hero { - background: url("../../../base/images/background-tile.png"); - } -} -.hero:after { - background-color: rgba(0, 0, 0, 0.09); - background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(0, 0, 0, 0.15)), to(rgba(0, 0, 0, 0))); - background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-repeat: repeat-x; - background-color: #f6f6f6; - border-bottom: 1px solid #d0d0d0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - -webkit-box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); - -moz-box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); - box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); -} -.hero:after .back:hover { - text-decoration: none; -} -.hero:after .back:hover span { - text-decoration: underline; -} -.context-info .module-content { - padding: 15px; -} -.context-info .image { - margin-bottom: 10px; -} -.context-info .image img, -.context-info .image a { - display: block; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.context-info p { - overflow: auto; -} -.context-info code { - display: block; - font-weight: normal; - padding: 0; - margin: 0; - overflow: auto; -} -.context-info h1.heading { - margin: 0 0 5px 0; - font-size: 18px; - line-height: 1.3; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.context-info .info { - margin-top: 15px; - padding-top: 10px; - border-top: 1px dotted #DDD; - word-break: break-word; -} -.context-info .info dl dd { - margin-top: 3px; - margin-left: 0; -} -.context-info .nums { - *zoom: 1; - margin-top: 15px; - padding-top: 10px; - padding-bottom: 0; - border-top: 1px dotted #DDD; -} -.context-info .nums:before, -.context-info .nums:after { - display: table; - content: ""; - line-height: 0; -} -.context-info .nums:after { - clear: both; -} -.context-info .nums dl { - float: left; - width: 50%; - margin: 5px 0 0 0; - color: #444; -} -.context-info .nums dl dt { - display: block; - font-size: 13px; - font-weight: 300; -} -.context-info .nums dl dd { - display: block; - font-size: 30px; - font-weight: 700; - line-height: 36px; - margin-left: 0; -} -.context-info .nums dl dd .smallest { - font-size: 13px; -} -.context-info .nums dl dd .smaller { - font-size: 16px; -} -.context-info .nums dl dd .small { - font-size: 21px; -} -.context-info .follow_button { - margin-top: 15px; -} -.context-info.editing .module-content { - margin-top: 0; -} -.flash-messages .alert { - -webkit-box-shadow: 0 0 0 1px white; - -moz-box-shadow: 0 0 0 1px white; - box-shadow: 0 0 0 1px white; -} -.homepage .row { - position: relative; -} -.homepage .module-search { - padding: 5px; - margin: 20px 0 0 0; - color: #fff; - background: #fff; -} -.homepage .module-search .search-giant { - margin-bottom: 10px; -} -.homepage .module-search .search-giant input { - border-color: #003f52; -} -.homepage .module-search .module-content { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - background-color: #E73892; - border-bottom: none; -} -.homepage .module-search .module-content .heading { - margin-top: 0; - margin-bottom: 7px; - font-size: 24px; - line-height: 40px; -} -.homepage .module-search .tags { - *zoom: 1; - padding: 5px 10px 10px 10px; - background-color: #d31979; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.homepage .module-search .tags:before, -.homepage .module-search .tags:after { - display: table; - content: ""; - line-height: 0; -} -.homepage .module-search .tags:after { - clear: both; -} -.homepage .module-search .tags h3, -.homepage .module-search .tags .tag { - display: block; - float: left; - margin: 5px 10px 0 0; -} -.homepage .module-search .tags h3 { - font-size: 14px; - line-height: 20px; - padding: 2px 8px; -} -.homepage .group-list { - margin: 0; -} -.homepage .box .inner { - padding: 20px 25px; -} -.homepage .stats h3 { - margin: 0 0 10px 0; -} -.homepage .stats ul { - margin: 0; - list-style: none; - *zoom: 1; -} -.homepage .stats ul:before, -.homepage .stats ul:after { - display: table; - content: ""; - line-height: 0; -} -.homepage .stats ul:after { - clear: both; -} -.homepage .stats ul li { - float: left; - width: 25%; - font-weight: 300; -} -.homepage .stats ul li a { - display: block; -} -.homepage .stats ul li a b { - display: block; - font-size: 35px; - line-height: 1.5; -} -.homepage .stats ul li a:hover { - text-decoration: none; -} -.homepage.layout-2 .stats { - margin-top: 20px; -} -@media (min-width: 768px) { - .homepage [role=main] { - padding: 20px 0; - } - .homepage.layout-1 .row1 .col2 { - position: absolute; - bottom: 0; - right: 0; - } - .homepage.layout-1 .row1 .col2 .module-search { - bottom: 0; - left: 0; - right: 0; - } -} -.account-masthead { - *zoom: 1; - min-height: 30px; - color: #fff; - background: #d31979 url("../../../base/images/bg.png"); -} -.account-masthead:before, -.account-masthead:after { - display: table; - content: ""; - line-height: 0; -} -.account-masthead:after { - clear: both; -} -.account-masthead .account { - float: right; -} -.account-masthead .account ul { - *zoom: 1; -} -.account-masthead .account ul:before, -.account-masthead .account ul:after { - display: table; - content: ""; - line-height: 0; -} -.account-masthead .account ul:after { - clear: both; -} -.account-masthead .account ul li { - display: block; - float: left; - border-left: 1px solid #bc176c; -} -.account-masthead .account ul li a { - display: block; - color: #f9cde4; - font-size: 13px; - font-weight: bold; - padding: 0 10px; - line-height: 31px; -} -.account-masthead .account ul li a span.username, -.account-masthead .account ul li a span.text { - margin: 0 2px 0 4px; -} -.account-masthead .account ul li a span.text { - position: absolute; - top: -9999px; - left: -9999px; -} -.account-masthead .account ul li a:hover { - color: #fbe1ef; - background-color: #bc176c; - text-decoration: none; -} -.account-masthead .account ul li a.sub { - font-weight: 300; -} -.account-masthead .account ul li a .btn { - vertical-align: 1px; - margin-left: 3px; -} -.account-masthead .account .notifications a span.badge { - font-size: 12px; - margin-left: 3px; - padding: 1px 6px; - background-color: #bc176c; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - text-shadow: none; - color: #f9cde4; -} -.account-masthead .account .notifications a:hover span { - color: #fff; - background-color: #a5145f; -} -.account-masthead .account .notifications.notifications-important a span.badge { - color: #fff; - background-color: #C9403A; -} -.account-masthead .account.authed .image { - padding: 0 6px; -} -.account-masthead .account.authed .image img { - vertical-align: -6px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.masthead { - *zoom: 1; - min-height: 55px; - color: #fff; - background: #E73892 url("../../../base/images/bg.png"); -} -.masthead:before, -.masthead:after { - display: table; - content: ""; - line-height: 0; -} -.masthead:after { - clear: both; -} -.masthead .container { - position: relative; -} -.masthead a { - color: #fff; -} -.masthead hgroup h1, -.masthead hgroup h2 { - float: left; - font-size: 30px; - line-height: 1.5; -} -.masthead hgroup h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; -} -.masthead hgroup h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; -} -.masthead .nav-collapse { - padding-top: 10px; -} -.masthead .section { - float: left; -} -.masthead input[type="text"] { - border-color: #e42186; -} -.masthead .navigation { - margin-right: 20px; -} -.masthead .navigation .nav-pills { - margin-bottom: 0; -} -.masthead .navigation .nav-pills li a:hover, -.masthead .navigation .nav-pills li.active a { - background-color: #d31979; -} -.masthead .nav > li > a, -.masthead .nav > li > a:focus, -.masthead .nav > li > a:hover, -.masthead .nav > .active > a, -.masthead .nav > .active > a:hover, -.masthead .nav > .active > a:focus { - color: #fff; - text-shadow: none; -} -.masthead .site-search { - margin: 2px 8px 2px 0; -} -.masthead .site-search input { - width: 200px; - padding: 4px 10px; -} -.masthead .btn-navbar, -.masthead .btn-navbar:hover, -.masthead .btn-navbar:focus, -.masthead .btn-navbar:active, -.masthead .btn-navbar.active, -.masthead .btn-navbar.disabled, -.masthead .btn-navbar[disabled] { - background-color: #d31979; - background-image: none; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - text-shadow: none; - margin-top: 15px; -} -.masthead .btn-navbar .icon-bar, -.masthead .btn-navbar:hover .icon-bar, -.masthead .btn-navbar:focus .icon-bar, -.masthead .btn-navbar:active .icon-bar, -.masthead .btn-navbar.active .icon-bar, -.masthead .btn-navbar.disabled .icon-bar, -.masthead .btn-navbar[disabled] .icon-bar { - margin-right: 0; -} -.masthead .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); -} -@media (min-width: 980px) { - .masthead .nav-collapse { - float: right; - } -} -@media (max-width: 767px) { - .account-masthead { - margin-left: -20px; - margin-right: -20px; - padding-left: 20px; - padding-right: 20px; - } - .masthead .section { - float: none; - } - .masthead .section .nav-collapse { - margin-bottom: 25px; - } -} -@media (max-width: 979px) { - .masthead .container { - padding-left: 20px; - padding-right: 20px; - } - .masthead .site-search { - display: none; - } -} -.site-footer { - *zoom: 1; - min-height: 55px; - color: #fff; - background: #E73892 url("../../../base/images/bg.png"); - padding: 20px 0; -} -.site-footer:before, -.site-footer:after { - display: table; - content: ""; - line-height: 0; -} -.site-footer:after { - clear: both; -} -.site-footer .container { - position: relative; -} -.site-footer a { - color: #fff; -} -.site-footer hgroup h1, -.site-footer hgroup h2 { - float: left; - font-size: 30px; - line-height: 1.5; -} -.site-footer hgroup h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; -} -.site-footer hgroup h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; -} -.site-footer .nav-collapse { - padding-top: 10px; -} -.site-footer .section { - float: left; -} -.site-footer input[type="text"] { - border-color: #e42186; -} -.site-footer .navigation { - margin-right: 20px; -} -.site-footer .navigation .nav-pills { - margin-bottom: 0; -} -.site-footer .navigation .nav-pills li a:hover, -.site-footer .navigation .nav-pills li.active a { - background-color: #d31979; -} -.site-footer .nav > li > a, -.site-footer .nav > li > a:focus, -.site-footer .nav > li > a:hover, -.site-footer .nav > .active > a, -.site-footer .nav > .active > a:hover, -.site-footer .nav > .active > a:focus { - color: #fff; - text-shadow: none; -} -.site-footer .site-search { - margin: 2px 8px 2px 0; -} -.site-footer .site-search input { - width: 200px; - padding: 4px 10px; -} -.site-footer .btn-navbar, -.site-footer .btn-navbar:hover, -.site-footer .btn-navbar:focus, -.site-footer .btn-navbar:active, -.site-footer .btn-navbar.active, -.site-footer .btn-navbar.disabled, -.site-footer .btn-navbar[disabled] { - background-color: #d31979; - background-image: none; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - text-shadow: none; - margin-top: 15px; -} -.site-footer .btn-navbar .icon-bar, -.site-footer .btn-navbar:hover .icon-bar, -.site-footer .btn-navbar:focus .icon-bar, -.site-footer .btn-navbar:active .icon-bar, -.site-footer .btn-navbar.active .icon-bar, -.site-footer .btn-navbar.disabled .icon-bar, -.site-footer .btn-navbar[disabled] .icon-bar { - margin-right: 0; -} -.site-footer .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); -} -.site-footer, -.site-footer label, -.site-footer small { - color: #f5afd3; -} -.site-footer a { - color: #f5afd3; -} -.footer-links ul li { - margin-bottom: 5px; -} -.attribution small { - color: #f5afd3; - font-size: 12px; -} -.attribution .ckan-footer-logo { - display: block; - width: 68px; - height: 21px; - margin-top: 2px; - background: url("../../../base/images/ckan-logo-footer.png") no-repeat top left; - text-indent: -900em; -} -.lang-select { - *zoom: 1; -} -.lang-select:before, -.lang-select:after { - display: table; - content: ""; - line-height: 0; -} -.lang-select:after { - clear: both; -} -.lang-select label, -.lang-select select, -.lang-select .lang-container { - float: left; - margin-top: 0; -} -.lang-dropdown { - color: #000; -} -.lang-dropdown li { - width: auto; -} -.table-selected td { - background-color: #f5f5f5; -} -.table-selected td .edit { - display: block; -} -.table-bulk-edit th input { - top: -5px; -} -.table-bulk-edit .table-actions .btn-group { - float: left; - margin: 0 10px 0 0; -} -.table-bulk-edit .context p { - margin-bottom: 0; -} -.table-header thead th { - background-color: #f6f6f6; -} -.table-edit-hover .edit { - display: none; - float: right; -} -.table-edit-hover tr:hover .edit { - display: block; -} -.js .table-toggle-more .toggle-more { - display: none; -} -.js .table-toggle-more .show-more { - display: inline; -} -.js .table-toggle-more .show-less { - display: none; -} -.js .table-toggle-more .toggle-seperator { - display: table-row; -} -.js .table-toggle-more .toggle-seperator td { - height: 11px; - padding: 0; - background-image: url("../../../base/images/table-seperator.png"); -} -.js .table .toggle-show td { - background: none; - text-align: center; -} -.js .table-toggle-less .show-less { - display: inline; -} -.js .table-toggle-less .show-more { - display: none; -} -.js .table-toggle-less .toggle-seperator { - display: none; -} -.profile .empty, -.profile .dataset-list { - margin-bottom: 20px; -} -.activity { - margin: 10px 0; - padding: 0; - list-style-type: none; - background: transparent url('../../../base/images/dotted.png') 14px 0 repeat-y; -} -.activity .item { - position: relative; - margin: 0 0 15px 0; - padding: 0; - *zoom: 1; -} -.activity .item:before, -.activity .item:after { - display: table; - content: ""; - line-height: 0; -} -.activity .item:after { - clear: both; -} -.activity .item .icon { - display: block; - position: absolute; - top: 0; - left: 0; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - color: #FFFFFF; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - font-weight: normal; - margin-right: 10px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); -} -.activity .item .gravatar { - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.activity .item .actor .gravatar { - position: absolute; - top: 0; - left: 40px; -} -.activity .item p { - font-size: 14px; - line-height: 1.5; - margin: 5px 0 0 80px; -} -.activity .item .date { - color: #999; - font-size: 12px; - white-space: nowrap; -} -.activity .item .new { - display: block; - position: absolute; - overflow: hidden; - top: -3px; - left: -3px; - width: 10px; - height: 10px; - background-color: #A35647; - border: 1px solid #FFF; - text-indent: -1000px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} -.activity .item.no-avatar p { - margin-left: 40px; -} -.activity .load-less { - margin-bottom: 15px; -} -.popover { - width: 300px; -} -.popover .popover-title { - font-weight: bold; - margin-bottom: 0; -} -.popover p.about { - margin: 0 0 10px 0; -} -.popover .popover-close { - float: right; - text-decoration: none; -} -.popover .popover-content { - font-size: 14px; - line-height: 20px; - color: #444; - word-break: break-all; -} -.popover .popover-content dl { - margin: 0; -} -.popover .popover-content dl dd { - margin-left: 0; - margin-bottom: 10px; -} -.activity .item .icon { - background-color: #999999; -} -.activity .item.failure .icon { - background-color: #B95252; -} -.activity .item.success .icon { - background-color: #69A67A; -} -.activity .item.added-tag .icon { - background-color: #6995a6; -} -.activity .item.changed-group .icon { - background-color: #767DCE; -} -.activity .item.changed-package .icon { - background-color: #8c76ce; -} -.activity .item.changed-package_extra .icon { - background-color: #769ace; -} -.activity .item.changed-resource .icon { - background-color: #aa76ce; -} -.activity .item.changed-user .icon { - background-color: #76b8ce; -} -.activity .item.changed-organization .icon { - background-color: #699fa6; -} -.activity .item.deleted-group .icon { - background-color: #B95252; -} -.activity .item.deleted-package .icon { - background-color: #b97452; -} -.activity .item.deleted-package_extra .icon { - background-color: #b95274; -} -.activity .item.deleted-resource .icon { - background-color: #b99752; -} -.activity .item.deleted-organization .icon { - background-color: #b95297; -} -.activity .item.new-group .icon { - background-color: #69A67A; -} -.activity .item.new-package .icon { - background-color: #69a68e; -} -.activity .item.new-package_extra .icon { - background-color: #6ca669; -} -.activity .item.new-resource .icon { - background-color: #81a669; -} -.activity .item.new-user .icon { - background-color: #69a6a3; -} -.activity .item.new-organization .icon { - background-color: #81a669; -} -.activity .item.removed-tag .icon { - background-color: #b95297; -} -.activity .item.deleted-related-item .icon { - background-color: #b9b952; -} -.activity .item.follow-dataset .icon { - background-color: #767DCE; -} -.activity .item.follow-user .icon { - background-color: #8c76ce; -} -.activity .item.new-related-item .icon { - background-color: #95a669; -} -.activity .item.follow-group .icon { - background-color: #8ba669; -} -.dropdown:hover .dropdown-menu { - display: block; -} -.js .dropdown .dropdown-menu, -.js .dropdown:hover .dropdown-menu { - display: none; -} -.js .dropdown.open .dropdown-menu { - display: block; -} -#followee-filter .btn { - *zoom: 1; -} -#followee-filter .btn:before, -#followee-filter .btn:after { - display: table; - content: ""; - line-height: 0; -} -#followee-filter .btn:after { - clear: both; -} -#followee-filter .btn span, -#followee-filter .btn strong { - display: block; - float: left; - line-height: 1.5; -} -#followee-filter .btn span { - font-weight: normal; -} -#followee-filter .btn strong { - margin: 0 5px; - white-space: nowrap; - max-width: 90px; - overflow: hidden; - text-overflow: ellipsis; -} -.dashboard-context { - position: relative; - margin-bottom: 20px; - padding: 20px; - border-bottom: 1px solid #DCDCDC; - background-color: #f6f6f6; - -webkit-border-radius: 3px 0 0 0; - -moz-border-radius: 3px 0 0 0; - border-radius: 3px 0 0 0; -} -.dashboard-context h2 { - margin-bottom: 10px; -} -.dashboard-context .arrow { - position: absolute; - content: ' '; - top: 30px; - right: -10px; - width: 10px; - height: 21px; - background: transparent url("../../../base/images/dashboard-followee-related.png"); -} -.popover-followee .popover-title { - display: none; -} -.popover-followee .popover-content { - padding: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.popover-followee .empty { - padding: 10px; -} -.popover-followee .popover-header { - *zoom: 1; - background-color: whiteSmoke; - padding: 5px; - border-bottom: 1px solid #ccc; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.popover-followee .popover-header:before, -.popover-followee .popover-header:after { - display: table; - content: ""; - line-height: 0; -} -.popover-followee .popover-header:after { - clear: both; -} -.popover-followee .popover-header .input-prepend { - margin-bottom: 0; -} -.popover-followee .popover-header .add-on, -.popover-followee .popover-header input { - float: left; - margin: 0; -} -.popover-followee .popover-header .add-on { - padding: 4px 8px 4px 12px; - border-right-width: 0; - -webkit-border-radius: 100px 0 0 100px; - -moz-border-radius: 100px 0 0 100px; - border-radius: 100px 0 0 100px; -} -.popover-followee .popover-header input { - padding: 4px 12px 4px 8px; - font-size: 13px; - width: 207px; - -webkit-border-radius: 0 100px 100px 0; - -moz-border-radius: 0 100px 100px 0; - border-radius: 0 100px 100px 0; -} -.popover-followee .nav { - padding: 0; - margin: 0; - max-height: 205px; - overflow: auto; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.popover-followee .nav li a { - display: block; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - padding: 7px 10px 7px 15px; - margin: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.popover-followee .nav li a i { - background-color: #E73892; - color: #fff; - margin-right: 11px; - padding: 3px 5px; - line-height: 1; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); -} -.popover-followee .nav li a:hover i { - background-color: #000; -} -.popover-followee .nav li.active a i { - color: #E73892; - background-color: #fff; -} -.dashboard-me { - *zoom: 1; - padding: 15px 15px 0 15px; -} -.dashboard-me:before, -.dashboard-me:after { - display: table; - content: ""; - line-height: 0; -} -.dashboard-me:after { - clear: both; -} -.dashboard-me img { - float: left; - margin-right: 10px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.dashboard-me strong { - display: block; - font-size: 16px; - margin: 3px 0; -} -.resource-view-filters { - margin-bottom: 1em; -} -.resource-view-filters .resource-view-filter { - margin-bottom: 1.0em; -} -.resource-view-filters .resource-view-remove-filter { - cursor: pointer; - color: #b55457; -} -.resource-view-filters .resource-view-filter-values .select2-container { - margin-right: 0.3em; - margin-bottom: 0.2em; - width: 24% !important; -} -.resource-view-filters .resource-view-filter-values .select2-container .select2-search-choice-close { - left: auto; -} -.datapusher-status-link:hover { - text-decoration: none; -} -.datapusher-status.status-unknown { - color: #bbb; -} -.datapusher-status.status-pending { - color: #FFCC00; -} -.datapusher-status.status-error { - color: red; -} -.datapusher-status.status-complete { - color: #009900; -} -body { - background: #E73892 url("../../../base/images/bg.png"); -} -[hidden] { - display: none; -} -table { - table-layout: fixed; -} -thead th { - vertical-align: top; -} -td, -th { - word-wrap: break-word; -} -table .metric { - width: 140px; -} -code { - color: #000; - border: none; - background: none; - white-space: normal; -} -pre { - border: none; - background: none; - padding-left: 0; - padding-right: 0; -} -mark { - background: #fdf7e9; -} -blockquote p { - font-size: 1em; -} -iframe { - border: none; -} -.embedded-content h1 { - font-size: 1.4em; -} -.embedded-content h2 { - font-size: 1.4em; -} -.embedded-content h3 { - font-size: 1.2em; -} -.popular { - text-indent: -999em; -} -.empty { - color: #aaa; - font-style: italic; -} -.page-heading { - margin-top: 0; - margin-bottom: 16px; -} -.m-top { - margin-top: 15px; -} -.m-left { - margin-left: 15px; -} -.m-right { - margin-right: 15px; -} -.m-bottom { - margin-bottom: 15px; -} -.no-margin { - margin: 0; -} -.reduced-margin { - margin: 3px 5px; -} -.p-top { - padding-top: 15px; -} -.p-left { - padding-left: 15px; -} -.p-right { - padding-right: 15px; -} -.p-bottom { - padding-bottom: 15px; -} -.no-padding { - padding: 0; -} -.reduced-padding { - padding: 3px 5px; -} -.ie .lang-dropdown { - position: relative; - top: -20px; -} -.ie .module-popup { - border-bottom: none; -} -.ie .banner { - top: 0; - right: 0; - width: auto; -} -.ie .group-listing { - margin-left: -24px; -} -.ie .toolbar .breadcrumb { - filter: none; -} -.ie .toolbar .breadcrumb li { - float: left; -} -.ie .toolbar .breadcrumb li:after { - margin: 0 0.2em; -} -.ie9 .control-large input { - height: 56px; -} -.ie8 .account-masthead a.image, -.ie8 .account-masthead .username { - white-space: nowrap; -} -.ie9 .homepage .media.module-heading .media-image img, -.ie8 .homepage .media.module-heading .media-image img, -.ie7 .homepage .media.module-heading .media-image img { - width: 85px !important; -} -.ie8 .masthead .nav-collapse, -.ie7 .masthead .nav-collapse { - float: right; -} -.ie8 [role=main], -.ie7 [role=main], -.ie8 .main, -.ie7 .main { - padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); -} -.ie8 .hero, -.ie7 .hero { - background: url("../../../base/images/background-tile.png"); -} -.ie8 .hero .hero-primary.module-popup .box, -.ie7 .hero .hero-primary.module-popup .box { - padding-bottom: 20px !important; - margin-bottom: 0 !important; -} -.ie8 .lang-dropdown, -.ie7 .lang-dropdown { - position: relative !important; - top: -90px !important; -} -.ie7 .alert { - position: relative; -} -.ie7 .alert .close { - position: absolute; - top: 6px !important; - right: 20px; -} -.ie7 .media-item { - width: 30%; -} -.ie7 .tags .tag-list { - *zoom: 1; -} -.ie7 .tags .tag-list:before, -.ie7 .tags .tag-list:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .tags .tag-list:after { - clear: both; -} -.ie7 .tags .tag-list li { - display: block; - float: left; -} -.ie7 .tags h3 { - float: left; -} -.ie7 .tags .tag { - display: block; -} -.ie7 .search-giant input { - width: 95%; -} -.ie7 .control-full input, -.ie7 .control-full select, -.ie7 .control-full textarea { - width: 95%; -} -.ie7 .control-full.control-large .controls input { - padding-bottom: 20px; -} -.ie7 .controls { - position: relative; -} -.ie7 .controls .info-block, -.ie7 .controls .info-inline { - position: absolute; - top: 0; - right: 0; -} -.ie7 .form-horizontal .controls { - margin-left: 0; -} -.ie7 .control-custom .checkbox { - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.ie7 .stages { - overflow: hidden; - background-color: #EDEDED; -} -.ie7 .stages li { - height: 30px; - width: 27.5%; -} -.ie7 .stages li button, -.ie7 .stages li span { - display: block; - height: 30px; - padding-left: 20px; -} -.ie7 .stages li button { - height: 50px; -} -.ie7 .stages li .highlight { - width: auto; -} -.ie7 .account-masthead .account a i { - line-height: 31px; -} -.ie7 .masthead { - position: relative; - z-index: 1; -} -.ie7 .masthead .logo img, -.ie7 .masthead nav { - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.ie7 .masthead .header-image { - display: block; -} -.ie7 .masthead .account .dropdown-menu { - z-index: 10000; -} -.ie7 .module-narrow .nav-item.image { - *zoom: 1; -} -.ie7 .module-narrow .nav-item.image:before, -.ie7 .module-narrow .nav-item.image:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .module-narrow .nav-item.image:after { - clear: both; -} -.ie7 .nav-facet .nav-item.active a { - content: 'x'; -} -.ie7 .toolbar .breadcrumb li { - padding-right: 10px; - margin-right: 5px; - background: transparent url("../../../base/images/breadcrumb-slash-ie7.png") 100% 50% no-repeat; -} -.ie7 .toolbar .breadcrumb li.active { - background-image: none; -} -.ie7 .module-heading { - *zoom: 1; - position: relative; -} -.ie7 .module-heading:before, -.ie7 .module-heading:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .module-heading:after { - clear: both; -} -.ie7 .module-heading .media-content { - position: relative; -} -.ie7 .module-heading .media-image img { - float: left; -} -.ie7 .group-listing { - position: relative; - zoom: 1; -} -.ie7 .resource-item { - position: static; - padding-bottom: 1px; -} -.ie7 .resource-item .heading { - position: relative; -} -.ie7 .resource-item .format-label { - left: -48px; -} -.ie7 .resource-item .btn-group { - position: relative; - float: right; - top: -35px; - right: 0; -} -.ie7 .media-overlay .media-heading { - background-color: #000; -} diff --git a/ckan/public-bs2/base/css/green.css b/ckan/public-bs2/base/css/green.css deleted file mode 100644 index 437660248d6..00000000000 --- a/ckan/public-bs2/base/css/green.css +++ /dev/null @@ -1,9520 +0,0 @@ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -a:hover, -a:active { - outline: 0; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - /* Responsive images (ensure images don't scale beyond their parents) */ - max-width: 100%; - /* Part 1: Set a maxium relative to the parent */ - width: auto\9; - /* IE7-8 need help adjusting responsive images */ - height: auto; - /* Part 2: Scale the height according to the width, otherwise you get stretching */ - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} -#map_canvas img, -.google-maps img { - max-width: none; -} -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} -button, -input { - *overflow: visible; - line-height: normal; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -textarea { - overflow: auto; - vertical-align: top; -} -@media print { - * { - text-shadow: none !important; - color: #000 !important; - 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) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.clearfix:after { - clear: both; -} -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -body { - margin: 0; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #444; - background-color: #eee; -} -a { - color: #2F9B45; - text-decoration: none; -} -a:hover, -a:focus { - color: #1d602b; - text-decoration: underline; -} -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, -.row:after { - display: table; - content: ""; - line-height: 0; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.span12 { - width: 940px; -} -.span11 { - width: 860px; -} -.span10 { - width: 780px; -} -.span9 { - width: 700px; -} -.span8 { - width: 620px; -} -.span7 { - width: 540px; -} -.span6 { - width: 460px; -} -.span5 { - width: 380px; -} -.span4 { - width: 300px; -} -.span3 { - width: 220px; -} -.span2 { - width: 140px; -} -.span1 { - width: 60px; -} -.offset12 { - margin-left: 980px; -} -.offset11 { - margin-left: 900px; -} -.offset10 { - margin-left: 820px; -} -.offset9 { - margin-left: 740px; -} -.offset8 { - margin-left: 660px; -} -.offset7 { - margin-left: 580px; -} -.offset6 { - margin-left: 500px; -} -.offset5 { - margin-left: 420px; -} -.offset4 { - margin-left: 340px; -} -.offset3 { - margin-left: 260px; -} -.offset2 { - margin-left: 180px; -} -.offset1 { - margin-left: 100px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.row-fluid:after { - clear: both; -} -.row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.12765957%; - *margin-left: 2.07446809%; -} -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.12765957%; -} -.row-fluid .span12 { - width: 100%; - *width: 99.94680851%; -} -.row-fluid .span11 { - width: 91.4893617%; - *width: 91.43617021%; -} -.row-fluid .span10 { - width: 82.9787234%; - *width: 82.92553191%; -} -.row-fluid .span9 { - width: 74.46808511%; - *width: 74.41489362%; -} -.row-fluid .span8 { - width: 65.95744681%; - *width: 65.90425532%; -} -.row-fluid .span7 { - width: 57.44680851%; - *width: 57.39361702%; -} -.row-fluid .span6 { - width: 48.93617021%; - *width: 48.88297872%; -} -.row-fluid .span5 { - width: 40.42553191%; - *width: 40.37234043%; -} -.row-fluid .span4 { - width: 31.91489362%; - *width: 31.86170213%; -} -.row-fluid .span3 { - width: 23.40425532%; - *width: 23.35106383%; -} -.row-fluid .span2 { - width: 14.89361702%; - *width: 14.84042553%; -} -.row-fluid .span1 { - width: 6.38297872%; - *width: 6.32978723%; -} -.row-fluid .offset12 { - margin-left: 104.25531915%; - *margin-left: 104.14893617%; -} -.row-fluid .offset12:first-child { - margin-left: 102.12765957%; - *margin-left: 102.0212766%; -} -.row-fluid .offset11 { - margin-left: 95.74468085%; - *margin-left: 95.63829787%; -} -.row-fluid .offset11:first-child { - margin-left: 93.61702128%; - *margin-left: 93.5106383%; -} -.row-fluid .offset10 { - margin-left: 87.23404255%; - *margin-left: 87.12765957%; -} -.row-fluid .offset10:first-child { - margin-left: 85.10638298%; - *margin-left: 85%; -} -.row-fluid .offset9 { - margin-left: 78.72340426%; - *margin-left: 78.61702128%; -} -.row-fluid .offset9:first-child { - margin-left: 76.59574468%; - *margin-left: 76.4893617%; -} -.row-fluid .offset8 { - margin-left: 70.21276596%; - *margin-left: 70.10638298%; -} -.row-fluid .offset8:first-child { - margin-left: 68.08510638%; - *margin-left: 67.9787234%; -} -.row-fluid .offset7 { - margin-left: 61.70212766%; - *margin-left: 61.59574468%; -} -.row-fluid .offset7:first-child { - margin-left: 59.57446809%; - *margin-left: 59.46808511%; -} -.row-fluid .offset6 { - margin-left: 53.19148936%; - *margin-left: 53.08510638%; -} -.row-fluid .offset6:first-child { - margin-left: 51.06382979%; - *margin-left: 50.95744681%; -} -.row-fluid .offset5 { - margin-left: 44.68085106%; - *margin-left: 44.57446809%; -} -.row-fluid .offset5:first-child { - margin-left: 42.55319149%; - *margin-left: 42.44680851%; -} -.row-fluid .offset4 { - margin-left: 36.17021277%; - *margin-left: 36.06382979%; -} -.row-fluid .offset4:first-child { - margin-left: 34.04255319%; - *margin-left: 33.93617021%; -} -.row-fluid .offset3 { - margin-left: 27.65957447%; - *margin-left: 27.55319149%; -} -.row-fluid .offset3:first-child { - margin-left: 25.53191489%; - *margin-left: 25.42553191%; -} -.row-fluid .offset2 { - margin-left: 19.14893617%; - *margin-left: 19.04255319%; -} -.row-fluid .offset2:first-child { - margin-left: 17.0212766%; - *margin-left: 16.91489362%; -} -.row-fluid .offset1 { - margin-left: 10.63829787%; - *margin-left: 10.53191489%; -} -.row-fluid .offset1:first-child { - margin-left: 8.5106383%; - *margin-left: 8.40425532%; -} -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} -.container:before, -.container:after { - display: table; - content: ""; - line-height: 0; -} -.container:after { - clear: both; -} -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.container-fluid:after { - clear: both; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} -small { - font-size: 85%; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -cite { - font-style: normal; -} -.muted { - color: #999; -} -a.muted:hover, -a.muted:focus { - color: #808080; -} -.text-warning { - color: #c09853; -} -a.text-warning:hover, -a.text-warning:focus { - color: #a47e3c; -} -.text-error { - color: #b55457; -} -a.text-error:hover, -a.text-error:focus { - color: #954143; -} -.text-info { - color: #3a87ad; -} -a.text-info:hover, -a.text-info:focus { - color: #2d6987; -} -.text-success { - color: #468847; -} -a.text-success:hover, -a.text-success:focus { - color: #356635; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999; -} -h1, -h2, -h3 { - line-height: 40px; -} -h1 { - font-size: 38.5px; -} -h2 { - font-size: 31.5px; -} -h3 { - font-size: 24.5px; -} -h4 { - font-size: 17.5px; -} -h5 { - font-size: 14px; -} -h6 { - font-size: 11.9px; -} -h1 small { - font-size: 24.5px; -} -h2 small { - font-size: 17.5px; -} -h3 small { - font-size: 14px; -} -h4 small { - font-size: 14px; -} -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eee; -} -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -li { - line-height: 20px; -} -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding-left: 5px; - padding-right: 5px; -} -dl { - margin-bottom: 20px; -} -dt, -dd { - line-height: 20px; -} -dt { - font-weight: bold; -} -dd { - margin-left: 10px; -} -.dl-horizontal { - *zoom: 1; -} -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - content: ""; - line-height: 0; -} -.dl-horizontal:after { - clear: both; -} -.dl-horizontal dt { - float: left; - width: 160px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.dl-horizontal dd { - margin-left: 180px; -} -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eee; - border-bottom: 1px solid #fff; -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999; -} -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eee; -} -blockquote p { - margin-bottom: 0; - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} -blockquote small { - display: block; - line-height: 20px; - color: #999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eee; - border-left: 0; -} -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} -blockquote.pull-right small:before { - content: ''; -} -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; - white-space: nowrap; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -pre.prettyprint { - margin-bottom: 20px; -} -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -form { - margin: 0 0 20px; -} -fieldset { - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -legend small { - font-size: 15px; - color: #999; -} -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} -input, -button, -select, -textarea { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} -label { - display: block; - margin-bottom: 5px; -} -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"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - vertical-align: middle; -} -input, -textarea, -.uneditable-input { - width: 206px; -} -textarea { - height: auto; -} -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"], -.uneditable-input { - background-color: #fff; - border: 1px solid #ccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear .2s, box-shadow linear .2s; - -moz-transition: border linear .2s, box-shadow linear .2s; - -o-transition: border linear .2s, box-shadow linear .2s; - transition: border linear .2s, box-shadow linear .2s; -} -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - *margin-top: 0; - /* IE7 */ - margin-top: 1px \9; - /* IE8-9 */ - line-height: normal; -} -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} -select, -input[type="file"] { - height: 30px; - /* 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: 30px; -} -select { - width: 220px; - border: 1px solid #ccc; - background-color: #fff; -} -select[multiple], -select[size] { - height: auto; -} -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.uneditable-input, -.uneditable-textarea { - color: #999; - background-color: #fcfcfc; - border-color: #ccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} -.uneditable-textarea { - width: auto; - height: auto; -} -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999; -} -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999; -} -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999; -} -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} -input, -textarea, -.uneditable-input { - margin-left: 0; -} -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} -.controls-row { - *zoom: 1; -} -.controls-row:before, -.controls-row:after { - display: table; - content: ""; - line-height: 0; -} -.controls-row:after { - clear: both; -} -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eee; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b55457; -} -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b55457; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b55457; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #954143; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; -} -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b55457; - background-color: #f8f0f0; - border-color: #b55457; -} -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} -.form-actions:before, -.form-actions:after { - display: table; - content: ""; - line-height: 0; -} -.form-actions:after { - clear: both; -} -.help-block, -.help-inline { - color: #6a6a6a; -} -.help-block { - display: block; - margin-bottom: 10px; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - vertical-align: middle; - padding-left: 5px; -} -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - vertical-align: middle; - font-size: 0; - white-space: nowrap; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 14px; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #fff; - background-color: #eee; - border: 1px solid #ccc; -} -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -/* Allow for input prepend/append in search forms */ -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} -.control-group { - margin-bottom: 10px; -} -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; - line-height: 0; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} -.form-horizontal .controls:first-child { - *padding-left: 180px; -} -.form-horizontal .help-block { - margin-bottom: 0; -} -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} -.form-horizontal .form-actions { - padding-left: 180px; -} -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} -.table { - width: 100%; - margin-bottom: 20px; -} -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table th { - font-weight: bold; -} -.table thead th { - vertical-align: bottom; -} -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #eee; -} -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #ddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.table-bordered th, -.table-bordered td { - border-left: 1px solid #ddd; -} -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; -} -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; -} -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; - border-bottom-left-radius: 0; -} -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; - border-bottom-right-radius: 0; -} -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; -} -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: #f5f5f5; -} -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} -.table tbody tr.success > td { - background-color: #dff0d8; -} -.table tbody tr.error > td { - background-color: #f8f0f0; -} -.table tbody tr.warning > td { - background-color: #fcf8e3; -} -.table tbody tr.info > td { - background-color: #d9edf7; -} -.table-hover tbody tr.success:hover > td { - background-color: #d0e9c6; -} -.table-hover tbody tr.error:hover > td { - background-color: #f0dfe0; -} -.table-hover tbody tr.warning:hover > td { - background-color: #faf2cc; -} -.table-hover tbody tr.info:hover > td { - background-color: #c4e3f3; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle { - *margin-bottom: -3px; -} -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - text-decoration: none; - color: #fff; - background-color: #2d9342; - background-image: -moz-linear-gradient(top, #2F9B45, #29873c); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#2F9B45), to(#29873c)); - background-image: -webkit-linear-gradient(top, #2F9B45, #29873c); - background-image: -o-linear-gradient(top, #2F9B45, #29873c); - background-image: linear-gradient(to bottom, #2F9B45, #29873c); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2f9b45', endColorstr='#ff29873c', GradientType=0); -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - outline: 0; - background-color: #2d9342; - background-image: -moz-linear-gradient(top, #2F9B45, #29873c); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#2F9B45), to(#29873c)); - background-image: -webkit-linear-gradient(top, #2F9B45, #29873c); - background-image: -o-linear-gradient(top, #2F9B45, #29873c); - background-image: linear-gradient(to bottom, #2F9B45, #29873c); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2f9b45', endColorstr='#ff29873c', GradientType=0); -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - cursor: default; -} -.open { - *z-index: 1000; -} -.open > .dropdown-menu { - display: block; -} -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000; - content: ""; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -.dropdown-submenu { - position: relative; -} -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} -.dropdown-submenu > a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #cccccc; - margin-top: 5px; - margin-right: -10px; -} -.dropdown-submenu:hover > a:after { - border-left-color: #fff; -} -.dropdown-submenu.pull-left { - float: none; -} -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} -.dropdown .dropdown-menu .nav-header { - padding-left: 20px; - padding-right: 20px; -} -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.btn { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding: 4px 12px; - margin-bottom: 0; - font-size: 14px; - line-height: 20px; - text-align: center; - vertical-align: middle; - cursor: pointer; - color: #333; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #ffffff, #eaeaea); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#eaeaea)); - background-image: -webkit-linear-gradient(top, #ffffff, #eaeaea); - background-image: -o-linear-gradient(top, #ffffff, #eaeaea); - background-image: linear-gradient(to bottom, #ffffff, #eaeaea); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeaeaea', GradientType=0); - border-color: #eaeaea #eaeaea #c4c4c4; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #eaeaea; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - border: 1px solid #ccc; - *border: 0; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *margin-left: .3em; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); -} -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333; - background-color: #eaeaea; - *background-color: #dddddd; -} -.btn:active, -.btn.active { - background-color: #d1d1d1 \9; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; - padding-left: 0; - padding-right: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} -.btn-primary { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #36b24f; - background-image: -moz-linear-gradient(top, #3bc256, #2F9B45); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3bc256), to(#2F9B45)); - background-image: -webkit-linear-gradient(top, #3bc256, #2F9B45); - background-image: -o-linear-gradient(top, #3bc256, #2F9B45); - background-image: linear-gradient(to bottom, #3bc256, #2F9B45); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3bc256', endColorstr='#ff2f9b45', GradientType=0); - border-color: #2F9B45 #2F9B45 #1d602b; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #2F9B45; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #fff; - background-color: #2F9B45; - *background-color: #29873c; -} -.btn-primary:active, -.btn-primary.active { - background-color: #237434 \9; -} -.btn-warning { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #f89406; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #fff; - background-color: #f89406; - *background-color: #df8505; -} -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #bd362f; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #fff; - background-color: #bd362f; - *background-color: #a9302a; -} -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #51a351; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #fff; - background-color: #51a351; - *background-color: #499249; -} -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} -.btn-info { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #2f96b4; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #fff; - background-color: #2f96b4; - *background-color: #2a85a0; -} -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} -.btn-inverse { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - background-image: -moz-linear-gradient(top, #444, #222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444), to(#222)); - background-image: -webkit-linear-gradient(top, #444, #222); - background-image: -o-linear-gradient(top, #444, #222); - background-image: linear-gradient(to bottom, #444, #222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - border-color: #222 #222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #222; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #fff; - background-color: #222; - *background-color: #151515; -} -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-link { - border-color: transparent; - cursor: pointer; - color: #2F9B45; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-link:hover, -.btn-link:focus { - color: #1d602b; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #333; - text-decoration: none; -} -.btn-group { - position: relative; - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - font-size: 0; - vertical-align: middle; - white-space: nowrap; - *margin-left: .3em; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - margin-left: 5px; -} -.btn-toolbar { - font-size: 0; - margin-top: 10px; - margin-bottom: 10px; -} -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group > .btn + .btn { - margin-left: -1px; -} -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} -.btn-group > .btn-mini { - font-size: 10.5px; -} -.btn-group > .btn-small { - font-size: 11.9px; -} -.btn-group > .btn-large { - font-size: 17.5px; -} -.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; -} -.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; -} -.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; -} -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-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); - -moz-box-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); - box-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); - *padding-top: 5px; - *padding-bottom: 5px; -} -.btn-group > .btn-mini + .dropdown-toggle { - padding-left: 5px; - padding-right: 5px; - *padding-top: 2px; - *padding-bottom: 2px; -} -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} -.btn-group > .btn-large + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; - *padding-top: 7px; - *padding-bottom: 7px; -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn-group.open .btn.dropdown-toggle { - background-color: #eaeaea; -} -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #2F9B45; -} -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222; -} -.btn .caret { - margin-top: 8px; - margin-left: 0; -} -.btn-large .caret { - margin-top: 6px; -} -.btn-large .caret { - border-left-width: 5px; - border-right-width: 5px; - border-top-width: 5px; -} -.btn-mini .caret, -.btn-small .caret { - margin-top: 8px; -} -.dropup .btn-large .caret { - border-bottom-width: 5px; -} -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group-vertical > .btn + .btn { - margin-left: 0; - margin-top: -1px; -} -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.alert, -.alert h4 { - color: #c09853; -} -.alert h4 { - margin: 0; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #468847; -} -.alert-success h4 { - color: #468847; -} -.alert-danger, -.alert-error { - background-color: #f8f0f0; - border-color: #c6898b; - color: #b55457; -} -.alert-danger h4, -.alert-error h4 { - color: #b55457; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #3a87ad; -} -.alert-info h4 { - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 20px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li > a > img { - max-width: none; -} -.nav > .pull-right { - float: right; -} -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} -.nav li + .nav-header { - margin-top: 9px; -} -.nav-list { - padding-left: 15px; - padding-right: 15px; - 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, 0.5); -} -.nav-list > li > a { - padding: 3px 15px; -} -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #2F9B45; -} -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.nav-tabs, -.nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; - line-height: 0; -} -.nav-tabs:after, -.nav-pills:after { - clear: both; -} -.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; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - margin-bottom: -1px; -} -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - border-color: #eee #eee #ddd; -} -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #555; - background-color: #eee; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #fff; - background-color: #2F9B45; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.nav .dropdown-toggle .caret { - border-top-color: #2F9B45; - border-bottom-color: #2F9B45; - margin-top: 6px; -} -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #1d602b; - border-bottom-color: #1d602b; -} -/* move down carets for tabs */ -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #fff; - background-color: #999; - border-color: #999; -} -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #fff; - border-bottom-color: #fff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, -.tabbable:after { - display: table; - content: ""; - line-height: 0; -} -.tabbable:after { - clear: both; -} -.tab-content { - overflow: auto; -} -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} -.tab-content > .active, -.pill-content > .active { - display: block; -} -.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 { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} -.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-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #eee #ddd #eee #eee; -} -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #fff; -} -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #eee #eee #eee #ddd; -} -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #fff; -} -.nav > .disabled > a { - color: #999; -} -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - cursor: default; -} -.navbar { - overflow: visible; - margin-bottom: 20px; - *position: relative; - *z-index: 2; -} -.navbar-inner { - min-height: 40px; - padding-left: 20px; - padding-right: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - *zoom: 1; -} -.navbar-inner:before, -.navbar-inner:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-inner:after { - clear: both; -} -.navbar .container { - width: auto; -} -.nav-collapse.collapse { - height: auto; - overflow: visible; -} -.navbar .brand { - float: left; - display: block; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777; -} -.navbar-link { - color: #777; -} -.navbar-link:hover, -.navbar-link:focus { - color: #333; -} -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-left: 1px solid #f2f2f2; - border-right: 1px solid #ffffff; -} -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} -.navbar-search .search-query { - margin-bottom: 0; - padding: 4px 14px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.navbar-static-top { - position: static; - margin-bottom: 0; -} -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-left: 0; - padding-right: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; - width: 100%; - *width: 99.94680851%; - width: 926px; -} -.navbar-fixed-top { - top: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1); - -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1); - box-shadow: 0 1px 10px rgba(0,0,0,.1); -} -.navbar-fixed-bottom { - bottom: 0; -} -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1); - -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1); - box-shadow: 0 -1px 10px rgba(0,0,0,.1); -} -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} -.navbar .nav > li { - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - background-color: transparent; - color: #333; - text-decoration: none; -} -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #e5e5e5; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); -} -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #fff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.navbar .nav > li > .dropdown-menu: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, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .nav > li > .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - border-top: 7px solid #ccc; - border-top-color: rgba(0, 0, 0, 0.2); - border-bottom: 0; - bottom: -7px; - top: auto; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - border-top: 6px solid #fff; - border-bottom: 0; - bottom: -6px; - top: auto; -} -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #333; - border-bottom-color: #333; -} -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #e5e5e5; - color: #555; -} -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777; - border-bottom-color: #777; -} -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - left: auto; - right: 0; -} -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - left: auto; - right: 12px; -} -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - left: auto; - right: 13px; -} -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - left: auto; - right: 100%; - margin-left: 0; - margin-right: -1px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); - border-color: #252525; -} -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #fff; -} -.navbar-inverse .brand { - color: #999; -} -.navbar-inverse .navbar-text { - color: #999; -} -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - background-color: transparent; - color: #fff; -} -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #fff; - background-color: #111111; -} -.navbar-inverse .navbar-link { - color: #999; -} -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #fff; -} -.navbar-inverse .divider-vertical { - border-left-color: #111111; - border-right-color: #222222; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #111111; - color: #fff; -} -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999; - border-bottom-color: #999; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .navbar-search .search-query { - color: #fff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333; - text-shadow: 0 1px 0 #fff; - background-color: #fff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-inverse .btn-navbar { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #040404; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #fff; - background-color: #040404; - *background-color: #000000; -} -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - text-shadow: 0 1px 0 #fff; -} -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} -.breadcrumb > .active { - color: #999; -} -.pagination { - margin: 20px 0; -} -.pagination ul { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-left: 0; - margin-bottom: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} -.pagination ul > li { - display: inline; -} -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; - border-left-width: 0; -} -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999; - cursor: default; -} -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #999; - background-color: transparent; - cursor: default; -} -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -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; -} -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -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; -} -.pagination-centered { - text-align: center; -} -.pagination-right { - text-align: right; -} -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -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; -} -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -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; -} -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-top-left-radius: 3px; - -moz-border-radius-topleft: 3px; - border-top-left-radius: 3px; - -webkit-border-bottom-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - border-bottom-left-radius: 3px; -} -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - -moz-border-radius-topright: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - -moz-border-radius-bottomright: 3px; - border-bottom-right-radius: 3px; -} -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} -.pager { - margin: 20px 0; - list-style: none; - text-align: center; - *zoom: 1; -} -.pager:before, -.pager:after { - display: table; - content: ""; - line-height: 0; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #f5f5f5; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999; - background-color: #fff; - cursor: default; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #fff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; - outline: none; -} -.modal.fade { - -webkit-transition: opacity .3s linear, top .3s ease-out; - -moz-transition: opacity .3s linear, top .3s ease-out; - -o-transition: opacity .3s linear, top .3s ease-out; - transition: opacity .3s linear, top .3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 10%; -} -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} -.modal-header .close { - margin-top: 2px; -} -.modal-header h3 { - margin: 0; - line-height: 30px; -} -.modal-body { - position: relative; - overflow-y: auto; - max-height: 400px; - padding: 15px; -} -.modal-form { - margin-bottom: 0; -} -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #fff; - -moz-box-shadow: inset 0 1px 0 #fff; - box-shadow: inset 0 1px 0 #fff; - *zoom: 1; -} -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; - line-height: 0; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.tooltip { - position: absolute; - z-index: 1030; - display: block; - visibility: visible; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -3px; - padding: 5px 0; -} -.tooltip.right { - margin-left: 3px; - padding: 0 5px; -} -.tooltip.bottom { - margin-top: 3px; - padding: 5px 0; -} -.tooltip.left { - margin-left: -3px; - padding: 0 5px; -} -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; - line-height: 0; -} -.thumbnails:after { - clear: both; -} -.row-fluid .thumbnails { - margin-left: 0; -} -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #2F9B45; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} -.thumbnail > img { - display: block; - max-width: 100%; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; - color: #555; -} -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #fff; - vertical-align: baseline; - white-space: nowrap; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #999; -} -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.badge { - padding-left: 9px; - padding-right: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} -.label:empty, -.badge:empty { - display: none; -} -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label-important, -.badge-important { - background-color: #b55457; -} -.label-important[href], -.badge-important[href] { - background-color: #954143; -} -.label-warning, -.badge-warning { - background-color: #f89406; -} -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} -.label-success, -.badge-success { - background-color: #468847; -} -.label-success[href], -.badge-success[href] { - background-color: #356635; -} -.label-info, -.badge-info { - background-color: #3a87ad; -} -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} -.label-inverse, -.badge-inverse { - background-color: #333; -} -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} -.btn-mini .label, -.btn-mini .badge { - top: 0; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 100%; - color: #fff; - float: left; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); -} -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.accordion { - margin-bottom: 20px; -} -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.accordion-heading { - border-bottom: 0; -} -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} -.accordion-toggle { - cursor: pointer; -} -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} -.carousel-inner { - overflow: hidden; - width: 100%; - position: relative; -} -.carousel-inner > .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.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: #fff; - text-align: center; - background: #222; - border: 3px solid #fff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.carousel-control.right { - left: auto; - right: 15px; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); - border-radius: 5px; -} -.carousel-indicators .active { - background-color: #fff; -} -.carousel-caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 15px; - background: #333; - background: rgba(0, 0, 0, 0.75); -} -.carousel-caption h4, -.carousel-caption p { - color: #fff; - line-height: 20px; -} -.carousel-caption h4 { - margin: 0 0 5px; -} -.carousel-caption p { - margin-bottom: 0; -} -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - color: inherit; - letter-spacing: -1px; -} -.hero-unit li { - line-height: 30px; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - background-color: #fff; - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - white-space: normal; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.popover-title:empty { - display: none; -} -.popover-content { - padding: 9px 14px; -} -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover .arrow { - border-width: 11px; -} -.popover .arrow:after { - border-width: 10px; - content: ""; -} -.popover.top .arrow { - left: 50%; - margin-left: -11px; - border-bottom-width: 0; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - bottom: -11px; -} -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-bottom-width: 0; - border-top-color: #fff; -} -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-left-width: 0; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); -} -.popover.right .arrow:after { - left: 1px; - bottom: -10px; - border-left-width: 0; - border-right-color: #fff; -} -.popover.bottom .arrow { - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - top: -11px; -} -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); -} -.popover.left .arrow:after { - right: 1px; - border-right-width: 0; - border-left-color: #fff; - bottom: -10px; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} -.affix { - position: fixed; -} -/*! - * Bootstrap Responsive v2.3.2 - * - * 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. - */ -@-ms-viewport { - width: device-width; -} -.hidden { - display: none; - visibility: hidden; -} -.visible-phone { - display: none !important; -} -.visible-tablet { - display: none !important; -} -.hidden-desktop { - display: none !important; -} -.visible-desktop { - display: inherit !important; -} -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - line-height: 0; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - line-height: 0; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.76243094%; - *margin-left: 2.70923945%; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.76243094%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851%; - } - .row-fluid .span11 { - width: 91.43646409%; - *width: 91.3832726%; - } - .row-fluid .span10 { - width: 82.87292818%; - *width: 82.81973669%; - } - .row-fluid .span9 { - width: 74.30939227%; - *width: 74.25620078%; - } - .row-fluid .span8 { - width: 65.74585635%; - *width: 65.69266486%; - } - .row-fluid .span7 { - width: 57.18232044%; - *width: 57.12912895%; - } - .row-fluid .span6 { - width: 48.61878453%; - *width: 48.56559304%; - } - .row-fluid .span5 { - width: 40.05524862%; - *width: 40.00205713%; - } - .row-fluid .span4 { - width: 31.49171271%; - *width: 31.43852122%; - } - .row-fluid .span3 { - width: 22.9281768%; - *width: 22.87498531%; - } - .row-fluid .span2 { - width: 14.36464088%; - *width: 14.31144939%; - } - .row-fluid .span1 { - width: 5.80110497%; - *width: 5.74791348%; - } - .row-fluid .offset12 { - margin-left: 105.52486188%; - *margin-left: 105.4184789%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243094%; - *margin-left: 102.65604796%; - } - .row-fluid .offset11 { - margin-left: 96.96132597%; - *margin-left: 96.85494299%; - } - .row-fluid .offset11:first-child { - margin-left: 94.19889503%; - *margin-left: 94.09251205%; - } - .row-fluid .offset10 { - margin-left: 88.39779006%; - *margin-left: 88.29140708%; - } - .row-fluid .offset10:first-child { - margin-left: 85.63535912%; - *margin-left: 85.52897614%; - } - .row-fluid .offset9 { - margin-left: 79.83425414%; - *margin-left: 79.72787116%; - } - .row-fluid .offset9:first-child { - margin-left: 77.0718232%; - *margin-left: 76.96544023%; - } - .row-fluid .offset8 { - margin-left: 71.27071823%; - *margin-left: 71.16433525%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729%; - *margin-left: 68.40190431%; - } - .row-fluid .offset7 { - margin-left: 62.70718232%; - *margin-left: 62.60079934%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138%; - *margin-left: 59.8383684%; - } - .row-fluid .offset6 { - margin-left: 54.14364641%; - *margin-left: 54.03726343%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121547%; - *margin-left: 51.27483249%; - } - .row-fluid .offset5 { - margin-left: 45.5801105%; - *margin-left: 45.47372752%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767956%; - *margin-left: 42.71129658%; - } - .row-fluid .offset4 { - margin-left: 37.01657459%; - *margin-left: 36.91019161%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414365%; - *margin-left: 34.14776067%; - } - .row-fluid .offset3 { - margin-left: 28.45303867%; - *margin-left: 28.3466557%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773%; - *margin-left: 25.58422476%; - } - .row-fluid .offset2 { - margin-left: 19.88950276%; - *margin-left: 19.78311978%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182%; - *margin-left: 17.02068884%; - } - .row-fluid .offset1 { - margin-left: 11.32596685%; - *margin-left: 11.21958387%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591%; - *margin-left: 8.45715293%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} -@media (max-width: 767px) { - body { - padding-left: 20px; - padding-right: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-left: -20px; - margin-right: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - clear: none; - width: auto; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - float: none; - display: block; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - left: 20px; - right: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-left: 10px; - padding-right: 10px; - } - .media .pull-left, - .media .pull-right { - float: none; - display: block; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - left: 10px; - right: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-left: 10px; - padding-right: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .nav > li > a:focus, - .nav-collapse .dropdown-menu a:hover, - .nav-collapse .dropdown-menu a:focus { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .nav > li > a:focus, - .navbar-inverse .nav-collapse .dropdown-menu a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:focus { - background-color: #111111; - } - .nav-collapse.in .btn-group { - margin-top: 5px; - padding: 0; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - float: none; - display: none; - max-width: none; - margin: 0 15px; - padding: 0; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - overflow: hidden; - height: 0; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-left: 10px; - padding-right: 10px; - } -} -@media (min-width: 979px + 1) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} -.break-word { - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.tag { - display: inline-block; - margin-bottom: 4px; - color: #111; - background-color: #f6f6f6; - padding: 1px 10px; - border: 1px solid #dddddd; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} -a.tag:hover { - text-decoration: none; - color: #fff; - background-color: #3bc256; - border: 1px solid #2f9b45; - -webkit-box-shadow: inset 0 1px 0 #61cf77; - -moz-box-shadow: inset 0 1px 0 #61cf77; - box-shadow: inset 0 1px 0 #61cf77; -} -.pill { - display: inline-block; - background-color: #6f8890; - color: #FFF; - padding: 2px 10px 1px 10px; - margin-right: 5px; - font-weight: normal; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.pill a { - color: #FFF; -} -.pill a.remove { - font-size: 11px; -} -.unstyled { - margin: 0; - list-style: none; -} -.simple-item { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.simple-item:last-of-type { - border-bottom: 0; -} -.simple-list { - *zoom: 1; - margin: 0; - list-style: none; -} -.simple-list:before, -.simple-list:after { - display: table; - content: ""; - line-height: 0; -} -.simple-list:after { - clear: both; -} -.simple-list > li { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.simple-list > li:last-of-type { - border-bottom: 0; -} -.simple-list .ckan-icon { - position: relative; - top: 0px; -} -.module-narrow .simple-list > li { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.listing li { - text-align: right; - margin-bottom: 5px; -} -.listing .key { - clear: right; - font-weight: bold; -} -.js .tab-content { - display: none; -} -.js .tab-content.active { - display: block; -} -.box { - background-color: #FFF; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); -} -.module { - margin: 20px 0; -} -.module-heading { - *zoom: 1; - margin: 0; - padding: 7px 25px; - font-size: 14px; - line-height: 1.3; - background-color: #f6f6f6; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; -} -.module-heading:before, -.module-heading:after { - display: table; - content: ""; - line-height: 0; -} -.module-heading:after { - clear: both; -} -.module-content { - padding: 0 25px; - margin: 20px 0; -} -@media (min-width: 768px) { - .span9 div.module-content { - padding-left: 10px; - } -} -.module-content:first-child { - margin-top: 0; - padding-top: 20px; -} -.module-content:last-child { - margin-bottom: 0; - padding-bottom: 20px; -} -.module-content > :last-child { - margin-bottom: 0; -} -.module:first-child .module-heading { - -webkit-border-radius: 3px 0 0 0; - -moz-border-radius: 3px 0 0 0; - border-radius: 3px 0 0 0; - border-top-width: 0; -} -.module:last-child { - margin-bottom: 20px; -} -.module-footer { - padding: 7px 25px 7px; - margin: 0; - border-top: 1px dotted #ddd; -} -.module .read-more { - font-weight: bold; - color: #000; -} -.module-content .pagination { - margin-left: -25px; - margin-right: -25px; - margin-bottom: -20px; -} -.module .pagination > ul { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - border: 0; -} -.module .pagination li a { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - padding-top: 7px; - padding-bottom: 7px; -} -.module .pagination li:first-child a, -.module .pagination li:last-child a { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.module-content-shallow { - padding: 0; - margin-top: 10px; - padding-bottom: 10px; -} -.module h1 { - margin-bottom: 20px; -} -.module-shallow .module-content { - padding: 10px; - margin: 0; -} -.module-shallow .module-tags { - margin-top: 0; - margin-bottom: 0; -} -.module-shallow .module-content:first-child { - padding-top: 10px; -} -.module-shallow .module-content:last-child { - padding-bottom: 10px; -} -.module-narrow .module-heading, -.module-narrow .module-content, -.module-narrow .module-footer { - padding-left: 15px; - padding-right: 15px; -} -.module-grid { - margin: 0; - list-style: none; - *zoom: 1; - margin: 0 -25px; - padding-bottom: 15px; - background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; - border-width: 1px 0; -} -.module-grid:before, -.module-grid:after { - display: table; - content: ""; - line-height: 0; -} -.module-grid:after { - clear: both; -} -.module-item { - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - float: left; - margin-left: 20px; - width: 460px; - padding-top: 10px; - padding-bottom: 10px; - padding-right: 50px; - overflow: hidden; - position: relative; -} -.module-item span.count { - color: #999; -} -.module-item .media-image { - margin-bottom: 5px; -} -.module-item .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; -} -.module-item:hover { - z-index: 1; -} -.module-item:hover .media-edit { - opacity: 1; -} -.module-item.first { - clear: left; -} -.group .content img { - margin: 0 -5px 5px; - max-width: initial; -} -.group .content h3 { - font-size: 14px; - line-height: 1.3; -} -.group-listing { - margin-left: -20px; -} -.ckanext-datapreview { - position: relative; - clear: both; - padding-top: 15px; - margin-top: 0; -} -.ckanext-datapreview > iframe { - min-height: 650px; -} -.ckanext-datapreview > img { - max-height: 500px; - max-width: 100%; - overflow: hidden; -} -.package-info h4 { - margin-bottom: 10px; -} -.module-resource { - background-color: #fff; - border-bottom: 1px solid #ddd; - margin-top: 0; - margin-bottom: 0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.module-resource .actions { - position: relative; - float: right; - top: -10px; - right: -15px; -} -.module .module-tags { - padding-bottom: 8px; -} -.secondary .module:first-child, -.primary .module:first-child { - margin-top: 0; -} -.no-nav .module:last-child { - margin-top: 0; -} -.module-image { - float: left; - width: 50px; - height: 50px; - line-height: 50px; - text-align: center; - margin-right: 15px; -} -.module-image img { - max-width: 50px; - max-height: 50px; - vertical-align: middle; -} -.banner { - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - -webkit-transform-origin: center center; - -moz-transform-origin: center center; - -ms-transform-origin: center center; - -o-transform-origin: center center; - transform-origin: center center; - position: absolute; - top: 15px; - right: -35px; - width: 80px; - color: #fff; - background-color: #2F9B45; - padding: 1px 20px; - font-size: 11px; - text-align: center; - text-transform: uppercase; -} -.media-grid { - margin: 0; - list-style: none; - *zoom: 1; - margin: 0 -25px; - padding-bottom: 15px; - background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; - border-width: 1px 0; -} -.media-grid:before, -.media-grid:after { - display: table; - content: ""; - line-height: 0; -} -.media-grid:after { - clear: both; -} -@media (min-width: 768px) { - .media-grid { - margin-left: -27px; - } - .module-content .wide .media-grid { - margin-left: -25px; - } -} -.media-item { - position: relative; - float: left; - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.media-item span.count { - color: #999; -} -.media-item .media-image { - margin-bottom: 5px; -} -.media-item .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; -} -.media-item:hover { - z-index: 1; -} -.media-item:hover .media-edit { - opacity: 1; -} -.media-view { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: 1px solid #ddd; - overflow: hidden; - -webkit-transition: all 0.2s ease-in; - -moz-transition: all 0.2s ease-in; - -o-transition: all 0.2s ease-in; - transition: all 0.2s ease-in; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.media-view:hover, -.media-view.hovered { - border-color: #2F9B45; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); -} -.media-view:hover .banner, -.media-view.hovered .banner { - background-color: #2F9B45; -} -.media-view span { - display: none; -} -.media-view .banner { - display: block; - background-color: #b7b7b7; - -webkit-transition: background-color 0.2s ease-in; - -moz-transition: background-color 0.2s ease-in; - -o-transition: background-color 0.2s ease-in; - transition: background-color 0.2s ease-in; -} -.media-image { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.media-heading { - font-size: 18px; - line-height: 1.3; - margin: 5px 0; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.media-overlay { - position: relative; - min-height: 35px; -} -.media-overlay .media-heading { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 12px 10px; - margin: 0; - background-color: #000; - background-color: rgba(0, 0, 0, 0.8); - font-size: 13px; - color: #fff; - z-index: 1; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.media-overlay .media-image { - float: none; - display: block; - margin-right: 0; -} -.media-item.is-expander .truncator-link { - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; - position: absolute; - z-index: 10; - left: 15px; - bottom: 15px; - opacity: 0; -} -.media-item.is-expander:hover { - padding-bottom: 35px; -} -.media-item.is-expander:hover .truncator-link { - opacity: 1; -} -.wide .media-item { - width: 186px; -} -.nav-simple, -.nav-aside { - *zoom: 1; - margin: 0; - list-style: none; - padding-bottom: 0; -} -.nav-simple:before, -.nav-aside:before, -.nav-simple:after, -.nav-aside:after { - display: table; - content: ""; - line-height: 0; -} -.nav-simple:after, -.nav-aside:after { - clear: both; -} -.nav-simple > li, -.nav-aside > li { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.nav-simple > li:last-of-type, -.nav-aside > li:last-of-type { - border-bottom: 0; -} -.nav-simple .ckan-icon, -.nav-aside .ckan-icon { - position: relative; - top: 0px; -} -.nav-aside { - border-top: 1px dotted #DDD; - border-bottom: 1px dotted #DDD; - margin-bottom: 15px; -} -.nav-item > a, -.nav-aside li a { - color: #333; - font-size: 14px; - line-height: 20px; - margin: -7px -25px; - padding: 7px 25px; -} -.nav-item.active, -.nav-aside li.active { - background-color: #f6f6f6; -} -.nav-item.active > a, -.nav-aside li.active a { - position: relative; - color: #FFF; - background-color: #8CA0A6; -} -.nav-item.active > a:hover, -.nav-aside li.active a:hover { - color: #FFF; - background-color: #8CA0A6; -} -@media (min-width: 768px) { - .nav-item.active > a:before, - .nav-aside li.active a:before { - content: ' '; - position: absolute; - top: 0; - right: -6px; - width: 6px; - height: 34px; - background-image: url("../../../base/images/nav-active.png?1"); - } -} -.nav-item.active > a span, -.nav-aside li.active a span { - white-space: nowrap; - overflow: hidden; - display: block; -} -.module-narrow .nav-item > a, -.module-narrow .nav-aside li a { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.module-narrow .nav-item.image, -.module-narrow .nav-aside li.image { - position: relative; -} -.module-narrow .nav-item.image > a, -.module-narrow .nav-aside li.image a { - padding-left: 42px; - padding-right: 42px; -} -.module-narrow .nav-item.image > img, -.module-narrow .nav-aside li.image img { - position: absolute; - top: 50%; - left: 15px; - width: 20px; - height: 20px; - margin-top: -10px; - z-index: 2; -} -.nav-facet .nav-item > a:hover:after, -.nav-facet .nav-item.active > a:after { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} -.nav-facet .nav-item > a:hover:after { - width: 17px; - height: 17px; - background-position: -17px -16px; -} -.nav-facet .nav-item.active > a:after { - width: 17px; - height: 17px; - background-position: 0px -16px; - right: 3px; -} -.user-list { - margin: 0; - list-style: none; -} -.user-list li { - margin: 0 0 10px 0; -} -.user-list .gravatar { - vertical-align: -4px; - margin-right: 3px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.nav-facet-tertiary { - margin: 10px 0; -} -.nav-facet-tertiary .module-heading { - margin-bottom: 5px; - padding: 8px 12px; - border-bottom-width: 0; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-facet-tertiary .module-heading i { - display: none; -} -.nav-facet-tertiary .module-footer { - padding: 8px 12px; - border-top-width: 0; -} -.nav-facet-tertiary .module-footer a { - font-weight: normal; - color: #8C8C8C; -} -.nav-facet-tertiary .nav { - margin-bottom: 0; -} -.nav-facet-tertiary .module-content.empty { - padding: 8px 12px; - margin-top: 0; -} -.nav-facet-tertiary .nav li.active { - position: relative; -} -.nav-facet-tertiary .nav li.active > a:hover:after, -.nav-facet-tertiary .nav li.active > a:after { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - width: 17px; - height: 17px; - background-position: 0px -16px; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} -.nav-simple > .nav-btn { - padding-left: 0; - padding-right: 0; - text-align: center; -} -.nav-simple > .nav-btn .btn { - display: inline-block; -} -.js .js-hide { - display: none; -} -.js .js-hide.active { - display: block; -} -.btn, -label { - font-weight: bold; -} -.btn-rounded { - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - padding-left: 15px; - padding-right: 15px; -} -label { - cursor: pointer; - font-size: 14px; -} -label:after { - content: ":"; -} -label.radio:after, -label.checkbox:after { - content: ""; -} -input[type=radio], -input[type=checkbox] { - position: relative; - top: 7px; - padding: 0; - margin: 0; -} -input[type=radio].checkbox-onown, -input[type=checkbox].checkbox-onown { - top: 0; -} -select { - padding: 4px; -} -textarea { - max-width: 100%; -} -.control-group .btn { - position: relative; - top: -2px; -} -.control-full input, -.control-full select, -.control-full textarea { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - height: auto; - width: 100%; -} -.control-medium input, -.control-medium select, -.control-medium textarea { - width: 320px; -} -@media (max-width: 768px) { - .control-medium input, - .control-medium select, - .control-medium textarea { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 28px; - } -} -.control-large input, -.control-large .control-label { - font-size: 17.5px; - line-height: 30px; -} -.control-large input { - height: 41px; -} -.control-required { - color: #c6898b; -} -.form-actions .control-required-message { - float: left; - margin-left: 20px; - margin-bottom: 0; - line-height: 30px; -} -.form-actions .control-required-message:first-child { - margin-left: 0; -} -.form-actions { - background: none; - margin-left: -25px; - margin-right: -25px; - margin-bottom: 0; - padding-bottom: 0; -} -@media (min-width: 768px) { - .form-actions { - text-align: right; - } -} -.form-actions .action-info { - line-height: 2; - text-align: left; - color: #707070; - margin: 0; -} -@media (min-width: 768px) { - .form-actions .action-info { - float: left; - width: 50%; - } -} -.form-actions .action-info.small { - font-size: 11px; - line-height: 1.2; -} -@media (max-width: 768px) { - .form-actions .btn { - margin-top: 5px; - } -} -.form-horizontal .control-label { - width: 120px; -} -@media (min-width: 768px) { - .form-horizontal .controls { - margin-left: 130px; - } -} -.form-horizontal .info-block { - position: relative; - display: block; - font-size: 11px; - color: #aaa; - line-height: 1.3; - margin-top: 6px; -} -.form-horizontal .info-help { - padding: 6px 0; -} -.form-horizontal .info-help:before { - display: none; -} -.form-horizontal .info-help-tight { - margin-top: -10px; -} -@media (min-width: 980px) { - .form-horizontal .info-block { - padding: 6px 0 6px 0; - } - .form-horizontal .info-inline { - float: right; - width: 265px; - margin-top: 0; - padding-bottom: 0; - } -} -.form-horizontal .control-medium .info-block.info-inline { - width: 165px; -} -.form-horizontal .info-block:before { - font-size: 2.2em; - position: absolute; - left: 0; - top: 2px; -} -.form-horizontal .info-inline:before { - top: 8px; -} -.info-block .icon-large, -.info-inline .icon-large { - float: left; - font-size: 22px; - margin-right: 15px; -} -.form-horizontal .info-block a { - color: #aaa; - text-decoration: underline; -} -.form-horizontal .form-actions { - padding-left: 25px; - padding-right: 25px; -} -.form-inline input { - padding-bottom: 9px; -} -.form-inline select { - margin-top: 0; -} -.form-inline .btn { - margin-left: 5px; -} -.form-narrow label { - margin-bottom: 0; -} -.form-narrow select { - width: 100%; -} -.form-narrow .form-actions { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px 0; -} -.form-select label { - margin-right: 5px; -} -.simple-input label, -.simple-input button { - display: none; -} -.simple-input .field { - position: relative; -} -.simple-input .field-bordered { - border-bottom: 1px dotted #ddd; -} -.simple-input .field input { - width: 100%; - height: auto; - margin: 0 -7px; - padding: 7px 5px; -} -.simple-input .field .btn-search { - position: absolute; - display: block; - height: 17px; - width: 17px; - padding: 0; - top: 50%; - right: 0; - margin-top: -10px; - background-color: transparent; - border: none; - color: #999; - -webkit-transition: color 0.2s ease-in; - -moz-transition: color 0.2s ease-in; - -o-transition: color 0.2s ease-in; - transition: color 0.2s ease-in; -} -.simple-input .field .btn-search:hover { - color: #000; -} -.editor textarea { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - border-bottom: none; -} -.editor .editor-info-block { - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - display: block; - float: none; - padding: 4px 10px; - background: #ebebeb; - width: auto; - border: 1px solid #ccc; - border-top: none; - font-size: 11px; - color: #282828; -} -.editor .editor-info-block a { - color: #2F9B45; - text-decoration: none; -} -@media (max-width: 768px) { - [data-module="custom-fields"] .input-prepend .add-on { - display: block; - } -} -@media (max-width: 480px) { - [data-module="custom-fields"] .input-prepend { - width: 100%; - } - [data-module="custom-fields"] .control-custom input { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 28px; - } -} -.control-custom { - font-size: 0; -} -.control-custom label { - margin-bottom: 0; -} -.control-custom input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - width: 140px; -} -.control-custom input:last-of-type { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.control-custom .checkbox { - display: inline-block; - margin-left: 5px; -} -.control-custom .checkbox input { - width: auto; -} -.control-custom.disabled label, -.control-custom.disabled input { - color: #aaa; - text-decoration: line-through; - text-shadow: none; -} -.control-custom.disabled input { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - background-color: #f3f3f3; -} -.control-custom.disabled .checkbox { - color: #444; - text-decoration: none; -} -.control-custom .checkbox.btn { - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; - position: relative; - top: 0; - left: 5px; - height: 1px; - width: 9px; - padding: 3px 8px; - line-height: 18px; -} -.control-custom .checkbox.btn span { - display: none; - width: 30px; -} -.control-custom .checkbox.btn:before { - position: relative; - top: 1px; - left: -1px; - color: #fff; -} -.control-custom .checkbox.btn input { - display: none; -} -.control-custom.disabled .checkbox.btn { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #36b24f; - background-image: -moz-linear-gradient(top, #3bc256, #2F9B45); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3bc256), to(#2F9B45)); - background-image: -webkit-linear-gradient(top, #3bc256, #2F9B45); - background-image: -o-linear-gradient(top, #3bc256, #2F9B45); - background-image: linear-gradient(to bottom, #3bc256, #2F9B45); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3bc256', endColorstr='#ff2f9b45', GradientType=0); - border-color: #2F9B45 #2F9B45 #1d602b; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #2F9B45; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.control-custom.disabled .checkbox.btn:hover, -.control-custom.disabled .checkbox.btn:focus, -.control-custom.disabled .checkbox.btn:active, -.control-custom.disabled .checkbox.btn.active, -.control-custom.disabled .checkbox.btn.disabled, -.control-custom.disabled .checkbox.btn[disabled] { - color: #fff; - background-color: #2F9B45; - *background-color: #29873c; -} -.control-custom.disabled .checkbox.btn:active, -.control-custom.disabled .checkbox.btn.active { - background-color: #237434 \9; -} -.control-custom.disabled .checkbox.btn .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.alert-danger a, -.alert-error a { - color: #b55457; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea, -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - border-color: #c6898b; -} -.error-inline { - color: #b55457; -} -.error-block, -.error-inline { - font-size: 12px; -} -.error-block { - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - display: block; - padding: 6px 8px 3px; - background: #c6898b; - margin: -3px 0 0; - color: #fff; - width: 208px; -} -.control-medium .error-block { - width: 318px; -} -.control-full .error-block { - width: auto; -} -.control-group.error .input-prepend .error-block, -.control-custom.error .error-block { - width: auto; -} -.control-custom.error .error-block { - width: 401px; -} -.control-select.error .error-block { - width: 196px; -} -.stages { - margin: 0; - list-style: none; - *zoom: 1; - color: #aeaeae; - counter-reset: stage; - margin: -20px -25px 20px; - overflow: hidden; -} -.stages:before, -.stages:after { - display: table; - content: ""; - line-height: 0; -} -.stages:after { - clear: both; -} -.stages li { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - line-height: 27px; - counter-increment: stage; - width: 50%; - background-color: #EDEDED; - float: left; - padding: 10px 20px; - position: relative; - z-index: 0; -} -.stages li:before { - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; - content: counter(stage); - display: inline-block; - width: 27px; - height: 27px; - margin-right: 5px; - font-weight: bold; - text-align: center; - color: #fff; - background-color: #aeaeae; - z-index: 1; -} -.stages li:after { - left: 0; - border: solid rgba(237, 237, 237, 0); - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-top-color: #EDEDED; - border-bottom-color: #EDEDED; - border-width: 29px; - top: 50%; - margin-top: -29px; - margin-left: -30px; -} -.stages li.last { - position: relative; - right: -1px; -} -.stages li.last, -.stages li.last .highlight { - -webkit-border-radius: 0 3px 0 0; - -moz-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0; -} -.stages li.first:after { - content: none; - border: none; -} -.stages li.active:after { - border-color: rgba(140, 198, 138, 0); - border-top-color: #8cc68a; - border-bottom-color: #8cc68a; -} -.stages li.complete:after { - border-color: rgba(197, 226, 196, 0); - border-top-color: #c5e2c4; - border-bottom-color: #c5e2c4; -} -.stages.stage-3 li.complete:first-child:after { - content: none; -} -.stages li.active, -.stages li.complete { - background: none; -} -.stages li.active:before { - color: #8cc68a; - background: #fff; -} -.stages li.complete:before { - color: #c5e2c4; - background: #eef6ed; -} -.stages li .highlight { - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - width: 100%; - padding: 10px 52px; - border: none; - text-align: left; - text-decoration: none; - line-height: 27px; - z-index: -1; -} -@media (max-width: 768px) { - .stages li .highlight { - text-indent: -9999px; - } -} -.stages li.active .highlight { - color: #fff; - background: #8cc68a; -} -.stages li.complete .highlight { - color: #eef6ed; - background: #c5e2c4; -} -.alert > :last-child { - margin-bottom: 0; -} -.slug-preview { - font-size: 14px; - line-height: 1.5; - margin-top: 5px; - margin-left: 10px; -} -.slug-preview-value { - background-color: #faedcf; - margin-right: 3px; -} -.resource-upload-field { - position: relative; - overflow: hidden; - display: inline-block; - vertical-align: bottom; -} -.resource-upload-field label { - z-index: 0; -} -.resource-upload-field input { - opacity: 0; - filter: alpha(opacity=0); - position: absolute; - top: 0; - right: 0; - z-index: 1; - margin: 0; - border: solid transparent; - border-width: 100px 0 0 200px; - cursor: pointer; - direction: ltr; - -moz-transform: translate(-300px, 0) scale(4); -} -.resource-upload-field.loading { - display: inline-block; - background: url("../../../base/images/loading-spinner.gif") no-repeat center right; - padding-right: 5px; -} -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - font-size: 14px; -} -.select2-container-multi .select2-choices .select2-search-field input { - height: 29px; -} -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - padding-left: 10px; -} -.select2-container { - margin-top: 1px; -} -.select2-container-multi { - margin-top: 0; -} -.select2-container-multi .select2-choices .select2-search-choice { - padding: 5px 8px 5px 22px; -} -.select2-container-multi.select2-container .select2-choices { - padding-top: 3px; - padding-bottom: 3px; -} -.select2-search-choice-close, -.select2-container-multi .select2-search-choice-close { - top: 6px; - left: 5px; -} -.select2-container-multi .select2-choices { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; - background-color: #fff; - border: 1px solid #ccc; -} -.select2-container-active .select2-choices, -.select2-container-multi.select2-container-active .select2-choices { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -.select2-container-multi .select2-drop { - margin-top: -2px; -} -.select2-container .select2-results li { - line-height: 18px; - padding-top: 4px; - padding-bottom: 4px; -} -.control-full .select2-container { - max-width: 100%; -} -.control-group.error .select2-container input:focus, -.control-group.error .select2-container select:focus, -.control-group.error .select2-container textarea:focus { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.js .image-upload #field-image-url { - padding-right: 90px; -} -.js .image-upload #field-image-upload { - cursor: pointer; - position: absolute; - z-index: 1; - opacity: 0; - filter: alpha(opacity=0); -} -.js .image-upload .controls { - position: relative; -} -.js .image-upload .btn { - position: relative; - top: 0; - margin-right: 10px; -} -.js .image-upload .btn.hover { - color: #333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.js .image-upload .btn-remove-url { - position: absolute; - margin-right: 0; - top: 4px; - right: 5px; - padding: 0 12px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.js .image-upload .btn-remove-url .icon-remove { - margin-right: 0; -} -.add-member-form .control-label { - width: 100%; - text-align: left; -} -.add-member-form .controls { - margin-left: auto; -} -.add-member-or { - float: left; - margin-top: 75px; - width: 7%; - text-align: center; - text-transform: uppercase; - color: #999; - font-weight: bold; -} -.add-member-form .row-fluid .control-group { - float: left; - width: 45%; -} -.add-member-form .row-fluid .select2-container, -.add-member-form .row-fluid input { - width: 100% !important; -} -#recaptcha_table { - table-layout: inherit; - line-height: 1; -} -.dataset-item { - border-bottom: 1px dotted #ddd; - padding-bottom: 20px; - margin-bottom: 20px; -} -@media (max-width: 768px) { - .dataset-item { - word-wrap: break-word; - } -} -.dataset-item:last-of-type { - border-bottom: none; - margin-bottom: 0; - padding-bottom: 0; -} -.dataset-heading { - font-size: 16px; - margin-top: 0; - margin-bottom: 8px; - line-height: 1.3; -} -.dataset-heading a { - color: #333; -} -.dataset-heading .label { - position: relative; - top: -1px; -} -.dataset-private { - margin-right: 10px; - text-transform: uppercase; -} -.dataset-private .icon-lock { - width: 9px; -} -.dataset-private.pull-right { - margin-right: 0; -} -.dataset-resources { - margin-top: 8px; -} -.dataset-resources li { - display: inline; -} -.dataset-resources li a { - background-color: #aaa; -} -.dataset-heading .popular { - top: 0; -} -.resource-list { - margin: 0; - list-style: none; - margin: -10px -10px 10px -10px; -} -.resource-item { - position: relative; - padding: 10px 10px 10px 60px; - margin-bottom: 0px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.resource-item:hover { - background-color: #eee; -} -.resource-item .heading { - color: #000; - font-size: 14px; - font-weight: bold; -} -.resource-item .format-label { - position: absolute; - top: 10px; - left: 10px; -} -.resource-item .description { - font-size: 12px; - margin-bottom: 0; - min-height: 12px; -} -.resource-item .btn-group { - position: absolute; - top: 14px; - right: 10px; -} -@media (max-width: 768px) { - .resource-item .btn-group { - display: none; - } -} -.resource-list.reordering .resource-item { - border: 1px solid #ddd; - margin-bottom: 10px; - cursor: move; -} -.resource-list.reordering .resource-item .handle { - display: block; - position: absolute; - color: #888; - left: -31px; - top: 50%; - margin-top: -15px; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - border: 1px solid #ddd; - border-width: 1px 0 1px 1px; - background-color: #fff; - -webkit-border-radius: 20px 0 0 20px; - -moz-border-radius: 20px 0 0 20px; - border-radius: 20px 0 0 20px; -} -.resource-list.reordering .resource-item .handle:hover { - text-decoration: none; -} -.resource-list.reordering .resource-item:hover .handle { - background-color: #eee; -} -.resource-list.reordering .resource-item.ui-sortable-helper { - background-color: #eee; - border: 1px solid #2F9B45; -} -.resource-list.reordering .resource-item.ui-sortable-helper .handle { - background-color: #eee; - border-color: #2F9B45; - color: #333; -} -.resource-item .handle { - display: none; -} -.tag-list { - margin: 0; - list-style: none; - padding: 10px 10px 5px 10px; -} -.tag-list li { - display: inline-block; - margin-right: 5px; -} -.tag-list li:last-child { - margin-right: 0; -} -.additional-info td, -.additional-info th { - width: 50%; -} -.label[data-format=html], -.label[data-format*=html] { - background-color: #55a1ce; -} -.label[data-format=json], -.label[data-format*=json] { - background-color: #ef7100; -} -.label[data-format=xml], -.label[data-format*=xml] { - background-color: #ef7100; -} -.label[data-format=text], -.label[data-format*=text] { - background-color: #74cbec; -} -.label[data-format=csv], -.label[data-format*=csv] { - background-color: #dfb100; -} -.label[data-format=xls], -.label[data-format*=xls] { - background-color: #2db55d; -} -.label[data-format=zip], -.label[data-format*=zip] { - background-color: #686868; -} -.label[data-format=api], -.label[data-format*=api] { - background-color: #ec96be; -} -.label[data-format=pdf], -.label[data-format*=pdf] { - background-color: #e0051e; -} -.label[data-format=rdf], -.label[data-format*=rdf], -.label[data-format*=nquad], -.label[data-format*=ntriples], -.label[data-format*=turtle] { - background-color: #0b4498; -} -.view-list { - margin: 0; - list-style: none; -} -.view-list li { - position: relative; - margin-bottom: 10px; -} -.view-list li a { - display: block; - min-height: 50px; - padding: 10px; - border: 1px solid #ddd; - overflow: hidden; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.view-list li a .icon { - float: left; - width: 50px; - height: 50px; - overflow: hidden; - margin-right: 10px; - color: #444; - background-color: #eee; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.view-list li a .icon i { - display: block; - text-align: center; - font-size: 28px; - line-height: 50px; -} -.view-list li a h3 { - color: #000; - font-weight: bold; - font-size: 16px; - margin: 0 0 3px 0; -} -.view-list li a p { - margin: 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - color: #444; -} -.view-list li a.active, -.view-list li a:hover { - text-decoration: none; - border-color: #2F9B45; -} -.view-list li a.active .icon, -.view-list li a:hover .icon { - background-color: #2F9B45; - color: #f6f6f6; -} -.view-list li .arrow { - position: absolute; - display: none; - border: 8px solid transparent; - border-top-color: #2F9B45; - left: 50%; - bottom: -15px; - margin-left: -4px; -} -.view-list li.active a { - text-decoration: none; - border-color: #2F9B45; -} -.view-list li.active a .icon { - background-color: #2F9B45; - color: #f6f6f6; -} -.view-list li.active .arrow { - display: block; -} -.view-list.stacked { - overflow-y: hidden; - overflow-x: auto; - height: 100px; - white-space: nowrap; -} -.view-list.stacked li { - display: inline-block; - width: 250px; - margin-right: 10px; -} -.view-list.stacked li:last-child { - margin-right: 0; -} -.view-list.stacked::-webkit-scrollbar { - width: 7px; - height: 7px; -} -.view-list.stacked::-webkit-scrollbar-track { - border-radius: 10px; - background-color: #f6f6f6; -} -.view-list.stacked::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color: #c3c3c3; -} -.view-list.stacked::-webkit-scrollbar-thumb:hover { - background-color: #2F9B45; -} -.resource-view { - margin-top: 20px; -} -.search-form { - margin-bottom: 20px; - padding-bottom: 25px; - border-bottom: 1px dotted #ddd; -} -.search-form .search-input { - position: relative; - margin-bottom: 20px; -} -.search-form .search-input input { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - width: 100%; - height: auto; -} -.search-form .search-input button { - cursor: pointer; - display: block; - position: absolute; - top: 50%; - margin-top: 1px; - right: 10px; - height: 20px; - padding: 0; - border: none; - background: transparent; -} -.search-form .search-input button span { - display: none; -} -.search-form .search-input button i { - color: #ccc; - -webkit-transition: color 0.2s ease-in; - -moz-transition: color 0.2s ease-in; - -o-transition: color 0.2s ease-in; - transition: color 0.2s ease-in; -} -.search-form .search-input button:hover i { - color: #000; -} -.search-form .search-input.search-giant input { - font-size: 16px; - padding: 15px; -} -.search-form .search-input.search-giant button { - margin-top: -4px; - right: 15px; - height: 30px; -} -.search-form .search-input.search-giant button i { - font-size: 28px; - width: 28px; -} -.search-form .control-order-by label, -.search-form .control-order-by select { - display: inline; -} -.search-form .control-order-by select { - width: 160px; - margin: 0; -} -.search-form h2 { - font-size: 24px; - line-height: 1.3; - color: #000; - margin-bottom: 0; - margin-top: 20px; -} -.search-form .filter-list { - color: #444; - line-height: 32px; - margin: 10px 0 0 0; -} -.search-form .filter-list .pill { - line-height: 21px; -} -.search-form .filter-list .extra { - margin-top: 10px; - font-size: 18px; - font-weight: normal; - color: #000; -} -.search-form.no-bottom-border { - border-bottom-width: 0; - margin-bottom: 0; -} -.tertiary .control-order-by { - float: none; - margin: 0; -} -.tertiary .control-order-by label { - display: block; - margin-bottom: 5px; - font-weight: normal; - font-size: 12px; -} -.tertiary .control-order-by select { - display: block; - font-size: 12px; - width: 100%; -} -.tertiary .search-input { - margin-bottom: 10px; -} -@media (min-width: 980px) { - .search-form .control-order-by { - float: right; - margin-left: 15px; - } - .tertiary .search-form .control-order-by { - float: none; - margin: 0; - } -} -.group .media-vertical .image { - margin: 0 -5px 5px; -} -.group-list:nth-child(odd) { - clear: left; -} -.group-list .module-heading { - padding-top: 15px; - padding-bottom: 15px; -} -.group-list .dataset-content { - min-height: 54px; -} -.group-list .module-heading h3 { - margin-bottom: 2px; -} -.group-list .module-heading h3 a { - color: #333; -} -.group-list .module-heading .media-image { - overflow: hidden; - max-height: 60px; -} -.group-list .module-heading .media-image img { - max-width: 85px; -} -.toolbar { - *zoom: 1; - position: relative; - margin-bottom: 10px; - padding: 5px 0; -} -.toolbar:before, -.toolbar:after { - display: table; - content: ""; - line-height: 0; -} -.toolbar:after { - clear: both; -} -.page_primary_action { - margin-bottom: 20px; -} -.toolbar .breadcrumb { - *zoom: 1; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - position: relative; - float: left; - margin: 0; - padding: 0; - border: none; - background: none; - font-size: 20px; - line-height: 1.3; -} -.toolbar .breadcrumb:before, -.toolbar .breadcrumb:after { - display: table; - content: ""; - line-height: 0; -} -.toolbar .breadcrumb:after { - clear: both; -} -.toolbar .breadcrumb li:after { - content: " / "; -} -.toolbar .breadcrumb li.active:after { - content: ""; -} -.toolbar .breadcrumb li:last-of-type:after { - content: ""; -} -.toolbar .home a { - text-decoration: none; -} -.toolbar .home span { - display: none; -} -.toolbar .breadcrumb a { - color: #505050; -} -@media (max-width: 767px) { - .toolbar .breadcrumb { - color: #fff; - text-shadow: none; - } - .toolbar .breadcrumb .home { - display: none; - } - .toolbar .breadcrumb a { - color: #fff; - text-shadow: none; - } -} -.toolbar .breadcrumb .active a, -.toolbar .breadcrumb a.active { - font-weight: bold; -} -.actions { - margin: 0; - list-style: none; - position: absolute; - top: 10px; - right: 10px; - z-index: 1; -} -.actions li { - display: inline-block; - margin-right: 5px; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.actions li:last-of-type { - margin-right: 0; -} -.hide-heading { - display: none; -} -.page-header { - *zoom: 1; - border-bottom: 1px solid #ddd; - background-color: #f6f6f6; - -webkit-border-radius: 0 3px 0 0; - -moz-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0; -} -.page-header:before, -.page-header:after { - display: table; - content: ""; - line-height: 0; -} -.page-header:after { - clear: both; -} -.page-header .nav-tabs { - float: left; - margin-bottom: -1px; -} -.page-header .nav-tabs li.active a, -.page-header .nav-tabs a:hover { - background-color: #fff; -} -.page-header .content_action { - float: right; - margin-top: -5px; - margin-right: -7px; -} -.no-nav .page-header { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.nav-tabs-plain { - padding: 0 25px; -} -.nav-tabs-plain > .active > a, -.nav-tabs-plain > .active > a:hover { - background-color: #fff; -} -@media (min-width: 768px) { - .span9 .page-header { - margin-left: -17px; - } -} -@media (max-width: 768px) { - .page-header .nav-tabs { - margin: 5px 10px 10px -5px; - border: none; - } - .page-header .nav-tabs > li { - float: none; - } - .page-header .nav-tabs > li a { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .page-header .nav-tabs > .active > a, - .page-header .nav-tabs > .active > a:hover, - .page-header .nav-tabs > .active > a:focus { - border-bottom-color: #dddddd; - } -} -h1 { - font-size: 28px; -} -h2 { - font-size: 21px; -} -h3 { - font-size: 18px; -} -h4 { - font-size: 14px; -} -h1, -h2, -h3, -h4 { - line-height: 1.5; -} -h1 small, -h2 small, -h3 small, -h4 small { - font-size: 14px; -} -.prose h1, -.prose heading-1 h2, -.prose heading-2 { - margin-bottom: 15px; -} -.prose h3, -.prose heading-3 { - margin-bottom: 10px; -} -.table-chunky td, -.table-chunky th { - padding: 12px 15px; - font-size: 12px; -} -.table-chunky thead th, -.table-chunky thead td { - color: #fff; - background-color: #aaa; - padding-top: 10px; - padding-bottom: 10px; -} -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: transparent; -} -.table-striped tbody tr:nth-child(even) td, -.table-striped tbody tr:nth-child(even) th { - background-color: #f2f2f2; -} -.table-chunky.table-bordered { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} -.table-chunky.table-bordered thead:first-child tr:first-child th:first-child, -.table-chunky.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 2px; - -moz-border-radius-topleft: 2px; - border-top-left-radius: 2px; -} -.table-chunky.table-bordered thead:first-child tr:first-child th:last-child, -.table-chunky.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 2px; - -moz-border-radius-topright: 2px; - border-top-right-radius: 2px; -} -.table-chunky.table-bordered thead:last-child tr:last-child th:first-child, -.table-chunky.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 2px; - -moz-border-radius: 0 0 0 2px; - border-radius: 0 0 0 2px; - -webkit-border-bottom-left-radius: 2px; - -moz-border-radius-bottomleft: 2px; - border-bottom-left-radius: 2px; -} -.table-chunky.table-bordered thead:last-child tr:last-child th:last-child, -.table-chunky.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 2px; - -moz-border-radius-bottomright: 2px; - border-bottom-right-radius: 2px; -} -.ellipsis { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.ckan-icon { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; -} -.ckan-icon-fb { - width: 16px; - height: 16px; - background-position: 0px 0; -} -.ckan-icon-gplus { - width: 16px; - height: 16px; - background-position: -16px 0; -} -.ckan-icon-twitter { - width: 16px; - height: 16px; - background-position: -32px 0; -} -.ckan-icon-email { - width: 16px; - height: 16px; - background-position: -48px 0; -} -.ckan-icon-share { - width: 16px; - height: 16px; - background-position: -64px 0; -} -.ckan-icon-feed { - width: 16px; - height: 16px; - background-position: -80px 0; -} -.ckan-icon-calendar { - width: 16px; - height: 16px; - background-position: -96px 0; -} -.ckan-icon-file { - width: 16px; - height: 16px; - background-position: -112px 0; -} -.ckan-icon-lock { - width: 16px; - height: 16px; - background-position: -128px 0; -} -.ckan-icon-link-file { - width: 16px; - height: 16px; - background-position: -144px 0; -} -.ckan-icon-link-plugin { - width: 16px; - height: 16px; - background-position: -160px 0; -} -.ckan-icon-upload-file { - width: 16px; - height: 16px; - background-position: -176px 0; -} -.ckan-icon-callout { - width: 16px; - height: 16px; - background-position: -192px 0; -} -.ckan-icon-circle-cross { - width: 17px; - height: 17px; - background-position: 0px -16px; -} -.ckan-icon-circle-add { - width: 17px; - height: 17px; - background-position: -17px -16px; -} -.ckan-icon-flame { - width: 17px; - height: 17px; - background-position: -34px -16px; -} -.ckan-icon-search { - width: 17px; - height: 17px; - background-position: -51px -16px; -} -.ckan-icon-large-lock { - width: 20px; - height: 20px; - background-position: 0px -33px; -} -.ckan-icon-photo { - width: 20px; - height: 20px; - background-position: -20px -33px; -} -.ckan-icon-add { - width: 20px; - height: 20px; - background-position: -40px -33px; -} -.ckan-icon-home { - width: 20px; - height: 20px; - background-position: -60px -33px; -} -.ckan-icon-rewind { - width: 20px; - height: 20px; - background-position: -80px -33px; -} -.ckan-icon-tools { - width: 20px; - height: 20px; - background-position: -100px -33px; -} -.ckan-icon-flag { - width: 20px; - height: 20px; - background-position: -120px -33px; -} -.ckan-icon-clipboard { - width: 20px; - height: 20px; - background-position: -140px -33px; -} -.ckan-icon-share { - width: 20px; - height: 20px; - background-position: -160px -33px; -} -.ckan-icon-info { - width: 20px; - height: 20px; - background-position: -180px -33px; -} -.ckan-icon-download { - width: 20px; - height: 20px; - background-position: -200px -33px; -} -.ckan-icon-star { - width: 20px; - height: 20px; - background-position: -220px -33px; -} -.ckan-icon-info-flat { - width: 20px; - height: 20px; - background-position: -240px -33px; -} -.ckan-icon-tag { - width: 20px; - height: 20px; - background-position: -260px -33px; -} -.ckan-icon-plus { - width: 20px; - height: 20px; - background-position: -280px -33px; - width: 16px; -} -.ckan-icon-head { - width: 20px; - height: 20px; - background-position: -300px -33px; -} -.ckan-icon-arrow-e { - width: 20px; - height: 20px; - background-position: -320px -33px; - width: 16px; -} -.ckan-icon-bookmark { - width: 25px; - height: 25px; - background-position: 0px -53px; -} -.format-label { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - text-indent: -900em; - background: url("../../../base/images/sprite-resource-icons.png") no-repeat 0 0; -} -.format-label { - width: 32px; - height: 35px; - background-position: 0px -62px; -} -.format-label[data-format=rdf], -.format-label[data-format*=rdf] { - width: 32px; - height: 35px; - background-position: -32px -62px; -} -.format-label[data-format=pdf], -.format-label[data-format*=pdf] { - width: 32px; - height: 35px; - background-position: -64px -62px; -} -.format-label[data-format=api], -.format-label[data-format*=api] { - width: 32px; - height: 35px; - background-position: -96px -62px; -} -.format-label[data-format=zip], -.format-label[data-format*=zip] { - width: 32px; - height: 35px; - background-position: -128px -62px; -} -.format-label[data-format=xls], -.format-label[data-format*=xls] { - width: 32px; - height: 35px; - background-position: -160px -62px; -} -.format-label[data-format=csv], -.format-label[data-format*=csv] { - width: 32px; - height: 35px; - background-position: -192px -62px; -} -.format-label[data-format=txt], -.format-label[data-format*=txt] { - width: 32px; - height: 35px; - background-position: -224px -62px; -} -.format-label[data-format=xml], -.format-label[data-format*=xml] { - width: 32px; - height: 35px; - background-position: -256px -62px; -} -.format-label[data-format=json], -.format-label[data-format*=json] { - width: 32px; - height: 35px; - background-position: -288px -62px; -} -.format-label[data-format=html], -.format-label[data-format*=html] { - width: 32px; - height: 35px; - background-position: -320px -62px; -} -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - text-align: right; - font-size: 14px; - line-height: 1; - width: 14px; -} -.btn [class^="icon-"], -.nav [class^="icon-"], -.module-heading [class^="icon-"], -.dropdown [class^="icon-"], -.btn [class*=" icon-"], -.nav [class*=" icon-"], -.module-heading [class*=" icon-"], -.dropdown [class*=" icon-"] { - margin-right: 4px; -} -.info-block [class^="icon-"], -.info-block [class*=" icon-"] { - float: left; - font-size: 28px; - width: 28px; - margin-right: 5px; - margin-top: 2px; -} -.breadcrumb .home .icon-home { - font-size: 24px; - width: 24px; - vertical-align: -1px; -} -.info-block-small [class^="icon-"], -.info-block-small [class*=" icon-"] { - font-size: 14px; - width: 14px; - margin-top: 1px; -} -.nav-tabs .fa:last-child, -.module-heading .fa:last-child, -.btn .fa:last-child { - margin-right: 3px; -} -.wrapper { - *zoom: 1; - background-color: #FFF; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - position: relative; - background-color: #fff; - margin-bottom: 20px; - margin-left: 0; -} -.wrapper:before, -.wrapper:after { - display: table; - content: ""; - line-height: 0; -} -.wrapper:after { - clear: both; -} -@media (min-width: 768px) { - .wrapper { - background-image: url("../../../base/images/nav.png"); - background-repeat: repeat-y; - background-position: -54px 0px; - } -} -@media (min-width: 980px) { - .wrapper { - background-position: 0px 0px; - } -} -.wrapper.no-nav { - background-image: none; -} -[role=main], -.main { - position: relative; - padding-bottom: 20px; -} -@media (min-width: 768px) { - [role=main], - .main { - padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); - } -} -[role=main] { - min-height: 350px; -} -.main:after, -[role=main]:after { - bottom: 0; - border-top-width: 1px; -} -[role=main] .primary { - float: right; - margin-left: 0; -} -[role=main] .secondary { - margin-left: 0; -} -/* Filters modal */ -.no-text .text { - display: none; -} -.js body.filters-modal { - overflow: hidden; -} -.show-filters.btn, -.hide-filters { - display: none; -} -@media (max-width: 768px) { - .wrapper { - margin: 0 -20px; - border-width: 0; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - } - .js [role=main] .secondary .filters { - display: none; - position: fixed; - overflow: auto; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 1; - padding: 10px; - background-color: #000000; - background-color: rgba(0, 0, 0, 0.5); - } - .js body.filters-modal .secondary .filters { - display: block; - } - .js [role=main] .secondary .filters > div { - background-color: #fff; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - overflow: hidden; - } - .js [role=main] .secondary .filters > div .module-footer { - display: none; - } - .js body.filters-modal .secondary .filters .hide-filters { - display: inline-block; - position: absolute; - top: 14px; - right: 17px; - opacity: 0.6; - } - .js body.filters-modal .secondary .filters .hide-filters i { - font-size: 18px; - } - .js .show-filters.btn { - display: inline-block; - } -} -.primary > :last-child, -.secondary > :last-child { - margin-bottom: 0; -} -.primary .primary { - float: left; - width: 467px; - margin-left: 0; - margin-bottom: 20px; -} -.primary .primary h1:first-child, -.primary .primary h2:first-child, -.primary .primary h3:first-child, -.primary .primary h4:first-child { - margin-top: 0; -} -.primary .tertiary { - float: left; - width: 180px; - margin-left: 18px; - margin-bottom: 20px; -} -@media (min-width: 768px) { - .hero { - background: url("../../../base/images/background-tile.png"); - } -} -.hero:after { - background-color: rgba(0, 0, 0, 0.09); - background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(0, 0, 0, 0.15)), to(rgba(0, 0, 0, 0))); - background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-repeat: repeat-x; - background-color: #f6f6f6; - border-bottom: 1px solid #d0d0d0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - -webkit-box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); - -moz-box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); - box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); -} -.hero:after .back:hover { - text-decoration: none; -} -.hero:after .back:hover span { - text-decoration: underline; -} -.context-info .module-content { - padding: 15px; -} -.context-info .image { - margin-bottom: 10px; -} -.context-info .image img, -.context-info .image a { - display: block; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.context-info p { - overflow: auto; -} -.context-info code { - display: block; - font-weight: normal; - padding: 0; - margin: 0; - overflow: auto; -} -.context-info h1.heading { - margin: 0 0 5px 0; - font-size: 18px; - line-height: 1.3; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.context-info .info { - margin-top: 15px; - padding-top: 10px; - border-top: 1px dotted #DDD; - word-break: break-word; -} -.context-info .info dl dd { - margin-top: 3px; - margin-left: 0; -} -.context-info .nums { - *zoom: 1; - margin-top: 15px; - padding-top: 10px; - padding-bottom: 0; - border-top: 1px dotted #DDD; -} -.context-info .nums:before, -.context-info .nums:after { - display: table; - content: ""; - line-height: 0; -} -.context-info .nums:after { - clear: both; -} -.context-info .nums dl { - float: left; - width: 50%; - margin: 5px 0 0 0; - color: #444; -} -.context-info .nums dl dt { - display: block; - font-size: 13px; - font-weight: 300; -} -.context-info .nums dl dd { - display: block; - font-size: 30px; - font-weight: 700; - line-height: 36px; - margin-left: 0; -} -.context-info .nums dl dd .smallest { - font-size: 13px; -} -.context-info .nums dl dd .smaller { - font-size: 16px; -} -.context-info .nums dl dd .small { - font-size: 21px; -} -.context-info .follow_button { - margin-top: 15px; -} -.context-info.editing .module-content { - margin-top: 0; -} -.flash-messages .alert { - -webkit-box-shadow: 0 0 0 1px white; - -moz-box-shadow: 0 0 0 1px white; - box-shadow: 0 0 0 1px white; -} -.homepage .row { - position: relative; -} -.homepage .module-search { - padding: 5px; - margin: 20px 0 0 0; - color: #fff; - background: #fff; -} -.homepage .module-search .search-giant { - margin-bottom: 10px; -} -.homepage .module-search .search-giant input { - border-color: #003f52; -} -.homepage .module-search .module-content { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - background-color: #2F9B45; - border-bottom: none; -} -.homepage .module-search .module-content .heading { - margin-top: 0; - margin-bottom: 7px; - font-size: 24px; - line-height: 40px; -} -.homepage .module-search .tags { - *zoom: 1; - padding: 5px 10px 10px 10px; - background-color: #237434; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.homepage .module-search .tags:before, -.homepage .module-search .tags:after { - display: table; - content: ""; - line-height: 0; -} -.homepage .module-search .tags:after { - clear: both; -} -.homepage .module-search .tags h3, -.homepage .module-search .tags .tag { - display: block; - float: left; - margin: 5px 10px 0 0; -} -.homepage .module-search .tags h3 { - font-size: 14px; - line-height: 20px; - padding: 2px 8px; -} -.homepage .group-list { - margin: 0; -} -.homepage .box .inner { - padding: 20px 25px; -} -.homepage .stats h3 { - margin: 0 0 10px 0; -} -.homepage .stats ul { - margin: 0; - list-style: none; - *zoom: 1; -} -.homepage .stats ul:before, -.homepage .stats ul:after { - display: table; - content: ""; - line-height: 0; -} -.homepage .stats ul:after { - clear: both; -} -.homepage .stats ul li { - float: left; - width: 25%; - font-weight: 300; -} -.homepage .stats ul li a { - display: block; -} -.homepage .stats ul li a b { - display: block; - font-size: 35px; - line-height: 1.5; -} -.homepage .stats ul li a:hover { - text-decoration: none; -} -.homepage.layout-2 .stats { - margin-top: 20px; -} -@media (min-width: 768px) { - .homepage [role=main] { - padding: 20px 0; - } - .homepage.layout-1 .row1 .col2 { - position: absolute; - bottom: 0; - right: 0; - } - .homepage.layout-1 .row1 .col2 .module-search { - bottom: 0; - left: 0; - right: 0; - } -} -.account-masthead { - *zoom: 1; - min-height: 30px; - color: #fff; - background: #237434 url("../../../base/images/bg.png"); -} -.account-masthead:before, -.account-masthead:after { - display: table; - content: ""; - line-height: 0; -} -.account-masthead:after { - clear: both; -} -.account-masthead .account { - float: right; -} -.account-masthead .account ul { - *zoom: 1; -} -.account-masthead .account ul:before, -.account-masthead .account ul:after { - display: table; - content: ""; - line-height: 0; -} -.account-masthead .account ul:after { - clear: both; -} -.account-masthead .account ul li { - display: block; - float: left; - border-left: 1px solid #1d602b; -} -.account-masthead .account ul li a { - display: block; - color: #cbe6d1; - font-size: 13px; - font-weight: bold; - padding: 0 10px; - line-height: 31px; -} -.account-masthead .account ul li a span.username, -.account-masthead .account ul li a span.text { - margin: 0 2px 0 4px; -} -.account-masthead .account ul li a span.text { - position: absolute; - top: -9999px; - left: -9999px; -} -.account-masthead .account ul li a:hover { - color: #e0f0e3; - background-color: #1d602b; - text-decoration: none; -} -.account-masthead .account ul li a.sub { - font-weight: 300; -} -.account-masthead .account ul li a .btn { - vertical-align: 1px; - margin-left: 3px; -} -.account-masthead .account .notifications a span.badge { - font-size: 12px; - margin-left: 3px; - padding: 1px 6px; - background-color: #1d602b; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - text-shadow: none; - color: #cbe6d1; -} -.account-masthead .account .notifications a:hover span { - color: #fff; - background-color: #174d22; -} -.account-masthead .account .notifications.notifications-important a span.badge { - color: #fff; - background-color: #C9403A; -} -.account-masthead .account.authed .image { - padding: 0 6px; -} -.account-masthead .account.authed .image img { - vertical-align: -6px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.masthead { - *zoom: 1; - min-height: 55px; - color: #fff; - background: #2F9B45 url("../../../base/images/bg.png"); -} -.masthead:before, -.masthead:after { - display: table; - content: ""; - line-height: 0; -} -.masthead:after { - clear: both; -} -.masthead .container { - position: relative; -} -.masthead a { - color: #fff; -} -.masthead hgroup h1, -.masthead hgroup h2 { - float: left; - font-size: 30px; - line-height: 1.5; -} -.masthead hgroup h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; -} -.masthead hgroup h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; -} -.masthead .nav-collapse { - padding-top: 10px; -} -.masthead .section { - float: left; -} -.masthead input[type="text"] { - border-color: #29873c; -} -.masthead .navigation { - margin-right: 20px; -} -.masthead .navigation .nav-pills { - margin-bottom: 0; -} -.masthead .navigation .nav-pills li a:hover, -.masthead .navigation .nav-pills li.active a { - background-color: #237434; -} -.masthead .nav > li > a, -.masthead .nav > li > a:focus, -.masthead .nav > li > a:hover, -.masthead .nav > .active > a, -.masthead .nav > .active > a:hover, -.masthead .nav > .active > a:focus { - color: #fff; - text-shadow: none; -} -.masthead .site-search { - margin: 2px 8px 2px 0; -} -.masthead .site-search input { - width: 200px; - padding: 4px 10px; -} -.masthead .btn-navbar, -.masthead .btn-navbar:hover, -.masthead .btn-navbar:focus, -.masthead .btn-navbar:active, -.masthead .btn-navbar.active, -.masthead .btn-navbar.disabled, -.masthead .btn-navbar[disabled] { - background-color: #237434; - background-image: none; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - text-shadow: none; - margin-top: 15px; -} -.masthead .btn-navbar .icon-bar, -.masthead .btn-navbar:hover .icon-bar, -.masthead .btn-navbar:focus .icon-bar, -.masthead .btn-navbar:active .icon-bar, -.masthead .btn-navbar.active .icon-bar, -.masthead .btn-navbar.disabled .icon-bar, -.masthead .btn-navbar[disabled] .icon-bar { - margin-right: 0; -} -.masthead .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); -} -@media (min-width: 980px) { - .masthead .nav-collapse { - float: right; - } -} -@media (max-width: 767px) { - .account-masthead { - margin-left: -20px; - margin-right: -20px; - padding-left: 20px; - padding-right: 20px; - } - .masthead .section { - float: none; - } - .masthead .section .nav-collapse { - margin-bottom: 25px; - } -} -@media (max-width: 979px) { - .masthead .container { - padding-left: 20px; - padding-right: 20px; - } - .masthead .site-search { - display: none; - } -} -.site-footer { - *zoom: 1; - min-height: 55px; - color: #fff; - background: #2F9B45 url("../../../base/images/bg.png"); - padding: 20px 0; -} -.site-footer:before, -.site-footer:after { - display: table; - content: ""; - line-height: 0; -} -.site-footer:after { - clear: both; -} -.site-footer .container { - position: relative; -} -.site-footer a { - color: #fff; -} -.site-footer hgroup h1, -.site-footer hgroup h2 { - float: left; - font-size: 30px; - line-height: 1.5; -} -.site-footer hgroup h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; -} -.site-footer hgroup h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; -} -.site-footer .nav-collapse { - padding-top: 10px; -} -.site-footer .section { - float: left; -} -.site-footer input[type="text"] { - border-color: #29873c; -} -.site-footer .navigation { - margin-right: 20px; -} -.site-footer .navigation .nav-pills { - margin-bottom: 0; -} -.site-footer .navigation .nav-pills li a:hover, -.site-footer .navigation .nav-pills li.active a { - background-color: #237434; -} -.site-footer .nav > li > a, -.site-footer .nav > li > a:focus, -.site-footer .nav > li > a:hover, -.site-footer .nav > .active > a, -.site-footer .nav > .active > a:hover, -.site-footer .nav > .active > a:focus { - color: #fff; - text-shadow: none; -} -.site-footer .site-search { - margin: 2px 8px 2px 0; -} -.site-footer .site-search input { - width: 200px; - padding: 4px 10px; -} -.site-footer .btn-navbar, -.site-footer .btn-navbar:hover, -.site-footer .btn-navbar:focus, -.site-footer .btn-navbar:active, -.site-footer .btn-navbar.active, -.site-footer .btn-navbar.disabled, -.site-footer .btn-navbar[disabled] { - background-color: #237434; - background-image: none; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - text-shadow: none; - margin-top: 15px; -} -.site-footer .btn-navbar .icon-bar, -.site-footer .btn-navbar:hover .icon-bar, -.site-footer .btn-navbar:focus .icon-bar, -.site-footer .btn-navbar:active .icon-bar, -.site-footer .btn-navbar.active .icon-bar, -.site-footer .btn-navbar.disabled .icon-bar, -.site-footer .btn-navbar[disabled] .icon-bar { - margin-right: 0; -} -.site-footer .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); -} -.site-footer, -.site-footer label, -.site-footer small { - color: #acd7b5; -} -.site-footer a { - color: #acd7b5; -} -.footer-links ul li { - margin-bottom: 5px; -} -.attribution small { - color: #acd7b5; - font-size: 12px; -} -.attribution .ckan-footer-logo { - display: block; - width: 68px; - height: 21px; - margin-top: 2px; - background: url("../../../base/images/ckan-logo-footer.png") no-repeat top left; - text-indent: -900em; -} -.lang-select { - *zoom: 1; -} -.lang-select:before, -.lang-select:after { - display: table; - content: ""; - line-height: 0; -} -.lang-select:after { - clear: both; -} -.lang-select label, -.lang-select select, -.lang-select .lang-container { - float: left; - margin-top: 0; -} -.lang-dropdown { - color: #000; -} -.lang-dropdown li { - width: auto; -} -.table-selected td { - background-color: #f5f5f5; -} -.table-selected td .edit { - display: block; -} -.table-bulk-edit th input { - top: -5px; -} -.table-bulk-edit .table-actions .btn-group { - float: left; - margin: 0 10px 0 0; -} -.table-bulk-edit .context p { - margin-bottom: 0; -} -.table-header thead th { - background-color: #f6f6f6; -} -.table-edit-hover .edit { - display: none; - float: right; -} -.table-edit-hover tr:hover .edit { - display: block; -} -.js .table-toggle-more .toggle-more { - display: none; -} -.js .table-toggle-more .show-more { - display: inline; -} -.js .table-toggle-more .show-less { - display: none; -} -.js .table-toggle-more .toggle-seperator { - display: table-row; -} -.js .table-toggle-more .toggle-seperator td { - height: 11px; - padding: 0; - background-image: url("../../../base/images/table-seperator.png"); -} -.js .table .toggle-show td { - background: none; - text-align: center; -} -.js .table-toggle-less .show-less { - display: inline; -} -.js .table-toggle-less .show-more { - display: none; -} -.js .table-toggle-less .toggle-seperator { - display: none; -} -.profile .empty, -.profile .dataset-list { - margin-bottom: 20px; -} -.activity { - margin: 10px 0; - padding: 0; - list-style-type: none; - background: transparent url('../../../base/images/dotted.png') 14px 0 repeat-y; -} -.activity .item { - position: relative; - margin: 0 0 15px 0; - padding: 0; - *zoom: 1; -} -.activity .item:before, -.activity .item:after { - display: table; - content: ""; - line-height: 0; -} -.activity .item:after { - clear: both; -} -.activity .item .icon { - display: block; - position: absolute; - top: 0; - left: 0; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - color: #FFFFFF; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - font-weight: normal; - margin-right: 10px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); -} -.activity .item .gravatar { - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.activity .item .actor .gravatar { - position: absolute; - top: 0; - left: 40px; -} -.activity .item p { - font-size: 14px; - line-height: 1.5; - margin: 5px 0 0 80px; -} -.activity .item .date { - color: #999; - font-size: 12px; - white-space: nowrap; -} -.activity .item .new { - display: block; - position: absolute; - overflow: hidden; - top: -3px; - left: -3px; - width: 10px; - height: 10px; - background-color: #A35647; - border: 1px solid #FFF; - text-indent: -1000px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} -.activity .item.no-avatar p { - margin-left: 40px; -} -.activity .load-less { - margin-bottom: 15px; -} -.popover { - width: 300px; -} -.popover .popover-title { - font-weight: bold; - margin-bottom: 0; -} -.popover p.about { - margin: 0 0 10px 0; -} -.popover .popover-close { - float: right; - text-decoration: none; -} -.popover .popover-content { - font-size: 14px; - line-height: 20px; - color: #444; - word-break: break-all; -} -.popover .popover-content dl { - margin: 0; -} -.popover .popover-content dl dd { - margin-left: 0; - margin-bottom: 10px; -} -.activity .item .icon { - background-color: #999999; -} -.activity .item.failure .icon { - background-color: #B95252; -} -.activity .item.success .icon { - background-color: #69A67A; -} -.activity .item.added-tag .icon { - background-color: #6995a6; -} -.activity .item.changed-group .icon { - background-color: #767DCE; -} -.activity .item.changed-package .icon { - background-color: #8c76ce; -} -.activity .item.changed-package_extra .icon { - background-color: #769ace; -} -.activity .item.changed-resource .icon { - background-color: #aa76ce; -} -.activity .item.changed-user .icon { - background-color: #76b8ce; -} -.activity .item.changed-organization .icon { - background-color: #699fa6; -} -.activity .item.deleted-group .icon { - background-color: #B95252; -} -.activity .item.deleted-package .icon { - background-color: #b97452; -} -.activity .item.deleted-package_extra .icon { - background-color: #b95274; -} -.activity .item.deleted-resource .icon { - background-color: #b99752; -} -.activity .item.deleted-organization .icon { - background-color: #b95297; -} -.activity .item.new-group .icon { - background-color: #69A67A; -} -.activity .item.new-package .icon { - background-color: #69a68e; -} -.activity .item.new-package_extra .icon { - background-color: #6ca669; -} -.activity .item.new-resource .icon { - background-color: #81a669; -} -.activity .item.new-user .icon { - background-color: #69a6a3; -} -.activity .item.new-organization .icon { - background-color: #81a669; -} -.activity .item.removed-tag .icon { - background-color: #b95297; -} -.activity .item.deleted-related-item .icon { - background-color: #b9b952; -} -.activity .item.follow-dataset .icon { - background-color: #767DCE; -} -.activity .item.follow-user .icon { - background-color: #8c76ce; -} -.activity .item.new-related-item .icon { - background-color: #95a669; -} -.activity .item.follow-group .icon { - background-color: #8ba669; -} -.dropdown:hover .dropdown-menu { - display: block; -} -.js .dropdown .dropdown-menu, -.js .dropdown:hover .dropdown-menu { - display: none; -} -.js .dropdown.open .dropdown-menu { - display: block; -} -#followee-filter .btn { - *zoom: 1; -} -#followee-filter .btn:before, -#followee-filter .btn:after { - display: table; - content: ""; - line-height: 0; -} -#followee-filter .btn:after { - clear: both; -} -#followee-filter .btn span, -#followee-filter .btn strong { - display: block; - float: left; - line-height: 1.5; -} -#followee-filter .btn span { - font-weight: normal; -} -#followee-filter .btn strong { - margin: 0 5px; - white-space: nowrap; - max-width: 90px; - overflow: hidden; - text-overflow: ellipsis; -} -.dashboard-context { - position: relative; - margin-bottom: 20px; - padding: 20px; - border-bottom: 1px solid #DCDCDC; - background-color: #f6f6f6; - -webkit-border-radius: 3px 0 0 0; - -moz-border-radius: 3px 0 0 0; - border-radius: 3px 0 0 0; -} -.dashboard-context h2 { - margin-bottom: 10px; -} -.dashboard-context .arrow { - position: absolute; - content: ' '; - top: 30px; - right: -10px; - width: 10px; - height: 21px; - background: transparent url("../../../base/images/dashboard-followee-related.png"); -} -.popover-followee .popover-title { - display: none; -} -.popover-followee .popover-content { - padding: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.popover-followee .empty { - padding: 10px; -} -.popover-followee .popover-header { - *zoom: 1; - background-color: whiteSmoke; - padding: 5px; - border-bottom: 1px solid #ccc; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.popover-followee .popover-header:before, -.popover-followee .popover-header:after { - display: table; - content: ""; - line-height: 0; -} -.popover-followee .popover-header:after { - clear: both; -} -.popover-followee .popover-header .input-prepend { - margin-bottom: 0; -} -.popover-followee .popover-header .add-on, -.popover-followee .popover-header input { - float: left; - margin: 0; -} -.popover-followee .popover-header .add-on { - padding: 4px 8px 4px 12px; - border-right-width: 0; - -webkit-border-radius: 100px 0 0 100px; - -moz-border-radius: 100px 0 0 100px; - border-radius: 100px 0 0 100px; -} -.popover-followee .popover-header input { - padding: 4px 12px 4px 8px; - font-size: 13px; - width: 207px; - -webkit-border-radius: 0 100px 100px 0; - -moz-border-radius: 0 100px 100px 0; - border-radius: 0 100px 100px 0; -} -.popover-followee .nav { - padding: 0; - margin: 0; - max-height: 205px; - overflow: auto; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.popover-followee .nav li a { - display: block; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - padding: 7px 10px 7px 15px; - margin: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.popover-followee .nav li a i { - background-color: #2F9B45; - color: #fff; - margin-right: 11px; - padding: 3px 5px; - line-height: 1; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); -} -.popover-followee .nav li a:hover i { - background-color: #000; -} -.popover-followee .nav li.active a i { - color: #2F9B45; - background-color: #fff; -} -.dashboard-me { - *zoom: 1; - padding: 15px 15px 0 15px; -} -.dashboard-me:before, -.dashboard-me:after { - display: table; - content: ""; - line-height: 0; -} -.dashboard-me:after { - clear: both; -} -.dashboard-me img { - float: left; - margin-right: 10px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.dashboard-me strong { - display: block; - font-size: 16px; - margin: 3px 0; -} -.resource-view-filters { - margin-bottom: 1em; -} -.resource-view-filters .resource-view-filter { - margin-bottom: 1.0em; -} -.resource-view-filters .resource-view-remove-filter { - cursor: pointer; - color: #b55457; -} -.resource-view-filters .resource-view-filter-values .select2-container { - margin-right: 0.3em; - margin-bottom: 0.2em; - width: 24% !important; -} -.resource-view-filters .resource-view-filter-values .select2-container .select2-search-choice-close { - left: auto; -} -.datapusher-status-link:hover { - text-decoration: none; -} -.datapusher-status.status-unknown { - color: #bbb; -} -.datapusher-status.status-pending { - color: #FFCC00; -} -.datapusher-status.status-error { - color: red; -} -.datapusher-status.status-complete { - color: #009900; -} -body { - background: #2F9B45 url("../../../base/images/bg.png"); -} -[hidden] { - display: none; -} -table { - table-layout: fixed; -} -thead th { - vertical-align: top; -} -td, -th { - word-wrap: break-word; -} -table .metric { - width: 140px; -} -code { - color: #000; - border: none; - background: none; - white-space: normal; -} -pre { - border: none; - background: none; - padding-left: 0; - padding-right: 0; -} -mark { - background: #fdf7e9; -} -blockquote p { - font-size: 1em; -} -iframe { - border: none; -} -.embedded-content h1 { - font-size: 1.4em; -} -.embedded-content h2 { - font-size: 1.4em; -} -.embedded-content h3 { - font-size: 1.2em; -} -.popular { - text-indent: -999em; -} -.empty { - color: #aaa; - font-style: italic; -} -.page-heading { - margin-top: 0; - margin-bottom: 16px; -} -.m-top { - margin-top: 15px; -} -.m-left { - margin-left: 15px; -} -.m-right { - margin-right: 15px; -} -.m-bottom { - margin-bottom: 15px; -} -.no-margin { - margin: 0; -} -.reduced-margin { - margin: 3px 5px; -} -.p-top { - padding-top: 15px; -} -.p-left { - padding-left: 15px; -} -.p-right { - padding-right: 15px; -} -.p-bottom { - padding-bottom: 15px; -} -.no-padding { - padding: 0; -} -.reduced-padding { - padding: 3px 5px; -} -.ie .lang-dropdown { - position: relative; - top: -20px; -} -.ie .module-popup { - border-bottom: none; -} -.ie .banner { - top: 0; - right: 0; - width: auto; -} -.ie .group-listing { - margin-left: -24px; -} -.ie .toolbar .breadcrumb { - filter: none; -} -.ie .toolbar .breadcrumb li { - float: left; -} -.ie .toolbar .breadcrumb li:after { - margin: 0 0.2em; -} -.ie9 .control-large input { - height: 56px; -} -.ie8 .account-masthead a.image, -.ie8 .account-masthead .username { - white-space: nowrap; -} -.ie9 .homepage .media.module-heading .media-image img, -.ie8 .homepage .media.module-heading .media-image img, -.ie7 .homepage .media.module-heading .media-image img { - width: 85px !important; -} -.ie8 .masthead .nav-collapse, -.ie7 .masthead .nav-collapse { - float: right; -} -.ie8 [role=main], -.ie7 [role=main], -.ie8 .main, -.ie7 .main { - padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); -} -.ie8 .hero, -.ie7 .hero { - background: url("../../../base/images/background-tile.png"); -} -.ie8 .hero .hero-primary.module-popup .box, -.ie7 .hero .hero-primary.module-popup .box { - padding-bottom: 20px !important; - margin-bottom: 0 !important; -} -.ie8 .lang-dropdown, -.ie7 .lang-dropdown { - position: relative !important; - top: -90px !important; -} -.ie7 .alert { - position: relative; -} -.ie7 .alert .close { - position: absolute; - top: 6px !important; - right: 20px; -} -.ie7 .media-item { - width: 30%; -} -.ie7 .tags .tag-list { - *zoom: 1; -} -.ie7 .tags .tag-list:before, -.ie7 .tags .tag-list:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .tags .tag-list:after { - clear: both; -} -.ie7 .tags .tag-list li { - display: block; - float: left; -} -.ie7 .tags h3 { - float: left; -} -.ie7 .tags .tag { - display: block; -} -.ie7 .search-giant input { - width: 95%; -} -.ie7 .control-full input, -.ie7 .control-full select, -.ie7 .control-full textarea { - width: 95%; -} -.ie7 .control-full.control-large .controls input { - padding-bottom: 20px; -} -.ie7 .controls { - position: relative; -} -.ie7 .controls .info-block, -.ie7 .controls .info-inline { - position: absolute; - top: 0; - right: 0; -} -.ie7 .form-horizontal .controls { - margin-left: 0; -} -.ie7 .control-custom .checkbox { - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.ie7 .stages { - overflow: hidden; - background-color: #EDEDED; -} -.ie7 .stages li { - height: 30px; - width: 27.5%; -} -.ie7 .stages li button, -.ie7 .stages li span { - display: block; - height: 30px; - padding-left: 20px; -} -.ie7 .stages li button { - height: 50px; -} -.ie7 .stages li .highlight { - width: auto; -} -.ie7 .account-masthead .account a i { - line-height: 31px; -} -.ie7 .masthead { - position: relative; - z-index: 1; -} -.ie7 .masthead .logo img, -.ie7 .masthead nav { - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.ie7 .masthead .header-image { - display: block; -} -.ie7 .masthead .account .dropdown-menu { - z-index: 10000; -} -.ie7 .module-narrow .nav-item.image { - *zoom: 1; -} -.ie7 .module-narrow .nav-item.image:before, -.ie7 .module-narrow .nav-item.image:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .module-narrow .nav-item.image:after { - clear: both; -} -.ie7 .nav-facet .nav-item.active a { - content: 'x'; -} -.ie7 .toolbar .breadcrumb li { - padding-right: 10px; - margin-right: 5px; - background: transparent url("../../../base/images/breadcrumb-slash-ie7.png") 100% 50% no-repeat; -} -.ie7 .toolbar .breadcrumb li.active { - background-image: none; -} -.ie7 .module-heading { - *zoom: 1; - position: relative; -} -.ie7 .module-heading:before, -.ie7 .module-heading:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .module-heading:after { - clear: both; -} -.ie7 .module-heading .media-content { - position: relative; -} -.ie7 .module-heading .media-image img { - float: left; -} -.ie7 .group-listing { - position: relative; - zoom: 1; -} -.ie7 .resource-item { - position: static; - padding-bottom: 1px; -} -.ie7 .resource-item .heading { - position: relative; -} -.ie7 .resource-item .format-label { - left: -48px; -} -.ie7 .resource-item .btn-group { - position: relative; - float: right; - top: -35px; - right: 0; -} -.ie7 .media-overlay .media-heading { - background-color: #000; -} diff --git a/ckan/public-bs2/base/css/main.css b/ckan/public-bs2/base/css/main.css deleted file mode 100644 index 8c5601d4c70..00000000000 --- a/ckan/public-bs2/base/css/main.css +++ /dev/null @@ -1,9520 +0,0 @@ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -a:hover, -a:active { - outline: 0; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - /* Responsive images (ensure images don't scale beyond their parents) */ - max-width: 100%; - /* Part 1: Set a maxium relative to the parent */ - width: auto\9; - /* IE7-8 need help adjusting responsive images */ - height: auto; - /* Part 2: Scale the height according to the width, otherwise you get stretching */ - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} -#map_canvas img, -.google-maps img { - max-width: none; -} -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} -button, -input { - *overflow: visible; - line-height: normal; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -textarea { - overflow: auto; - vertical-align: top; -} -@media print { - * { - text-shadow: none !important; - color: #000 !important; - 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) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.clearfix:after { - clear: both; -} -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -body { - margin: 0; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #444; - background-color: #eee; -} -a { - color: #187794; - text-decoration: none; -} -a:hover, -a:focus { - color: #0d4252; - text-decoration: underline; -} -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, -.row:after { - display: table; - content: ""; - line-height: 0; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.span12 { - width: 940px; -} -.span11 { - width: 860px; -} -.span10 { - width: 780px; -} -.span9 { - width: 700px; -} -.span8 { - width: 620px; -} -.span7 { - width: 540px; -} -.span6 { - width: 460px; -} -.span5 { - width: 380px; -} -.span4 { - width: 300px; -} -.span3 { - width: 220px; -} -.span2 { - width: 140px; -} -.span1 { - width: 60px; -} -.offset12 { - margin-left: 980px; -} -.offset11 { - margin-left: 900px; -} -.offset10 { - margin-left: 820px; -} -.offset9 { - margin-left: 740px; -} -.offset8 { - margin-left: 660px; -} -.offset7 { - margin-left: 580px; -} -.offset6 { - margin-left: 500px; -} -.offset5 { - margin-left: 420px; -} -.offset4 { - margin-left: 340px; -} -.offset3 { - margin-left: 260px; -} -.offset2 { - margin-left: 180px; -} -.offset1 { - margin-left: 100px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.row-fluid:after { - clear: both; -} -.row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.12765957%; - *margin-left: 2.07446809%; -} -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.12765957%; -} -.row-fluid .span12 { - width: 100%; - *width: 99.94680851%; -} -.row-fluid .span11 { - width: 91.4893617%; - *width: 91.43617021%; -} -.row-fluid .span10 { - width: 82.9787234%; - *width: 82.92553191%; -} -.row-fluid .span9 { - width: 74.46808511%; - *width: 74.41489362%; -} -.row-fluid .span8 { - width: 65.95744681%; - *width: 65.90425532%; -} -.row-fluid .span7 { - width: 57.44680851%; - *width: 57.39361702%; -} -.row-fluid .span6 { - width: 48.93617021%; - *width: 48.88297872%; -} -.row-fluid .span5 { - width: 40.42553191%; - *width: 40.37234043%; -} -.row-fluid .span4 { - width: 31.91489362%; - *width: 31.86170213%; -} -.row-fluid .span3 { - width: 23.40425532%; - *width: 23.35106383%; -} -.row-fluid .span2 { - width: 14.89361702%; - *width: 14.84042553%; -} -.row-fluid .span1 { - width: 6.38297872%; - *width: 6.32978723%; -} -.row-fluid .offset12 { - margin-left: 104.25531915%; - *margin-left: 104.14893617%; -} -.row-fluid .offset12:first-child { - margin-left: 102.12765957%; - *margin-left: 102.0212766%; -} -.row-fluid .offset11 { - margin-left: 95.74468085%; - *margin-left: 95.63829787%; -} -.row-fluid .offset11:first-child { - margin-left: 93.61702128%; - *margin-left: 93.5106383%; -} -.row-fluid .offset10 { - margin-left: 87.23404255%; - *margin-left: 87.12765957%; -} -.row-fluid .offset10:first-child { - margin-left: 85.10638298%; - *margin-left: 85%; -} -.row-fluid .offset9 { - margin-left: 78.72340426%; - *margin-left: 78.61702128%; -} -.row-fluid .offset9:first-child { - margin-left: 76.59574468%; - *margin-left: 76.4893617%; -} -.row-fluid .offset8 { - margin-left: 70.21276596%; - *margin-left: 70.10638298%; -} -.row-fluid .offset8:first-child { - margin-left: 68.08510638%; - *margin-left: 67.9787234%; -} -.row-fluid .offset7 { - margin-left: 61.70212766%; - *margin-left: 61.59574468%; -} -.row-fluid .offset7:first-child { - margin-left: 59.57446809%; - *margin-left: 59.46808511%; -} -.row-fluid .offset6 { - margin-left: 53.19148936%; - *margin-left: 53.08510638%; -} -.row-fluid .offset6:first-child { - margin-left: 51.06382979%; - *margin-left: 50.95744681%; -} -.row-fluid .offset5 { - margin-left: 44.68085106%; - *margin-left: 44.57446809%; -} -.row-fluid .offset5:first-child { - margin-left: 42.55319149%; - *margin-left: 42.44680851%; -} -.row-fluid .offset4 { - margin-left: 36.17021277%; - *margin-left: 36.06382979%; -} -.row-fluid .offset4:first-child { - margin-left: 34.04255319%; - *margin-left: 33.93617021%; -} -.row-fluid .offset3 { - margin-left: 27.65957447%; - *margin-left: 27.55319149%; -} -.row-fluid .offset3:first-child { - margin-left: 25.53191489%; - *margin-left: 25.42553191%; -} -.row-fluid .offset2 { - margin-left: 19.14893617%; - *margin-left: 19.04255319%; -} -.row-fluid .offset2:first-child { - margin-left: 17.0212766%; - *margin-left: 16.91489362%; -} -.row-fluid .offset1 { - margin-left: 10.63829787%; - *margin-left: 10.53191489%; -} -.row-fluid .offset1:first-child { - margin-left: 8.5106383%; - *margin-left: 8.40425532%; -} -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} -.container:before, -.container:after { - display: table; - content: ""; - line-height: 0; -} -.container:after { - clear: both; -} -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.container-fluid:after { - clear: both; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} -small { - font-size: 85%; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -cite { - font-style: normal; -} -.muted { - color: #999; -} -a.muted:hover, -a.muted:focus { - color: #808080; -} -.text-warning { - color: #c09853; -} -a.text-warning:hover, -a.text-warning:focus { - color: #a47e3c; -} -.text-error { - color: #b55457; -} -a.text-error:hover, -a.text-error:focus { - color: #954143; -} -.text-info { - color: #3a87ad; -} -a.text-info:hover, -a.text-info:focus { - color: #2d6987; -} -.text-success { - color: #468847; -} -a.text-success:hover, -a.text-success:focus { - color: #356635; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999; -} -h1, -h2, -h3 { - line-height: 40px; -} -h1 { - font-size: 38.5px; -} -h2 { - font-size: 31.5px; -} -h3 { - font-size: 24.5px; -} -h4 { - font-size: 17.5px; -} -h5 { - font-size: 14px; -} -h6 { - font-size: 11.9px; -} -h1 small { - font-size: 24.5px; -} -h2 small { - font-size: 17.5px; -} -h3 small { - font-size: 14px; -} -h4 small { - font-size: 14px; -} -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eee; -} -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -li { - line-height: 20px; -} -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding-left: 5px; - padding-right: 5px; -} -dl { - margin-bottom: 20px; -} -dt, -dd { - line-height: 20px; -} -dt { - font-weight: bold; -} -dd { - margin-left: 10px; -} -.dl-horizontal { - *zoom: 1; -} -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - content: ""; - line-height: 0; -} -.dl-horizontal:after { - clear: both; -} -.dl-horizontal dt { - float: left; - width: 160px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.dl-horizontal dd { - margin-left: 180px; -} -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eee; - border-bottom: 1px solid #fff; -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999; -} -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eee; -} -blockquote p { - margin-bottom: 0; - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} -blockquote small { - display: block; - line-height: 20px; - color: #999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eee; - border-left: 0; -} -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} -blockquote.pull-right small:before { - content: ''; -} -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; - white-space: nowrap; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -pre.prettyprint { - margin-bottom: 20px; -} -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -form { - margin: 0 0 20px; -} -fieldset { - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -legend small { - font-size: 15px; - color: #999; -} -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} -input, -button, -select, -textarea { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} -label { - display: block; - margin-bottom: 5px; -} -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"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - vertical-align: middle; -} -input, -textarea, -.uneditable-input { - width: 206px; -} -textarea { - height: auto; -} -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"], -.uneditable-input { - background-color: #fff; - border: 1px solid #ccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear .2s, box-shadow linear .2s; - -moz-transition: border linear .2s, box-shadow linear .2s; - -o-transition: border linear .2s, box-shadow linear .2s; - transition: border linear .2s, box-shadow linear .2s; -} -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - *margin-top: 0; - /* IE7 */ - margin-top: 1px \9; - /* IE8-9 */ - line-height: normal; -} -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} -select, -input[type="file"] { - height: 30px; - /* 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: 30px; -} -select { - width: 220px; - border: 1px solid #ccc; - background-color: #fff; -} -select[multiple], -select[size] { - height: auto; -} -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.uneditable-input, -.uneditable-textarea { - color: #999; - background-color: #fcfcfc; - border-color: #ccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} -.uneditable-textarea { - width: auto; - height: auto; -} -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999; -} -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999; -} -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999; -} -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} -input, -textarea, -.uneditable-input { - margin-left: 0; -} -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} -.controls-row { - *zoom: 1; -} -.controls-row:before, -.controls-row:after { - display: table; - content: ""; - line-height: 0; -} -.controls-row:after { - clear: both; -} -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eee; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b55457; -} -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b55457; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b55457; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #954143; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; -} -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b55457; - background-color: #f8f0f0; - border-color: #b55457; -} -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} -.form-actions:before, -.form-actions:after { - display: table; - content: ""; - line-height: 0; -} -.form-actions:after { - clear: both; -} -.help-block, -.help-inline { - color: #6a6a6a; -} -.help-block { - display: block; - margin-bottom: 10px; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - vertical-align: middle; - padding-left: 5px; -} -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - vertical-align: middle; - font-size: 0; - white-space: nowrap; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 14px; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #fff; - background-color: #eee; - border: 1px solid #ccc; -} -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -/* Allow for input prepend/append in search forms */ -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} -.control-group { - margin-bottom: 10px; -} -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; - line-height: 0; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} -.form-horizontal .controls:first-child { - *padding-left: 180px; -} -.form-horizontal .help-block { - margin-bottom: 0; -} -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} -.form-horizontal .form-actions { - padding-left: 180px; -} -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} -.table { - width: 100%; - margin-bottom: 20px; -} -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table th { - font-weight: bold; -} -.table thead th { - vertical-align: bottom; -} -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #eee; -} -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #ddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.table-bordered th, -.table-bordered td { - border-left: 1px solid #ddd; -} -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; -} -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; -} -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; - border-bottom-left-radius: 0; -} -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; - border-bottom-right-radius: 0; -} -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; -} -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: #f5f5f5; -} -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} -.table tbody tr.success > td { - background-color: #dff0d8; -} -.table tbody tr.error > td { - background-color: #f8f0f0; -} -.table tbody tr.warning > td { - background-color: #fcf8e3; -} -.table tbody tr.info > td { - background-color: #d9edf7; -} -.table-hover tbody tr.success:hover > td { - background-color: #d0e9c6; -} -.table-hover tbody tr.error:hover > td { - background-color: #f0dfe0; -} -.table-hover tbody tr.warning:hover > td { - background-color: #faf2cc; -} -.table-hover tbody tr.info:hover > td { - background-color: #c4e3f3; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle { - *margin-bottom: -3px; -} -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - text-decoration: none; - color: #fff; - background-color: #17708b; - background-image: -moz-linear-gradient(top, #187794, #14657e); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#187794), to(#14657e)); - background-image: -webkit-linear-gradient(top, #187794, #14657e); - background-image: -o-linear-gradient(top, #187794, #14657e); - background-image: linear-gradient(to bottom, #187794, #14657e); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff187794', endColorstr='#ff14657e', GradientType=0); -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - outline: 0; - background-color: #17708b; - background-image: -moz-linear-gradient(top, #187794, #14657e); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#187794), to(#14657e)); - background-image: -webkit-linear-gradient(top, #187794, #14657e); - background-image: -o-linear-gradient(top, #187794, #14657e); - background-image: linear-gradient(to bottom, #187794, #14657e); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff187794', endColorstr='#ff14657e', GradientType=0); -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - cursor: default; -} -.open { - *z-index: 1000; -} -.open > .dropdown-menu { - display: block; -} -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000; - content: ""; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -.dropdown-submenu { - position: relative; -} -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} -.dropdown-submenu > a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #cccccc; - margin-top: 5px; - margin-right: -10px; -} -.dropdown-submenu:hover > a:after { - border-left-color: #fff; -} -.dropdown-submenu.pull-left { - float: none; -} -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} -.dropdown .dropdown-menu .nav-header { - padding-left: 20px; - padding-right: 20px; -} -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.btn { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding: 4px 12px; - margin-bottom: 0; - font-size: 14px; - line-height: 20px; - text-align: center; - vertical-align: middle; - cursor: pointer; - color: #333; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #ffffff, #eaeaea); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#eaeaea)); - background-image: -webkit-linear-gradient(top, #ffffff, #eaeaea); - background-image: -o-linear-gradient(top, #ffffff, #eaeaea); - background-image: linear-gradient(to bottom, #ffffff, #eaeaea); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeaeaea', GradientType=0); - border-color: #eaeaea #eaeaea #c4c4c4; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #eaeaea; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - border: 1px solid #ccc; - *border: 0; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *margin-left: .3em; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); -} -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333; - background-color: #eaeaea; - *background-color: #dddddd; -} -.btn:active, -.btn.active { - background-color: #d1d1d1 \9; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; - padding-left: 0; - padding-right: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} -.btn-primary { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #206b82; - background-image: -moz-linear-gradient(top, #30778d, #085871); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#30778d), to(#085871)); - background-image: -webkit-linear-gradient(top, #30778d, #085871); - background-image: -o-linear-gradient(top, #30778d, #085871); - background-image: linear-gradient(to bottom, #30778d, #085871); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff30778d', endColorstr='#ff085871', GradientType=0); - border-color: #085871 #085871 #03202a; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #085871; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #fff; - background-color: #085871; - *background-color: #064559; -} -.btn-primary:active, -.btn-primary.active { - background-color: #053341 \9; -} -.btn-warning { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #f89406; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #fff; - background-color: #f89406; - *background-color: #df8505; -} -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #bd362f; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #fff; - background-color: #bd362f; - *background-color: #a9302a; -} -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #51a351; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #fff; - background-color: #51a351; - *background-color: #499249; -} -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} -.btn-info { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #2f96b4; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #fff; - background-color: #2f96b4; - *background-color: #2a85a0; -} -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} -.btn-inverse { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - background-image: -moz-linear-gradient(top, #444, #222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444), to(#222)); - background-image: -webkit-linear-gradient(top, #444, #222); - background-image: -o-linear-gradient(top, #444, #222); - background-image: linear-gradient(to bottom, #444, #222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - border-color: #222 #222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #222; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #fff; - background-color: #222; - *background-color: #151515; -} -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-link { - border-color: transparent; - cursor: pointer; - color: #187794; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-link:hover, -.btn-link:focus { - color: #0d4252; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #333; - text-decoration: none; -} -.btn-group { - position: relative; - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - font-size: 0; - vertical-align: middle; - white-space: nowrap; - *margin-left: .3em; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - margin-left: 5px; -} -.btn-toolbar { - font-size: 0; - margin-top: 10px; - margin-bottom: 10px; -} -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group > .btn + .btn { - margin-left: -1px; -} -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} -.btn-group > .btn-mini { - font-size: 10.5px; -} -.btn-group > .btn-small { - font-size: 11.9px; -} -.btn-group > .btn-large { - font-size: 17.5px; -} -.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; -} -.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; -} -.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; -} -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-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); - -moz-box-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); - box-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); - *padding-top: 5px; - *padding-bottom: 5px; -} -.btn-group > .btn-mini + .dropdown-toggle { - padding-left: 5px; - padding-right: 5px; - *padding-top: 2px; - *padding-bottom: 2px; -} -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} -.btn-group > .btn-large + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; - *padding-top: 7px; - *padding-bottom: 7px; -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn-group.open .btn.dropdown-toggle { - background-color: #eaeaea; -} -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #085871; -} -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222; -} -.btn .caret { - margin-top: 8px; - margin-left: 0; -} -.btn-large .caret { - margin-top: 6px; -} -.btn-large .caret { - border-left-width: 5px; - border-right-width: 5px; - border-top-width: 5px; -} -.btn-mini .caret, -.btn-small .caret { - margin-top: 8px; -} -.dropup .btn-large .caret { - border-bottom-width: 5px; -} -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group-vertical > .btn + .btn { - margin-left: 0; - margin-top: -1px; -} -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.alert, -.alert h4 { - color: #c09853; -} -.alert h4 { - margin: 0; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #468847; -} -.alert-success h4 { - color: #468847; -} -.alert-danger, -.alert-error { - background-color: #f8f0f0; - border-color: #c6898b; - color: #b55457; -} -.alert-danger h4, -.alert-error h4 { - color: #b55457; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #3a87ad; -} -.alert-info h4 { - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 20px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li > a > img { - max-width: none; -} -.nav > .pull-right { - float: right; -} -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} -.nav li + .nav-header { - margin-top: 9px; -} -.nav-list { - padding-left: 15px; - padding-right: 15px; - 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, 0.5); -} -.nav-list > li > a { - padding: 3px 15px; -} -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #187794; -} -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.nav-tabs, -.nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; - line-height: 0; -} -.nav-tabs:after, -.nav-pills:after { - clear: both; -} -.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; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - margin-bottom: -1px; -} -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - border-color: #eee #eee #ddd; -} -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #555; - background-color: #eee; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #fff; - background-color: #187794; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.nav .dropdown-toggle .caret { - border-top-color: #187794; - border-bottom-color: #187794; - margin-top: 6px; -} -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #0d4252; - border-bottom-color: #0d4252; -} -/* move down carets for tabs */ -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #fff; - background-color: #999; - border-color: #999; -} -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #fff; - border-bottom-color: #fff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, -.tabbable:after { - display: table; - content: ""; - line-height: 0; -} -.tabbable:after { - clear: both; -} -.tab-content { - overflow: auto; -} -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} -.tab-content > .active, -.pill-content > .active { - display: block; -} -.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 { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} -.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-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #eee #ddd #eee #eee; -} -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #fff; -} -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #eee #eee #eee #ddd; -} -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #fff; -} -.nav > .disabled > a { - color: #999; -} -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - cursor: default; -} -.navbar { - overflow: visible; - margin-bottom: 20px; - *position: relative; - *z-index: 2; -} -.navbar-inner { - min-height: 40px; - padding-left: 20px; - padding-right: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - *zoom: 1; -} -.navbar-inner:before, -.navbar-inner:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-inner:after { - clear: both; -} -.navbar .container { - width: auto; -} -.nav-collapse.collapse { - height: auto; - overflow: visible; -} -.navbar .brand { - float: left; - display: block; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777; -} -.navbar-link { - color: #777; -} -.navbar-link:hover, -.navbar-link:focus { - color: #333; -} -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-left: 1px solid #f2f2f2; - border-right: 1px solid #ffffff; -} -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} -.navbar-search .search-query { - margin-bottom: 0; - padding: 4px 14px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.navbar-static-top { - position: static; - margin-bottom: 0; -} -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-left: 0; - padding-right: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; - width: 100%; - *width: 99.94680851%; - width: 926px; -} -.navbar-fixed-top { - top: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1); - -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1); - box-shadow: 0 1px 10px rgba(0,0,0,.1); -} -.navbar-fixed-bottom { - bottom: 0; -} -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1); - -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1); - box-shadow: 0 -1px 10px rgba(0,0,0,.1); -} -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} -.navbar .nav > li { - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - background-color: transparent; - color: #333; - text-decoration: none; -} -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #e5e5e5; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); -} -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #fff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.navbar .nav > li > .dropdown-menu: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, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .nav > li > .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - border-top: 7px solid #ccc; - border-top-color: rgba(0, 0, 0, 0.2); - border-bottom: 0; - bottom: -7px; - top: auto; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - border-top: 6px solid #fff; - border-bottom: 0; - bottom: -6px; - top: auto; -} -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #333; - border-bottom-color: #333; -} -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #e5e5e5; - color: #555; -} -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777; - border-bottom-color: #777; -} -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - left: auto; - right: 0; -} -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - left: auto; - right: 12px; -} -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - left: auto; - right: 13px; -} -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - left: auto; - right: 100%; - margin-left: 0; - margin-right: -1px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); - border-color: #252525; -} -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #fff; -} -.navbar-inverse .brand { - color: #999; -} -.navbar-inverse .navbar-text { - color: #999; -} -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - background-color: transparent; - color: #fff; -} -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #fff; - background-color: #111111; -} -.navbar-inverse .navbar-link { - color: #999; -} -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #fff; -} -.navbar-inverse .divider-vertical { - border-left-color: #111111; - border-right-color: #222222; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #111111; - color: #fff; -} -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999; - border-bottom-color: #999; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .navbar-search .search-query { - color: #fff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333; - text-shadow: 0 1px 0 #fff; - background-color: #fff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-inverse .btn-navbar { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #040404; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #fff; - background-color: #040404; - *background-color: #000000; -} -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - text-shadow: 0 1px 0 #fff; -} -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} -.breadcrumb > .active { - color: #999; -} -.pagination { - margin: 20px 0; -} -.pagination ul { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-left: 0; - margin-bottom: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} -.pagination ul > li { - display: inline; -} -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; - border-left-width: 0; -} -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999; - cursor: default; -} -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #999; - background-color: transparent; - cursor: default; -} -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -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; -} -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -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; -} -.pagination-centered { - text-align: center; -} -.pagination-right { - text-align: right; -} -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -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; -} -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -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; -} -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-top-left-radius: 3px; - -moz-border-radius-topleft: 3px; - border-top-left-radius: 3px; - -webkit-border-bottom-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - border-bottom-left-radius: 3px; -} -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - -moz-border-radius-topright: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - -moz-border-radius-bottomright: 3px; - border-bottom-right-radius: 3px; -} -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} -.pager { - margin: 20px 0; - list-style: none; - text-align: center; - *zoom: 1; -} -.pager:before, -.pager:after { - display: table; - content: ""; - line-height: 0; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #f5f5f5; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999; - background-color: #fff; - cursor: default; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #fff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; - outline: none; -} -.modal.fade { - -webkit-transition: opacity .3s linear, top .3s ease-out; - -moz-transition: opacity .3s linear, top .3s ease-out; - -o-transition: opacity .3s linear, top .3s ease-out; - transition: opacity .3s linear, top .3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 10%; -} -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} -.modal-header .close { - margin-top: 2px; -} -.modal-header h3 { - margin: 0; - line-height: 30px; -} -.modal-body { - position: relative; - overflow-y: auto; - max-height: 400px; - padding: 15px; -} -.modal-form { - margin-bottom: 0; -} -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #fff; - -moz-box-shadow: inset 0 1px 0 #fff; - box-shadow: inset 0 1px 0 #fff; - *zoom: 1; -} -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; - line-height: 0; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.tooltip { - position: absolute; - z-index: 1030; - display: block; - visibility: visible; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -3px; - padding: 5px 0; -} -.tooltip.right { - margin-left: 3px; - padding: 0 5px; -} -.tooltip.bottom { - margin-top: 3px; - padding: 5px 0; -} -.tooltip.left { - margin-left: -3px; - padding: 0 5px; -} -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; - line-height: 0; -} -.thumbnails:after { - clear: both; -} -.row-fluid .thumbnails { - margin-left: 0; -} -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #187794; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} -.thumbnail > img { - display: block; - max-width: 100%; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; - color: #555; -} -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #fff; - vertical-align: baseline; - white-space: nowrap; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #999; -} -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.badge { - padding-left: 9px; - padding-right: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} -.label:empty, -.badge:empty { - display: none; -} -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label-important, -.badge-important { - background-color: #b55457; -} -.label-important[href], -.badge-important[href] { - background-color: #954143; -} -.label-warning, -.badge-warning { - background-color: #f89406; -} -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} -.label-success, -.badge-success { - background-color: #468847; -} -.label-success[href], -.badge-success[href] { - background-color: #356635; -} -.label-info, -.badge-info { - background-color: #3a87ad; -} -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} -.label-inverse, -.badge-inverse { - background-color: #333; -} -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} -.btn-mini .label, -.btn-mini .badge { - top: 0; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 100%; - color: #fff; - float: left; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); -} -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.accordion { - margin-bottom: 20px; -} -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.accordion-heading { - border-bottom: 0; -} -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} -.accordion-toggle { - cursor: pointer; -} -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} -.carousel-inner { - overflow: hidden; - width: 100%; - position: relative; -} -.carousel-inner > .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.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: #fff; - text-align: center; - background: #222; - border: 3px solid #fff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.carousel-control.right { - left: auto; - right: 15px; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); - border-radius: 5px; -} -.carousel-indicators .active { - background-color: #fff; -} -.carousel-caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 15px; - background: #333; - background: rgba(0, 0, 0, 0.75); -} -.carousel-caption h4, -.carousel-caption p { - color: #fff; - line-height: 20px; -} -.carousel-caption h4 { - margin: 0 0 5px; -} -.carousel-caption p { - margin-bottom: 0; -} -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - color: inherit; - letter-spacing: -1px; -} -.hero-unit li { - line-height: 30px; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - background-color: #fff; - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - white-space: normal; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.popover-title:empty { - display: none; -} -.popover-content { - padding: 9px 14px; -} -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover .arrow { - border-width: 11px; -} -.popover .arrow:after { - border-width: 10px; - content: ""; -} -.popover.top .arrow { - left: 50%; - margin-left: -11px; - border-bottom-width: 0; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - bottom: -11px; -} -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-bottom-width: 0; - border-top-color: #fff; -} -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-left-width: 0; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); -} -.popover.right .arrow:after { - left: 1px; - bottom: -10px; - border-left-width: 0; - border-right-color: #fff; -} -.popover.bottom .arrow { - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - top: -11px; -} -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); -} -.popover.left .arrow:after { - right: 1px; - border-right-width: 0; - border-left-color: #fff; - bottom: -10px; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} -.affix { - position: fixed; -} -/*! - * Bootstrap Responsive v2.3.2 - * - * 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. - */ -@-ms-viewport { - width: device-width; -} -.hidden { - display: none; - visibility: hidden; -} -.visible-phone { - display: none !important; -} -.visible-tablet { - display: none !important; -} -.hidden-desktop { - display: none !important; -} -.visible-desktop { - display: inherit !important; -} -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - line-height: 0; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - line-height: 0; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.76243094%; - *margin-left: 2.70923945%; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.76243094%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851%; - } - .row-fluid .span11 { - width: 91.43646409%; - *width: 91.3832726%; - } - .row-fluid .span10 { - width: 82.87292818%; - *width: 82.81973669%; - } - .row-fluid .span9 { - width: 74.30939227%; - *width: 74.25620078%; - } - .row-fluid .span8 { - width: 65.74585635%; - *width: 65.69266486%; - } - .row-fluid .span7 { - width: 57.18232044%; - *width: 57.12912895%; - } - .row-fluid .span6 { - width: 48.61878453%; - *width: 48.56559304%; - } - .row-fluid .span5 { - width: 40.05524862%; - *width: 40.00205713%; - } - .row-fluid .span4 { - width: 31.49171271%; - *width: 31.43852122%; - } - .row-fluid .span3 { - width: 22.9281768%; - *width: 22.87498531%; - } - .row-fluid .span2 { - width: 14.36464088%; - *width: 14.31144939%; - } - .row-fluid .span1 { - width: 5.80110497%; - *width: 5.74791348%; - } - .row-fluid .offset12 { - margin-left: 105.52486188%; - *margin-left: 105.4184789%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243094%; - *margin-left: 102.65604796%; - } - .row-fluid .offset11 { - margin-left: 96.96132597%; - *margin-left: 96.85494299%; - } - .row-fluid .offset11:first-child { - margin-left: 94.19889503%; - *margin-left: 94.09251205%; - } - .row-fluid .offset10 { - margin-left: 88.39779006%; - *margin-left: 88.29140708%; - } - .row-fluid .offset10:first-child { - margin-left: 85.63535912%; - *margin-left: 85.52897614%; - } - .row-fluid .offset9 { - margin-left: 79.83425414%; - *margin-left: 79.72787116%; - } - .row-fluid .offset9:first-child { - margin-left: 77.0718232%; - *margin-left: 76.96544023%; - } - .row-fluid .offset8 { - margin-left: 71.27071823%; - *margin-left: 71.16433525%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729%; - *margin-left: 68.40190431%; - } - .row-fluid .offset7 { - margin-left: 62.70718232%; - *margin-left: 62.60079934%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138%; - *margin-left: 59.8383684%; - } - .row-fluid .offset6 { - margin-left: 54.14364641%; - *margin-left: 54.03726343%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121547%; - *margin-left: 51.27483249%; - } - .row-fluid .offset5 { - margin-left: 45.5801105%; - *margin-left: 45.47372752%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767956%; - *margin-left: 42.71129658%; - } - .row-fluid .offset4 { - margin-left: 37.01657459%; - *margin-left: 36.91019161%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414365%; - *margin-left: 34.14776067%; - } - .row-fluid .offset3 { - margin-left: 28.45303867%; - *margin-left: 28.3466557%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773%; - *margin-left: 25.58422476%; - } - .row-fluid .offset2 { - margin-left: 19.88950276%; - *margin-left: 19.78311978%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182%; - *margin-left: 17.02068884%; - } - .row-fluid .offset1 { - margin-left: 11.32596685%; - *margin-left: 11.21958387%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591%; - *margin-left: 8.45715293%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} -@media (max-width: 767px) { - body { - padding-left: 20px; - padding-right: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-left: -20px; - margin-right: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - clear: none; - width: auto; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - float: none; - display: block; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - left: 20px; - right: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-left: 10px; - padding-right: 10px; - } - .media .pull-left, - .media .pull-right { - float: none; - display: block; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - left: 10px; - right: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-left: 10px; - padding-right: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .nav > li > a:focus, - .nav-collapse .dropdown-menu a:hover, - .nav-collapse .dropdown-menu a:focus { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .nav > li > a:focus, - .navbar-inverse .nav-collapse .dropdown-menu a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:focus { - background-color: #111111; - } - .nav-collapse.in .btn-group { - margin-top: 5px; - padding: 0; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - float: none; - display: none; - max-width: none; - margin: 0 15px; - padding: 0; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - overflow: hidden; - height: 0; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-left: 10px; - padding-right: 10px; - } -} -@media (min-width: 979px + 1) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} -.break-word { - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.tag { - display: inline-block; - margin-bottom: 4px; - color: #111; - background-color: #f6f6f6; - padding: 1px 10px; - border: 1px solid #dddddd; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} -a.tag:hover { - text-decoration: none; - color: #fff; - background-color: #30778d; - border: 1px solid #235767; - -webkit-box-shadow: inset 0 1px 0 #3d97b3; - -moz-box-shadow: inset 0 1px 0 #3d97b3; - box-shadow: inset 0 1px 0 #3d97b3; -} -.pill { - display: inline-block; - background-color: #6f8890; - color: #FFF; - padding: 2px 10px 1px 10px; - margin-right: 5px; - font-weight: normal; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.pill a { - color: #FFF; -} -.pill a.remove { - font-size: 11px; -} -.unstyled { - margin: 0; - list-style: none; -} -.simple-item { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.simple-item:last-of-type { - border-bottom: 0; -} -.simple-list { - *zoom: 1; - margin: 0; - list-style: none; -} -.simple-list:before, -.simple-list:after { - display: table; - content: ""; - line-height: 0; -} -.simple-list:after { - clear: both; -} -.simple-list > li { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.simple-list > li:last-of-type { - border-bottom: 0; -} -.simple-list .ckan-icon { - position: relative; - top: 0px; -} -.module-narrow .simple-list > li { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.listing li { - text-align: right; - margin-bottom: 5px; -} -.listing .key { - clear: right; - font-weight: bold; -} -.js .tab-content { - display: none; -} -.js .tab-content.active { - display: block; -} -.box { - background-color: #FFF; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); -} -.module { - margin: 20px 0; -} -.module-heading { - *zoom: 1; - margin: 0; - padding: 7px 25px; - font-size: 14px; - line-height: 1.3; - background-color: #f6f6f6; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; -} -.module-heading:before, -.module-heading:after { - display: table; - content: ""; - line-height: 0; -} -.module-heading:after { - clear: both; -} -.module-content { - padding: 0 25px; - margin: 20px 0; -} -@media (min-width: 768px) { - .span9 div.module-content { - padding-left: 10px; - } -} -.module-content:first-child { - margin-top: 0; - padding-top: 20px; -} -.module-content:last-child { - margin-bottom: 0; - padding-bottom: 20px; -} -.module-content > :last-child { - margin-bottom: 0; -} -.module:first-child .module-heading { - -webkit-border-radius: 3px 0 0 0; - -moz-border-radius: 3px 0 0 0; - border-radius: 3px 0 0 0; - border-top-width: 0; -} -.module:last-child { - margin-bottom: 20px; -} -.module-footer { - padding: 7px 25px 7px; - margin: 0; - border-top: 1px dotted #ddd; -} -.module .read-more { - font-weight: bold; - color: #000; -} -.module-content .pagination { - margin-left: -25px; - margin-right: -25px; - margin-bottom: -20px; -} -.module .pagination > ul { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - border: 0; -} -.module .pagination li a { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - padding-top: 7px; - padding-bottom: 7px; -} -.module .pagination li:first-child a, -.module .pagination li:last-child a { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.module-content-shallow { - padding: 0; - margin-top: 10px; - padding-bottom: 10px; -} -.module h1 { - margin-bottom: 20px; -} -.module-shallow .module-content { - padding: 10px; - margin: 0; -} -.module-shallow .module-tags { - margin-top: 0; - margin-bottom: 0; -} -.module-shallow .module-content:first-child { - padding-top: 10px; -} -.module-shallow .module-content:last-child { - padding-bottom: 10px; -} -.module-narrow .module-heading, -.module-narrow .module-content, -.module-narrow .module-footer { - padding-left: 15px; - padding-right: 15px; -} -.module-grid { - margin: 0; - list-style: none; - *zoom: 1; - margin: 0 -25px; - padding-bottom: 15px; - background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; - border-width: 1px 0; -} -.module-grid:before, -.module-grid:after { - display: table; - content: ""; - line-height: 0; -} -.module-grid:after { - clear: both; -} -.module-item { - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - float: left; - margin-left: 20px; - width: 460px; - padding-top: 10px; - padding-bottom: 10px; - padding-right: 50px; - overflow: hidden; - position: relative; -} -.module-item span.count { - color: #999; -} -.module-item .media-image { - margin-bottom: 5px; -} -.module-item .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; -} -.module-item:hover { - z-index: 1; -} -.module-item:hover .media-edit { - opacity: 1; -} -.module-item.first { - clear: left; -} -.group .content img { - margin: 0 -5px 5px; - max-width: initial; -} -.group .content h3 { - font-size: 14px; - line-height: 1.3; -} -.group-listing { - margin-left: -20px; -} -.ckanext-datapreview { - position: relative; - clear: both; - padding-top: 15px; - margin-top: 0; -} -.ckanext-datapreview > iframe { - min-height: 650px; -} -.ckanext-datapreview > img { - max-height: 500px; - max-width: 100%; - overflow: hidden; -} -.package-info h4 { - margin-bottom: 10px; -} -.module-resource { - background-color: #fff; - border-bottom: 1px solid #ddd; - margin-top: 0; - margin-bottom: 0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.module-resource .actions { - position: relative; - float: right; - top: -10px; - right: -15px; -} -.module .module-tags { - padding-bottom: 8px; -} -.secondary .module:first-child, -.primary .module:first-child { - margin-top: 0; -} -.no-nav .module:last-child { - margin-top: 0; -} -.module-image { - float: left; - width: 50px; - height: 50px; - line-height: 50px; - text-align: center; - margin-right: 15px; -} -.module-image img { - max-width: 50px; - max-height: 50px; - vertical-align: middle; -} -.banner { - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - -webkit-transform-origin: center center; - -moz-transform-origin: center center; - -ms-transform-origin: center center; - -o-transform-origin: center center; - transform-origin: center center; - position: absolute; - top: 15px; - right: -35px; - width: 80px; - color: #fff; - background-color: #005d7a; - padding: 1px 20px; - font-size: 11px; - text-align: center; - text-transform: uppercase; -} -.media-grid { - margin: 0; - list-style: none; - *zoom: 1; - margin: 0 -25px; - padding-bottom: 15px; - background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; - border-width: 1px 0; -} -.media-grid:before, -.media-grid:after { - display: table; - content: ""; - line-height: 0; -} -.media-grid:after { - clear: both; -} -@media (min-width: 768px) { - .media-grid { - margin-left: -27px; - } - .module-content .wide .media-grid { - margin-left: -25px; - } -} -.media-item { - position: relative; - float: left; - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.media-item span.count { - color: #999; -} -.media-item .media-image { - margin-bottom: 5px; -} -.media-item .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; -} -.media-item:hover { - z-index: 1; -} -.media-item:hover .media-edit { - opacity: 1; -} -.media-view { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: 1px solid #ddd; - overflow: hidden; - -webkit-transition: all 0.2s ease-in; - -moz-transition: all 0.2s ease-in; - -o-transition: all 0.2s ease-in; - transition: all 0.2s ease-in; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.media-view:hover, -.media-view.hovered { - border-color: #005d7a; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); -} -.media-view:hover .banner, -.media-view.hovered .banner { - background-color: #005d7a; -} -.media-view span { - display: none; -} -.media-view .banner { - display: block; - background-color: #b7b7b7; - -webkit-transition: background-color 0.2s ease-in; - -moz-transition: background-color 0.2s ease-in; - -o-transition: background-color 0.2s ease-in; - transition: background-color 0.2s ease-in; -} -.media-image { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.media-heading { - font-size: 18px; - line-height: 1.3; - margin: 5px 0; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.media-overlay { - position: relative; - min-height: 35px; -} -.media-overlay .media-heading { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 12px 10px; - margin: 0; - background-color: #000; - background-color: rgba(0, 0, 0, 0.8); - font-size: 13px; - color: #fff; - z-index: 1; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.media-overlay .media-image { - float: none; - display: block; - margin-right: 0; -} -.media-item.is-expander .truncator-link { - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; - position: absolute; - z-index: 10; - left: 15px; - bottom: 15px; - opacity: 0; -} -.media-item.is-expander:hover { - padding-bottom: 35px; -} -.media-item.is-expander:hover .truncator-link { - opacity: 1; -} -.wide .media-item { - width: 186px; -} -.nav-simple, -.nav-aside { - *zoom: 1; - margin: 0; - list-style: none; - padding-bottom: 0; -} -.nav-simple:before, -.nav-aside:before, -.nav-simple:after, -.nav-aside:after { - display: table; - content: ""; - line-height: 0; -} -.nav-simple:after, -.nav-aside:after { - clear: both; -} -.nav-simple > li, -.nav-aside > li { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.nav-simple > li:last-of-type, -.nav-aside > li:last-of-type { - border-bottom: 0; -} -.nav-simple .ckan-icon, -.nav-aside .ckan-icon { - position: relative; - top: 0px; -} -.nav-aside { - border-top: 1px dotted #DDD; - border-bottom: 1px dotted #DDD; - margin-bottom: 15px; -} -.nav-item > a, -.nav-aside li a { - color: #333; - font-size: 14px; - line-height: 20px; - margin: -7px -25px; - padding: 7px 25px; -} -.nav-item.active, -.nav-aside li.active { - background-color: #f6f6f6; -} -.nav-item.active > a, -.nav-aside li.active a { - position: relative; - color: #FFF; - background-color: #8CA0A6; -} -.nav-item.active > a:hover, -.nav-aside li.active a:hover { - color: #FFF; - background-color: #8CA0A6; -} -@media (min-width: 768px) { - .nav-item.active > a:before, - .nav-aside li.active a:before { - content: ' '; - position: absolute; - top: 0; - right: -6px; - width: 6px; - height: 34px; - background-image: url("../../../base/images/nav-active.png?1"); - } -} -.nav-item.active > a span, -.nav-aside li.active a span { - white-space: nowrap; - overflow: hidden; - display: block; -} -.module-narrow .nav-item > a, -.module-narrow .nav-aside li a { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.module-narrow .nav-item.image, -.module-narrow .nav-aside li.image { - position: relative; -} -.module-narrow .nav-item.image > a, -.module-narrow .nav-aside li.image a { - padding-left: 42px; - padding-right: 42px; -} -.module-narrow .nav-item.image > img, -.module-narrow .nav-aside li.image img { - position: absolute; - top: 50%; - left: 15px; - width: 20px; - height: 20px; - margin-top: -10px; - z-index: 2; -} -.nav-facet .nav-item > a:hover:after, -.nav-facet .nav-item.active > a:after { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} -.nav-facet .nav-item > a:hover:after { - width: 17px; - height: 17px; - background-position: -17px -16px; -} -.nav-facet .nav-item.active > a:after { - width: 17px; - height: 17px; - background-position: 0px -16px; - right: 3px; -} -.user-list { - margin: 0; - list-style: none; -} -.user-list li { - margin: 0 0 10px 0; -} -.user-list .gravatar { - vertical-align: -4px; - margin-right: 3px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.nav-facet-tertiary { - margin: 10px 0; -} -.nav-facet-tertiary .module-heading { - margin-bottom: 5px; - padding: 8px 12px; - border-bottom-width: 0; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-facet-tertiary .module-heading i { - display: none; -} -.nav-facet-tertiary .module-footer { - padding: 8px 12px; - border-top-width: 0; -} -.nav-facet-tertiary .module-footer a { - font-weight: normal; - color: #8C8C8C; -} -.nav-facet-tertiary .nav { - margin-bottom: 0; -} -.nav-facet-tertiary .module-content.empty { - padding: 8px 12px; - margin-top: 0; -} -.nav-facet-tertiary .nav li.active { - position: relative; -} -.nav-facet-tertiary .nav li.active > a:hover:after, -.nav-facet-tertiary .nav li.active > a:after { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - width: 17px; - height: 17px; - background-position: 0px -16px; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} -.nav-simple > .nav-btn { - padding-left: 0; - padding-right: 0; - text-align: center; -} -.nav-simple > .nav-btn .btn { - display: inline-block; -} -.js .js-hide { - display: none; -} -.js .js-hide.active { - display: block; -} -.btn, -label { - font-weight: bold; -} -.btn-rounded { - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - padding-left: 15px; - padding-right: 15px; -} -label { - cursor: pointer; - font-size: 14px; -} -label:after { - content: ":"; -} -label.radio:after, -label.checkbox:after { - content: ""; -} -input[type=radio], -input[type=checkbox] { - position: relative; - top: 7px; - padding: 0; - margin: 0; -} -input[type=radio].checkbox-onown, -input[type=checkbox].checkbox-onown { - top: 0; -} -select { - padding: 4px; -} -textarea { - max-width: 100%; -} -.control-group .btn { - position: relative; - top: -2px; -} -.control-full input, -.control-full select, -.control-full textarea { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - height: auto; - width: 100%; -} -.control-medium input, -.control-medium select, -.control-medium textarea { - width: 320px; -} -@media (max-width: 768px) { - .control-medium input, - .control-medium select, - .control-medium textarea { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 28px; - } -} -.control-large input, -.control-large .control-label { - font-size: 17.5px; - line-height: 30px; -} -.control-large input { - height: 41px; -} -.control-required { - color: #c6898b; -} -.form-actions .control-required-message { - float: left; - margin-left: 20px; - margin-bottom: 0; - line-height: 30px; -} -.form-actions .control-required-message:first-child { - margin-left: 0; -} -.form-actions { - background: none; - margin-left: -25px; - margin-right: -25px; - margin-bottom: 0; - padding-bottom: 0; -} -@media (min-width: 768px) { - .form-actions { - text-align: right; - } -} -.form-actions .action-info { - line-height: 2; - text-align: left; - color: #707070; - margin: 0; -} -@media (min-width: 768px) { - .form-actions .action-info { - float: left; - width: 50%; - } -} -.form-actions .action-info.small { - font-size: 11px; - line-height: 1.2; -} -@media (max-width: 768px) { - .form-actions .btn { - margin-top: 5px; - } -} -.form-horizontal .control-label { - width: 120px; -} -@media (min-width: 768px) { - .form-horizontal .controls { - margin-left: 130px; - } -} -.form-horizontal .info-block { - position: relative; - display: block; - font-size: 11px; - color: #aaa; - line-height: 1.3; - margin-top: 6px; -} -.form-horizontal .info-help { - padding: 6px 0; -} -.form-horizontal .info-help:before { - display: none; -} -.form-horizontal .info-help-tight { - margin-top: -10px; -} -@media (min-width: 980px) { - .form-horizontal .info-block { - padding: 6px 0 6px 0; - } - .form-horizontal .info-inline { - float: right; - width: 265px; - margin-top: 0; - padding-bottom: 0; - } -} -.form-horizontal .control-medium .info-block.info-inline { - width: 165px; -} -.form-horizontal .info-block:before { - font-size: 2.2em; - position: absolute; - left: 0; - top: 2px; -} -.form-horizontal .info-inline:before { - top: 8px; -} -.info-block .icon-large, -.info-inline .icon-large { - float: left; - font-size: 22px; - margin-right: 15px; -} -.form-horizontal .info-block a { - color: #aaa; - text-decoration: underline; -} -.form-horizontal .form-actions { - padding-left: 25px; - padding-right: 25px; -} -.form-inline input { - padding-bottom: 9px; -} -.form-inline select { - margin-top: 0; -} -.form-inline .btn { - margin-left: 5px; -} -.form-narrow label { - margin-bottom: 0; -} -.form-narrow select { - width: 100%; -} -.form-narrow .form-actions { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px 0; -} -.form-select label { - margin-right: 5px; -} -.simple-input label, -.simple-input button { - display: none; -} -.simple-input .field { - position: relative; -} -.simple-input .field-bordered { - border-bottom: 1px dotted #ddd; -} -.simple-input .field input { - width: 100%; - height: auto; - margin: 0 -7px; - padding: 7px 5px; -} -.simple-input .field .btn-search { - position: absolute; - display: block; - height: 17px; - width: 17px; - padding: 0; - top: 50%; - right: 0; - margin-top: -10px; - background-color: transparent; - border: none; - color: #999; - -webkit-transition: color 0.2s ease-in; - -moz-transition: color 0.2s ease-in; - -o-transition: color 0.2s ease-in; - transition: color 0.2s ease-in; -} -.simple-input .field .btn-search:hover { - color: #000; -} -.editor textarea { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - border-bottom: none; -} -.editor .editor-info-block { - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - display: block; - float: none; - padding: 4px 10px; - background: #ebebeb; - width: auto; - border: 1px solid #ccc; - border-top: none; - font-size: 11px; - color: #282828; -} -.editor .editor-info-block a { - color: #187794; - text-decoration: none; -} -@media (max-width: 768px) { - [data-module="custom-fields"] .input-prepend .add-on { - display: block; - } -} -@media (max-width: 480px) { - [data-module="custom-fields"] .input-prepend { - width: 100%; - } - [data-module="custom-fields"] .control-custom input { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 28px; - } -} -.control-custom { - font-size: 0; -} -.control-custom label { - margin-bottom: 0; -} -.control-custom input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - width: 140px; -} -.control-custom input:last-of-type { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.control-custom .checkbox { - display: inline-block; - margin-left: 5px; -} -.control-custom .checkbox input { - width: auto; -} -.control-custom.disabled label, -.control-custom.disabled input { - color: #aaa; - text-decoration: line-through; - text-shadow: none; -} -.control-custom.disabled input { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - background-color: #f3f3f3; -} -.control-custom.disabled .checkbox { - color: #444; - text-decoration: none; -} -.control-custom .checkbox.btn { - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; - position: relative; - top: 0; - left: 5px; - height: 1px; - width: 9px; - padding: 3px 8px; - line-height: 18px; -} -.control-custom .checkbox.btn span { - display: none; - width: 30px; -} -.control-custom .checkbox.btn:before { - position: relative; - top: 1px; - left: -1px; - color: #fff; -} -.control-custom .checkbox.btn input { - display: none; -} -.control-custom.disabled .checkbox.btn { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #206b82; - background-image: -moz-linear-gradient(top, #30778d, #085871); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#30778d), to(#085871)); - background-image: -webkit-linear-gradient(top, #30778d, #085871); - background-image: -o-linear-gradient(top, #30778d, #085871); - background-image: linear-gradient(to bottom, #30778d, #085871); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff30778d', endColorstr='#ff085871', GradientType=0); - border-color: #085871 #085871 #03202a; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #085871; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.control-custom.disabled .checkbox.btn:hover, -.control-custom.disabled .checkbox.btn:focus, -.control-custom.disabled .checkbox.btn:active, -.control-custom.disabled .checkbox.btn.active, -.control-custom.disabled .checkbox.btn.disabled, -.control-custom.disabled .checkbox.btn[disabled] { - color: #fff; - background-color: #085871; - *background-color: #064559; -} -.control-custom.disabled .checkbox.btn:active, -.control-custom.disabled .checkbox.btn.active { - background-color: #053341 \9; -} -.control-custom.disabled .checkbox.btn .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.alert-danger a, -.alert-error a { - color: #b55457; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea, -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - border-color: #c6898b; -} -.error-inline { - color: #b55457; -} -.error-block, -.error-inline { - font-size: 12px; -} -.error-block { - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - display: block; - padding: 6px 8px 3px; - background: #c6898b; - margin: -3px 0 0; - color: #fff; - width: 208px; -} -.control-medium .error-block { - width: 318px; -} -.control-full .error-block { - width: auto; -} -.control-group.error .input-prepend .error-block, -.control-custom.error .error-block { - width: auto; -} -.control-custom.error .error-block { - width: 401px; -} -.control-select.error .error-block { - width: 196px; -} -.stages { - margin: 0; - list-style: none; - *zoom: 1; - color: #aeaeae; - counter-reset: stage; - margin: -20px -25px 20px; - overflow: hidden; -} -.stages:before, -.stages:after { - display: table; - content: ""; - line-height: 0; -} -.stages:after { - clear: both; -} -.stages li { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - line-height: 27px; - counter-increment: stage; - width: 50%; - background-color: #EDEDED; - float: left; - padding: 10px 20px; - position: relative; - z-index: 0; -} -.stages li:before { - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; - content: counter(stage); - display: inline-block; - width: 27px; - height: 27px; - margin-right: 5px; - font-weight: bold; - text-align: center; - color: #fff; - background-color: #aeaeae; - z-index: 1; -} -.stages li:after { - left: 0; - border: solid rgba(237, 237, 237, 0); - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-top-color: #EDEDED; - border-bottom-color: #EDEDED; - border-width: 29px; - top: 50%; - margin-top: -29px; - margin-left: -30px; -} -.stages li.last { - position: relative; - right: -1px; -} -.stages li.last, -.stages li.last .highlight { - -webkit-border-radius: 0 3px 0 0; - -moz-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0; -} -.stages li.first:after { - content: none; - border: none; -} -.stages li.active:after { - border-color: rgba(140, 198, 138, 0); - border-top-color: #8cc68a; - border-bottom-color: #8cc68a; -} -.stages li.complete:after { - border-color: rgba(197, 226, 196, 0); - border-top-color: #c5e2c4; - border-bottom-color: #c5e2c4; -} -.stages.stage-3 li.complete:first-child:after { - content: none; -} -.stages li.active, -.stages li.complete { - background: none; -} -.stages li.active:before { - color: #8cc68a; - background: #fff; -} -.stages li.complete:before { - color: #c5e2c4; - background: #eef6ed; -} -.stages li .highlight { - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - width: 100%; - padding: 10px 52px; - border: none; - text-align: left; - text-decoration: none; - line-height: 27px; - z-index: -1; -} -@media (max-width: 768px) { - .stages li .highlight { - text-indent: -9999px; - } -} -.stages li.active .highlight { - color: #fff; - background: #8cc68a; -} -.stages li.complete .highlight { - color: #eef6ed; - background: #c5e2c4; -} -.alert > :last-child { - margin-bottom: 0; -} -.slug-preview { - font-size: 14px; - line-height: 1.5; - margin-top: 5px; - margin-left: 10px; -} -.slug-preview-value { - background-color: #faedcf; - margin-right: 3px; -} -.resource-upload-field { - position: relative; - overflow: hidden; - display: inline-block; - vertical-align: bottom; -} -.resource-upload-field label { - z-index: 0; -} -.resource-upload-field input { - opacity: 0; - filter: alpha(opacity=0); - position: absolute; - top: 0; - right: 0; - z-index: 1; - margin: 0; - border: solid transparent; - border-width: 100px 0 0 200px; - cursor: pointer; - direction: ltr; - -moz-transform: translate(-300px, 0) scale(4); -} -.resource-upload-field.loading { - display: inline-block; - background: url("../../../base/images/loading-spinner.gif") no-repeat center right; - padding-right: 5px; -} -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - font-size: 14px; -} -.select2-container-multi .select2-choices .select2-search-field input { - height: 29px; -} -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - padding-left: 10px; -} -.select2-container { - margin-top: 1px; -} -.select2-container-multi { - margin-top: 0; -} -.select2-container-multi .select2-choices .select2-search-choice { - padding: 5px 8px 5px 22px; -} -.select2-container-multi.select2-container .select2-choices { - padding-top: 3px; - padding-bottom: 3px; -} -.select2-search-choice-close, -.select2-container-multi .select2-search-choice-close { - top: 6px; - left: 5px; -} -.select2-container-multi .select2-choices { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; - background-color: #fff; - border: 1px solid #ccc; -} -.select2-container-active .select2-choices, -.select2-container-multi.select2-container-active .select2-choices { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -.select2-container-multi .select2-drop { - margin-top: -2px; -} -.select2-container .select2-results li { - line-height: 18px; - padding-top: 4px; - padding-bottom: 4px; -} -.control-full .select2-container { - max-width: 100%; -} -.control-group.error .select2-container input:focus, -.control-group.error .select2-container select:focus, -.control-group.error .select2-container textarea:focus { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.js .image-upload #field-image-url { - padding-right: 90px; -} -.js .image-upload #field-image-upload { - cursor: pointer; - position: absolute; - z-index: 1; - opacity: 0; - filter: alpha(opacity=0); -} -.js .image-upload .controls { - position: relative; -} -.js .image-upload .btn { - position: relative; - top: 0; - margin-right: 10px; -} -.js .image-upload .btn.hover { - color: #333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.js .image-upload .btn-remove-url { - position: absolute; - margin-right: 0; - top: 4px; - right: 5px; - padding: 0 12px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.js .image-upload .btn-remove-url .icon-remove { - margin-right: 0; -} -.add-member-form .control-label { - width: 100%; - text-align: left; -} -.add-member-form .controls { - margin-left: auto; -} -.add-member-or { - float: left; - margin-top: 75px; - width: 7%; - text-align: center; - text-transform: uppercase; - color: #999; - font-weight: bold; -} -.add-member-form .row-fluid .control-group { - float: left; - width: 45%; -} -.add-member-form .row-fluid .select2-container, -.add-member-form .row-fluid input { - width: 100% !important; -} -#recaptcha_table { - table-layout: inherit; - line-height: 1; -} -.dataset-item { - border-bottom: 1px dotted #ddd; - padding-bottom: 20px; - margin-bottom: 20px; -} -@media (max-width: 768px) { - .dataset-item { - word-wrap: break-word; - } -} -.dataset-item:last-of-type { - border-bottom: none; - margin-bottom: 0; - padding-bottom: 0; -} -.dataset-heading { - font-size: 16px; - margin-top: 0; - margin-bottom: 8px; - line-height: 1.3; -} -.dataset-heading a { - color: #333; -} -.dataset-heading .label { - position: relative; - top: -1px; -} -.dataset-private { - margin-right: 10px; - text-transform: uppercase; -} -.dataset-private .icon-lock { - width: 9px; -} -.dataset-private.pull-right { - margin-right: 0; -} -.dataset-resources { - margin-top: 8px; -} -.dataset-resources li { - display: inline; -} -.dataset-resources li a { - background-color: #aaa; -} -.dataset-heading .popular { - top: 0; -} -.resource-list { - margin: 0; - list-style: none; - margin: -10px -10px 10px -10px; -} -.resource-item { - position: relative; - padding: 10px 10px 10px 60px; - margin-bottom: 0px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.resource-item:hover { - background-color: #eee; -} -.resource-item .heading { - color: #000; - font-size: 14px; - font-weight: bold; -} -.resource-item .format-label { - position: absolute; - top: 10px; - left: 10px; -} -.resource-item .description { - font-size: 12px; - margin-bottom: 0; - min-height: 12px; -} -.resource-item .btn-group { - position: absolute; - top: 14px; - right: 10px; -} -@media (max-width: 768px) { - .resource-item .btn-group { - display: none; - } -} -.resource-list.reordering .resource-item { - border: 1px solid #ddd; - margin-bottom: 10px; - cursor: move; -} -.resource-list.reordering .resource-item .handle { - display: block; - position: absolute; - color: #888; - left: -31px; - top: 50%; - margin-top: -15px; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - border: 1px solid #ddd; - border-width: 1px 0 1px 1px; - background-color: #fff; - -webkit-border-radius: 20px 0 0 20px; - -moz-border-radius: 20px 0 0 20px; - border-radius: 20px 0 0 20px; -} -.resource-list.reordering .resource-item .handle:hover { - text-decoration: none; -} -.resource-list.reordering .resource-item:hover .handle { - background-color: #eee; -} -.resource-list.reordering .resource-item.ui-sortable-helper { - background-color: #eee; - border: 1px solid #187794; -} -.resource-list.reordering .resource-item.ui-sortable-helper .handle { - background-color: #eee; - border-color: #187794; - color: #333; -} -.resource-item .handle { - display: none; -} -.tag-list { - margin: 0; - list-style: none; - padding: 10px 10px 5px 10px; -} -.tag-list li { - display: inline-block; - margin-right: 5px; -} -.tag-list li:last-child { - margin-right: 0; -} -.additional-info td, -.additional-info th { - width: 50%; -} -.label[data-format=html], -.label[data-format*=html] { - background-color: #55a1ce; -} -.label[data-format=json], -.label[data-format*=json] { - background-color: #ef7100; -} -.label[data-format=xml], -.label[data-format*=xml] { - background-color: #ef7100; -} -.label[data-format=text], -.label[data-format*=text] { - background-color: #74cbec; -} -.label[data-format=csv], -.label[data-format*=csv] { - background-color: #dfb100; -} -.label[data-format=xls], -.label[data-format*=xls] { - background-color: #2db55d; -} -.label[data-format=zip], -.label[data-format*=zip] { - background-color: #686868; -} -.label[data-format=api], -.label[data-format*=api] { - background-color: #ec96be; -} -.label[data-format=pdf], -.label[data-format*=pdf] { - background-color: #e0051e; -} -.label[data-format=rdf], -.label[data-format*=rdf], -.label[data-format*=nquad], -.label[data-format*=ntriples], -.label[data-format*=turtle] { - background-color: #0b4498; -} -.view-list { - margin: 0; - list-style: none; -} -.view-list li { - position: relative; - margin-bottom: 10px; -} -.view-list li a { - display: block; - min-height: 50px; - padding: 10px; - border: 1px solid #ddd; - overflow: hidden; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.view-list li a .icon { - float: left; - width: 50px; - height: 50px; - overflow: hidden; - margin-right: 10px; - color: #444; - background-color: #eee; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.view-list li a .icon i { - display: block; - text-align: center; - font-size: 28px; - line-height: 50px; -} -.view-list li a h3 { - color: #000; - font-weight: bold; - font-size: 16px; - margin: 0 0 3px 0; -} -.view-list li a p { - margin: 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - color: #444; -} -.view-list li a.active, -.view-list li a:hover { - text-decoration: none; - border-color: #187794; -} -.view-list li a.active .icon, -.view-list li a:hover .icon { - background-color: #187794; - color: #f6f6f6; -} -.view-list li .arrow { - position: absolute; - display: none; - border: 8px solid transparent; - border-top-color: #187794; - left: 50%; - bottom: -15px; - margin-left: -4px; -} -.view-list li.active a { - text-decoration: none; - border-color: #187794; -} -.view-list li.active a .icon { - background-color: #187794; - color: #f6f6f6; -} -.view-list li.active .arrow { - display: block; -} -.view-list.stacked { - overflow-y: hidden; - overflow-x: auto; - height: 100px; - white-space: nowrap; -} -.view-list.stacked li { - display: inline-block; - width: 250px; - margin-right: 10px; -} -.view-list.stacked li:last-child { - margin-right: 0; -} -.view-list.stacked::-webkit-scrollbar { - width: 7px; - height: 7px; -} -.view-list.stacked::-webkit-scrollbar-track { - border-radius: 10px; - background-color: #f6f6f6; -} -.view-list.stacked::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color: #c3c3c3; -} -.view-list.stacked::-webkit-scrollbar-thumb:hover { - background-color: #187794; -} -.resource-view { - margin-top: 20px; -} -.search-form { - margin-bottom: 20px; - padding-bottom: 25px; - border-bottom: 1px dotted #ddd; -} -.search-form .search-input { - position: relative; - margin-bottom: 20px; -} -.search-form .search-input input { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - width: 100%; - height: auto; -} -.search-form .search-input button { - cursor: pointer; - display: block; - position: absolute; - top: 50%; - margin-top: 1px; - right: 10px; - height: 20px; - padding: 0; - border: none; - background: transparent; -} -.search-form .search-input button span { - display: none; -} -.search-form .search-input button i { - color: #ccc; - -webkit-transition: color 0.2s ease-in; - -moz-transition: color 0.2s ease-in; - -o-transition: color 0.2s ease-in; - transition: color 0.2s ease-in; -} -.search-form .search-input button:hover i { - color: #000; -} -.search-form .search-input.search-giant input { - font-size: 16px; - padding: 15px; -} -.search-form .search-input.search-giant button { - margin-top: -4px; - right: 15px; - height: 30px; -} -.search-form .search-input.search-giant button i { - font-size: 28px; - width: 28px; -} -.search-form .control-order-by label, -.search-form .control-order-by select { - display: inline; -} -.search-form .control-order-by select { - width: 160px; - margin: 0; -} -.search-form h2 { - font-size: 24px; - line-height: 1.3; - color: #000; - margin-bottom: 0; - margin-top: 20px; -} -.search-form .filter-list { - color: #444; - line-height: 32px; - margin: 10px 0 0 0; -} -.search-form .filter-list .pill { - line-height: 21px; -} -.search-form .filter-list .extra { - margin-top: 10px; - font-size: 18px; - font-weight: normal; - color: #000; -} -.search-form.no-bottom-border { - border-bottom-width: 0; - margin-bottom: 0; -} -.tertiary .control-order-by { - float: none; - margin: 0; -} -.tertiary .control-order-by label { - display: block; - margin-bottom: 5px; - font-weight: normal; - font-size: 12px; -} -.tertiary .control-order-by select { - display: block; - font-size: 12px; - width: 100%; -} -.tertiary .search-input { - margin-bottom: 10px; -} -@media (min-width: 980px) { - .search-form .control-order-by { - float: right; - margin-left: 15px; - } - .tertiary .search-form .control-order-by { - float: none; - margin: 0; - } -} -.group .media-vertical .image { - margin: 0 -5px 5px; -} -.group-list:nth-child(odd) { - clear: left; -} -.group-list .module-heading { - padding-top: 15px; - padding-bottom: 15px; -} -.group-list .dataset-content { - min-height: 54px; -} -.group-list .module-heading h3 { - margin-bottom: 2px; -} -.group-list .module-heading h3 a { - color: #333; -} -.group-list .module-heading .media-image { - overflow: hidden; - max-height: 60px; -} -.group-list .module-heading .media-image img { - max-width: 85px; -} -.toolbar { - *zoom: 1; - position: relative; - margin-bottom: 10px; - padding: 5px 0; -} -.toolbar:before, -.toolbar:after { - display: table; - content: ""; - line-height: 0; -} -.toolbar:after { - clear: both; -} -.page_primary_action { - margin-bottom: 20px; -} -.toolbar .breadcrumb { - *zoom: 1; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - position: relative; - float: left; - margin: 0; - padding: 0; - border: none; - background: none; - font-size: 20px; - line-height: 1.3; -} -.toolbar .breadcrumb:before, -.toolbar .breadcrumb:after { - display: table; - content: ""; - line-height: 0; -} -.toolbar .breadcrumb:after { - clear: both; -} -.toolbar .breadcrumb li:after { - content: " / "; -} -.toolbar .breadcrumb li.active:after { - content: ""; -} -.toolbar .breadcrumb li:last-of-type:after { - content: ""; -} -.toolbar .home a { - text-decoration: none; -} -.toolbar .home span { - display: none; -} -.toolbar .breadcrumb a { - color: #505050; -} -@media (max-width: 767px) { - .toolbar .breadcrumb { - color: #fff; - text-shadow: none; - } - .toolbar .breadcrumb .home { - display: none; - } - .toolbar .breadcrumb a { - color: #fff; - text-shadow: none; - } -} -.toolbar .breadcrumb .active a, -.toolbar .breadcrumb a.active { - font-weight: bold; -} -.actions { - margin: 0; - list-style: none; - position: absolute; - top: 10px; - right: 10px; - z-index: 1; -} -.actions li { - display: inline-block; - margin-right: 5px; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.actions li:last-of-type { - margin-right: 0; -} -.hide-heading { - display: none; -} -.page-header { - *zoom: 1; - border-bottom: 1px solid #ddd; - background-color: #f6f6f6; - -webkit-border-radius: 0 3px 0 0; - -moz-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0; -} -.page-header:before, -.page-header:after { - display: table; - content: ""; - line-height: 0; -} -.page-header:after { - clear: both; -} -.page-header .nav-tabs { - float: left; - margin-bottom: -1px; -} -.page-header .nav-tabs li.active a, -.page-header .nav-tabs a:hover { - background-color: #fff; -} -.page-header .content_action { - float: right; - margin-top: -5px; - margin-right: -7px; -} -.no-nav .page-header { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.nav-tabs-plain { - padding: 0 25px; -} -.nav-tabs-plain > .active > a, -.nav-tabs-plain > .active > a:hover { - background-color: #fff; -} -@media (min-width: 768px) { - .span9 .page-header { - margin-left: -17px; - } -} -@media (max-width: 768px) { - .page-header .nav-tabs { - margin: 5px 10px 10px -5px; - border: none; - } - .page-header .nav-tabs > li { - float: none; - } - .page-header .nav-tabs > li a { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .page-header .nav-tabs > .active > a, - .page-header .nav-tabs > .active > a:hover, - .page-header .nav-tabs > .active > a:focus { - border-bottom-color: #dddddd; - } -} -h1 { - font-size: 28px; -} -h2 { - font-size: 21px; -} -h3 { - font-size: 18px; -} -h4 { - font-size: 14px; -} -h1, -h2, -h3, -h4 { - line-height: 1.5; -} -h1 small, -h2 small, -h3 small, -h4 small { - font-size: 14px; -} -.prose h1, -.prose heading-1 h2, -.prose heading-2 { - margin-bottom: 15px; -} -.prose h3, -.prose heading-3 { - margin-bottom: 10px; -} -.table-chunky td, -.table-chunky th { - padding: 12px 15px; - font-size: 12px; -} -.table-chunky thead th, -.table-chunky thead td { - color: #fff; - background-color: #aaa; - padding-top: 10px; - padding-bottom: 10px; -} -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: transparent; -} -.table-striped tbody tr:nth-child(even) td, -.table-striped tbody tr:nth-child(even) th { - background-color: #f2f2f2; -} -.table-chunky.table-bordered { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} -.table-chunky.table-bordered thead:first-child tr:first-child th:first-child, -.table-chunky.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 2px; - -moz-border-radius-topleft: 2px; - border-top-left-radius: 2px; -} -.table-chunky.table-bordered thead:first-child tr:first-child th:last-child, -.table-chunky.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 2px; - -moz-border-radius-topright: 2px; - border-top-right-radius: 2px; -} -.table-chunky.table-bordered thead:last-child tr:last-child th:first-child, -.table-chunky.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 2px; - -moz-border-radius: 0 0 0 2px; - border-radius: 0 0 0 2px; - -webkit-border-bottom-left-radius: 2px; - -moz-border-radius-bottomleft: 2px; - border-bottom-left-radius: 2px; -} -.table-chunky.table-bordered thead:last-child tr:last-child th:last-child, -.table-chunky.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 2px; - -moz-border-radius-bottomright: 2px; - border-bottom-right-radius: 2px; -} -.ellipsis { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.ckan-icon { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; -} -.ckan-icon-fb { - width: 16px; - height: 16px; - background-position: 0px 0; -} -.ckan-icon-gplus { - width: 16px; - height: 16px; - background-position: -16px 0; -} -.ckan-icon-twitter { - width: 16px; - height: 16px; - background-position: -32px 0; -} -.ckan-icon-email { - width: 16px; - height: 16px; - background-position: -48px 0; -} -.ckan-icon-share { - width: 16px; - height: 16px; - background-position: -64px 0; -} -.ckan-icon-feed { - width: 16px; - height: 16px; - background-position: -80px 0; -} -.ckan-icon-calendar { - width: 16px; - height: 16px; - background-position: -96px 0; -} -.ckan-icon-file { - width: 16px; - height: 16px; - background-position: -112px 0; -} -.ckan-icon-lock { - width: 16px; - height: 16px; - background-position: -128px 0; -} -.ckan-icon-link-file { - width: 16px; - height: 16px; - background-position: -144px 0; -} -.ckan-icon-link-plugin { - width: 16px; - height: 16px; - background-position: -160px 0; -} -.ckan-icon-upload-file { - width: 16px; - height: 16px; - background-position: -176px 0; -} -.ckan-icon-callout { - width: 16px; - height: 16px; - background-position: -192px 0; -} -.ckan-icon-circle-cross { - width: 17px; - height: 17px; - background-position: 0px -16px; -} -.ckan-icon-circle-add { - width: 17px; - height: 17px; - background-position: -17px -16px; -} -.ckan-icon-flame { - width: 17px; - height: 17px; - background-position: -34px -16px; -} -.ckan-icon-search { - width: 17px; - height: 17px; - background-position: -51px -16px; -} -.ckan-icon-large-lock { - width: 20px; - height: 20px; - background-position: 0px -33px; -} -.ckan-icon-photo { - width: 20px; - height: 20px; - background-position: -20px -33px; -} -.ckan-icon-add { - width: 20px; - height: 20px; - background-position: -40px -33px; -} -.ckan-icon-home { - width: 20px; - height: 20px; - background-position: -60px -33px; -} -.ckan-icon-rewind { - width: 20px; - height: 20px; - background-position: -80px -33px; -} -.ckan-icon-tools { - width: 20px; - height: 20px; - background-position: -100px -33px; -} -.ckan-icon-flag { - width: 20px; - height: 20px; - background-position: -120px -33px; -} -.ckan-icon-clipboard { - width: 20px; - height: 20px; - background-position: -140px -33px; -} -.ckan-icon-share { - width: 20px; - height: 20px; - background-position: -160px -33px; -} -.ckan-icon-info { - width: 20px; - height: 20px; - background-position: -180px -33px; -} -.ckan-icon-download { - width: 20px; - height: 20px; - background-position: -200px -33px; -} -.ckan-icon-star { - width: 20px; - height: 20px; - background-position: -220px -33px; -} -.ckan-icon-info-flat { - width: 20px; - height: 20px; - background-position: -240px -33px; -} -.ckan-icon-tag { - width: 20px; - height: 20px; - background-position: -260px -33px; -} -.ckan-icon-plus { - width: 20px; - height: 20px; - background-position: -280px -33px; - width: 16px; -} -.ckan-icon-head { - width: 20px; - height: 20px; - background-position: -300px -33px; -} -.ckan-icon-arrow-e { - width: 20px; - height: 20px; - background-position: -320px -33px; - width: 16px; -} -.ckan-icon-bookmark { - width: 25px; - height: 25px; - background-position: 0px -53px; -} -.format-label { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - text-indent: -900em; - background: url("../../../base/images/sprite-resource-icons.png") no-repeat 0 0; -} -.format-label { - width: 32px; - height: 35px; - background-position: 0px -62px; -} -.format-label[data-format=rdf], -.format-label[data-format*=rdf] { - width: 32px; - height: 35px; - background-position: -32px -62px; -} -.format-label[data-format=pdf], -.format-label[data-format*=pdf] { - width: 32px; - height: 35px; - background-position: -64px -62px; -} -.format-label[data-format=api], -.format-label[data-format*=api] { - width: 32px; - height: 35px; - background-position: -96px -62px; -} -.format-label[data-format=zip], -.format-label[data-format*=zip] { - width: 32px; - height: 35px; - background-position: -128px -62px; -} -.format-label[data-format=xls], -.format-label[data-format*=xls] { - width: 32px; - height: 35px; - background-position: -160px -62px; -} -.format-label[data-format=csv], -.format-label[data-format*=csv] { - width: 32px; - height: 35px; - background-position: -192px -62px; -} -.format-label[data-format=txt], -.format-label[data-format*=txt] { - width: 32px; - height: 35px; - background-position: -224px -62px; -} -.format-label[data-format=xml], -.format-label[data-format*=xml] { - width: 32px; - height: 35px; - background-position: -256px -62px; -} -.format-label[data-format=json], -.format-label[data-format*=json] { - width: 32px; - height: 35px; - background-position: -288px -62px; -} -.format-label[data-format=html], -.format-label[data-format*=html] { - width: 32px; - height: 35px; - background-position: -320px -62px; -} -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - text-align: right; - font-size: 14px; - line-height: 1; - width: 14px; -} -.btn [class^="icon-"], -.nav [class^="icon-"], -.module-heading [class^="icon-"], -.dropdown [class^="icon-"], -.btn [class*=" icon-"], -.nav [class*=" icon-"], -.module-heading [class*=" icon-"], -.dropdown [class*=" icon-"] { - margin-right: 4px; -} -.info-block [class^="icon-"], -.info-block [class*=" icon-"] { - float: left; - font-size: 28px; - width: 28px; - margin-right: 5px; - margin-top: 2px; -} -.breadcrumb .home .icon-home { - font-size: 24px; - width: 24px; - vertical-align: -1px; -} -.info-block-small [class^="icon-"], -.info-block-small [class*=" icon-"] { - font-size: 14px; - width: 14px; - margin-top: 1px; -} -.nav-tabs .fa:last-child, -.module-heading .fa:last-child, -.btn .fa:last-child { - margin-right: 3px; -} -.wrapper { - *zoom: 1; - background-color: #FFF; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - position: relative; - background-color: #fff; - margin-bottom: 20px; - margin-left: 0; -} -.wrapper:before, -.wrapper:after { - display: table; - content: ""; - line-height: 0; -} -.wrapper:after { - clear: both; -} -@media (min-width: 768px) { - .wrapper { - background-image: url("../../../base/images/nav.png"); - background-repeat: repeat-y; - background-position: -54px 0px; - } -} -@media (min-width: 980px) { - .wrapper { - background-position: 0px 0px; - } -} -.wrapper.no-nav { - background-image: none; -} -[role=main], -.main { - position: relative; - padding-bottom: 20px; -} -@media (min-width: 768px) { - [role=main], - .main { - padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); - } -} -[role=main] { - min-height: 350px; -} -.main:after, -[role=main]:after { - bottom: 0; - border-top-width: 1px; -} -[role=main] .primary { - float: right; - margin-left: 0; -} -[role=main] .secondary { - margin-left: 0; -} -/* Filters modal */ -.no-text .text { - display: none; -} -.js body.filters-modal { - overflow: hidden; -} -.show-filters.btn, -.hide-filters { - display: none; -} -@media (max-width: 768px) { - .wrapper { - margin: 0 -20px; - border-width: 0; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - } - .js [role=main] .secondary .filters { - display: none; - position: fixed; - overflow: auto; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 1; - padding: 10px; - background-color: #000000; - background-color: rgba(0, 0, 0, 0.5); - } - .js body.filters-modal .secondary .filters { - display: block; - } - .js [role=main] .secondary .filters > div { - background-color: #fff; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - overflow: hidden; - } - .js [role=main] .secondary .filters > div .module-footer { - display: none; - } - .js body.filters-modal .secondary .filters .hide-filters { - display: inline-block; - position: absolute; - top: 14px; - right: 17px; - opacity: 0.6; - } - .js body.filters-modal .secondary .filters .hide-filters i { - font-size: 18px; - } - .js .show-filters.btn { - display: inline-block; - } -} -.primary > :last-child, -.secondary > :last-child { - margin-bottom: 0; -} -.primary .primary { - float: left; - width: 467px; - margin-left: 0; - margin-bottom: 20px; -} -.primary .primary h1:first-child, -.primary .primary h2:first-child, -.primary .primary h3:first-child, -.primary .primary h4:first-child { - margin-top: 0; -} -.primary .tertiary { - float: left; - width: 180px; - margin-left: 18px; - margin-bottom: 20px; -} -@media (min-width: 768px) { - .hero { - background: url("../../../base/images/background-tile.png"); - } -} -.hero:after { - background-color: rgba(0, 0, 0, 0.09); - background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(0, 0, 0, 0.15)), to(rgba(0, 0, 0, 0))); - background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-repeat: repeat-x; - background-color: #f6f6f6; - border-bottom: 1px solid #d0d0d0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - -webkit-box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); - -moz-box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); - box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); -} -.hero:after .back:hover { - text-decoration: none; -} -.hero:after .back:hover span { - text-decoration: underline; -} -.context-info .module-content { - padding: 15px; -} -.context-info .image { - margin-bottom: 10px; -} -.context-info .image img, -.context-info .image a { - display: block; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.context-info p { - overflow: auto; -} -.context-info code { - display: block; - font-weight: normal; - padding: 0; - margin: 0; - overflow: auto; -} -.context-info h1.heading { - margin: 0 0 5px 0; - font-size: 18px; - line-height: 1.3; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.context-info .info { - margin-top: 15px; - padding-top: 10px; - border-top: 1px dotted #DDD; - word-break: break-word; -} -.context-info .info dl dd { - margin-top: 3px; - margin-left: 0; -} -.context-info .nums { - *zoom: 1; - margin-top: 15px; - padding-top: 10px; - padding-bottom: 0; - border-top: 1px dotted #DDD; -} -.context-info .nums:before, -.context-info .nums:after { - display: table; - content: ""; - line-height: 0; -} -.context-info .nums:after { - clear: both; -} -.context-info .nums dl { - float: left; - width: 50%; - margin: 5px 0 0 0; - color: #444; -} -.context-info .nums dl dt { - display: block; - font-size: 13px; - font-weight: 300; -} -.context-info .nums dl dd { - display: block; - font-size: 30px; - font-weight: 700; - line-height: 36px; - margin-left: 0; -} -.context-info .nums dl dd .smallest { - font-size: 13px; -} -.context-info .nums dl dd .smaller { - font-size: 16px; -} -.context-info .nums dl dd .small { - font-size: 21px; -} -.context-info .follow_button { - margin-top: 15px; -} -.context-info.editing .module-content { - margin-top: 0; -} -.flash-messages .alert { - -webkit-box-shadow: 0 0 0 1px white; - -moz-box-shadow: 0 0 0 1px white; - box-shadow: 0 0 0 1px white; -} -.homepage .row { - position: relative; -} -.homepage .module-search { - padding: 5px; - margin: 20px 0 0 0; - color: #fff; - background: #fff; -} -.homepage .module-search .search-giant { - margin-bottom: 10px; -} -.homepage .module-search .search-giant input { - border-color: #003f52; -} -.homepage .module-search .module-content { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - background-color: #005d7a; - border-bottom: none; -} -.homepage .module-search .module-content .heading { - margin-top: 0; - margin-bottom: 7px; - font-size: 24px; - line-height: 40px; -} -.homepage .module-search .tags { - *zoom: 1; - padding: 5px 10px 10px 10px; - background-color: #003647; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.homepage .module-search .tags:before, -.homepage .module-search .tags:after { - display: table; - content: ""; - line-height: 0; -} -.homepage .module-search .tags:after { - clear: both; -} -.homepage .module-search .tags h3, -.homepage .module-search .tags .tag { - display: block; - float: left; - margin: 5px 10px 0 0; -} -.homepage .module-search .tags h3 { - font-size: 14px; - line-height: 20px; - padding: 2px 8px; -} -.homepage .group-list { - margin: 0; -} -.homepage .box .inner { - padding: 20px 25px; -} -.homepage .stats h3 { - margin: 0 0 10px 0; -} -.homepage .stats ul { - margin: 0; - list-style: none; - *zoom: 1; -} -.homepage .stats ul:before, -.homepage .stats ul:after { - display: table; - content: ""; - line-height: 0; -} -.homepage .stats ul:after { - clear: both; -} -.homepage .stats ul li { - float: left; - width: 25%; - font-weight: 300; -} -.homepage .stats ul li a { - display: block; -} -.homepage .stats ul li a b { - display: block; - font-size: 35px; - line-height: 1.5; -} -.homepage .stats ul li a:hover { - text-decoration: none; -} -.homepage.layout-2 .stats { - margin-top: 20px; -} -@media (min-width: 768px) { - .homepage [role=main] { - padding: 20px 0; - } - .homepage.layout-1 .row1 .col2 { - position: absolute; - bottom: 0; - right: 0; - } - .homepage.layout-1 .row1 .col2 .module-search { - bottom: 0; - left: 0; - right: 0; - } -} -.account-masthead { - *zoom: 1; - min-height: 30px; - color: #fff; - background: #003647 url("../../../base/images/bg.png"); -} -.account-masthead:before, -.account-masthead:after { - display: table; - content: ""; - line-height: 0; -} -.account-masthead:after { - clear: both; -} -.account-masthead .account { - float: right; -} -.account-masthead .account ul { - *zoom: 1; -} -.account-masthead .account ul:before, -.account-masthead .account ul:after { - display: table; - content: ""; - line-height: 0; -} -.account-masthead .account ul:after { - clear: both; -} -.account-masthead .account ul li { - display: block; - float: left; - border-left: 1px solid #00232e; -} -.account-masthead .account ul li a { - display: block; - color: #bfd7de; - font-size: 13px; - font-weight: bold; - padding: 0 10px; - line-height: 31px; -} -.account-masthead .account ul li a span.username, -.account-masthead .account ul li a span.text { - margin: 0 2px 0 4px; -} -.account-masthead .account ul li a span.text { - position: absolute; - top: -9999px; - left: -9999px; -} -.account-masthead .account ul li a:hover { - color: #d9e7eb; - background-color: #00232e; - text-decoration: none; -} -.account-masthead .account ul li a.sub { - font-weight: 300; -} -.account-masthead .account ul li a .btn { - vertical-align: 1px; - margin-left: 3px; -} -.account-masthead .account .notifications a span.badge { - font-size: 12px; - margin-left: 3px; - padding: 1px 6px; - background-color: #00232e; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - text-shadow: none; - color: #bfd7de; -} -.account-masthead .account .notifications a:hover span { - color: #fff; - background-color: #000f14; -} -.account-masthead .account .notifications.notifications-important a span.badge { - color: #fff; - background-color: #C9403A; -} -.account-masthead .account.authed .image { - padding: 0 6px; -} -.account-masthead .account.authed .image img { - vertical-align: -6px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.masthead { - *zoom: 1; - min-height: 55px; - color: #fff; - background: #005d7a url("../../../base/images/bg.png"); -} -.masthead:before, -.masthead:after { - display: table; - content: ""; - line-height: 0; -} -.masthead:after { - clear: both; -} -.masthead .container { - position: relative; -} -.masthead a { - color: #fff; -} -.masthead hgroup h1, -.masthead hgroup h2 { - float: left; - font-size: 30px; - line-height: 1.5; -} -.masthead hgroup h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; -} -.masthead hgroup h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; -} -.masthead .nav-collapse { - padding-top: 10px; -} -.masthead .section { - float: left; -} -.masthead input[type="text"] { - border-color: #004a61; -} -.masthead .navigation { - margin-right: 20px; -} -.masthead .navigation .nav-pills { - margin-bottom: 0; -} -.masthead .navigation .nav-pills li a:hover, -.masthead .navigation .nav-pills li.active a { - background-color: #003647; -} -.masthead .nav > li > a, -.masthead .nav > li > a:focus, -.masthead .nav > li > a:hover, -.masthead .nav > .active > a, -.masthead .nav > .active > a:hover, -.masthead .nav > .active > a:focus { - color: #fff; - text-shadow: none; -} -.masthead .site-search { - margin: 2px 8px 2px 0; -} -.masthead .site-search input { - width: 200px; - padding: 4px 10px; -} -.masthead .btn-navbar, -.masthead .btn-navbar:hover, -.masthead .btn-navbar:focus, -.masthead .btn-navbar:active, -.masthead .btn-navbar.active, -.masthead .btn-navbar.disabled, -.masthead .btn-navbar[disabled] { - background-color: #003647; - background-image: none; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - text-shadow: none; - margin-top: 15px; -} -.masthead .btn-navbar .icon-bar, -.masthead .btn-navbar:hover .icon-bar, -.masthead .btn-navbar:focus .icon-bar, -.masthead .btn-navbar:active .icon-bar, -.masthead .btn-navbar.active .icon-bar, -.masthead .btn-navbar.disabled .icon-bar, -.masthead .btn-navbar[disabled] .icon-bar { - margin-right: 0; -} -.masthead .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); -} -@media (min-width: 980px) { - .masthead .nav-collapse { - float: right; - } -} -@media (max-width: 767px) { - .account-masthead { - margin-left: -20px; - margin-right: -20px; - padding-left: 20px; - padding-right: 20px; - } - .masthead .section { - float: none; - } - .masthead .section .nav-collapse { - margin-bottom: 25px; - } -} -@media (max-width: 979px) { - .masthead .container { - padding-left: 20px; - padding-right: 20px; - } - .masthead .site-search { - display: none; - } -} -.site-footer { - *zoom: 1; - min-height: 55px; - color: #fff; - background: #005d7a url("../../../base/images/bg.png"); - padding: 20px 0; -} -.site-footer:before, -.site-footer:after { - display: table; - content: ""; - line-height: 0; -} -.site-footer:after { - clear: both; -} -.site-footer .container { - position: relative; -} -.site-footer a { - color: #fff; -} -.site-footer hgroup h1, -.site-footer hgroup h2 { - float: left; - font-size: 30px; - line-height: 1.5; -} -.site-footer hgroup h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; -} -.site-footer hgroup h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; -} -.site-footer .nav-collapse { - padding-top: 10px; -} -.site-footer .section { - float: left; -} -.site-footer input[type="text"] { - border-color: #004a61; -} -.site-footer .navigation { - margin-right: 20px; -} -.site-footer .navigation .nav-pills { - margin-bottom: 0; -} -.site-footer .navigation .nav-pills li a:hover, -.site-footer .navigation .nav-pills li.active a { - background-color: #003647; -} -.site-footer .nav > li > a, -.site-footer .nav > li > a:focus, -.site-footer .nav > li > a:hover, -.site-footer .nav > .active > a, -.site-footer .nav > .active > a:hover, -.site-footer .nav > .active > a:focus { - color: #fff; - text-shadow: none; -} -.site-footer .site-search { - margin: 2px 8px 2px 0; -} -.site-footer .site-search input { - width: 200px; - padding: 4px 10px; -} -.site-footer .btn-navbar, -.site-footer .btn-navbar:hover, -.site-footer .btn-navbar:focus, -.site-footer .btn-navbar:active, -.site-footer .btn-navbar.active, -.site-footer .btn-navbar.disabled, -.site-footer .btn-navbar[disabled] { - background-color: #003647; - background-image: none; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - text-shadow: none; - margin-top: 15px; -} -.site-footer .btn-navbar .icon-bar, -.site-footer .btn-navbar:hover .icon-bar, -.site-footer .btn-navbar:focus .icon-bar, -.site-footer .btn-navbar:active .icon-bar, -.site-footer .btn-navbar.active .icon-bar, -.site-footer .btn-navbar.disabled .icon-bar, -.site-footer .btn-navbar[disabled] .icon-bar { - margin-right: 0; -} -.site-footer .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); -} -.site-footer, -.site-footer label, -.site-footer small { - color: #CCDEE3; -} -.site-footer a { - color: #CCDEE3; -} -.footer-links ul li { - margin-bottom: 5px; -} -.attribution small { - color: #CCDEE3; - font-size: 12px; -} -.attribution .ckan-footer-logo { - display: block; - width: 68px; - height: 21px; - margin-top: 2px; - background: url("../../../base/images/ckan-logo-footer.png") no-repeat top left; - text-indent: -900em; -} -.lang-select { - *zoom: 1; -} -.lang-select:before, -.lang-select:after { - display: table; - content: ""; - line-height: 0; -} -.lang-select:after { - clear: both; -} -.lang-select label, -.lang-select select, -.lang-select .lang-container { - float: left; - margin-top: 0; -} -.lang-dropdown { - color: #000; -} -.lang-dropdown li { - width: auto; -} -.table-selected td { - background-color: #f5f5f5; -} -.table-selected td .edit { - display: block; -} -.table-bulk-edit th input { - top: -5px; -} -.table-bulk-edit .table-actions .btn-group { - float: left; - margin: 0 10px 0 0; -} -.table-bulk-edit .context p { - margin-bottom: 0; -} -.table-header thead th { - background-color: #f6f6f6; -} -.table-edit-hover .edit { - display: none; - float: right; -} -.table-edit-hover tr:hover .edit { - display: block; -} -.js .table-toggle-more .toggle-more { - display: none; -} -.js .table-toggle-more .show-more { - display: inline; -} -.js .table-toggle-more .show-less { - display: none; -} -.js .table-toggle-more .toggle-seperator { - display: table-row; -} -.js .table-toggle-more .toggle-seperator td { - height: 11px; - padding: 0; - background-image: url("../../../base/images/table-seperator.png"); -} -.js .table .toggle-show td { - background: none; - text-align: center; -} -.js .table-toggle-less .show-less { - display: inline; -} -.js .table-toggle-less .show-more { - display: none; -} -.js .table-toggle-less .toggle-seperator { - display: none; -} -.profile .empty, -.profile .dataset-list { - margin-bottom: 20px; -} -.activity { - margin: 10px 0; - padding: 0; - list-style-type: none; - background: transparent url('../../../base/images/dotted.png') 14px 0 repeat-y; -} -.activity .item { - position: relative; - margin: 0 0 15px 0; - padding: 0; - *zoom: 1; -} -.activity .item:before, -.activity .item:after { - display: table; - content: ""; - line-height: 0; -} -.activity .item:after { - clear: both; -} -.activity .item .icon { - display: block; - position: absolute; - top: 0; - left: 0; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - color: #FFFFFF; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - font-weight: normal; - margin-right: 10px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); -} -.activity .item .gravatar { - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.activity .item .actor .gravatar { - position: absolute; - top: 0; - left: 40px; -} -.activity .item p { - font-size: 14px; - line-height: 1.5; - margin: 5px 0 0 80px; -} -.activity .item .date { - color: #999; - font-size: 12px; - white-space: nowrap; -} -.activity .item .new { - display: block; - position: absolute; - overflow: hidden; - top: -3px; - left: -3px; - width: 10px; - height: 10px; - background-color: #A35647; - border: 1px solid #FFF; - text-indent: -1000px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} -.activity .item.no-avatar p { - margin-left: 40px; -} -.activity .load-less { - margin-bottom: 15px; -} -.popover { - width: 300px; -} -.popover .popover-title { - font-weight: bold; - margin-bottom: 0; -} -.popover p.about { - margin: 0 0 10px 0; -} -.popover .popover-close { - float: right; - text-decoration: none; -} -.popover .popover-content { - font-size: 14px; - line-height: 20px; - color: #444; - word-break: break-all; -} -.popover .popover-content dl { - margin: 0; -} -.popover .popover-content dl dd { - margin-left: 0; - margin-bottom: 10px; -} -.activity .item .icon { - background-color: #999999; -} -.activity .item.failure .icon { - background-color: #B95252; -} -.activity .item.success .icon { - background-color: #69A67A; -} -.activity .item.added-tag .icon { - background-color: #6995a6; -} -.activity .item.changed-group .icon { - background-color: #767DCE; -} -.activity .item.changed-package .icon { - background-color: #8c76ce; -} -.activity .item.changed-package_extra .icon { - background-color: #769ace; -} -.activity .item.changed-resource .icon { - background-color: #aa76ce; -} -.activity .item.changed-user .icon { - background-color: #76b8ce; -} -.activity .item.changed-organization .icon { - background-color: #699fa6; -} -.activity .item.deleted-group .icon { - background-color: #B95252; -} -.activity .item.deleted-package .icon { - background-color: #b97452; -} -.activity .item.deleted-package_extra .icon { - background-color: #b95274; -} -.activity .item.deleted-resource .icon { - background-color: #b99752; -} -.activity .item.deleted-organization .icon { - background-color: #b95297; -} -.activity .item.new-group .icon { - background-color: #69A67A; -} -.activity .item.new-package .icon { - background-color: #69a68e; -} -.activity .item.new-package_extra .icon { - background-color: #6ca669; -} -.activity .item.new-resource .icon { - background-color: #81a669; -} -.activity .item.new-user .icon { - background-color: #69a6a3; -} -.activity .item.new-organization .icon { - background-color: #81a669; -} -.activity .item.removed-tag .icon { - background-color: #b95297; -} -.activity .item.deleted-related-item .icon { - background-color: #b9b952; -} -.activity .item.follow-dataset .icon { - background-color: #767DCE; -} -.activity .item.follow-user .icon { - background-color: #8c76ce; -} -.activity .item.new-related-item .icon { - background-color: #95a669; -} -.activity .item.follow-group .icon { - background-color: #8ba669; -} -.dropdown:hover .dropdown-menu { - display: block; -} -.js .dropdown .dropdown-menu, -.js .dropdown:hover .dropdown-menu { - display: none; -} -.js .dropdown.open .dropdown-menu { - display: block; -} -#followee-filter .btn { - *zoom: 1; -} -#followee-filter .btn:before, -#followee-filter .btn:after { - display: table; - content: ""; - line-height: 0; -} -#followee-filter .btn:after { - clear: both; -} -#followee-filter .btn span, -#followee-filter .btn strong { - display: block; - float: left; - line-height: 1.5; -} -#followee-filter .btn span { - font-weight: normal; -} -#followee-filter .btn strong { - margin: 0 5px; - white-space: nowrap; - max-width: 90px; - overflow: hidden; - text-overflow: ellipsis; -} -.dashboard-context { - position: relative; - margin-bottom: 20px; - padding: 20px; - border-bottom: 1px solid #DCDCDC; - background-color: #f6f6f6; - -webkit-border-radius: 3px 0 0 0; - -moz-border-radius: 3px 0 0 0; - border-radius: 3px 0 0 0; -} -.dashboard-context h2 { - margin-bottom: 10px; -} -.dashboard-context .arrow { - position: absolute; - content: ' '; - top: 30px; - right: -10px; - width: 10px; - height: 21px; - background: transparent url("../../../base/images/dashboard-followee-related.png"); -} -.popover-followee .popover-title { - display: none; -} -.popover-followee .popover-content { - padding: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.popover-followee .empty { - padding: 10px; -} -.popover-followee .popover-header { - *zoom: 1; - background-color: whiteSmoke; - padding: 5px; - border-bottom: 1px solid #ccc; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.popover-followee .popover-header:before, -.popover-followee .popover-header:after { - display: table; - content: ""; - line-height: 0; -} -.popover-followee .popover-header:after { - clear: both; -} -.popover-followee .popover-header .input-prepend { - margin-bottom: 0; -} -.popover-followee .popover-header .add-on, -.popover-followee .popover-header input { - float: left; - margin: 0; -} -.popover-followee .popover-header .add-on { - padding: 4px 8px 4px 12px; - border-right-width: 0; - -webkit-border-radius: 100px 0 0 100px; - -moz-border-radius: 100px 0 0 100px; - border-radius: 100px 0 0 100px; -} -.popover-followee .popover-header input { - padding: 4px 12px 4px 8px; - font-size: 13px; - width: 207px; - -webkit-border-radius: 0 100px 100px 0; - -moz-border-radius: 0 100px 100px 0; - border-radius: 0 100px 100px 0; -} -.popover-followee .nav { - padding: 0; - margin: 0; - max-height: 205px; - overflow: auto; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.popover-followee .nav li a { - display: block; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - padding: 7px 10px 7px 15px; - margin: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.popover-followee .nav li a i { - background-color: #187794; - color: #fff; - margin-right: 11px; - padding: 3px 5px; - line-height: 1; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); -} -.popover-followee .nav li a:hover i { - background-color: #000; -} -.popover-followee .nav li.active a i { - color: #187794; - background-color: #fff; -} -.dashboard-me { - *zoom: 1; - padding: 15px 15px 0 15px; -} -.dashboard-me:before, -.dashboard-me:after { - display: table; - content: ""; - line-height: 0; -} -.dashboard-me:after { - clear: both; -} -.dashboard-me img { - float: left; - margin-right: 10px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.dashboard-me strong { - display: block; - font-size: 16px; - margin: 3px 0; -} -.resource-view-filters { - margin-bottom: 1em; -} -.resource-view-filters .resource-view-filter { - margin-bottom: 1.0em; -} -.resource-view-filters .resource-view-remove-filter { - cursor: pointer; - color: #b55457; -} -.resource-view-filters .resource-view-filter-values .select2-container { - margin-right: 0.3em; - margin-bottom: 0.2em; - width: 24% !important; -} -.resource-view-filters .resource-view-filter-values .select2-container .select2-search-choice-close { - left: auto; -} -.datapusher-status-link:hover { - text-decoration: none; -} -.datapusher-status.status-unknown { - color: #bbb; -} -.datapusher-status.status-pending { - color: #FFCC00; -} -.datapusher-status.status-error { - color: red; -} -.datapusher-status.status-complete { - color: #009900; -} -body { - background: #005d7a url("../../../base/images/bg.png"); -} -[hidden] { - display: none; -} -table { - table-layout: fixed; -} -thead th { - vertical-align: top; -} -td, -th { - word-wrap: break-word; -} -table .metric { - width: 140px; -} -code { - color: #000; - border: none; - background: none; - white-space: normal; -} -pre { - border: none; - background: none; - padding-left: 0; - padding-right: 0; -} -mark { - background: #fdf7e9; -} -blockquote p { - font-size: 1em; -} -iframe { - border: none; -} -.embedded-content h1 { - font-size: 1.4em; -} -.embedded-content h2 { - font-size: 1.4em; -} -.embedded-content h3 { - font-size: 1.2em; -} -.popular { - text-indent: -999em; -} -.empty { - color: #aaa; - font-style: italic; -} -.page-heading { - margin-top: 0; - margin-bottom: 16px; -} -.m-top { - margin-top: 15px; -} -.m-left { - margin-left: 15px; -} -.m-right { - margin-right: 15px; -} -.m-bottom { - margin-bottom: 15px; -} -.no-margin { - margin: 0; -} -.reduced-margin { - margin: 3px 5px; -} -.p-top { - padding-top: 15px; -} -.p-left { - padding-left: 15px; -} -.p-right { - padding-right: 15px; -} -.p-bottom { - padding-bottom: 15px; -} -.no-padding { - padding: 0; -} -.reduced-padding { - padding: 3px 5px; -} -.ie .lang-dropdown { - position: relative; - top: -20px; -} -.ie .module-popup { - border-bottom: none; -} -.ie .banner { - top: 0; - right: 0; - width: auto; -} -.ie .group-listing { - margin-left: -24px; -} -.ie .toolbar .breadcrumb { - filter: none; -} -.ie .toolbar .breadcrumb li { - float: left; -} -.ie .toolbar .breadcrumb li:after { - margin: 0 0.2em; -} -.ie9 .control-large input { - height: 56px; -} -.ie8 .account-masthead a.image, -.ie8 .account-masthead .username { - white-space: nowrap; -} -.ie9 .homepage .media.module-heading .media-image img, -.ie8 .homepage .media.module-heading .media-image img, -.ie7 .homepage .media.module-heading .media-image img { - width: 85px !important; -} -.ie8 .masthead .nav-collapse, -.ie7 .masthead .nav-collapse { - float: right; -} -.ie8 [role=main], -.ie7 [role=main], -.ie8 .main, -.ie7 .main { - padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); -} -.ie8 .hero, -.ie7 .hero { - background: url("../../../base/images/background-tile.png"); -} -.ie8 .hero .hero-primary.module-popup .box, -.ie7 .hero .hero-primary.module-popup .box { - padding-bottom: 20px !important; - margin-bottom: 0 !important; -} -.ie8 .lang-dropdown, -.ie7 .lang-dropdown { - position: relative !important; - top: -90px !important; -} -.ie7 .alert { - position: relative; -} -.ie7 .alert .close { - position: absolute; - top: 6px !important; - right: 20px; -} -.ie7 .media-item { - width: 30%; -} -.ie7 .tags .tag-list { - *zoom: 1; -} -.ie7 .tags .tag-list:before, -.ie7 .tags .tag-list:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .tags .tag-list:after { - clear: both; -} -.ie7 .tags .tag-list li { - display: block; - float: left; -} -.ie7 .tags h3 { - float: left; -} -.ie7 .tags .tag { - display: block; -} -.ie7 .search-giant input { - width: 95%; -} -.ie7 .control-full input, -.ie7 .control-full select, -.ie7 .control-full textarea { - width: 95%; -} -.ie7 .control-full.control-large .controls input { - padding-bottom: 20px; -} -.ie7 .controls { - position: relative; -} -.ie7 .controls .info-block, -.ie7 .controls .info-inline { - position: absolute; - top: 0; - right: 0; -} -.ie7 .form-horizontal .controls { - margin-left: 0; -} -.ie7 .control-custom .checkbox { - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.ie7 .stages { - overflow: hidden; - background-color: #EDEDED; -} -.ie7 .stages li { - height: 30px; - width: 27.5%; -} -.ie7 .stages li button, -.ie7 .stages li span { - display: block; - height: 30px; - padding-left: 20px; -} -.ie7 .stages li button { - height: 50px; -} -.ie7 .stages li .highlight { - width: auto; -} -.ie7 .account-masthead .account a i { - line-height: 31px; -} -.ie7 .masthead { - position: relative; - z-index: 1; -} -.ie7 .masthead .logo img, -.ie7 .masthead nav { - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.ie7 .masthead .header-image { - display: block; -} -.ie7 .masthead .account .dropdown-menu { - z-index: 10000; -} -.ie7 .module-narrow .nav-item.image { - *zoom: 1; -} -.ie7 .module-narrow .nav-item.image:before, -.ie7 .module-narrow .nav-item.image:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .module-narrow .nav-item.image:after { - clear: both; -} -.ie7 .nav-facet .nav-item.active a { - content: 'x'; -} -.ie7 .toolbar .breadcrumb li { - padding-right: 10px; - margin-right: 5px; - background: transparent url("../../../base/images/breadcrumb-slash-ie7.png") 100% 50% no-repeat; -} -.ie7 .toolbar .breadcrumb li.active { - background-image: none; -} -.ie7 .module-heading { - *zoom: 1; - position: relative; -} -.ie7 .module-heading:before, -.ie7 .module-heading:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .module-heading:after { - clear: both; -} -.ie7 .module-heading .media-content { - position: relative; -} -.ie7 .module-heading .media-image img { - float: left; -} -.ie7 .group-listing { - position: relative; - zoom: 1; -} -.ie7 .resource-item { - position: static; - padding-bottom: 1px; -} -.ie7 .resource-item .heading { - position: relative; -} -.ie7 .resource-item .format-label { - left: -48px; -} -.ie7 .resource-item .btn-group { - position: relative; - float: right; - top: -35px; - right: 0; -} -.ie7 .media-overlay .media-heading { - background-color: #000; -} diff --git a/ckan/public-bs2/base/css/maroon.css b/ckan/public-bs2/base/css/maroon.css deleted file mode 100644 index 821fe83029c..00000000000 --- a/ckan/public-bs2/base/css/maroon.css +++ /dev/null @@ -1,9520 +0,0 @@ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -a:hover, -a:active { - outline: 0; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - /* Responsive images (ensure images don't scale beyond their parents) */ - max-width: 100%; - /* Part 1: Set a maxium relative to the parent */ - width: auto\9; - /* IE7-8 need help adjusting responsive images */ - height: auto; - /* Part 2: Scale the height according to the width, otherwise you get stretching */ - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} -#map_canvas img, -.google-maps img { - max-width: none; -} -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} -button, -input { - *overflow: visible; - line-height: normal; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -textarea { - overflow: auto; - vertical-align: top; -} -@media print { - * { - text-shadow: none !important; - color: #000 !important; - 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) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.clearfix:after { - clear: both; -} -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -body { - margin: 0; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #444; - background-color: #eee; -} -a { - color: #810606; - text-decoration: none; -} -a:hover, -a:focus { - color: #380303; - text-decoration: underline; -} -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, -.row:after { - display: table; - content: ""; - line-height: 0; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.span12 { - width: 940px; -} -.span11 { - width: 860px; -} -.span10 { - width: 780px; -} -.span9 { - width: 700px; -} -.span8 { - width: 620px; -} -.span7 { - width: 540px; -} -.span6 { - width: 460px; -} -.span5 { - width: 380px; -} -.span4 { - width: 300px; -} -.span3 { - width: 220px; -} -.span2 { - width: 140px; -} -.span1 { - width: 60px; -} -.offset12 { - margin-left: 980px; -} -.offset11 { - margin-left: 900px; -} -.offset10 { - margin-left: 820px; -} -.offset9 { - margin-left: 740px; -} -.offset8 { - margin-left: 660px; -} -.offset7 { - margin-left: 580px; -} -.offset6 { - margin-left: 500px; -} -.offset5 { - margin-left: 420px; -} -.offset4 { - margin-left: 340px; -} -.offset3 { - margin-left: 260px; -} -.offset2 { - margin-left: 180px; -} -.offset1 { - margin-left: 100px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.row-fluid:after { - clear: both; -} -.row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.12765957%; - *margin-left: 2.07446809%; -} -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.12765957%; -} -.row-fluid .span12 { - width: 100%; - *width: 99.94680851%; -} -.row-fluid .span11 { - width: 91.4893617%; - *width: 91.43617021%; -} -.row-fluid .span10 { - width: 82.9787234%; - *width: 82.92553191%; -} -.row-fluid .span9 { - width: 74.46808511%; - *width: 74.41489362%; -} -.row-fluid .span8 { - width: 65.95744681%; - *width: 65.90425532%; -} -.row-fluid .span7 { - width: 57.44680851%; - *width: 57.39361702%; -} -.row-fluid .span6 { - width: 48.93617021%; - *width: 48.88297872%; -} -.row-fluid .span5 { - width: 40.42553191%; - *width: 40.37234043%; -} -.row-fluid .span4 { - width: 31.91489362%; - *width: 31.86170213%; -} -.row-fluid .span3 { - width: 23.40425532%; - *width: 23.35106383%; -} -.row-fluid .span2 { - width: 14.89361702%; - *width: 14.84042553%; -} -.row-fluid .span1 { - width: 6.38297872%; - *width: 6.32978723%; -} -.row-fluid .offset12 { - margin-left: 104.25531915%; - *margin-left: 104.14893617%; -} -.row-fluid .offset12:first-child { - margin-left: 102.12765957%; - *margin-left: 102.0212766%; -} -.row-fluid .offset11 { - margin-left: 95.74468085%; - *margin-left: 95.63829787%; -} -.row-fluid .offset11:first-child { - margin-left: 93.61702128%; - *margin-left: 93.5106383%; -} -.row-fluid .offset10 { - margin-left: 87.23404255%; - *margin-left: 87.12765957%; -} -.row-fluid .offset10:first-child { - margin-left: 85.10638298%; - *margin-left: 85%; -} -.row-fluid .offset9 { - margin-left: 78.72340426%; - *margin-left: 78.61702128%; -} -.row-fluid .offset9:first-child { - margin-left: 76.59574468%; - *margin-left: 76.4893617%; -} -.row-fluid .offset8 { - margin-left: 70.21276596%; - *margin-left: 70.10638298%; -} -.row-fluid .offset8:first-child { - margin-left: 68.08510638%; - *margin-left: 67.9787234%; -} -.row-fluid .offset7 { - margin-left: 61.70212766%; - *margin-left: 61.59574468%; -} -.row-fluid .offset7:first-child { - margin-left: 59.57446809%; - *margin-left: 59.46808511%; -} -.row-fluid .offset6 { - margin-left: 53.19148936%; - *margin-left: 53.08510638%; -} -.row-fluid .offset6:first-child { - margin-left: 51.06382979%; - *margin-left: 50.95744681%; -} -.row-fluid .offset5 { - margin-left: 44.68085106%; - *margin-left: 44.57446809%; -} -.row-fluid .offset5:first-child { - margin-left: 42.55319149%; - *margin-left: 42.44680851%; -} -.row-fluid .offset4 { - margin-left: 36.17021277%; - *margin-left: 36.06382979%; -} -.row-fluid .offset4:first-child { - margin-left: 34.04255319%; - *margin-left: 33.93617021%; -} -.row-fluid .offset3 { - margin-left: 27.65957447%; - *margin-left: 27.55319149%; -} -.row-fluid .offset3:first-child { - margin-left: 25.53191489%; - *margin-left: 25.42553191%; -} -.row-fluid .offset2 { - margin-left: 19.14893617%; - *margin-left: 19.04255319%; -} -.row-fluid .offset2:first-child { - margin-left: 17.0212766%; - *margin-left: 16.91489362%; -} -.row-fluid .offset1 { - margin-left: 10.63829787%; - *margin-left: 10.53191489%; -} -.row-fluid .offset1:first-child { - margin-left: 8.5106383%; - *margin-left: 8.40425532%; -} -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} -.container:before, -.container:after { - display: table; - content: ""; - line-height: 0; -} -.container:after { - clear: both; -} -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.container-fluid:after { - clear: both; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} -small { - font-size: 85%; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -cite { - font-style: normal; -} -.muted { - color: #999; -} -a.muted:hover, -a.muted:focus { - color: #808080; -} -.text-warning { - color: #c09853; -} -a.text-warning:hover, -a.text-warning:focus { - color: #a47e3c; -} -.text-error { - color: #b55457; -} -a.text-error:hover, -a.text-error:focus { - color: #954143; -} -.text-info { - color: #3a87ad; -} -a.text-info:hover, -a.text-info:focus { - color: #2d6987; -} -.text-success { - color: #468847; -} -a.text-success:hover, -a.text-success:focus { - color: #356635; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999; -} -h1, -h2, -h3 { - line-height: 40px; -} -h1 { - font-size: 38.5px; -} -h2 { - font-size: 31.5px; -} -h3 { - font-size: 24.5px; -} -h4 { - font-size: 17.5px; -} -h5 { - font-size: 14px; -} -h6 { - font-size: 11.9px; -} -h1 small { - font-size: 24.5px; -} -h2 small { - font-size: 17.5px; -} -h3 small { - font-size: 14px; -} -h4 small { - font-size: 14px; -} -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eee; -} -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -li { - line-height: 20px; -} -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding-left: 5px; - padding-right: 5px; -} -dl { - margin-bottom: 20px; -} -dt, -dd { - line-height: 20px; -} -dt { - font-weight: bold; -} -dd { - margin-left: 10px; -} -.dl-horizontal { - *zoom: 1; -} -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - content: ""; - line-height: 0; -} -.dl-horizontal:after { - clear: both; -} -.dl-horizontal dt { - float: left; - width: 160px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.dl-horizontal dd { - margin-left: 180px; -} -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eee; - border-bottom: 1px solid #fff; -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999; -} -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eee; -} -blockquote p { - margin-bottom: 0; - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} -blockquote small { - display: block; - line-height: 20px; - color: #999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eee; - border-left: 0; -} -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} -blockquote.pull-right small:before { - content: ''; -} -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; - white-space: nowrap; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -pre.prettyprint { - margin-bottom: 20px; -} -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -form { - margin: 0 0 20px; -} -fieldset { - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -legend small { - font-size: 15px; - color: #999; -} -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} -input, -button, -select, -textarea { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} -label { - display: block; - margin-bottom: 5px; -} -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"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - vertical-align: middle; -} -input, -textarea, -.uneditable-input { - width: 206px; -} -textarea { - height: auto; -} -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"], -.uneditable-input { - background-color: #fff; - border: 1px solid #ccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear .2s, box-shadow linear .2s; - -moz-transition: border linear .2s, box-shadow linear .2s; - -o-transition: border linear .2s, box-shadow linear .2s; - transition: border linear .2s, box-shadow linear .2s; -} -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - *margin-top: 0; - /* IE7 */ - margin-top: 1px \9; - /* IE8-9 */ - line-height: normal; -} -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} -select, -input[type="file"] { - height: 30px; - /* 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: 30px; -} -select { - width: 220px; - border: 1px solid #ccc; - background-color: #fff; -} -select[multiple], -select[size] { - height: auto; -} -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.uneditable-input, -.uneditable-textarea { - color: #999; - background-color: #fcfcfc; - border-color: #ccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} -.uneditable-textarea { - width: auto; - height: auto; -} -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999; -} -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999; -} -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999; -} -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} -input, -textarea, -.uneditable-input { - margin-left: 0; -} -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} -.controls-row { - *zoom: 1; -} -.controls-row:before, -.controls-row:after { - display: table; - content: ""; - line-height: 0; -} -.controls-row:after { - clear: both; -} -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eee; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b55457; -} -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b55457; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b55457; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #954143; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; -} -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b55457; - background-color: #f8f0f0; - border-color: #b55457; -} -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} -.form-actions:before, -.form-actions:after { - display: table; - content: ""; - line-height: 0; -} -.form-actions:after { - clear: both; -} -.help-block, -.help-inline { - color: #6a6a6a; -} -.help-block { - display: block; - margin-bottom: 10px; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - vertical-align: middle; - padding-left: 5px; -} -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - vertical-align: middle; - font-size: 0; - white-space: nowrap; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 14px; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #fff; - background-color: #eee; - border: 1px solid #ccc; -} -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -/* Allow for input prepend/append in search forms */ -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} -.control-group { - margin-bottom: 10px; -} -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; - line-height: 0; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} -.form-horizontal .controls:first-child { - *padding-left: 180px; -} -.form-horizontal .help-block { - margin-bottom: 0; -} -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} -.form-horizontal .form-actions { - padding-left: 180px; -} -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} -.table { - width: 100%; - margin-bottom: 20px; -} -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table th { - font-weight: bold; -} -.table thead th { - vertical-align: bottom; -} -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #eee; -} -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #ddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.table-bordered th, -.table-bordered td { - border-left: 1px solid #ddd; -} -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; -} -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; -} -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; - border-bottom-left-radius: 0; -} -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; - border-bottom-right-radius: 0; -} -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; -} -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: #f5f5f5; -} -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} -.table tbody tr.success > td { - background-color: #dff0d8; -} -.table tbody tr.error > td { - background-color: #f8f0f0; -} -.table tbody tr.warning > td { - background-color: #fcf8e3; -} -.table tbody tr.info > td { - background-color: #d9edf7; -} -.table-hover tbody tr.success:hover > td { - background-color: #d0e9c6; -} -.table-hover tbody tr.error:hover > td { - background-color: #f0dfe0; -} -.table-hover tbody tr.warning:hover > td { - background-color: #faf2cc; -} -.table-hover tbody tr.info:hover > td { - background-color: #c4e3f3; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle { - *margin-bottom: -3px; -} -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - text-decoration: none; - color: #fff; - background-color: #770606; - background-image: -moz-linear-gradient(top, #810606, #690505); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#810606), to(#690505)); - background-image: -webkit-linear-gradient(top, #810606, #690505); - background-image: -o-linear-gradient(top, #810606, #690505); - background-image: linear-gradient(to bottom, #810606, #690505); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff810606', endColorstr='#ff690505', GradientType=0); -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - outline: 0; - background-color: #770606; - background-image: -moz-linear-gradient(top, #810606, #690505); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#810606), to(#690505)); - background-image: -webkit-linear-gradient(top, #810606, #690505); - background-image: -o-linear-gradient(top, #810606, #690505); - background-image: linear-gradient(to bottom, #810606, #690505); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff810606', endColorstr='#ff690505', GradientType=0); -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - cursor: default; -} -.open { - *z-index: 1000; -} -.open > .dropdown-menu { - display: block; -} -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000; - content: ""; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -.dropdown-submenu { - position: relative; -} -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} -.dropdown-submenu > a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #cccccc; - margin-top: 5px; - margin-right: -10px; -} -.dropdown-submenu:hover > a:after { - border-left-color: #fff; -} -.dropdown-submenu.pull-left { - float: none; -} -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} -.dropdown .dropdown-menu .nav-header { - padding-left: 20px; - padding-right: 20px; -} -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.btn { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding: 4px 12px; - margin-bottom: 0; - font-size: 14px; - line-height: 20px; - text-align: center; - vertical-align: middle; - cursor: pointer; - color: #333; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #ffffff, #eaeaea); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#eaeaea)); - background-image: -webkit-linear-gradient(top, #ffffff, #eaeaea); - background-image: -o-linear-gradient(top, #ffffff, #eaeaea); - background-image: linear-gradient(to bottom, #ffffff, #eaeaea); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeaeaea', GradientType=0); - border-color: #eaeaea #eaeaea #c4c4c4; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #eaeaea; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - border: 1px solid #ccc; - *border: 0; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *margin-left: .3em; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); -} -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333; - background-color: #eaeaea; - *background-color: #dddddd; -} -.btn:active, -.btn.active { - background-color: #d1d1d1 \9; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; - padding-left: 0; - padding-right: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} -.btn-primary { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #9e0707; - background-image: -moz-linear-gradient(top, #b20808, #810606); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b20808), to(#810606)); - background-image: -webkit-linear-gradient(top, #b20808, #810606); - background-image: -o-linear-gradient(top, #b20808, #810606); - background-image: linear-gradient(to bottom, #b20808, #810606); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb20808', endColorstr='#ff810606', GradientType=0); - border-color: #810606 #810606 #380303; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #810606; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #fff; - background-color: #810606; - *background-color: #690505; -} -.btn-primary:active, -.btn-primary.active { - background-color: #500404 \9; -} -.btn-warning { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #f89406; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #fff; - background-color: #f89406; - *background-color: #df8505; -} -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #bd362f; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #fff; - background-color: #bd362f; - *background-color: #a9302a; -} -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #51a351; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #fff; - background-color: #51a351; - *background-color: #499249; -} -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} -.btn-info { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #2f96b4; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #fff; - background-color: #2f96b4; - *background-color: #2a85a0; -} -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} -.btn-inverse { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - background-image: -moz-linear-gradient(top, #444, #222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444), to(#222)); - background-image: -webkit-linear-gradient(top, #444, #222); - background-image: -o-linear-gradient(top, #444, #222); - background-image: linear-gradient(to bottom, #444, #222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - border-color: #222 #222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #222; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #fff; - background-color: #222; - *background-color: #151515; -} -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-link { - border-color: transparent; - cursor: pointer; - color: #810606; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-link:hover, -.btn-link:focus { - color: #380303; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #333; - text-decoration: none; -} -.btn-group { - position: relative; - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - font-size: 0; - vertical-align: middle; - white-space: nowrap; - *margin-left: .3em; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - margin-left: 5px; -} -.btn-toolbar { - font-size: 0; - margin-top: 10px; - margin-bottom: 10px; -} -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group > .btn + .btn { - margin-left: -1px; -} -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} -.btn-group > .btn-mini { - font-size: 10.5px; -} -.btn-group > .btn-small { - font-size: 11.9px; -} -.btn-group > .btn-large { - font-size: 17.5px; -} -.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; -} -.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; -} -.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; -} -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-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); - -moz-box-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); - box-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); - *padding-top: 5px; - *padding-bottom: 5px; -} -.btn-group > .btn-mini + .dropdown-toggle { - padding-left: 5px; - padding-right: 5px; - *padding-top: 2px; - *padding-bottom: 2px; -} -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} -.btn-group > .btn-large + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; - *padding-top: 7px; - *padding-bottom: 7px; -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn-group.open .btn.dropdown-toggle { - background-color: #eaeaea; -} -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #810606; -} -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222; -} -.btn .caret { - margin-top: 8px; - margin-left: 0; -} -.btn-large .caret { - margin-top: 6px; -} -.btn-large .caret { - border-left-width: 5px; - border-right-width: 5px; - border-top-width: 5px; -} -.btn-mini .caret, -.btn-small .caret { - margin-top: 8px; -} -.dropup .btn-large .caret { - border-bottom-width: 5px; -} -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group-vertical > .btn + .btn { - margin-left: 0; - margin-top: -1px; -} -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.alert, -.alert h4 { - color: #c09853; -} -.alert h4 { - margin: 0; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #468847; -} -.alert-success h4 { - color: #468847; -} -.alert-danger, -.alert-error { - background-color: #f8f0f0; - border-color: #c6898b; - color: #b55457; -} -.alert-danger h4, -.alert-error h4 { - color: #b55457; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #3a87ad; -} -.alert-info h4 { - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 20px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li > a > img { - max-width: none; -} -.nav > .pull-right { - float: right; -} -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} -.nav li + .nav-header { - margin-top: 9px; -} -.nav-list { - padding-left: 15px; - padding-right: 15px; - 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, 0.5); -} -.nav-list > li > a { - padding: 3px 15px; -} -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #810606; -} -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.nav-tabs, -.nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; - line-height: 0; -} -.nav-tabs:after, -.nav-pills:after { - clear: both; -} -.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; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - margin-bottom: -1px; -} -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - border-color: #eee #eee #ddd; -} -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #555; - background-color: #eee; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #fff; - background-color: #810606; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.nav .dropdown-toggle .caret { - border-top-color: #810606; - border-bottom-color: #810606; - margin-top: 6px; -} -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #380303; - border-bottom-color: #380303; -} -/* move down carets for tabs */ -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #fff; - background-color: #999; - border-color: #999; -} -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #fff; - border-bottom-color: #fff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, -.tabbable:after { - display: table; - content: ""; - line-height: 0; -} -.tabbable:after { - clear: both; -} -.tab-content { - overflow: auto; -} -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} -.tab-content > .active, -.pill-content > .active { - display: block; -} -.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 { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} -.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-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #eee #ddd #eee #eee; -} -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #fff; -} -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #eee #eee #eee #ddd; -} -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #fff; -} -.nav > .disabled > a { - color: #999; -} -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - cursor: default; -} -.navbar { - overflow: visible; - margin-bottom: 20px; - *position: relative; - *z-index: 2; -} -.navbar-inner { - min-height: 40px; - padding-left: 20px; - padding-right: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - *zoom: 1; -} -.navbar-inner:before, -.navbar-inner:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-inner:after { - clear: both; -} -.navbar .container { - width: auto; -} -.nav-collapse.collapse { - height: auto; - overflow: visible; -} -.navbar .brand { - float: left; - display: block; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777; -} -.navbar-link { - color: #777; -} -.navbar-link:hover, -.navbar-link:focus { - color: #333; -} -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-left: 1px solid #f2f2f2; - border-right: 1px solid #ffffff; -} -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} -.navbar-search .search-query { - margin-bottom: 0; - padding: 4px 14px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.navbar-static-top { - position: static; - margin-bottom: 0; -} -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-left: 0; - padding-right: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; - width: 100%; - *width: 99.94680851%; - width: 926px; -} -.navbar-fixed-top { - top: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1); - -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1); - box-shadow: 0 1px 10px rgba(0,0,0,.1); -} -.navbar-fixed-bottom { - bottom: 0; -} -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1); - -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1); - box-shadow: 0 -1px 10px rgba(0,0,0,.1); -} -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} -.navbar .nav > li { - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - background-color: transparent; - color: #333; - text-decoration: none; -} -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #e5e5e5; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); -} -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #fff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.navbar .nav > li > .dropdown-menu: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, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .nav > li > .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - border-top: 7px solid #ccc; - border-top-color: rgba(0, 0, 0, 0.2); - border-bottom: 0; - bottom: -7px; - top: auto; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - border-top: 6px solid #fff; - border-bottom: 0; - bottom: -6px; - top: auto; -} -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #333; - border-bottom-color: #333; -} -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #e5e5e5; - color: #555; -} -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777; - border-bottom-color: #777; -} -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - left: auto; - right: 0; -} -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - left: auto; - right: 12px; -} -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - left: auto; - right: 13px; -} -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - left: auto; - right: 100%; - margin-left: 0; - margin-right: -1px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); - border-color: #252525; -} -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #fff; -} -.navbar-inverse .brand { - color: #999; -} -.navbar-inverse .navbar-text { - color: #999; -} -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - background-color: transparent; - color: #fff; -} -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #fff; - background-color: #111111; -} -.navbar-inverse .navbar-link { - color: #999; -} -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #fff; -} -.navbar-inverse .divider-vertical { - border-left-color: #111111; - border-right-color: #222222; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #111111; - color: #fff; -} -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999; - border-bottom-color: #999; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .navbar-search .search-query { - color: #fff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333; - text-shadow: 0 1px 0 #fff; - background-color: #fff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-inverse .btn-navbar { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #040404; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #fff; - background-color: #040404; - *background-color: #000000; -} -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - text-shadow: 0 1px 0 #fff; -} -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} -.breadcrumb > .active { - color: #999; -} -.pagination { - margin: 20px 0; -} -.pagination ul { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-left: 0; - margin-bottom: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} -.pagination ul > li { - display: inline; -} -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; - border-left-width: 0; -} -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999; - cursor: default; -} -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #999; - background-color: transparent; - cursor: default; -} -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -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; -} -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -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; -} -.pagination-centered { - text-align: center; -} -.pagination-right { - text-align: right; -} -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -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; -} -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -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; -} -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-top-left-radius: 3px; - -moz-border-radius-topleft: 3px; - border-top-left-radius: 3px; - -webkit-border-bottom-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - border-bottom-left-radius: 3px; -} -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - -moz-border-radius-topright: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - -moz-border-radius-bottomright: 3px; - border-bottom-right-radius: 3px; -} -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} -.pager { - margin: 20px 0; - list-style: none; - text-align: center; - *zoom: 1; -} -.pager:before, -.pager:after { - display: table; - content: ""; - line-height: 0; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #f5f5f5; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999; - background-color: #fff; - cursor: default; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #fff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; - outline: none; -} -.modal.fade { - -webkit-transition: opacity .3s linear, top .3s ease-out; - -moz-transition: opacity .3s linear, top .3s ease-out; - -o-transition: opacity .3s linear, top .3s ease-out; - transition: opacity .3s linear, top .3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 10%; -} -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} -.modal-header .close { - margin-top: 2px; -} -.modal-header h3 { - margin: 0; - line-height: 30px; -} -.modal-body { - position: relative; - overflow-y: auto; - max-height: 400px; - padding: 15px; -} -.modal-form { - margin-bottom: 0; -} -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #fff; - -moz-box-shadow: inset 0 1px 0 #fff; - box-shadow: inset 0 1px 0 #fff; - *zoom: 1; -} -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; - line-height: 0; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.tooltip { - position: absolute; - z-index: 1030; - display: block; - visibility: visible; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -3px; - padding: 5px 0; -} -.tooltip.right { - margin-left: 3px; - padding: 0 5px; -} -.tooltip.bottom { - margin-top: 3px; - padding: 5px 0; -} -.tooltip.left { - margin-left: -3px; - padding: 0 5px; -} -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; - line-height: 0; -} -.thumbnails:after { - clear: both; -} -.row-fluid .thumbnails { - margin-left: 0; -} -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #810606; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} -.thumbnail > img { - display: block; - max-width: 100%; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; - color: #555; -} -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #fff; - vertical-align: baseline; - white-space: nowrap; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #999; -} -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.badge { - padding-left: 9px; - padding-right: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} -.label:empty, -.badge:empty { - display: none; -} -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label-important, -.badge-important { - background-color: #b55457; -} -.label-important[href], -.badge-important[href] { - background-color: #954143; -} -.label-warning, -.badge-warning { - background-color: #f89406; -} -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} -.label-success, -.badge-success { - background-color: #468847; -} -.label-success[href], -.badge-success[href] { - background-color: #356635; -} -.label-info, -.badge-info { - background-color: #3a87ad; -} -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} -.label-inverse, -.badge-inverse { - background-color: #333; -} -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} -.btn-mini .label, -.btn-mini .badge { - top: 0; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 100%; - color: #fff; - float: left; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); -} -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.accordion { - margin-bottom: 20px; -} -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.accordion-heading { - border-bottom: 0; -} -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} -.accordion-toggle { - cursor: pointer; -} -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} -.carousel-inner { - overflow: hidden; - width: 100%; - position: relative; -} -.carousel-inner > .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.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: #fff; - text-align: center; - background: #222; - border: 3px solid #fff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.carousel-control.right { - left: auto; - right: 15px; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); - border-radius: 5px; -} -.carousel-indicators .active { - background-color: #fff; -} -.carousel-caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 15px; - background: #333; - background: rgba(0, 0, 0, 0.75); -} -.carousel-caption h4, -.carousel-caption p { - color: #fff; - line-height: 20px; -} -.carousel-caption h4 { - margin: 0 0 5px; -} -.carousel-caption p { - margin-bottom: 0; -} -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - color: inherit; - letter-spacing: -1px; -} -.hero-unit li { - line-height: 30px; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - background-color: #fff; - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - white-space: normal; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.popover-title:empty { - display: none; -} -.popover-content { - padding: 9px 14px; -} -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover .arrow { - border-width: 11px; -} -.popover .arrow:after { - border-width: 10px; - content: ""; -} -.popover.top .arrow { - left: 50%; - margin-left: -11px; - border-bottom-width: 0; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - bottom: -11px; -} -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-bottom-width: 0; - border-top-color: #fff; -} -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-left-width: 0; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); -} -.popover.right .arrow:after { - left: 1px; - bottom: -10px; - border-left-width: 0; - border-right-color: #fff; -} -.popover.bottom .arrow { - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - top: -11px; -} -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); -} -.popover.left .arrow:after { - right: 1px; - border-right-width: 0; - border-left-color: #fff; - bottom: -10px; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} -.affix { - position: fixed; -} -/*! - * Bootstrap Responsive v2.3.2 - * - * 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. - */ -@-ms-viewport { - width: device-width; -} -.hidden { - display: none; - visibility: hidden; -} -.visible-phone { - display: none !important; -} -.visible-tablet { - display: none !important; -} -.hidden-desktop { - display: none !important; -} -.visible-desktop { - display: inherit !important; -} -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - line-height: 0; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - line-height: 0; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.76243094%; - *margin-left: 2.70923945%; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.76243094%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851%; - } - .row-fluid .span11 { - width: 91.43646409%; - *width: 91.3832726%; - } - .row-fluid .span10 { - width: 82.87292818%; - *width: 82.81973669%; - } - .row-fluid .span9 { - width: 74.30939227%; - *width: 74.25620078%; - } - .row-fluid .span8 { - width: 65.74585635%; - *width: 65.69266486%; - } - .row-fluid .span7 { - width: 57.18232044%; - *width: 57.12912895%; - } - .row-fluid .span6 { - width: 48.61878453%; - *width: 48.56559304%; - } - .row-fluid .span5 { - width: 40.05524862%; - *width: 40.00205713%; - } - .row-fluid .span4 { - width: 31.49171271%; - *width: 31.43852122%; - } - .row-fluid .span3 { - width: 22.9281768%; - *width: 22.87498531%; - } - .row-fluid .span2 { - width: 14.36464088%; - *width: 14.31144939%; - } - .row-fluid .span1 { - width: 5.80110497%; - *width: 5.74791348%; - } - .row-fluid .offset12 { - margin-left: 105.52486188%; - *margin-left: 105.4184789%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243094%; - *margin-left: 102.65604796%; - } - .row-fluid .offset11 { - margin-left: 96.96132597%; - *margin-left: 96.85494299%; - } - .row-fluid .offset11:first-child { - margin-left: 94.19889503%; - *margin-left: 94.09251205%; - } - .row-fluid .offset10 { - margin-left: 88.39779006%; - *margin-left: 88.29140708%; - } - .row-fluid .offset10:first-child { - margin-left: 85.63535912%; - *margin-left: 85.52897614%; - } - .row-fluid .offset9 { - margin-left: 79.83425414%; - *margin-left: 79.72787116%; - } - .row-fluid .offset9:first-child { - margin-left: 77.0718232%; - *margin-left: 76.96544023%; - } - .row-fluid .offset8 { - margin-left: 71.27071823%; - *margin-left: 71.16433525%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729%; - *margin-left: 68.40190431%; - } - .row-fluid .offset7 { - margin-left: 62.70718232%; - *margin-left: 62.60079934%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138%; - *margin-left: 59.8383684%; - } - .row-fluid .offset6 { - margin-left: 54.14364641%; - *margin-left: 54.03726343%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121547%; - *margin-left: 51.27483249%; - } - .row-fluid .offset5 { - margin-left: 45.5801105%; - *margin-left: 45.47372752%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767956%; - *margin-left: 42.71129658%; - } - .row-fluid .offset4 { - margin-left: 37.01657459%; - *margin-left: 36.91019161%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414365%; - *margin-left: 34.14776067%; - } - .row-fluid .offset3 { - margin-left: 28.45303867%; - *margin-left: 28.3466557%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773%; - *margin-left: 25.58422476%; - } - .row-fluid .offset2 { - margin-left: 19.88950276%; - *margin-left: 19.78311978%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182%; - *margin-left: 17.02068884%; - } - .row-fluid .offset1 { - margin-left: 11.32596685%; - *margin-left: 11.21958387%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591%; - *margin-left: 8.45715293%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} -@media (max-width: 767px) { - body { - padding-left: 20px; - padding-right: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-left: -20px; - margin-right: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - clear: none; - width: auto; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - float: none; - display: block; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - left: 20px; - right: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-left: 10px; - padding-right: 10px; - } - .media .pull-left, - .media .pull-right { - float: none; - display: block; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - left: 10px; - right: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-left: 10px; - padding-right: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .nav > li > a:focus, - .nav-collapse .dropdown-menu a:hover, - .nav-collapse .dropdown-menu a:focus { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .nav > li > a:focus, - .navbar-inverse .nav-collapse .dropdown-menu a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:focus { - background-color: #111111; - } - .nav-collapse.in .btn-group { - margin-top: 5px; - padding: 0; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - float: none; - display: none; - max-width: none; - margin: 0 15px; - padding: 0; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - overflow: hidden; - height: 0; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-left: 10px; - padding-right: 10px; - } -} -@media (min-width: 979px + 1) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} -.break-word { - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.tag { - display: inline-block; - margin-bottom: 4px; - color: #111; - background-color: #f6f6f6; - padding: 1px 10px; - border: 1px solid #dddddd; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} -a.tag:hover { - text-decoration: none; - color: #fff; - background-color: #b20808; - border: 1px solid #810606; - -webkit-box-shadow: inset 0 1px 0 #e20b0b; - -moz-box-shadow: inset 0 1px 0 #e20b0b; - box-shadow: inset 0 1px 0 #e20b0b; -} -.pill { - display: inline-block; - background-color: #6f8890; - color: #FFF; - padding: 2px 10px 1px 10px; - margin-right: 5px; - font-weight: normal; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.pill a { - color: #FFF; -} -.pill a.remove { - font-size: 11px; -} -.unstyled { - margin: 0; - list-style: none; -} -.simple-item { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.simple-item:last-of-type { - border-bottom: 0; -} -.simple-list { - *zoom: 1; - margin: 0; - list-style: none; -} -.simple-list:before, -.simple-list:after { - display: table; - content: ""; - line-height: 0; -} -.simple-list:after { - clear: both; -} -.simple-list > li { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.simple-list > li:last-of-type { - border-bottom: 0; -} -.simple-list .ckan-icon { - position: relative; - top: 0px; -} -.module-narrow .simple-list > li { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.listing li { - text-align: right; - margin-bottom: 5px; -} -.listing .key { - clear: right; - font-weight: bold; -} -.js .tab-content { - display: none; -} -.js .tab-content.active { - display: block; -} -.box { - background-color: #FFF; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); -} -.module { - margin: 20px 0; -} -.module-heading { - *zoom: 1; - margin: 0; - padding: 7px 25px; - font-size: 14px; - line-height: 1.3; - background-color: #f6f6f6; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; -} -.module-heading:before, -.module-heading:after { - display: table; - content: ""; - line-height: 0; -} -.module-heading:after { - clear: both; -} -.module-content { - padding: 0 25px; - margin: 20px 0; -} -@media (min-width: 768px) { - .span9 div.module-content { - padding-left: 10px; - } -} -.module-content:first-child { - margin-top: 0; - padding-top: 20px; -} -.module-content:last-child { - margin-bottom: 0; - padding-bottom: 20px; -} -.module-content > :last-child { - margin-bottom: 0; -} -.module:first-child .module-heading { - -webkit-border-radius: 3px 0 0 0; - -moz-border-radius: 3px 0 0 0; - border-radius: 3px 0 0 0; - border-top-width: 0; -} -.module:last-child { - margin-bottom: 20px; -} -.module-footer { - padding: 7px 25px 7px; - margin: 0; - border-top: 1px dotted #ddd; -} -.module .read-more { - font-weight: bold; - color: #000; -} -.module-content .pagination { - margin-left: -25px; - margin-right: -25px; - margin-bottom: -20px; -} -.module .pagination > ul { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - border: 0; -} -.module .pagination li a { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - padding-top: 7px; - padding-bottom: 7px; -} -.module .pagination li:first-child a, -.module .pagination li:last-child a { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.module-content-shallow { - padding: 0; - margin-top: 10px; - padding-bottom: 10px; -} -.module h1 { - margin-bottom: 20px; -} -.module-shallow .module-content { - padding: 10px; - margin: 0; -} -.module-shallow .module-tags { - margin-top: 0; - margin-bottom: 0; -} -.module-shallow .module-content:first-child { - padding-top: 10px; -} -.module-shallow .module-content:last-child { - padding-bottom: 10px; -} -.module-narrow .module-heading, -.module-narrow .module-content, -.module-narrow .module-footer { - padding-left: 15px; - padding-right: 15px; -} -.module-grid { - margin: 0; - list-style: none; - *zoom: 1; - margin: 0 -25px; - padding-bottom: 15px; - background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; - border-width: 1px 0; -} -.module-grid:before, -.module-grid:after { - display: table; - content: ""; - line-height: 0; -} -.module-grid:after { - clear: both; -} -.module-item { - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - float: left; - margin-left: 20px; - width: 460px; - padding-top: 10px; - padding-bottom: 10px; - padding-right: 50px; - overflow: hidden; - position: relative; -} -.module-item span.count { - color: #999; -} -.module-item .media-image { - margin-bottom: 5px; -} -.module-item .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; -} -.module-item:hover { - z-index: 1; -} -.module-item:hover .media-edit { - opacity: 1; -} -.module-item.first { - clear: left; -} -.group .content img { - margin: 0 -5px 5px; - max-width: initial; -} -.group .content h3 { - font-size: 14px; - line-height: 1.3; -} -.group-listing { - margin-left: -20px; -} -.ckanext-datapreview { - position: relative; - clear: both; - padding-top: 15px; - margin-top: 0; -} -.ckanext-datapreview > iframe { - min-height: 650px; -} -.ckanext-datapreview > img { - max-height: 500px; - max-width: 100%; - overflow: hidden; -} -.package-info h4 { - margin-bottom: 10px; -} -.module-resource { - background-color: #fff; - border-bottom: 1px solid #ddd; - margin-top: 0; - margin-bottom: 0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.module-resource .actions { - position: relative; - float: right; - top: -10px; - right: -15px; -} -.module .module-tags { - padding-bottom: 8px; -} -.secondary .module:first-child, -.primary .module:first-child { - margin-top: 0; -} -.no-nav .module:last-child { - margin-top: 0; -} -.module-image { - float: left; - width: 50px; - height: 50px; - line-height: 50px; - text-align: center; - margin-right: 15px; -} -.module-image img { - max-width: 50px; - max-height: 50px; - vertical-align: middle; -} -.banner { - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - -webkit-transform-origin: center center; - -moz-transform-origin: center center; - -ms-transform-origin: center center; - -o-transform-origin: center center; - transform-origin: center center; - position: absolute; - top: 15px; - right: -35px; - width: 80px; - color: #fff; - background-color: #810606; - padding: 1px 20px; - font-size: 11px; - text-align: center; - text-transform: uppercase; -} -.media-grid { - margin: 0; - list-style: none; - *zoom: 1; - margin: 0 -25px; - padding-bottom: 15px; - background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; - border-width: 1px 0; -} -.media-grid:before, -.media-grid:after { - display: table; - content: ""; - line-height: 0; -} -.media-grid:after { - clear: both; -} -@media (min-width: 768px) { - .media-grid { - margin-left: -27px; - } - .module-content .wide .media-grid { - margin-left: -25px; - } -} -.media-item { - position: relative; - float: left; - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.media-item span.count { - color: #999; -} -.media-item .media-image { - margin-bottom: 5px; -} -.media-item .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; -} -.media-item:hover { - z-index: 1; -} -.media-item:hover .media-edit { - opacity: 1; -} -.media-view { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: 1px solid #ddd; - overflow: hidden; - -webkit-transition: all 0.2s ease-in; - -moz-transition: all 0.2s ease-in; - -o-transition: all 0.2s ease-in; - transition: all 0.2s ease-in; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.media-view:hover, -.media-view.hovered { - border-color: #810606; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); -} -.media-view:hover .banner, -.media-view.hovered .banner { - background-color: #810606; -} -.media-view span { - display: none; -} -.media-view .banner { - display: block; - background-color: #b7b7b7; - -webkit-transition: background-color 0.2s ease-in; - -moz-transition: background-color 0.2s ease-in; - -o-transition: background-color 0.2s ease-in; - transition: background-color 0.2s ease-in; -} -.media-image { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.media-heading { - font-size: 18px; - line-height: 1.3; - margin: 5px 0; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.media-overlay { - position: relative; - min-height: 35px; -} -.media-overlay .media-heading { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 12px 10px; - margin: 0; - background-color: #000; - background-color: rgba(0, 0, 0, 0.8); - font-size: 13px; - color: #fff; - z-index: 1; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.media-overlay .media-image { - float: none; - display: block; - margin-right: 0; -} -.media-item.is-expander .truncator-link { - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; - position: absolute; - z-index: 10; - left: 15px; - bottom: 15px; - opacity: 0; -} -.media-item.is-expander:hover { - padding-bottom: 35px; -} -.media-item.is-expander:hover .truncator-link { - opacity: 1; -} -.wide .media-item { - width: 186px; -} -.nav-simple, -.nav-aside { - *zoom: 1; - margin: 0; - list-style: none; - padding-bottom: 0; -} -.nav-simple:before, -.nav-aside:before, -.nav-simple:after, -.nav-aside:after { - display: table; - content: ""; - line-height: 0; -} -.nav-simple:after, -.nav-aside:after { - clear: both; -} -.nav-simple > li, -.nav-aside > li { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.nav-simple > li:last-of-type, -.nav-aside > li:last-of-type { - border-bottom: 0; -} -.nav-simple .ckan-icon, -.nav-aside .ckan-icon { - position: relative; - top: 0px; -} -.nav-aside { - border-top: 1px dotted #DDD; - border-bottom: 1px dotted #DDD; - margin-bottom: 15px; -} -.nav-item > a, -.nav-aside li a { - color: #333; - font-size: 14px; - line-height: 20px; - margin: -7px -25px; - padding: 7px 25px; -} -.nav-item.active, -.nav-aside li.active { - background-color: #f6f6f6; -} -.nav-item.active > a, -.nav-aside li.active a { - position: relative; - color: #FFF; - background-color: #8CA0A6; -} -.nav-item.active > a:hover, -.nav-aside li.active a:hover { - color: #FFF; - background-color: #8CA0A6; -} -@media (min-width: 768px) { - .nav-item.active > a:before, - .nav-aside li.active a:before { - content: ' '; - position: absolute; - top: 0; - right: -6px; - width: 6px; - height: 34px; - background-image: url("../../../base/images/nav-active.png?1"); - } -} -.nav-item.active > a span, -.nav-aside li.active a span { - white-space: nowrap; - overflow: hidden; - display: block; -} -.module-narrow .nav-item > a, -.module-narrow .nav-aside li a { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.module-narrow .nav-item.image, -.module-narrow .nav-aside li.image { - position: relative; -} -.module-narrow .nav-item.image > a, -.module-narrow .nav-aside li.image a { - padding-left: 42px; - padding-right: 42px; -} -.module-narrow .nav-item.image > img, -.module-narrow .nav-aside li.image img { - position: absolute; - top: 50%; - left: 15px; - width: 20px; - height: 20px; - margin-top: -10px; - z-index: 2; -} -.nav-facet .nav-item > a:hover:after, -.nav-facet .nav-item.active > a:after { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} -.nav-facet .nav-item > a:hover:after { - width: 17px; - height: 17px; - background-position: -17px -16px; -} -.nav-facet .nav-item.active > a:after { - width: 17px; - height: 17px; - background-position: 0px -16px; - right: 3px; -} -.user-list { - margin: 0; - list-style: none; -} -.user-list li { - margin: 0 0 10px 0; -} -.user-list .gravatar { - vertical-align: -4px; - margin-right: 3px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.nav-facet-tertiary { - margin: 10px 0; -} -.nav-facet-tertiary .module-heading { - margin-bottom: 5px; - padding: 8px 12px; - border-bottom-width: 0; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-facet-tertiary .module-heading i { - display: none; -} -.nav-facet-tertiary .module-footer { - padding: 8px 12px; - border-top-width: 0; -} -.nav-facet-tertiary .module-footer a { - font-weight: normal; - color: #8C8C8C; -} -.nav-facet-tertiary .nav { - margin-bottom: 0; -} -.nav-facet-tertiary .module-content.empty { - padding: 8px 12px; - margin-top: 0; -} -.nav-facet-tertiary .nav li.active { - position: relative; -} -.nav-facet-tertiary .nav li.active > a:hover:after, -.nav-facet-tertiary .nav li.active > a:after { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - width: 17px; - height: 17px; - background-position: 0px -16px; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} -.nav-simple > .nav-btn { - padding-left: 0; - padding-right: 0; - text-align: center; -} -.nav-simple > .nav-btn .btn { - display: inline-block; -} -.js .js-hide { - display: none; -} -.js .js-hide.active { - display: block; -} -.btn, -label { - font-weight: bold; -} -.btn-rounded { - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - padding-left: 15px; - padding-right: 15px; -} -label { - cursor: pointer; - font-size: 14px; -} -label:after { - content: ":"; -} -label.radio:after, -label.checkbox:after { - content: ""; -} -input[type=radio], -input[type=checkbox] { - position: relative; - top: 7px; - padding: 0; - margin: 0; -} -input[type=radio].checkbox-onown, -input[type=checkbox].checkbox-onown { - top: 0; -} -select { - padding: 4px; -} -textarea { - max-width: 100%; -} -.control-group .btn { - position: relative; - top: -2px; -} -.control-full input, -.control-full select, -.control-full textarea { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - height: auto; - width: 100%; -} -.control-medium input, -.control-medium select, -.control-medium textarea { - width: 320px; -} -@media (max-width: 768px) { - .control-medium input, - .control-medium select, - .control-medium textarea { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 28px; - } -} -.control-large input, -.control-large .control-label { - font-size: 17.5px; - line-height: 30px; -} -.control-large input { - height: 41px; -} -.control-required { - color: #c6898b; -} -.form-actions .control-required-message { - float: left; - margin-left: 20px; - margin-bottom: 0; - line-height: 30px; -} -.form-actions .control-required-message:first-child { - margin-left: 0; -} -.form-actions { - background: none; - margin-left: -25px; - margin-right: -25px; - margin-bottom: 0; - padding-bottom: 0; -} -@media (min-width: 768px) { - .form-actions { - text-align: right; - } -} -.form-actions .action-info { - line-height: 2; - text-align: left; - color: #707070; - margin: 0; -} -@media (min-width: 768px) { - .form-actions .action-info { - float: left; - width: 50%; - } -} -.form-actions .action-info.small { - font-size: 11px; - line-height: 1.2; -} -@media (max-width: 768px) { - .form-actions .btn { - margin-top: 5px; - } -} -.form-horizontal .control-label { - width: 120px; -} -@media (min-width: 768px) { - .form-horizontal .controls { - margin-left: 130px; - } -} -.form-horizontal .info-block { - position: relative; - display: block; - font-size: 11px; - color: #aaa; - line-height: 1.3; - margin-top: 6px; -} -.form-horizontal .info-help { - padding: 6px 0; -} -.form-horizontal .info-help:before { - display: none; -} -.form-horizontal .info-help-tight { - margin-top: -10px; -} -@media (min-width: 980px) { - .form-horizontal .info-block { - padding: 6px 0 6px 0; - } - .form-horizontal .info-inline { - float: right; - width: 265px; - margin-top: 0; - padding-bottom: 0; - } -} -.form-horizontal .control-medium .info-block.info-inline { - width: 165px; -} -.form-horizontal .info-block:before { - font-size: 2.2em; - position: absolute; - left: 0; - top: 2px; -} -.form-horizontal .info-inline:before { - top: 8px; -} -.info-block .icon-large, -.info-inline .icon-large { - float: left; - font-size: 22px; - margin-right: 15px; -} -.form-horizontal .info-block a { - color: #aaa; - text-decoration: underline; -} -.form-horizontal .form-actions { - padding-left: 25px; - padding-right: 25px; -} -.form-inline input { - padding-bottom: 9px; -} -.form-inline select { - margin-top: 0; -} -.form-inline .btn { - margin-left: 5px; -} -.form-narrow label { - margin-bottom: 0; -} -.form-narrow select { - width: 100%; -} -.form-narrow .form-actions { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px 0; -} -.form-select label { - margin-right: 5px; -} -.simple-input label, -.simple-input button { - display: none; -} -.simple-input .field { - position: relative; -} -.simple-input .field-bordered { - border-bottom: 1px dotted #ddd; -} -.simple-input .field input { - width: 100%; - height: auto; - margin: 0 -7px; - padding: 7px 5px; -} -.simple-input .field .btn-search { - position: absolute; - display: block; - height: 17px; - width: 17px; - padding: 0; - top: 50%; - right: 0; - margin-top: -10px; - background-color: transparent; - border: none; - color: #999; - -webkit-transition: color 0.2s ease-in; - -moz-transition: color 0.2s ease-in; - -o-transition: color 0.2s ease-in; - transition: color 0.2s ease-in; -} -.simple-input .field .btn-search:hover { - color: #000; -} -.editor textarea { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - border-bottom: none; -} -.editor .editor-info-block { - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - display: block; - float: none; - padding: 4px 10px; - background: #ebebeb; - width: auto; - border: 1px solid #ccc; - border-top: none; - font-size: 11px; - color: #282828; -} -.editor .editor-info-block a { - color: #810606; - text-decoration: none; -} -@media (max-width: 768px) { - [data-module="custom-fields"] .input-prepend .add-on { - display: block; - } -} -@media (max-width: 480px) { - [data-module="custom-fields"] .input-prepend { - width: 100%; - } - [data-module="custom-fields"] .control-custom input { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 28px; - } -} -.control-custom { - font-size: 0; -} -.control-custom label { - margin-bottom: 0; -} -.control-custom input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - width: 140px; -} -.control-custom input:last-of-type { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.control-custom .checkbox { - display: inline-block; - margin-left: 5px; -} -.control-custom .checkbox input { - width: auto; -} -.control-custom.disabled label, -.control-custom.disabled input { - color: #aaa; - text-decoration: line-through; - text-shadow: none; -} -.control-custom.disabled input { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - background-color: #f3f3f3; -} -.control-custom.disabled .checkbox { - color: #444; - text-decoration: none; -} -.control-custom .checkbox.btn { - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; - position: relative; - top: 0; - left: 5px; - height: 1px; - width: 9px; - padding: 3px 8px; - line-height: 18px; -} -.control-custom .checkbox.btn span { - display: none; - width: 30px; -} -.control-custom .checkbox.btn:before { - position: relative; - top: 1px; - left: -1px; - color: #fff; -} -.control-custom .checkbox.btn input { - display: none; -} -.control-custom.disabled .checkbox.btn { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #9e0707; - background-image: -moz-linear-gradient(top, #b20808, #810606); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b20808), to(#810606)); - background-image: -webkit-linear-gradient(top, #b20808, #810606); - background-image: -o-linear-gradient(top, #b20808, #810606); - background-image: linear-gradient(to bottom, #b20808, #810606); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb20808', endColorstr='#ff810606', GradientType=0); - border-color: #810606 #810606 #380303; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #810606; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.control-custom.disabled .checkbox.btn:hover, -.control-custom.disabled .checkbox.btn:focus, -.control-custom.disabled .checkbox.btn:active, -.control-custom.disabled .checkbox.btn.active, -.control-custom.disabled .checkbox.btn.disabled, -.control-custom.disabled .checkbox.btn[disabled] { - color: #fff; - background-color: #810606; - *background-color: #690505; -} -.control-custom.disabled .checkbox.btn:active, -.control-custom.disabled .checkbox.btn.active { - background-color: #500404 \9; -} -.control-custom.disabled .checkbox.btn .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.alert-danger a, -.alert-error a { - color: #b55457; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea, -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - border-color: #c6898b; -} -.error-inline { - color: #b55457; -} -.error-block, -.error-inline { - font-size: 12px; -} -.error-block { - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - display: block; - padding: 6px 8px 3px; - background: #c6898b; - margin: -3px 0 0; - color: #fff; - width: 208px; -} -.control-medium .error-block { - width: 318px; -} -.control-full .error-block { - width: auto; -} -.control-group.error .input-prepend .error-block, -.control-custom.error .error-block { - width: auto; -} -.control-custom.error .error-block { - width: 401px; -} -.control-select.error .error-block { - width: 196px; -} -.stages { - margin: 0; - list-style: none; - *zoom: 1; - color: #aeaeae; - counter-reset: stage; - margin: -20px -25px 20px; - overflow: hidden; -} -.stages:before, -.stages:after { - display: table; - content: ""; - line-height: 0; -} -.stages:after { - clear: both; -} -.stages li { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - line-height: 27px; - counter-increment: stage; - width: 50%; - background-color: #EDEDED; - float: left; - padding: 10px 20px; - position: relative; - z-index: 0; -} -.stages li:before { - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; - content: counter(stage); - display: inline-block; - width: 27px; - height: 27px; - margin-right: 5px; - font-weight: bold; - text-align: center; - color: #fff; - background-color: #aeaeae; - z-index: 1; -} -.stages li:after { - left: 0; - border: solid rgba(237, 237, 237, 0); - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-top-color: #EDEDED; - border-bottom-color: #EDEDED; - border-width: 29px; - top: 50%; - margin-top: -29px; - margin-left: -30px; -} -.stages li.last { - position: relative; - right: -1px; -} -.stages li.last, -.stages li.last .highlight { - -webkit-border-radius: 0 3px 0 0; - -moz-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0; -} -.stages li.first:after { - content: none; - border: none; -} -.stages li.active:after { - border-color: rgba(140, 198, 138, 0); - border-top-color: #8cc68a; - border-bottom-color: #8cc68a; -} -.stages li.complete:after { - border-color: rgba(197, 226, 196, 0); - border-top-color: #c5e2c4; - border-bottom-color: #c5e2c4; -} -.stages.stage-3 li.complete:first-child:after { - content: none; -} -.stages li.active, -.stages li.complete { - background: none; -} -.stages li.active:before { - color: #8cc68a; - background: #fff; -} -.stages li.complete:before { - color: #c5e2c4; - background: #eef6ed; -} -.stages li .highlight { - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - width: 100%; - padding: 10px 52px; - border: none; - text-align: left; - text-decoration: none; - line-height: 27px; - z-index: -1; -} -@media (max-width: 768px) { - .stages li .highlight { - text-indent: -9999px; - } -} -.stages li.active .highlight { - color: #fff; - background: #8cc68a; -} -.stages li.complete .highlight { - color: #eef6ed; - background: #c5e2c4; -} -.alert > :last-child { - margin-bottom: 0; -} -.slug-preview { - font-size: 14px; - line-height: 1.5; - margin-top: 5px; - margin-left: 10px; -} -.slug-preview-value { - background-color: #faedcf; - margin-right: 3px; -} -.resource-upload-field { - position: relative; - overflow: hidden; - display: inline-block; - vertical-align: bottom; -} -.resource-upload-field label { - z-index: 0; -} -.resource-upload-field input { - opacity: 0; - filter: alpha(opacity=0); - position: absolute; - top: 0; - right: 0; - z-index: 1; - margin: 0; - border: solid transparent; - border-width: 100px 0 0 200px; - cursor: pointer; - direction: ltr; - -moz-transform: translate(-300px, 0) scale(4); -} -.resource-upload-field.loading { - display: inline-block; - background: url("../../../base/images/loading-spinner.gif") no-repeat center right; - padding-right: 5px; -} -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - font-size: 14px; -} -.select2-container-multi .select2-choices .select2-search-field input { - height: 29px; -} -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - padding-left: 10px; -} -.select2-container { - margin-top: 1px; -} -.select2-container-multi { - margin-top: 0; -} -.select2-container-multi .select2-choices .select2-search-choice { - padding: 5px 8px 5px 22px; -} -.select2-container-multi.select2-container .select2-choices { - padding-top: 3px; - padding-bottom: 3px; -} -.select2-search-choice-close, -.select2-container-multi .select2-search-choice-close { - top: 6px; - left: 5px; -} -.select2-container-multi .select2-choices { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; - background-color: #fff; - border: 1px solid #ccc; -} -.select2-container-active .select2-choices, -.select2-container-multi.select2-container-active .select2-choices { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -.select2-container-multi .select2-drop { - margin-top: -2px; -} -.select2-container .select2-results li { - line-height: 18px; - padding-top: 4px; - padding-bottom: 4px; -} -.control-full .select2-container { - max-width: 100%; -} -.control-group.error .select2-container input:focus, -.control-group.error .select2-container select:focus, -.control-group.error .select2-container textarea:focus { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.js .image-upload #field-image-url { - padding-right: 90px; -} -.js .image-upload #field-image-upload { - cursor: pointer; - position: absolute; - z-index: 1; - opacity: 0; - filter: alpha(opacity=0); -} -.js .image-upload .controls { - position: relative; -} -.js .image-upload .btn { - position: relative; - top: 0; - margin-right: 10px; -} -.js .image-upload .btn.hover { - color: #333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.js .image-upload .btn-remove-url { - position: absolute; - margin-right: 0; - top: 4px; - right: 5px; - padding: 0 12px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.js .image-upload .btn-remove-url .icon-remove { - margin-right: 0; -} -.add-member-form .control-label { - width: 100%; - text-align: left; -} -.add-member-form .controls { - margin-left: auto; -} -.add-member-or { - float: left; - margin-top: 75px; - width: 7%; - text-align: center; - text-transform: uppercase; - color: #999; - font-weight: bold; -} -.add-member-form .row-fluid .control-group { - float: left; - width: 45%; -} -.add-member-form .row-fluid .select2-container, -.add-member-form .row-fluid input { - width: 100% !important; -} -#recaptcha_table { - table-layout: inherit; - line-height: 1; -} -.dataset-item { - border-bottom: 1px dotted #ddd; - padding-bottom: 20px; - margin-bottom: 20px; -} -@media (max-width: 768px) { - .dataset-item { - word-wrap: break-word; - } -} -.dataset-item:last-of-type { - border-bottom: none; - margin-bottom: 0; - padding-bottom: 0; -} -.dataset-heading { - font-size: 16px; - margin-top: 0; - margin-bottom: 8px; - line-height: 1.3; -} -.dataset-heading a { - color: #333; -} -.dataset-heading .label { - position: relative; - top: -1px; -} -.dataset-private { - margin-right: 10px; - text-transform: uppercase; -} -.dataset-private .icon-lock { - width: 9px; -} -.dataset-private.pull-right { - margin-right: 0; -} -.dataset-resources { - margin-top: 8px; -} -.dataset-resources li { - display: inline; -} -.dataset-resources li a { - background-color: #aaa; -} -.dataset-heading .popular { - top: 0; -} -.resource-list { - margin: 0; - list-style: none; - margin: -10px -10px 10px -10px; -} -.resource-item { - position: relative; - padding: 10px 10px 10px 60px; - margin-bottom: 0px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.resource-item:hover { - background-color: #eee; -} -.resource-item .heading { - color: #000; - font-size: 14px; - font-weight: bold; -} -.resource-item .format-label { - position: absolute; - top: 10px; - left: 10px; -} -.resource-item .description { - font-size: 12px; - margin-bottom: 0; - min-height: 12px; -} -.resource-item .btn-group { - position: absolute; - top: 14px; - right: 10px; -} -@media (max-width: 768px) { - .resource-item .btn-group { - display: none; - } -} -.resource-list.reordering .resource-item { - border: 1px solid #ddd; - margin-bottom: 10px; - cursor: move; -} -.resource-list.reordering .resource-item .handle { - display: block; - position: absolute; - color: #888; - left: -31px; - top: 50%; - margin-top: -15px; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - border: 1px solid #ddd; - border-width: 1px 0 1px 1px; - background-color: #fff; - -webkit-border-radius: 20px 0 0 20px; - -moz-border-radius: 20px 0 0 20px; - border-radius: 20px 0 0 20px; -} -.resource-list.reordering .resource-item .handle:hover { - text-decoration: none; -} -.resource-list.reordering .resource-item:hover .handle { - background-color: #eee; -} -.resource-list.reordering .resource-item.ui-sortable-helper { - background-color: #eee; - border: 1px solid #810606; -} -.resource-list.reordering .resource-item.ui-sortable-helper .handle { - background-color: #eee; - border-color: #810606; - color: #333; -} -.resource-item .handle { - display: none; -} -.tag-list { - margin: 0; - list-style: none; - padding: 10px 10px 5px 10px; -} -.tag-list li { - display: inline-block; - margin-right: 5px; -} -.tag-list li:last-child { - margin-right: 0; -} -.additional-info td, -.additional-info th { - width: 50%; -} -.label[data-format=html], -.label[data-format*=html] { - background-color: #55a1ce; -} -.label[data-format=json], -.label[data-format*=json] { - background-color: #ef7100; -} -.label[data-format=xml], -.label[data-format*=xml] { - background-color: #ef7100; -} -.label[data-format=text], -.label[data-format*=text] { - background-color: #74cbec; -} -.label[data-format=csv], -.label[data-format*=csv] { - background-color: #dfb100; -} -.label[data-format=xls], -.label[data-format*=xls] { - background-color: #2db55d; -} -.label[data-format=zip], -.label[data-format*=zip] { - background-color: #686868; -} -.label[data-format=api], -.label[data-format*=api] { - background-color: #ec96be; -} -.label[data-format=pdf], -.label[data-format*=pdf] { - background-color: #e0051e; -} -.label[data-format=rdf], -.label[data-format*=rdf], -.label[data-format*=nquad], -.label[data-format*=ntriples], -.label[data-format*=turtle] { - background-color: #0b4498; -} -.view-list { - margin: 0; - list-style: none; -} -.view-list li { - position: relative; - margin-bottom: 10px; -} -.view-list li a { - display: block; - min-height: 50px; - padding: 10px; - border: 1px solid #ddd; - overflow: hidden; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.view-list li a .icon { - float: left; - width: 50px; - height: 50px; - overflow: hidden; - margin-right: 10px; - color: #444; - background-color: #eee; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.view-list li a .icon i { - display: block; - text-align: center; - font-size: 28px; - line-height: 50px; -} -.view-list li a h3 { - color: #000; - font-weight: bold; - font-size: 16px; - margin: 0 0 3px 0; -} -.view-list li a p { - margin: 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - color: #444; -} -.view-list li a.active, -.view-list li a:hover { - text-decoration: none; - border-color: #810606; -} -.view-list li a.active .icon, -.view-list li a:hover .icon { - background-color: #810606; - color: #f6f6f6; -} -.view-list li .arrow { - position: absolute; - display: none; - border: 8px solid transparent; - border-top-color: #810606; - left: 50%; - bottom: -15px; - margin-left: -4px; -} -.view-list li.active a { - text-decoration: none; - border-color: #810606; -} -.view-list li.active a .icon { - background-color: #810606; - color: #f6f6f6; -} -.view-list li.active .arrow { - display: block; -} -.view-list.stacked { - overflow-y: hidden; - overflow-x: auto; - height: 100px; - white-space: nowrap; -} -.view-list.stacked li { - display: inline-block; - width: 250px; - margin-right: 10px; -} -.view-list.stacked li:last-child { - margin-right: 0; -} -.view-list.stacked::-webkit-scrollbar { - width: 7px; - height: 7px; -} -.view-list.stacked::-webkit-scrollbar-track { - border-radius: 10px; - background-color: #f6f6f6; -} -.view-list.stacked::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color: #c3c3c3; -} -.view-list.stacked::-webkit-scrollbar-thumb:hover { - background-color: #810606; -} -.resource-view { - margin-top: 20px; -} -.search-form { - margin-bottom: 20px; - padding-bottom: 25px; - border-bottom: 1px dotted #ddd; -} -.search-form .search-input { - position: relative; - margin-bottom: 20px; -} -.search-form .search-input input { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - width: 100%; - height: auto; -} -.search-form .search-input button { - cursor: pointer; - display: block; - position: absolute; - top: 50%; - margin-top: 1px; - right: 10px; - height: 20px; - padding: 0; - border: none; - background: transparent; -} -.search-form .search-input button span { - display: none; -} -.search-form .search-input button i { - color: #ccc; - -webkit-transition: color 0.2s ease-in; - -moz-transition: color 0.2s ease-in; - -o-transition: color 0.2s ease-in; - transition: color 0.2s ease-in; -} -.search-form .search-input button:hover i { - color: #000; -} -.search-form .search-input.search-giant input { - font-size: 16px; - padding: 15px; -} -.search-form .search-input.search-giant button { - margin-top: -4px; - right: 15px; - height: 30px; -} -.search-form .search-input.search-giant button i { - font-size: 28px; - width: 28px; -} -.search-form .control-order-by label, -.search-form .control-order-by select { - display: inline; -} -.search-form .control-order-by select { - width: 160px; - margin: 0; -} -.search-form h2 { - font-size: 24px; - line-height: 1.3; - color: #000; - margin-bottom: 0; - margin-top: 20px; -} -.search-form .filter-list { - color: #444; - line-height: 32px; - margin: 10px 0 0 0; -} -.search-form .filter-list .pill { - line-height: 21px; -} -.search-form .filter-list .extra { - margin-top: 10px; - font-size: 18px; - font-weight: normal; - color: #000; -} -.search-form.no-bottom-border { - border-bottom-width: 0; - margin-bottom: 0; -} -.tertiary .control-order-by { - float: none; - margin: 0; -} -.tertiary .control-order-by label { - display: block; - margin-bottom: 5px; - font-weight: normal; - font-size: 12px; -} -.tertiary .control-order-by select { - display: block; - font-size: 12px; - width: 100%; -} -.tertiary .search-input { - margin-bottom: 10px; -} -@media (min-width: 980px) { - .search-form .control-order-by { - float: right; - margin-left: 15px; - } - .tertiary .search-form .control-order-by { - float: none; - margin: 0; - } -} -.group .media-vertical .image { - margin: 0 -5px 5px; -} -.group-list:nth-child(odd) { - clear: left; -} -.group-list .module-heading { - padding-top: 15px; - padding-bottom: 15px; -} -.group-list .dataset-content { - min-height: 54px; -} -.group-list .module-heading h3 { - margin-bottom: 2px; -} -.group-list .module-heading h3 a { - color: #333; -} -.group-list .module-heading .media-image { - overflow: hidden; - max-height: 60px; -} -.group-list .module-heading .media-image img { - max-width: 85px; -} -.toolbar { - *zoom: 1; - position: relative; - margin-bottom: 10px; - padding: 5px 0; -} -.toolbar:before, -.toolbar:after { - display: table; - content: ""; - line-height: 0; -} -.toolbar:after { - clear: both; -} -.page_primary_action { - margin-bottom: 20px; -} -.toolbar .breadcrumb { - *zoom: 1; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - position: relative; - float: left; - margin: 0; - padding: 0; - border: none; - background: none; - font-size: 20px; - line-height: 1.3; -} -.toolbar .breadcrumb:before, -.toolbar .breadcrumb:after { - display: table; - content: ""; - line-height: 0; -} -.toolbar .breadcrumb:after { - clear: both; -} -.toolbar .breadcrumb li:after { - content: " / "; -} -.toolbar .breadcrumb li.active:after { - content: ""; -} -.toolbar .breadcrumb li:last-of-type:after { - content: ""; -} -.toolbar .home a { - text-decoration: none; -} -.toolbar .home span { - display: none; -} -.toolbar .breadcrumb a { - color: #505050; -} -@media (max-width: 767px) { - .toolbar .breadcrumb { - color: #fff; - text-shadow: none; - } - .toolbar .breadcrumb .home { - display: none; - } - .toolbar .breadcrumb a { - color: #fff; - text-shadow: none; - } -} -.toolbar .breadcrumb .active a, -.toolbar .breadcrumb a.active { - font-weight: bold; -} -.actions { - margin: 0; - list-style: none; - position: absolute; - top: 10px; - right: 10px; - z-index: 1; -} -.actions li { - display: inline-block; - margin-right: 5px; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.actions li:last-of-type { - margin-right: 0; -} -.hide-heading { - display: none; -} -.page-header { - *zoom: 1; - border-bottom: 1px solid #ddd; - background-color: #f6f6f6; - -webkit-border-radius: 0 3px 0 0; - -moz-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0; -} -.page-header:before, -.page-header:after { - display: table; - content: ""; - line-height: 0; -} -.page-header:after { - clear: both; -} -.page-header .nav-tabs { - float: left; - margin-bottom: -1px; -} -.page-header .nav-tabs li.active a, -.page-header .nav-tabs a:hover { - background-color: #fff; -} -.page-header .content_action { - float: right; - margin-top: -5px; - margin-right: -7px; -} -.no-nav .page-header { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.nav-tabs-plain { - padding: 0 25px; -} -.nav-tabs-plain > .active > a, -.nav-tabs-plain > .active > a:hover { - background-color: #fff; -} -@media (min-width: 768px) { - .span9 .page-header { - margin-left: -17px; - } -} -@media (max-width: 768px) { - .page-header .nav-tabs { - margin: 5px 10px 10px -5px; - border: none; - } - .page-header .nav-tabs > li { - float: none; - } - .page-header .nav-tabs > li a { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .page-header .nav-tabs > .active > a, - .page-header .nav-tabs > .active > a:hover, - .page-header .nav-tabs > .active > a:focus { - border-bottom-color: #dddddd; - } -} -h1 { - font-size: 28px; -} -h2 { - font-size: 21px; -} -h3 { - font-size: 18px; -} -h4 { - font-size: 14px; -} -h1, -h2, -h3, -h4 { - line-height: 1.5; -} -h1 small, -h2 small, -h3 small, -h4 small { - font-size: 14px; -} -.prose h1, -.prose heading-1 h2, -.prose heading-2 { - margin-bottom: 15px; -} -.prose h3, -.prose heading-3 { - margin-bottom: 10px; -} -.table-chunky td, -.table-chunky th { - padding: 12px 15px; - font-size: 12px; -} -.table-chunky thead th, -.table-chunky thead td { - color: #fff; - background-color: #aaa; - padding-top: 10px; - padding-bottom: 10px; -} -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: transparent; -} -.table-striped tbody tr:nth-child(even) td, -.table-striped tbody tr:nth-child(even) th { - background-color: #f2f2f2; -} -.table-chunky.table-bordered { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} -.table-chunky.table-bordered thead:first-child tr:first-child th:first-child, -.table-chunky.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 2px; - -moz-border-radius-topleft: 2px; - border-top-left-radius: 2px; -} -.table-chunky.table-bordered thead:first-child tr:first-child th:last-child, -.table-chunky.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 2px; - -moz-border-radius-topright: 2px; - border-top-right-radius: 2px; -} -.table-chunky.table-bordered thead:last-child tr:last-child th:first-child, -.table-chunky.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 2px; - -moz-border-radius: 0 0 0 2px; - border-radius: 0 0 0 2px; - -webkit-border-bottom-left-radius: 2px; - -moz-border-radius-bottomleft: 2px; - border-bottom-left-radius: 2px; -} -.table-chunky.table-bordered thead:last-child tr:last-child th:last-child, -.table-chunky.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 2px; - -moz-border-radius-bottomright: 2px; - border-bottom-right-radius: 2px; -} -.ellipsis { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.ckan-icon { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; -} -.ckan-icon-fb { - width: 16px; - height: 16px; - background-position: 0px 0; -} -.ckan-icon-gplus { - width: 16px; - height: 16px; - background-position: -16px 0; -} -.ckan-icon-twitter { - width: 16px; - height: 16px; - background-position: -32px 0; -} -.ckan-icon-email { - width: 16px; - height: 16px; - background-position: -48px 0; -} -.ckan-icon-share { - width: 16px; - height: 16px; - background-position: -64px 0; -} -.ckan-icon-feed { - width: 16px; - height: 16px; - background-position: -80px 0; -} -.ckan-icon-calendar { - width: 16px; - height: 16px; - background-position: -96px 0; -} -.ckan-icon-file { - width: 16px; - height: 16px; - background-position: -112px 0; -} -.ckan-icon-lock { - width: 16px; - height: 16px; - background-position: -128px 0; -} -.ckan-icon-link-file { - width: 16px; - height: 16px; - background-position: -144px 0; -} -.ckan-icon-link-plugin { - width: 16px; - height: 16px; - background-position: -160px 0; -} -.ckan-icon-upload-file { - width: 16px; - height: 16px; - background-position: -176px 0; -} -.ckan-icon-callout { - width: 16px; - height: 16px; - background-position: -192px 0; -} -.ckan-icon-circle-cross { - width: 17px; - height: 17px; - background-position: 0px -16px; -} -.ckan-icon-circle-add { - width: 17px; - height: 17px; - background-position: -17px -16px; -} -.ckan-icon-flame { - width: 17px; - height: 17px; - background-position: -34px -16px; -} -.ckan-icon-search { - width: 17px; - height: 17px; - background-position: -51px -16px; -} -.ckan-icon-large-lock { - width: 20px; - height: 20px; - background-position: 0px -33px; -} -.ckan-icon-photo { - width: 20px; - height: 20px; - background-position: -20px -33px; -} -.ckan-icon-add { - width: 20px; - height: 20px; - background-position: -40px -33px; -} -.ckan-icon-home { - width: 20px; - height: 20px; - background-position: -60px -33px; -} -.ckan-icon-rewind { - width: 20px; - height: 20px; - background-position: -80px -33px; -} -.ckan-icon-tools { - width: 20px; - height: 20px; - background-position: -100px -33px; -} -.ckan-icon-flag { - width: 20px; - height: 20px; - background-position: -120px -33px; -} -.ckan-icon-clipboard { - width: 20px; - height: 20px; - background-position: -140px -33px; -} -.ckan-icon-share { - width: 20px; - height: 20px; - background-position: -160px -33px; -} -.ckan-icon-info { - width: 20px; - height: 20px; - background-position: -180px -33px; -} -.ckan-icon-download { - width: 20px; - height: 20px; - background-position: -200px -33px; -} -.ckan-icon-star { - width: 20px; - height: 20px; - background-position: -220px -33px; -} -.ckan-icon-info-flat { - width: 20px; - height: 20px; - background-position: -240px -33px; -} -.ckan-icon-tag { - width: 20px; - height: 20px; - background-position: -260px -33px; -} -.ckan-icon-plus { - width: 20px; - height: 20px; - background-position: -280px -33px; - width: 16px; -} -.ckan-icon-head { - width: 20px; - height: 20px; - background-position: -300px -33px; -} -.ckan-icon-arrow-e { - width: 20px; - height: 20px; - background-position: -320px -33px; - width: 16px; -} -.ckan-icon-bookmark { - width: 25px; - height: 25px; - background-position: 0px -53px; -} -.format-label { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - text-indent: -900em; - background: url("../../../base/images/sprite-resource-icons.png") no-repeat 0 0; -} -.format-label { - width: 32px; - height: 35px; - background-position: 0px -62px; -} -.format-label[data-format=rdf], -.format-label[data-format*=rdf] { - width: 32px; - height: 35px; - background-position: -32px -62px; -} -.format-label[data-format=pdf], -.format-label[data-format*=pdf] { - width: 32px; - height: 35px; - background-position: -64px -62px; -} -.format-label[data-format=api], -.format-label[data-format*=api] { - width: 32px; - height: 35px; - background-position: -96px -62px; -} -.format-label[data-format=zip], -.format-label[data-format*=zip] { - width: 32px; - height: 35px; - background-position: -128px -62px; -} -.format-label[data-format=xls], -.format-label[data-format*=xls] { - width: 32px; - height: 35px; - background-position: -160px -62px; -} -.format-label[data-format=csv], -.format-label[data-format*=csv] { - width: 32px; - height: 35px; - background-position: -192px -62px; -} -.format-label[data-format=txt], -.format-label[data-format*=txt] { - width: 32px; - height: 35px; - background-position: -224px -62px; -} -.format-label[data-format=xml], -.format-label[data-format*=xml] { - width: 32px; - height: 35px; - background-position: -256px -62px; -} -.format-label[data-format=json], -.format-label[data-format*=json] { - width: 32px; - height: 35px; - background-position: -288px -62px; -} -.format-label[data-format=html], -.format-label[data-format*=html] { - width: 32px; - height: 35px; - background-position: -320px -62px; -} -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - text-align: right; - font-size: 14px; - line-height: 1; - width: 14px; -} -.btn [class^="icon-"], -.nav [class^="icon-"], -.module-heading [class^="icon-"], -.dropdown [class^="icon-"], -.btn [class*=" icon-"], -.nav [class*=" icon-"], -.module-heading [class*=" icon-"], -.dropdown [class*=" icon-"] { - margin-right: 4px; -} -.info-block [class^="icon-"], -.info-block [class*=" icon-"] { - float: left; - font-size: 28px; - width: 28px; - margin-right: 5px; - margin-top: 2px; -} -.breadcrumb .home .icon-home { - font-size: 24px; - width: 24px; - vertical-align: -1px; -} -.info-block-small [class^="icon-"], -.info-block-small [class*=" icon-"] { - font-size: 14px; - width: 14px; - margin-top: 1px; -} -.nav-tabs .fa:last-child, -.module-heading .fa:last-child, -.btn .fa:last-child { - margin-right: 3px; -} -.wrapper { - *zoom: 1; - background-color: #FFF; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - position: relative; - background-color: #fff; - margin-bottom: 20px; - margin-left: 0; -} -.wrapper:before, -.wrapper:after { - display: table; - content: ""; - line-height: 0; -} -.wrapper:after { - clear: both; -} -@media (min-width: 768px) { - .wrapper { - background-image: url("../../../base/images/nav.png"); - background-repeat: repeat-y; - background-position: -54px 0px; - } -} -@media (min-width: 980px) { - .wrapper { - background-position: 0px 0px; - } -} -.wrapper.no-nav { - background-image: none; -} -[role=main], -.main { - position: relative; - padding-bottom: 20px; -} -@media (min-width: 768px) { - [role=main], - .main { - padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); - } -} -[role=main] { - min-height: 350px; -} -.main:after, -[role=main]:after { - bottom: 0; - border-top-width: 1px; -} -[role=main] .primary { - float: right; - margin-left: 0; -} -[role=main] .secondary { - margin-left: 0; -} -/* Filters modal */ -.no-text .text { - display: none; -} -.js body.filters-modal { - overflow: hidden; -} -.show-filters.btn, -.hide-filters { - display: none; -} -@media (max-width: 768px) { - .wrapper { - margin: 0 -20px; - border-width: 0; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - } - .js [role=main] .secondary .filters { - display: none; - position: fixed; - overflow: auto; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 1; - padding: 10px; - background-color: #000000; - background-color: rgba(0, 0, 0, 0.5); - } - .js body.filters-modal .secondary .filters { - display: block; - } - .js [role=main] .secondary .filters > div { - background-color: #fff; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - overflow: hidden; - } - .js [role=main] .secondary .filters > div .module-footer { - display: none; - } - .js body.filters-modal .secondary .filters .hide-filters { - display: inline-block; - position: absolute; - top: 14px; - right: 17px; - opacity: 0.6; - } - .js body.filters-modal .secondary .filters .hide-filters i { - font-size: 18px; - } - .js .show-filters.btn { - display: inline-block; - } -} -.primary > :last-child, -.secondary > :last-child { - margin-bottom: 0; -} -.primary .primary { - float: left; - width: 467px; - margin-left: 0; - margin-bottom: 20px; -} -.primary .primary h1:first-child, -.primary .primary h2:first-child, -.primary .primary h3:first-child, -.primary .primary h4:first-child { - margin-top: 0; -} -.primary .tertiary { - float: left; - width: 180px; - margin-left: 18px; - margin-bottom: 20px; -} -@media (min-width: 768px) { - .hero { - background: url("../../../base/images/background-tile.png"); - } -} -.hero:after { - background-color: rgba(0, 0, 0, 0.09); - background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(0, 0, 0, 0.15)), to(rgba(0, 0, 0, 0))); - background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-repeat: repeat-x; - background-color: #f6f6f6; - border-bottom: 1px solid #d0d0d0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - -webkit-box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); - -moz-box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); - box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); -} -.hero:after .back:hover { - text-decoration: none; -} -.hero:after .back:hover span { - text-decoration: underline; -} -.context-info .module-content { - padding: 15px; -} -.context-info .image { - margin-bottom: 10px; -} -.context-info .image img, -.context-info .image a { - display: block; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.context-info p { - overflow: auto; -} -.context-info code { - display: block; - font-weight: normal; - padding: 0; - margin: 0; - overflow: auto; -} -.context-info h1.heading { - margin: 0 0 5px 0; - font-size: 18px; - line-height: 1.3; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.context-info .info { - margin-top: 15px; - padding-top: 10px; - border-top: 1px dotted #DDD; - word-break: break-word; -} -.context-info .info dl dd { - margin-top: 3px; - margin-left: 0; -} -.context-info .nums { - *zoom: 1; - margin-top: 15px; - padding-top: 10px; - padding-bottom: 0; - border-top: 1px dotted #DDD; -} -.context-info .nums:before, -.context-info .nums:after { - display: table; - content: ""; - line-height: 0; -} -.context-info .nums:after { - clear: both; -} -.context-info .nums dl { - float: left; - width: 50%; - margin: 5px 0 0 0; - color: #444; -} -.context-info .nums dl dt { - display: block; - font-size: 13px; - font-weight: 300; -} -.context-info .nums dl dd { - display: block; - font-size: 30px; - font-weight: 700; - line-height: 36px; - margin-left: 0; -} -.context-info .nums dl dd .smallest { - font-size: 13px; -} -.context-info .nums dl dd .smaller { - font-size: 16px; -} -.context-info .nums dl dd .small { - font-size: 21px; -} -.context-info .follow_button { - margin-top: 15px; -} -.context-info.editing .module-content { - margin-top: 0; -} -.flash-messages .alert { - -webkit-box-shadow: 0 0 0 1px white; - -moz-box-shadow: 0 0 0 1px white; - box-shadow: 0 0 0 1px white; -} -.homepage .row { - position: relative; -} -.homepage .module-search { - padding: 5px; - margin: 20px 0 0 0; - color: #fff; - background: #fff; -} -.homepage .module-search .search-giant { - margin-bottom: 10px; -} -.homepage .module-search .search-giant input { - border-color: #003f52; -} -.homepage .module-search .module-content { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - background-color: #810606; - border-bottom: none; -} -.homepage .module-search .module-content .heading { - margin-top: 0; - margin-bottom: 7px; - font-size: 24px; - line-height: 40px; -} -.homepage .module-search .tags { - *zoom: 1; - padding: 5px 10px 10px 10px; - background-color: #500404; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.homepage .module-search .tags:before, -.homepage .module-search .tags:after { - display: table; - content: ""; - line-height: 0; -} -.homepage .module-search .tags:after { - clear: both; -} -.homepage .module-search .tags h3, -.homepage .module-search .tags .tag { - display: block; - float: left; - margin: 5px 10px 0 0; -} -.homepage .module-search .tags h3 { - font-size: 14px; - line-height: 20px; - padding: 2px 8px; -} -.homepage .group-list { - margin: 0; -} -.homepage .box .inner { - padding: 20px 25px; -} -.homepage .stats h3 { - margin: 0 0 10px 0; -} -.homepage .stats ul { - margin: 0; - list-style: none; - *zoom: 1; -} -.homepage .stats ul:before, -.homepage .stats ul:after { - display: table; - content: ""; - line-height: 0; -} -.homepage .stats ul:after { - clear: both; -} -.homepage .stats ul li { - float: left; - width: 25%; - font-weight: 300; -} -.homepage .stats ul li a { - display: block; -} -.homepage .stats ul li a b { - display: block; - font-size: 35px; - line-height: 1.5; -} -.homepage .stats ul li a:hover { - text-decoration: none; -} -.homepage.layout-2 .stats { - margin-top: 20px; -} -@media (min-width: 768px) { - .homepage [role=main] { - padding: 20px 0; - } - .homepage.layout-1 .row1 .col2 { - position: absolute; - bottom: 0; - right: 0; - } - .homepage.layout-1 .row1 .col2 .module-search { - bottom: 0; - left: 0; - right: 0; - } -} -.account-masthead { - *zoom: 1; - min-height: 30px; - color: #fff; - background: #500404 url("../../../base/images/bg.png"); -} -.account-masthead:before, -.account-masthead:after { - display: table; - content: ""; - line-height: 0; -} -.account-masthead:after { - clear: both; -} -.account-masthead .account { - float: right; -} -.account-masthead .account ul { - *zoom: 1; -} -.account-masthead .account ul:before, -.account-masthead .account ul:after { - display: table; - content: ""; - line-height: 0; -} -.account-masthead .account ul:after { - clear: both; -} -.account-masthead .account ul li { - display: block; - float: left; - border-left: 1px solid #380303; -} -.account-masthead .account ul li a { - display: block; - color: #e0c1c1; - font-size: 13px; - font-weight: bold; - padding: 0 10px; - line-height: 31px; -} -.account-masthead .account ul li a span.username, -.account-masthead .account ul li a span.text { - margin: 0 2px 0 4px; -} -.account-masthead .account ul li a span.text { - position: absolute; - top: -9999px; - left: -9999px; -} -.account-masthead .account ul li a:hover { - color: #ecdada; - background-color: #380303; - text-decoration: none; -} -.account-masthead .account ul li a.sub { - font-weight: 300; -} -.account-masthead .account ul li a .btn { - vertical-align: 1px; - margin-left: 3px; -} -.account-masthead .account .notifications a span.badge { - font-size: 12px; - margin-left: 3px; - padding: 1px 6px; - background-color: #380303; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - text-shadow: none; - color: #e0c1c1; -} -.account-masthead .account .notifications a:hover span { - color: #fff; - background-color: #200101; -} -.account-masthead .account .notifications.notifications-important a span.badge { - color: #fff; - background-color: #C9403A; -} -.account-masthead .account.authed .image { - padding: 0 6px; -} -.account-masthead .account.authed .image img { - vertical-align: -6px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.masthead { - *zoom: 1; - min-height: 55px; - color: #fff; - background: #810606 url("../../../base/images/bg.png"); -} -.masthead:before, -.masthead:after { - display: table; - content: ""; - line-height: 0; -} -.masthead:after { - clear: both; -} -.masthead .container { - position: relative; -} -.masthead a { - color: #fff; -} -.masthead hgroup h1, -.masthead hgroup h2 { - float: left; - font-size: 30px; - line-height: 1.5; -} -.masthead hgroup h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; -} -.masthead hgroup h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; -} -.masthead .nav-collapse { - padding-top: 10px; -} -.masthead .section { - float: left; -} -.masthead input[type="text"] { - border-color: #690505; -} -.masthead .navigation { - margin-right: 20px; -} -.masthead .navigation .nav-pills { - margin-bottom: 0; -} -.masthead .navigation .nav-pills li a:hover, -.masthead .navigation .nav-pills li.active a { - background-color: #500404; -} -.masthead .nav > li > a, -.masthead .nav > li > a:focus, -.masthead .nav > li > a:hover, -.masthead .nav > .active > a, -.masthead .nav > .active > a:hover, -.masthead .nav > .active > a:focus { - color: #fff; - text-shadow: none; -} -.masthead .site-search { - margin: 2px 8px 2px 0; -} -.masthead .site-search input { - width: 200px; - padding: 4px 10px; -} -.masthead .btn-navbar, -.masthead .btn-navbar:hover, -.masthead .btn-navbar:focus, -.masthead .btn-navbar:active, -.masthead .btn-navbar.active, -.masthead .btn-navbar.disabled, -.masthead .btn-navbar[disabled] { - background-color: #500404; - background-image: none; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - text-shadow: none; - margin-top: 15px; -} -.masthead .btn-navbar .icon-bar, -.masthead .btn-navbar:hover .icon-bar, -.masthead .btn-navbar:focus .icon-bar, -.masthead .btn-navbar:active .icon-bar, -.masthead .btn-navbar.active .icon-bar, -.masthead .btn-navbar.disabled .icon-bar, -.masthead .btn-navbar[disabled] .icon-bar { - margin-right: 0; -} -.masthead .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); -} -@media (min-width: 980px) { - .masthead .nav-collapse { - float: right; - } -} -@media (max-width: 767px) { - .account-masthead { - margin-left: -20px; - margin-right: -20px; - padding-left: 20px; - padding-right: 20px; - } - .masthead .section { - float: none; - } - .masthead .section .nav-collapse { - margin-bottom: 25px; - } -} -@media (max-width: 979px) { - .masthead .container { - padding-left: 20px; - padding-right: 20px; - } - .masthead .site-search { - display: none; - } -} -.site-footer { - *zoom: 1; - min-height: 55px; - color: #fff; - background: #810606 url("../../../base/images/bg.png"); - padding: 20px 0; -} -.site-footer:before, -.site-footer:after { - display: table; - content: ""; - line-height: 0; -} -.site-footer:after { - clear: both; -} -.site-footer .container { - position: relative; -} -.site-footer a { - color: #fff; -} -.site-footer hgroup h1, -.site-footer hgroup h2 { - float: left; - font-size: 30px; - line-height: 1.5; -} -.site-footer hgroup h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; -} -.site-footer hgroup h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; -} -.site-footer .nav-collapse { - padding-top: 10px; -} -.site-footer .section { - float: left; -} -.site-footer input[type="text"] { - border-color: #690505; -} -.site-footer .navigation { - margin-right: 20px; -} -.site-footer .navigation .nav-pills { - margin-bottom: 0; -} -.site-footer .navigation .nav-pills li a:hover, -.site-footer .navigation .nav-pills li.active a { - background-color: #500404; -} -.site-footer .nav > li > a, -.site-footer .nav > li > a:focus, -.site-footer .nav > li > a:hover, -.site-footer .nav > .active > a, -.site-footer .nav > .active > a:hover, -.site-footer .nav > .active > a:focus { - color: #fff; - text-shadow: none; -} -.site-footer .site-search { - margin: 2px 8px 2px 0; -} -.site-footer .site-search input { - width: 200px; - padding: 4px 10px; -} -.site-footer .btn-navbar, -.site-footer .btn-navbar:hover, -.site-footer .btn-navbar:focus, -.site-footer .btn-navbar:active, -.site-footer .btn-navbar.active, -.site-footer .btn-navbar.disabled, -.site-footer .btn-navbar[disabled] { - background-color: #500404; - background-image: none; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - text-shadow: none; - margin-top: 15px; -} -.site-footer .btn-navbar .icon-bar, -.site-footer .btn-navbar:hover .icon-bar, -.site-footer .btn-navbar:focus .icon-bar, -.site-footer .btn-navbar:active .icon-bar, -.site-footer .btn-navbar.active .icon-bar, -.site-footer .btn-navbar.disabled .icon-bar, -.site-footer .btn-navbar[disabled] .icon-bar { - margin-right: 0; -} -.site-footer .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); -} -.site-footer, -.site-footer label, -.site-footer small { - color: #cd9b9b; -} -.site-footer a { - color: #cd9b9b; -} -.footer-links ul li { - margin-bottom: 5px; -} -.attribution small { - color: #cd9b9b; - font-size: 12px; -} -.attribution .ckan-footer-logo { - display: block; - width: 68px; - height: 21px; - margin-top: 2px; - background: url("../../../base/images/ckan-logo-footer.png") no-repeat top left; - text-indent: -900em; -} -.lang-select { - *zoom: 1; -} -.lang-select:before, -.lang-select:after { - display: table; - content: ""; - line-height: 0; -} -.lang-select:after { - clear: both; -} -.lang-select label, -.lang-select select, -.lang-select .lang-container { - float: left; - margin-top: 0; -} -.lang-dropdown { - color: #000; -} -.lang-dropdown li { - width: auto; -} -.table-selected td { - background-color: #f5f5f5; -} -.table-selected td .edit { - display: block; -} -.table-bulk-edit th input { - top: -5px; -} -.table-bulk-edit .table-actions .btn-group { - float: left; - margin: 0 10px 0 0; -} -.table-bulk-edit .context p { - margin-bottom: 0; -} -.table-header thead th { - background-color: #f6f6f6; -} -.table-edit-hover .edit { - display: none; - float: right; -} -.table-edit-hover tr:hover .edit { - display: block; -} -.js .table-toggle-more .toggle-more { - display: none; -} -.js .table-toggle-more .show-more { - display: inline; -} -.js .table-toggle-more .show-less { - display: none; -} -.js .table-toggle-more .toggle-seperator { - display: table-row; -} -.js .table-toggle-more .toggle-seperator td { - height: 11px; - padding: 0; - background-image: url("../../../base/images/table-seperator.png"); -} -.js .table .toggle-show td { - background: none; - text-align: center; -} -.js .table-toggle-less .show-less { - display: inline; -} -.js .table-toggle-less .show-more { - display: none; -} -.js .table-toggle-less .toggle-seperator { - display: none; -} -.profile .empty, -.profile .dataset-list { - margin-bottom: 20px; -} -.activity { - margin: 10px 0; - padding: 0; - list-style-type: none; - background: transparent url('../../../base/images/dotted.png') 14px 0 repeat-y; -} -.activity .item { - position: relative; - margin: 0 0 15px 0; - padding: 0; - *zoom: 1; -} -.activity .item:before, -.activity .item:after { - display: table; - content: ""; - line-height: 0; -} -.activity .item:after { - clear: both; -} -.activity .item .icon { - display: block; - position: absolute; - top: 0; - left: 0; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - color: #FFFFFF; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - font-weight: normal; - margin-right: 10px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); -} -.activity .item .gravatar { - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.activity .item .actor .gravatar { - position: absolute; - top: 0; - left: 40px; -} -.activity .item p { - font-size: 14px; - line-height: 1.5; - margin: 5px 0 0 80px; -} -.activity .item .date { - color: #999; - font-size: 12px; - white-space: nowrap; -} -.activity .item .new { - display: block; - position: absolute; - overflow: hidden; - top: -3px; - left: -3px; - width: 10px; - height: 10px; - background-color: #A35647; - border: 1px solid #FFF; - text-indent: -1000px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} -.activity .item.no-avatar p { - margin-left: 40px; -} -.activity .load-less { - margin-bottom: 15px; -} -.popover { - width: 300px; -} -.popover .popover-title { - font-weight: bold; - margin-bottom: 0; -} -.popover p.about { - margin: 0 0 10px 0; -} -.popover .popover-close { - float: right; - text-decoration: none; -} -.popover .popover-content { - font-size: 14px; - line-height: 20px; - color: #444; - word-break: break-all; -} -.popover .popover-content dl { - margin: 0; -} -.popover .popover-content dl dd { - margin-left: 0; - margin-bottom: 10px; -} -.activity .item .icon { - background-color: #999999; -} -.activity .item.failure .icon { - background-color: #B95252; -} -.activity .item.success .icon { - background-color: #69A67A; -} -.activity .item.added-tag .icon { - background-color: #6995a6; -} -.activity .item.changed-group .icon { - background-color: #767DCE; -} -.activity .item.changed-package .icon { - background-color: #8c76ce; -} -.activity .item.changed-package_extra .icon { - background-color: #769ace; -} -.activity .item.changed-resource .icon { - background-color: #aa76ce; -} -.activity .item.changed-user .icon { - background-color: #76b8ce; -} -.activity .item.changed-organization .icon { - background-color: #699fa6; -} -.activity .item.deleted-group .icon { - background-color: #B95252; -} -.activity .item.deleted-package .icon { - background-color: #b97452; -} -.activity .item.deleted-package_extra .icon { - background-color: #b95274; -} -.activity .item.deleted-resource .icon { - background-color: #b99752; -} -.activity .item.deleted-organization .icon { - background-color: #b95297; -} -.activity .item.new-group .icon { - background-color: #69A67A; -} -.activity .item.new-package .icon { - background-color: #69a68e; -} -.activity .item.new-package_extra .icon { - background-color: #6ca669; -} -.activity .item.new-resource .icon { - background-color: #81a669; -} -.activity .item.new-user .icon { - background-color: #69a6a3; -} -.activity .item.new-organization .icon { - background-color: #81a669; -} -.activity .item.removed-tag .icon { - background-color: #b95297; -} -.activity .item.deleted-related-item .icon { - background-color: #b9b952; -} -.activity .item.follow-dataset .icon { - background-color: #767DCE; -} -.activity .item.follow-user .icon { - background-color: #8c76ce; -} -.activity .item.new-related-item .icon { - background-color: #95a669; -} -.activity .item.follow-group .icon { - background-color: #8ba669; -} -.dropdown:hover .dropdown-menu { - display: block; -} -.js .dropdown .dropdown-menu, -.js .dropdown:hover .dropdown-menu { - display: none; -} -.js .dropdown.open .dropdown-menu { - display: block; -} -#followee-filter .btn { - *zoom: 1; -} -#followee-filter .btn:before, -#followee-filter .btn:after { - display: table; - content: ""; - line-height: 0; -} -#followee-filter .btn:after { - clear: both; -} -#followee-filter .btn span, -#followee-filter .btn strong { - display: block; - float: left; - line-height: 1.5; -} -#followee-filter .btn span { - font-weight: normal; -} -#followee-filter .btn strong { - margin: 0 5px; - white-space: nowrap; - max-width: 90px; - overflow: hidden; - text-overflow: ellipsis; -} -.dashboard-context { - position: relative; - margin-bottom: 20px; - padding: 20px; - border-bottom: 1px solid #DCDCDC; - background-color: #f6f6f6; - -webkit-border-radius: 3px 0 0 0; - -moz-border-radius: 3px 0 0 0; - border-radius: 3px 0 0 0; -} -.dashboard-context h2 { - margin-bottom: 10px; -} -.dashboard-context .arrow { - position: absolute; - content: ' '; - top: 30px; - right: -10px; - width: 10px; - height: 21px; - background: transparent url("../../../base/images/dashboard-followee-related.png"); -} -.popover-followee .popover-title { - display: none; -} -.popover-followee .popover-content { - padding: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.popover-followee .empty { - padding: 10px; -} -.popover-followee .popover-header { - *zoom: 1; - background-color: whiteSmoke; - padding: 5px; - border-bottom: 1px solid #ccc; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.popover-followee .popover-header:before, -.popover-followee .popover-header:after { - display: table; - content: ""; - line-height: 0; -} -.popover-followee .popover-header:after { - clear: both; -} -.popover-followee .popover-header .input-prepend { - margin-bottom: 0; -} -.popover-followee .popover-header .add-on, -.popover-followee .popover-header input { - float: left; - margin: 0; -} -.popover-followee .popover-header .add-on { - padding: 4px 8px 4px 12px; - border-right-width: 0; - -webkit-border-radius: 100px 0 0 100px; - -moz-border-radius: 100px 0 0 100px; - border-radius: 100px 0 0 100px; -} -.popover-followee .popover-header input { - padding: 4px 12px 4px 8px; - font-size: 13px; - width: 207px; - -webkit-border-radius: 0 100px 100px 0; - -moz-border-radius: 0 100px 100px 0; - border-radius: 0 100px 100px 0; -} -.popover-followee .nav { - padding: 0; - margin: 0; - max-height: 205px; - overflow: auto; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.popover-followee .nav li a { - display: block; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - padding: 7px 10px 7px 15px; - margin: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.popover-followee .nav li a i { - background-color: #810606; - color: #fff; - margin-right: 11px; - padding: 3px 5px; - line-height: 1; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); -} -.popover-followee .nav li a:hover i { - background-color: #000; -} -.popover-followee .nav li.active a i { - color: #810606; - background-color: #fff; -} -.dashboard-me { - *zoom: 1; - padding: 15px 15px 0 15px; -} -.dashboard-me:before, -.dashboard-me:after { - display: table; - content: ""; - line-height: 0; -} -.dashboard-me:after { - clear: both; -} -.dashboard-me img { - float: left; - margin-right: 10px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.dashboard-me strong { - display: block; - font-size: 16px; - margin: 3px 0; -} -.resource-view-filters { - margin-bottom: 1em; -} -.resource-view-filters .resource-view-filter { - margin-bottom: 1.0em; -} -.resource-view-filters .resource-view-remove-filter { - cursor: pointer; - color: #b55457; -} -.resource-view-filters .resource-view-filter-values .select2-container { - margin-right: 0.3em; - margin-bottom: 0.2em; - width: 24% !important; -} -.resource-view-filters .resource-view-filter-values .select2-container .select2-search-choice-close { - left: auto; -} -.datapusher-status-link:hover { - text-decoration: none; -} -.datapusher-status.status-unknown { - color: #bbb; -} -.datapusher-status.status-pending { - color: #FFCC00; -} -.datapusher-status.status-error { - color: red; -} -.datapusher-status.status-complete { - color: #009900; -} -body { - background: #810606 url("../../../base/images/bg.png"); -} -[hidden] { - display: none; -} -table { - table-layout: fixed; -} -thead th { - vertical-align: top; -} -td, -th { - word-wrap: break-word; -} -table .metric { - width: 140px; -} -code { - color: #000; - border: none; - background: none; - white-space: normal; -} -pre { - border: none; - background: none; - padding-left: 0; - padding-right: 0; -} -mark { - background: #fdf7e9; -} -blockquote p { - font-size: 1em; -} -iframe { - border: none; -} -.embedded-content h1 { - font-size: 1.4em; -} -.embedded-content h2 { - font-size: 1.4em; -} -.embedded-content h3 { - font-size: 1.2em; -} -.popular { - text-indent: -999em; -} -.empty { - color: #aaa; - font-style: italic; -} -.page-heading { - margin-top: 0; - margin-bottom: 16px; -} -.m-top { - margin-top: 15px; -} -.m-left { - margin-left: 15px; -} -.m-right { - margin-right: 15px; -} -.m-bottom { - margin-bottom: 15px; -} -.no-margin { - margin: 0; -} -.reduced-margin { - margin: 3px 5px; -} -.p-top { - padding-top: 15px; -} -.p-left { - padding-left: 15px; -} -.p-right { - padding-right: 15px; -} -.p-bottom { - padding-bottom: 15px; -} -.no-padding { - padding: 0; -} -.reduced-padding { - padding: 3px 5px; -} -.ie .lang-dropdown { - position: relative; - top: -20px; -} -.ie .module-popup { - border-bottom: none; -} -.ie .banner { - top: 0; - right: 0; - width: auto; -} -.ie .group-listing { - margin-left: -24px; -} -.ie .toolbar .breadcrumb { - filter: none; -} -.ie .toolbar .breadcrumb li { - float: left; -} -.ie .toolbar .breadcrumb li:after { - margin: 0 0.2em; -} -.ie9 .control-large input { - height: 56px; -} -.ie8 .account-masthead a.image, -.ie8 .account-masthead .username { - white-space: nowrap; -} -.ie9 .homepage .media.module-heading .media-image img, -.ie8 .homepage .media.module-heading .media-image img, -.ie7 .homepage .media.module-heading .media-image img { - width: 85px !important; -} -.ie8 .masthead .nav-collapse, -.ie7 .masthead .nav-collapse { - float: right; -} -.ie8 [role=main], -.ie7 [role=main], -.ie8 .main, -.ie7 .main { - padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); -} -.ie8 .hero, -.ie7 .hero { - background: url("../../../base/images/background-tile.png"); -} -.ie8 .hero .hero-primary.module-popup .box, -.ie7 .hero .hero-primary.module-popup .box { - padding-bottom: 20px !important; - margin-bottom: 0 !important; -} -.ie8 .lang-dropdown, -.ie7 .lang-dropdown { - position: relative !important; - top: -90px !important; -} -.ie7 .alert { - position: relative; -} -.ie7 .alert .close { - position: absolute; - top: 6px !important; - right: 20px; -} -.ie7 .media-item { - width: 30%; -} -.ie7 .tags .tag-list { - *zoom: 1; -} -.ie7 .tags .tag-list:before, -.ie7 .tags .tag-list:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .tags .tag-list:after { - clear: both; -} -.ie7 .tags .tag-list li { - display: block; - float: left; -} -.ie7 .tags h3 { - float: left; -} -.ie7 .tags .tag { - display: block; -} -.ie7 .search-giant input { - width: 95%; -} -.ie7 .control-full input, -.ie7 .control-full select, -.ie7 .control-full textarea { - width: 95%; -} -.ie7 .control-full.control-large .controls input { - padding-bottom: 20px; -} -.ie7 .controls { - position: relative; -} -.ie7 .controls .info-block, -.ie7 .controls .info-inline { - position: absolute; - top: 0; - right: 0; -} -.ie7 .form-horizontal .controls { - margin-left: 0; -} -.ie7 .control-custom .checkbox { - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.ie7 .stages { - overflow: hidden; - background-color: #EDEDED; -} -.ie7 .stages li { - height: 30px; - width: 27.5%; -} -.ie7 .stages li button, -.ie7 .stages li span { - display: block; - height: 30px; - padding-left: 20px; -} -.ie7 .stages li button { - height: 50px; -} -.ie7 .stages li .highlight { - width: auto; -} -.ie7 .account-masthead .account a i { - line-height: 31px; -} -.ie7 .masthead { - position: relative; - z-index: 1; -} -.ie7 .masthead .logo img, -.ie7 .masthead nav { - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.ie7 .masthead .header-image { - display: block; -} -.ie7 .masthead .account .dropdown-menu { - z-index: 10000; -} -.ie7 .module-narrow .nav-item.image { - *zoom: 1; -} -.ie7 .module-narrow .nav-item.image:before, -.ie7 .module-narrow .nav-item.image:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .module-narrow .nav-item.image:after { - clear: both; -} -.ie7 .nav-facet .nav-item.active a { - content: 'x'; -} -.ie7 .toolbar .breadcrumb li { - padding-right: 10px; - margin-right: 5px; - background: transparent url("../../../base/images/breadcrumb-slash-ie7.png") 100% 50% no-repeat; -} -.ie7 .toolbar .breadcrumb li.active { - background-image: none; -} -.ie7 .module-heading { - *zoom: 1; - position: relative; -} -.ie7 .module-heading:before, -.ie7 .module-heading:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .module-heading:after { - clear: both; -} -.ie7 .module-heading .media-content { - position: relative; -} -.ie7 .module-heading .media-image img { - float: left; -} -.ie7 .group-listing { - position: relative; - zoom: 1; -} -.ie7 .resource-item { - position: static; - padding-bottom: 1px; -} -.ie7 .resource-item .heading { - position: relative; -} -.ie7 .resource-item .format-label { - left: -48px; -} -.ie7 .resource-item .btn-group { - position: relative; - float: right; - top: -35px; - right: 0; -} -.ie7 .media-overlay .media-heading { - background-color: #000; -} diff --git a/ckan/public-bs2/base/css/red.css b/ckan/public-bs2/base/css/red.css deleted file mode 100644 index a6363ef2ea2..00000000000 --- a/ckan/public-bs2/base/css/red.css +++ /dev/null @@ -1,9520 +0,0 @@ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -a:hover, -a:active { - outline: 0; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - /* Responsive images (ensure images don't scale beyond their parents) */ - max-width: 100%; - /* Part 1: Set a maxium relative to the parent */ - width: auto\9; - /* IE7-8 need help adjusting responsive images */ - height: auto; - /* Part 2: Scale the height according to the width, otherwise you get stretching */ - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} -#map_canvas img, -.google-maps img { - max-width: none; -} -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} -button, -input { - *overflow: visible; - line-height: normal; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -textarea { - overflow: auto; - vertical-align: top; -} -@media print { - * { - text-shadow: none !important; - color: #000 !important; - 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) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.clearfix:after { - clear: both; -} -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -body { - margin: 0; - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #444; - background-color: #eee; -} -a { - color: #C14531; - text-decoration: none; -} -a:hover, -a:focus { - color: #842f22; - text-decoration: underline; -} -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, -.row:after { - display: table; - content: ""; - line-height: 0; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.span12 { - width: 940px; -} -.span11 { - width: 860px; -} -.span10 { - width: 780px; -} -.span9 { - width: 700px; -} -.span8 { - width: 620px; -} -.span7 { - width: 540px; -} -.span6 { - width: 460px; -} -.span5 { - width: 380px; -} -.span4 { - width: 300px; -} -.span3 { - width: 220px; -} -.span2 { - width: 140px; -} -.span1 { - width: 60px; -} -.offset12 { - margin-left: 980px; -} -.offset11 { - margin-left: 900px; -} -.offset10 { - margin-left: 820px; -} -.offset9 { - margin-left: 740px; -} -.offset8 { - margin-left: 660px; -} -.offset7 { - margin-left: 580px; -} -.offset6 { - margin-left: 500px; -} -.offset5 { - margin-left: 420px; -} -.offset4 { - margin-left: 340px; -} -.offset3 { - margin-left: 260px; -} -.offset2 { - margin-left: 180px; -} -.offset1 { - margin-left: 100px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.row-fluid:after { - clear: both; -} -.row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.12765957%; - *margin-left: 2.07446809%; -} -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.12765957%; -} -.row-fluid .span12 { - width: 100%; - *width: 99.94680851%; -} -.row-fluid .span11 { - width: 91.4893617%; - *width: 91.43617021%; -} -.row-fluid .span10 { - width: 82.9787234%; - *width: 82.92553191%; -} -.row-fluid .span9 { - width: 74.46808511%; - *width: 74.41489362%; -} -.row-fluid .span8 { - width: 65.95744681%; - *width: 65.90425532%; -} -.row-fluid .span7 { - width: 57.44680851%; - *width: 57.39361702%; -} -.row-fluid .span6 { - width: 48.93617021%; - *width: 48.88297872%; -} -.row-fluid .span5 { - width: 40.42553191%; - *width: 40.37234043%; -} -.row-fluid .span4 { - width: 31.91489362%; - *width: 31.86170213%; -} -.row-fluid .span3 { - width: 23.40425532%; - *width: 23.35106383%; -} -.row-fluid .span2 { - width: 14.89361702%; - *width: 14.84042553%; -} -.row-fluid .span1 { - width: 6.38297872%; - *width: 6.32978723%; -} -.row-fluid .offset12 { - margin-left: 104.25531915%; - *margin-left: 104.14893617%; -} -.row-fluid .offset12:first-child { - margin-left: 102.12765957%; - *margin-left: 102.0212766%; -} -.row-fluid .offset11 { - margin-left: 95.74468085%; - *margin-left: 95.63829787%; -} -.row-fluid .offset11:first-child { - margin-left: 93.61702128%; - *margin-left: 93.5106383%; -} -.row-fluid .offset10 { - margin-left: 87.23404255%; - *margin-left: 87.12765957%; -} -.row-fluid .offset10:first-child { - margin-left: 85.10638298%; - *margin-left: 85%; -} -.row-fluid .offset9 { - margin-left: 78.72340426%; - *margin-left: 78.61702128%; -} -.row-fluid .offset9:first-child { - margin-left: 76.59574468%; - *margin-left: 76.4893617%; -} -.row-fluid .offset8 { - margin-left: 70.21276596%; - *margin-left: 70.10638298%; -} -.row-fluid .offset8:first-child { - margin-left: 68.08510638%; - *margin-left: 67.9787234%; -} -.row-fluid .offset7 { - margin-left: 61.70212766%; - *margin-left: 61.59574468%; -} -.row-fluid .offset7:first-child { - margin-left: 59.57446809%; - *margin-left: 59.46808511%; -} -.row-fluid .offset6 { - margin-left: 53.19148936%; - *margin-left: 53.08510638%; -} -.row-fluid .offset6:first-child { - margin-left: 51.06382979%; - *margin-left: 50.95744681%; -} -.row-fluid .offset5 { - margin-left: 44.68085106%; - *margin-left: 44.57446809%; -} -.row-fluid .offset5:first-child { - margin-left: 42.55319149%; - *margin-left: 42.44680851%; -} -.row-fluid .offset4 { - margin-left: 36.17021277%; - *margin-left: 36.06382979%; -} -.row-fluid .offset4:first-child { - margin-left: 34.04255319%; - *margin-left: 33.93617021%; -} -.row-fluid .offset3 { - margin-left: 27.65957447%; - *margin-left: 27.55319149%; -} -.row-fluid .offset3:first-child { - margin-left: 25.53191489%; - *margin-left: 25.42553191%; -} -.row-fluid .offset2 { - margin-left: 19.14893617%; - *margin-left: 19.04255319%; -} -.row-fluid .offset2:first-child { - margin-left: 17.0212766%; - *margin-left: 16.91489362%; -} -.row-fluid .offset1 { - margin-left: 10.63829787%; - *margin-left: 10.53191489%; -} -.row-fluid .offset1:first-child { - margin-left: 8.5106383%; - *margin-left: 8.40425532%; -} -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} -.container:before, -.container:after { - display: table; - content: ""; - line-height: 0; -} -.container:after { - clear: both; -} -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; - line-height: 0; -} -.container-fluid:after { - clear: both; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} -small { - font-size: 85%; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -cite { - font-style: normal; -} -.muted { - color: #999; -} -a.muted:hover, -a.muted:focus { - color: #808080; -} -.text-warning { - color: #c09853; -} -a.text-warning:hover, -a.text-warning:focus { - color: #a47e3c; -} -.text-error { - color: #b55457; -} -a.text-error:hover, -a.text-error:focus { - color: #954143; -} -.text-info { - color: #3a87ad; -} -a.text-info:hover, -a.text-info:focus { - color: #2d6987; -} -.text-success { - color: #468847; -} -a.text-success:hover, -a.text-success:focus { - color: #356635; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999; -} -h1, -h2, -h3 { - line-height: 40px; -} -h1 { - font-size: 38.5px; -} -h2 { - font-size: 31.5px; -} -h3 { - font-size: 24.5px; -} -h4 { - font-size: 17.5px; -} -h5 { - font-size: 14px; -} -h6 { - font-size: 11.9px; -} -h1 small { - font-size: 24.5px; -} -h2 small { - font-size: 17.5px; -} -h3 small { - font-size: 14px; -} -h4 small { - font-size: 14px; -} -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eee; -} -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -li { - line-height: 20px; -} -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding-left: 5px; - padding-right: 5px; -} -dl { - margin-bottom: 20px; -} -dt, -dd { - line-height: 20px; -} -dt { - font-weight: bold; -} -dd { - margin-left: 10px; -} -.dl-horizontal { - *zoom: 1; -} -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - content: ""; - line-height: 0; -} -.dl-horizontal:after { - clear: both; -} -.dl-horizontal dt { - float: left; - width: 160px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.dl-horizontal dd { - margin-left: 180px; -} -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eee; - border-bottom: 1px solid #fff; -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999; -} -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eee; -} -blockquote p { - margin-bottom: 0; - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} -blockquote small { - display: block; - line-height: 20px; - color: #999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eee; - border-left: 0; -} -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} -blockquote.pull-right small:before { - content: ''; -} -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; - white-space: nowrap; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -pre.prettyprint { - margin-bottom: 20px; -} -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -form { - margin: 0 0 20px; -} -fieldset { - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -legend small { - font-size: 15px; - color: #999; -} -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} -input, -button, -select, -textarea { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; -} -label { - display: block; - margin-bottom: 5px; -} -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"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - vertical-align: middle; -} -input, -textarea, -.uneditable-input { - width: 206px; -} -textarea { - height: auto; -} -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"], -.uneditable-input { - background-color: #fff; - border: 1px solid #ccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear .2s, box-shadow linear .2s; - -moz-transition: border linear .2s, box-shadow linear .2s; - -o-transition: border linear .2s, box-shadow linear .2s; - transition: border linear .2s, box-shadow linear .2s; -} -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - *margin-top: 0; - /* IE7 */ - margin-top: 1px \9; - /* IE8-9 */ - line-height: normal; -} -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} -select, -input[type="file"] { - height: 30px; - /* 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: 30px; -} -select { - width: 220px; - border: 1px solid #ccc; - background-color: #fff; -} -select[multiple], -select[size] { - height: auto; -} -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.uneditable-input, -.uneditable-textarea { - color: #999; - background-color: #fcfcfc; - border-color: #ccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} -.uneditable-textarea { - width: auto; - height: auto; -} -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999; -} -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999; -} -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999; -} -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} -input, -textarea, -.uneditable-input { - margin-left: 0; -} -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} -.controls-row { - *zoom: 1; -} -.controls-row:before, -.controls-row:after { - display: table; - content: ""; - line-height: 0; -} -.controls-row:after { - clear: both; -} -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eee; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b55457; -} -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b55457; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b55457; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #954143; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d49b9d; -} -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b55457; - background-color: #f8f0f0; - border-color: #b55457; -} -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} -.form-actions:before, -.form-actions:after { - display: table; - content: ""; - line-height: 0; -} -.form-actions:after { - clear: both; -} -.help-block, -.help-inline { - color: #6a6a6a; -} -.help-block { - display: block; - margin-bottom: 10px; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - vertical-align: middle; - padding-left: 5px; -} -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - vertical-align: middle; - font-size: 0; - white-space: nowrap; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 14px; -} -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #fff; - background-color: #eee; - border: 1px solid #ccc; -} -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -/* Allow for input prepend/append in search forms */ -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} -.control-group { - margin-bottom: 10px; -} -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; - line-height: 0; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} -.form-horizontal .controls:first-child { - *padding-left: 180px; -} -.form-horizontal .help-block { - margin-bottom: 0; -} -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} -.form-horizontal .form-actions { - padding-left: 180px; -} -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} -.table { - width: 100%; - margin-bottom: 20px; -} -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table th { - font-weight: bold; -} -.table thead th { - vertical-align: bottom; -} -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #eee; -} -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #ddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.table-bordered th, -.table-bordered td { - border-left: 1px solid #ddd; -} -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; -} -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; -} -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; - border-bottom-left-radius: 0; -} -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; - border-bottom-right-radius: 0; -} -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; -} -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: #f5f5f5; -} -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} -.table tbody tr.success > td { - background-color: #dff0d8; -} -.table tbody tr.error > td { - background-color: #f8f0f0; -} -.table tbody tr.warning > td { - background-color: #fcf8e3; -} -.table tbody tr.info > td { - background-color: #d9edf7; -} -.table-hover tbody tr.success:hover > td { - background-color: #d0e9c6; -} -.table-hover tbody tr.error:hover > td { - background-color: #f0dfe0; -} -.table-hover tbody tr.warning:hover > td { - background-color: #faf2cc; -} -.table-hover tbody tr.info:hover > td { - background-color: #c4e3f3; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle { - *margin-bottom: -3px; -} -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - text-decoration: none; - color: #fff; - background-color: #b9422f; - background-image: -moz-linear-gradient(top, #C14531, #ad3e2c); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#C14531), to(#ad3e2c)); - background-image: -webkit-linear-gradient(top, #C14531, #ad3e2c); - background-image: -o-linear-gradient(top, #C14531, #ad3e2c); - background-image: linear-gradient(to bottom, #C14531, #ad3e2c); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc14531', endColorstr='#ffad3e2c', GradientType=0); -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - outline: 0; - background-color: #b9422f; - background-image: -moz-linear-gradient(top, #C14531, #ad3e2c); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#C14531), to(#ad3e2c)); - background-image: -webkit-linear-gradient(top, #C14531, #ad3e2c); - background-image: -o-linear-gradient(top, #C14531, #ad3e2c); - background-image: linear-gradient(to bottom, #C14531, #ad3e2c); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc14531', endColorstr='#ffad3e2c', GradientType=0); -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - cursor: default; -} -.open { - *z-index: 1000; -} -.open > .dropdown-menu { - display: block; -} -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000; - content: ""; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -.dropdown-submenu { - position: relative; -} -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} -.dropdown-submenu > a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #cccccc; - margin-top: 5px; - margin-right: -10px; -} -.dropdown-submenu:hover > a:after { - border-left-color: #fff; -} -.dropdown-submenu.pull-left { - float: none; -} -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} -.dropdown .dropdown-menu .nav-header { - padding-left: 20px; - padding-right: 20px; -} -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.btn { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - padding: 4px 12px; - margin-bottom: 0; - font-size: 14px; - line-height: 20px; - text-align: center; - vertical-align: middle; - cursor: pointer; - color: #333; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #ffffff, #eaeaea); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#eaeaea)); - background-image: -webkit-linear-gradient(top, #ffffff, #eaeaea); - background-image: -o-linear-gradient(top, #ffffff, #eaeaea); - background-image: linear-gradient(to bottom, #ffffff, #eaeaea); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeaeaea', GradientType=0); - border-color: #eaeaea #eaeaea #c4c4c4; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #eaeaea; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - border: 1px solid #ccc; - *border: 0; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *margin-left: .3em; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); -} -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333; - background-color: #eaeaea; - *background-color: #dddddd; -} -.btn:active, -.btn.active { - background-color: #d1d1d1 \9; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; - padding-left: 0; - padding-right: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} -.btn-primary { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #cc5845; - background-image: -moz-linear-gradient(top, #d36452, #C14531); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#d36452), to(#C14531)); - background-image: -webkit-linear-gradient(top, #d36452, #C14531); - background-image: -o-linear-gradient(top, #d36452, #C14531); - background-image: linear-gradient(to bottom, #d36452, #C14531); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd36452', endColorstr='#ffc14531', GradientType=0); - border-color: #C14531 #C14531 #842f22; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #C14531; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #fff; - background-color: #C14531; - *background-color: #ad3e2c; -} -.btn-primary:active, -.btn-primary.active { - background-color: #983627 \9; -} -.btn-warning { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #f89406; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #fff; - background-color: #f89406; - *background-color: #df8505; -} -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #bd362f; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #fff; - background-color: #bd362f; - *background-color: #a9302a; -} -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #51a351; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #fff; - background-color: #51a351; - *background-color: #499249; -} -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} -.btn-info { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #2f96b4; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #fff; - background-color: #2f96b4; - *background-color: #2a85a0; -} -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} -.btn-inverse { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - background-image: -moz-linear-gradient(top, #444, #222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444), to(#222)); - background-image: -webkit-linear-gradient(top, #444, #222); - background-image: -o-linear-gradient(top, #444, #222); - background-image: linear-gradient(to bottom, #444, #222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - border-color: #222 #222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #222; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #fff; - background-color: #222; - *background-color: #151515; -} -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-link { - border-color: transparent; - cursor: pointer; - color: #C14531; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-link:hover, -.btn-link:focus { - color: #842f22; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #333; - text-decoration: none; -} -.btn-group { - position: relative; - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - font-size: 0; - vertical-align: middle; - white-space: nowrap; - *margin-left: .3em; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - margin-left: 5px; -} -.btn-toolbar { - font-size: 0; - margin-top: 10px; - margin-bottom: 10px; -} -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group > .btn + .btn { - margin-left: -1px; -} -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} -.btn-group > .btn-mini { - font-size: 10.5px; -} -.btn-group > .btn-small { - font-size: 11.9px; -} -.btn-group > .btn-large { - font-size: 17.5px; -} -.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; -} -.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; -} -.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; -} -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-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); - -moz-box-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); - box-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); - *padding-top: 5px; - *padding-bottom: 5px; -} -.btn-group > .btn-mini + .dropdown-toggle { - padding-left: 5px; - padding-right: 5px; - *padding-top: 2px; - *padding-bottom: 2px; -} -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} -.btn-group > .btn-large + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; - *padding-top: 7px; - *padding-bottom: 7px; -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); - box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -} -.btn-group.open .btn.dropdown-toggle { - background-color: #eaeaea; -} -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #C14531; -} -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222; -} -.btn .caret { - margin-top: 8px; - margin-left: 0; -} -.btn-large .caret { - margin-top: 6px; -} -.btn-large .caret { - border-left-width: 5px; - border-right-width: 5px; - border-top-width: 5px; -} -.btn-mini .caret, -.btn-small .caret { - margin-top: 8px; -} -.dropup .btn-large .caret { - border-bottom-width: 5px; -} -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group-vertical > .btn + .btn { - margin-left: 0; - margin-top: -1px; -} -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.alert, -.alert h4 { - color: #c09853; -} -.alert h4 { - margin: 0; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #468847; -} -.alert-success h4 { - color: #468847; -} -.alert-danger, -.alert-error { - background-color: #f8f0f0; - border-color: #c6898b; - color: #b55457; -} -.alert-danger h4, -.alert-error h4 { - color: #b55457; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #3a87ad; -} -.alert-info h4 { - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 20px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li > a > img { - max-width: none; -} -.nav > .pull-right { - float: right; -} -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} -.nav li + .nav-header { - margin-top: 9px; -} -.nav-list { - padding-left: 15px; - padding-right: 15px; - 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, 0.5); -} -.nav-list > li > a { - padding: 3px 15px; -} -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #C14531; -} -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #fff; -} -.nav-tabs, -.nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; - line-height: 0; -} -.nav-tabs:after, -.nav-pills:after { - clear: both; -} -.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; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - margin-bottom: -1px; -} -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - border-color: #eee #eee #ddd; -} -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #555; - background-color: #eee; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #fff; - background-color: #C14531; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; -} -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.nav .dropdown-toggle .caret { - border-top-color: #C14531; - border-bottom-color: #C14531; - margin-top: 6px; -} -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #842f22; - border-bottom-color: #842f22; -} -/* move down carets for tabs */ -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #fff; - background-color: #999; - border-color: #999; -} -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #fff; - border-bottom-color: #fff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, -.tabbable:after { - display: table; - content: ""; - line-height: 0; -} -.tabbable:after { - clear: both; -} -.tab-content { - overflow: auto; -} -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} -.tab-content > .active, -.pill-content > .active { - display: block; -} -.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 { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} -.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-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #eee #ddd #eee #eee; -} -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #fff; -} -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #eee #eee #eee #ddd; -} -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #fff; -} -.nav > .disabled > a { - color: #999; -} -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - cursor: default; -} -.navbar { - overflow: visible; - margin-bottom: 20px; - *position: relative; - *z-index: 2; -} -.navbar-inner { - min-height: 40px; - padding-left: 20px; - padding-right: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - *zoom: 1; -} -.navbar-inner:before, -.navbar-inner:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-inner:after { - clear: both; -} -.navbar .container { - width: auto; -} -.nav-collapse.collapse { - height: auto; - overflow: visible; -} -.navbar .brand { - float: left; - display: block; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777; -} -.navbar-link { - color: #777; -} -.navbar-link:hover, -.navbar-link:focus { - color: #333; -} -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-left: 1px solid #f2f2f2; - border-right: 1px solid #ffffff; -} -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; - line-height: 0; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} -.navbar-search .search-query { - margin-bottom: 0; - padding: 4px 14px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.navbar-static-top { - position: static; - margin-bottom: 0; -} -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-left: 0; - padding-right: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; - width: 100%; - *width: 99.94680851%; - width: 926px; -} -.navbar-fixed-top { - top: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1); - -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1); - box-shadow: 0 1px 10px rgba(0,0,0,.1); -} -.navbar-fixed-bottom { - bottom: 0; -} -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1); - -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1); - box-shadow: 0 -1px 10px rgba(0,0,0,.1); -} -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} -.navbar .nav > li { - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - background-color: transparent; - color: #333; - text-decoration: none; -} -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #e5e5e5; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); -} -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #fff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.navbar .nav > li > .dropdown-menu: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, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .nav > li > .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - border-top: 7px solid #ccc; - border-top-color: rgba(0, 0, 0, 0.2); - border-bottom: 0; - bottom: -7px; - top: auto; -} -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - border-top: 6px solid #fff; - border-bottom: 0; - bottom: -6px; - top: auto; -} -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #333; - border-bottom-color: #333; -} -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #e5e5e5; - color: #555; -} -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777; - border-bottom-color: #777; -} -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555; - border-bottom-color: #555; -} -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - left: auto; - right: 0; -} -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - left: auto; - right: 12px; -} -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - left: auto; - right: 13px; -} -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - left: auto; - right: 100%; - margin-left: 0; - margin-right: -1px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); - border-color: #252525; -} -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #fff; -} -.navbar-inverse .brand { - color: #999; -} -.navbar-inverse .navbar-text { - color: #999; -} -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - background-color: transparent; - color: #fff; -} -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #fff; - background-color: #111111; -} -.navbar-inverse .navbar-link { - color: #999; -} -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #fff; -} -.navbar-inverse .divider-vertical { - border-left-color: #111111; - border-right-color: #222222; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - background-color: #111111; - color: #fff; -} -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999; - border-bottom-color: #999; -} -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.navbar-inverse .navbar-search .search-query { - color: #fff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #ccc; -} -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333; - text-shadow: 0 1px 0 #fff; - background-color: #fff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-inverse .btn-navbar { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #040404; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #fff; - background-color: #040404; - *background-color: #000000; -} -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - text-shadow: 0 1px 0 #fff; -} -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} -.breadcrumb > .active { - color: #999; -} -.pagination { - margin: 20px 0; -} -.pagination ul { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; - margin-left: 0; - margin-bottom: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} -.pagination ul > li { - display: inline; -} -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; - border-left-width: 0; -} -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999; - cursor: default; -} -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #999; - background-color: transparent; - cursor: default; -} -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -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; -} -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -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; -} -.pagination-centered { - text-align: center; -} -.pagination-right { - text-align: right; -} -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -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; -} -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -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; -} -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-top-left-radius: 3px; - -moz-border-radius-topleft: 3px; - border-top-left-radius: 3px; - -webkit-border-bottom-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - border-bottom-left-radius: 3px; -} -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - -moz-border-radius-topright: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - -moz-border-radius-bottomright: 3px; - border-bottom-right-radius: 3px; -} -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} -.pager { - margin: 20px 0; - list-style: none; - text-align: center; - *zoom: 1; -} -.pager:before, -.pager:after { - display: table; - content: ""; - line-height: 0; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #f5f5f5; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999; - background-color: #fff; - cursor: default; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #fff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; - outline: none; -} -.modal.fade { - -webkit-transition: opacity .3s linear, top .3s ease-out; - -moz-transition: opacity .3s linear, top .3s ease-out; - -o-transition: opacity .3s linear, top .3s ease-out; - transition: opacity .3s linear, top .3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 10%; -} -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} -.modal-header .close { - margin-top: 2px; -} -.modal-header h3 { - margin: 0; - line-height: 30px; -} -.modal-body { - position: relative; - overflow-y: auto; - max-height: 400px; - padding: 15px; -} -.modal-form { - margin-bottom: 0; -} -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #fff; - -moz-box-shadow: inset 0 1px 0 #fff; - box-shadow: inset 0 1px 0 #fff; - *zoom: 1; -} -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; - line-height: 0; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.tooltip { - position: absolute; - z-index: 1030; - display: block; - visibility: visible; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -3px; - padding: 5px 0; -} -.tooltip.right { - margin-left: 3px; - padding: 0 5px; -} -.tooltip.bottom { - margin-top: 3px; - padding: 5px 0; -} -.tooltip.left { - margin-left: -3px; - padding: 0 5px; -} -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; - line-height: 0; -} -.thumbnails:after { - clear: both; -} -.row-fluid .thumbnails { - margin-left: 0; -} -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #C14531; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} -.thumbnail > img { - display: block; - max-width: 100%; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; - color: #555; -} -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #fff; - vertical-align: baseline; - white-space: nowrap; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #999; -} -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.badge { - padding-left: 9px; - padding-right: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} -.label:empty, -.badge:empty { - display: none; -} -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label-important, -.badge-important { - background-color: #b55457; -} -.label-important[href], -.badge-important[href] { - background-color: #954143; -} -.label-warning, -.badge-warning { - background-color: #f89406; -} -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} -.label-success, -.badge-success { - background-color: #468847; -} -.label-success[href], -.badge-success[href] { - background-color: #356635; -} -.label-info, -.badge-info { - background-color: #3a87ad; -} -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} -.label-inverse, -.badge-inverse { - background-color: #333; -} -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} -.btn-mini .label, -.btn-mini .badge { - top: 0; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - overflow: hidden; - height: 20px; - margin-bottom: 20px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 100%; - color: #fff; - float: left; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); - box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); -} -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.accordion { - margin-bottom: 20px; -} -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.accordion-heading { - border-bottom: 0; -} -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} -.accordion-toggle { - cursor: pointer; -} -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} -.carousel-inner { - overflow: hidden; - width: 100%; - position: relative; -} -.carousel-inner > .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.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: #fff; - text-align: center; - background: #222; - border: 3px solid #fff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.carousel-control.right { - left: auto; - right: 15px; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); - border-radius: 5px; -} -.carousel-indicators .active { - background-color: #fff; -} -.carousel-caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 15px; - background: #333; - background: rgba(0, 0, 0, 0.75); -} -.carousel-caption h4, -.carousel-caption p { - color: #fff; - line-height: 20px; -} -.carousel-caption h4 { - margin: 0 0 5px; -} -.carousel-caption p { - margin-bottom: 0; -} -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - color: inherit; - letter-spacing: -1px; -} -.hero-unit li { - line-height: 30px; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - background-color: #fff; - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - white-space: normal; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} -.popover-title:empty { - display: none; -} -.popover-content { - padding: 9px 14px; -} -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover .arrow { - border-width: 11px; -} -.popover .arrow:after { - border-width: 10px; - content: ""; -} -.popover.top .arrow { - left: 50%; - margin-left: -11px; - border-bottom-width: 0; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - bottom: -11px; -} -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-bottom-width: 0; - border-top-color: #fff; -} -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-left-width: 0; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); -} -.popover.right .arrow:after { - left: 1px; - bottom: -10px; - border-left-width: 0; - border-right-color: #fff; -} -.popover.bottom .arrow { - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - top: -11px; -} -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); -} -.popover.left .arrow:after { - right: 1px; - border-right-width: 0; - border-left-color: #fff; - bottom: -10px; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} -.affix { - position: fixed; -} -/*! - * Bootstrap Responsive v2.3.2 - * - * 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. - */ -@-ms-viewport { - width: device-width; -} -.hidden { - display: none; - visibility: hidden; -} -.visible-phone { - display: none !important; -} -.visible-tablet { - display: none !important; -} -.hidden-desktop { - display: none !important; -} -.visible-desktop { - display: inherit !important; -} -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - line-height: 0; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - line-height: 0; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - margin-left: 2.76243094%; - *margin-left: 2.70923945%; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.76243094%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851%; - } - .row-fluid .span11 { - width: 91.43646409%; - *width: 91.3832726%; - } - .row-fluid .span10 { - width: 82.87292818%; - *width: 82.81973669%; - } - .row-fluid .span9 { - width: 74.30939227%; - *width: 74.25620078%; - } - .row-fluid .span8 { - width: 65.74585635%; - *width: 65.69266486%; - } - .row-fluid .span7 { - width: 57.18232044%; - *width: 57.12912895%; - } - .row-fluid .span6 { - width: 48.61878453%; - *width: 48.56559304%; - } - .row-fluid .span5 { - width: 40.05524862%; - *width: 40.00205713%; - } - .row-fluid .span4 { - width: 31.49171271%; - *width: 31.43852122%; - } - .row-fluid .span3 { - width: 22.9281768%; - *width: 22.87498531%; - } - .row-fluid .span2 { - width: 14.36464088%; - *width: 14.31144939%; - } - .row-fluid .span1 { - width: 5.80110497%; - *width: 5.74791348%; - } - .row-fluid .offset12 { - margin-left: 105.52486188%; - *margin-left: 105.4184789%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243094%; - *margin-left: 102.65604796%; - } - .row-fluid .offset11 { - margin-left: 96.96132597%; - *margin-left: 96.85494299%; - } - .row-fluid .offset11:first-child { - margin-left: 94.19889503%; - *margin-left: 94.09251205%; - } - .row-fluid .offset10 { - margin-left: 88.39779006%; - *margin-left: 88.29140708%; - } - .row-fluid .offset10:first-child { - margin-left: 85.63535912%; - *margin-left: 85.52897614%; - } - .row-fluid .offset9 { - margin-left: 79.83425414%; - *margin-left: 79.72787116%; - } - .row-fluid .offset9:first-child { - margin-left: 77.0718232%; - *margin-left: 76.96544023%; - } - .row-fluid .offset8 { - margin-left: 71.27071823%; - *margin-left: 71.16433525%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729%; - *margin-left: 68.40190431%; - } - .row-fluid .offset7 { - margin-left: 62.70718232%; - *margin-left: 62.60079934%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138%; - *margin-left: 59.8383684%; - } - .row-fluid .offset6 { - margin-left: 54.14364641%; - *margin-left: 54.03726343%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121547%; - *margin-left: 51.27483249%; - } - .row-fluid .offset5 { - margin-left: 45.5801105%; - *margin-left: 45.47372752%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767956%; - *margin-left: 42.71129658%; - } - .row-fluid .offset4 { - margin-left: 37.01657459%; - *margin-left: 36.91019161%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414365%; - *margin-left: 34.14776067%; - } - .row-fluid .offset3 { - margin-left: 28.45303867%; - *margin-left: 28.3466557%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773%; - *margin-left: 25.58422476%; - } - .row-fluid .offset2 { - margin-left: 19.88950276%; - *margin-left: 19.78311978%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182%; - *margin-left: 17.02068884%; - } - .row-fluid .offset1 { - margin-left: 11.32596685%; - *margin-left: 11.21958387%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591%; - *margin-left: 8.45715293%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} -@media (max-width: 767px) { - body { - padding-left: 20px; - padding-right: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-left: -20px; - margin-right: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - clear: none; - width: auto; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - float: none; - display: block; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - left: 20px; - right: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-left: 10px; - padding-right: 10px; - } - .media .pull-left, - .media .pull-right { - float: none; - display: block; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - left: 10px; - right: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-left: 10px; - padding-right: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .nav > li > a:focus, - .nav-collapse .dropdown-menu a:hover, - .nav-collapse .dropdown-menu a:focus { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .nav > li > a:focus, - .navbar-inverse .nav-collapse .dropdown-menu a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:focus { - background-color: #111111; - } - .nav-collapse.in .btn-group { - margin-top: 5px; - padding: 0; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - float: none; - display: none; - max-width: none; - margin: 0 15px; - padding: 0; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - overflow: hidden; - height: 0; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-left: 10px; - padding-right: 10px; - } -} -@media (min-width: 979px + 1) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} -.break-word { - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.tag { - display: inline-block; - margin-bottom: 4px; - color: #111; - background-color: #f6f6f6; - padding: 1px 10px; - border: 1px solid #dddddd; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} -a.tag:hover { - text-decoration: none; - color: #fff; - background-color: #d36452; - border: 1px solid #c14531; - -webkit-box-shadow: inset 0 1px 0 #dd887b; - -moz-box-shadow: inset 0 1px 0 #dd887b; - box-shadow: inset 0 1px 0 #dd887b; -} -.pill { - display: inline-block; - background-color: #6f8890; - color: #FFF; - padding: 2px 10px 1px 10px; - margin-right: 5px; - font-weight: normal; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.pill a { - color: #FFF; -} -.pill a.remove { - font-size: 11px; -} -.unstyled { - margin: 0; - list-style: none; -} -.simple-item { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.simple-item:last-of-type { - border-bottom: 0; -} -.simple-list { - *zoom: 1; - margin: 0; - list-style: none; -} -.simple-list:before, -.simple-list:after { - display: table; - content: ""; - line-height: 0; -} -.simple-list:after { - clear: both; -} -.simple-list > li { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.simple-list > li:last-of-type { - border-bottom: 0; -} -.simple-list .ckan-icon { - position: relative; - top: 0px; -} -.module-narrow .simple-list > li { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.listing li { - text-align: right; - margin-bottom: 5px; -} -.listing .key { - clear: right; - font-weight: bold; -} -.js .tab-content { - display: none; -} -.js .tab-content.active { - display: block; -} -.box { - background-color: #FFF; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); -} -.module { - margin: 20px 0; -} -.module-heading { - *zoom: 1; - margin: 0; - padding: 7px 25px; - font-size: 14px; - line-height: 1.3; - background-color: #f6f6f6; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; -} -.module-heading:before, -.module-heading:after { - display: table; - content: ""; - line-height: 0; -} -.module-heading:after { - clear: both; -} -.module-content { - padding: 0 25px; - margin: 20px 0; -} -@media (min-width: 768px) { - .span9 div.module-content { - padding-left: 10px; - } -} -.module-content:first-child { - margin-top: 0; - padding-top: 20px; -} -.module-content:last-child { - margin-bottom: 0; - padding-bottom: 20px; -} -.module-content > :last-child { - margin-bottom: 0; -} -.module:first-child .module-heading { - -webkit-border-radius: 3px 0 0 0; - -moz-border-radius: 3px 0 0 0; - border-radius: 3px 0 0 0; - border-top-width: 0; -} -.module:last-child { - margin-bottom: 20px; -} -.module-footer { - padding: 7px 25px 7px; - margin: 0; - border-top: 1px dotted #ddd; -} -.module .read-more { - font-weight: bold; - color: #000; -} -.module-content .pagination { - margin-left: -25px; - margin-right: -25px; - margin-bottom: -20px; -} -.module .pagination > ul { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - border: 0; -} -.module .pagination li a { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - padding-top: 7px; - padding-bottom: 7px; -} -.module .pagination li:first-child a, -.module .pagination li:last-child a { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.module-content-shallow { - padding: 0; - margin-top: 10px; - padding-bottom: 10px; -} -.module h1 { - margin-bottom: 20px; -} -.module-shallow .module-content { - padding: 10px; - margin: 0; -} -.module-shallow .module-tags { - margin-top: 0; - margin-bottom: 0; -} -.module-shallow .module-content:first-child { - padding-top: 10px; -} -.module-shallow .module-content:last-child { - padding-bottom: 10px; -} -.module-narrow .module-heading, -.module-narrow .module-content, -.module-narrow .module-footer { - padding-left: 15px; - padding-right: 15px; -} -.module-grid { - margin: 0; - list-style: none; - *zoom: 1; - margin: 0 -25px; - padding-bottom: 15px; - background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; - border-width: 1px 0; -} -.module-grid:before, -.module-grid:after { - display: table; - content: ""; - line-height: 0; -} -.module-grid:after { - clear: both; -} -.module-item { - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - float: left; - margin-left: 20px; - width: 460px; - padding-top: 10px; - padding-bottom: 10px; - padding-right: 50px; - overflow: hidden; - position: relative; -} -.module-item span.count { - color: #999; -} -.module-item .media-image { - margin-bottom: 5px; -} -.module-item .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; -} -.module-item:hover { - z-index: 1; -} -.module-item:hover .media-edit { - opacity: 1; -} -.module-item.first { - clear: left; -} -.group .content img { - margin: 0 -5px 5px; - max-width: initial; -} -.group .content h3 { - font-size: 14px; - line-height: 1.3; -} -.group-listing { - margin-left: -20px; -} -.ckanext-datapreview { - position: relative; - clear: both; - padding-top: 15px; - margin-top: 0; -} -.ckanext-datapreview > iframe { - min-height: 650px; -} -.ckanext-datapreview > img { - max-height: 500px; - max-width: 100%; - overflow: hidden; -} -.package-info h4 { - margin-bottom: 10px; -} -.module-resource { - background-color: #fff; - border-bottom: 1px solid #ddd; - margin-top: 0; - margin-bottom: 0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.module-resource .actions { - position: relative; - float: right; - top: -10px; - right: -15px; -} -.module .module-tags { - padding-bottom: 8px; -} -.secondary .module:first-child, -.primary .module:first-child { - margin-top: 0; -} -.no-nav .module:last-child { - margin-top: 0; -} -.module-image { - float: left; - width: 50px; - height: 50px; - line-height: 50px; - text-align: center; - margin-right: 15px; -} -.module-image img { - max-width: 50px; - max-height: 50px; - vertical-align: middle; -} -.banner { - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - -webkit-transform-origin: center center; - -moz-transform-origin: center center; - -ms-transform-origin: center center; - -o-transform-origin: center center; - transform-origin: center center; - position: absolute; - top: 15px; - right: -35px; - width: 80px; - color: #fff; - background-color: #C14531; - padding: 1px 20px; - font-size: 11px; - text-align: center; - text-transform: uppercase; -} -.media-grid { - margin: 0; - list-style: none; - *zoom: 1; - margin: 0 -25px; - padding-bottom: 15px; - background: #fbfbfb url("../../../base/images/bg.png"); - border: 1px solid #ddd; - border-width: 1px 0; -} -.media-grid:before, -.media-grid:after { - display: table; - content: ""; - line-height: 0; -} -.media-grid:after { - clear: both; -} -@media (min-width: 768px) { - .media-grid { - margin-left: -27px; - } - .module-content .wide .media-grid { - margin-left: -25px; - } -} -.media-item { - position: relative; - float: left; - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.media-item span.count { - color: #999; -} -.media-item .media-image { - margin-bottom: 5px; -} -.media-item .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; -} -.media-item:hover { - z-index: 1; -} -.media-item:hover .media-edit { - opacity: 1; -} -.media-view { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: 1px solid #ddd; - overflow: hidden; - -webkit-transition: all 0.2s ease-in; - -moz-transition: all 0.2s ease-in; - -o-transition: all 0.2s ease-in; - transition: all 0.2s ease-in; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.media-view:hover, -.media-view.hovered { - border-color: #C14531; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1); -} -.media-view:hover .banner, -.media-view.hovered .banner { - background-color: #C14531; -} -.media-view span { - display: none; -} -.media-view .banner { - display: block; - background-color: #b7b7b7; - -webkit-transition: background-color 0.2s ease-in; - -moz-transition: background-color 0.2s ease-in; - -o-transition: background-color 0.2s ease-in; - transition: background-color 0.2s ease-in; -} -.media-image { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.media-heading { - font-size: 18px; - line-height: 1.3; - margin: 5px 0; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.media-overlay { - position: relative; - min-height: 35px; -} -.media-overlay .media-heading { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 12px 10px; - margin: 0; - background-color: #000; - background-color: rgba(0, 0, 0, 0.8); - font-size: 13px; - color: #fff; - z-index: 1; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.media-overlay .media-image { - float: none; - display: block; - margin-right: 0; -} -.media-item.is-expander .truncator-link { - -webkit-transition: opacity 0.2s ease-in; - -moz-transition: opacity 0.2s ease-in; - -o-transition: opacity 0.2s ease-in; - transition: opacity 0.2s ease-in; - position: absolute; - z-index: 10; - left: 15px; - bottom: 15px; - opacity: 0; -} -.media-item.is-expander:hover { - padding-bottom: 35px; -} -.media-item.is-expander:hover .truncator-link { - opacity: 1; -} -.wide .media-item { - width: 186px; -} -.nav-simple, -.nav-aside { - *zoom: 1; - margin: 0; - list-style: none; - padding-bottom: 0; -} -.nav-simple:before, -.nav-aside:before, -.nav-simple:after, -.nav-aside:after { - display: table; - content: ""; - line-height: 0; -} -.nav-simple:after, -.nav-aside:after { - clear: both; -} -.nav-simple > li, -.nav-aside > li { - font-size: 12px; - line-height: 1.16666667em; - padding: 7px 25px; - border-bottom: 1px dotted #ddd; -} -.nav-simple > li:last-of-type, -.nav-aside > li:last-of-type { - border-bottom: 0; -} -.nav-simple .ckan-icon, -.nav-aside .ckan-icon { - position: relative; - top: 0px; -} -.nav-aside { - border-top: 1px dotted #DDD; - border-bottom: 1px dotted #DDD; - margin-bottom: 15px; -} -.nav-item > a, -.nav-aside li a { - color: #333; - font-size: 14px; - line-height: 20px; - margin: -7px -25px; - padding: 7px 25px; -} -.nav-item.active, -.nav-aside li.active { - background-color: #f6f6f6; -} -.nav-item.active > a, -.nav-aside li.active a { - position: relative; - color: #FFF; - background-color: #8CA0A6; -} -.nav-item.active > a:hover, -.nav-aside li.active a:hover { - color: #FFF; - background-color: #8CA0A6; -} -@media (min-width: 768px) { - .nav-item.active > a:before, - .nav-aside li.active a:before { - content: ' '; - position: absolute; - top: 0; - right: -6px; - width: 6px; - height: 34px; - background-image: url("../../../base/images/nav-active.png?1"); - } -} -.nav-item.active > a span, -.nav-aside li.active a span { - white-space: nowrap; - overflow: hidden; - display: block; -} -.module-narrow .nav-item > a, -.module-narrow .nav-aside li a { - padding-left: 15px; - padding-right: 15px; - position: relative; -} -.module-narrow .nav-item.image, -.module-narrow .nav-aside li.image { - position: relative; -} -.module-narrow .nav-item.image > a, -.module-narrow .nav-aside li.image a { - padding-left: 42px; - padding-right: 42px; -} -.module-narrow .nav-item.image > img, -.module-narrow .nav-aside li.image img { - position: absolute; - top: 50%; - left: 15px; - width: 20px; - height: 20px; - margin-top: -10px; - z-index: 2; -} -.nav-facet .nav-item > a:hover:after, -.nav-facet .nav-item.active > a:after { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} -.nav-facet .nav-item > a:hover:after { - width: 17px; - height: 17px; - background-position: -17px -16px; -} -.nav-facet .nav-item.active > a:after { - width: 17px; - height: 17px; - background-position: 0px -16px; - right: 3px; -} -.user-list { - margin: 0; - list-style: none; -} -.user-list li { - margin: 0 0 10px 0; -} -.user-list .gravatar { - vertical-align: -4px; - margin-right: 3px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.nav-facet-tertiary { - margin: 10px 0; -} -.nav-facet-tertiary .module-heading { - margin-bottom: 5px; - padding: 8px 12px; - border-bottom-width: 0; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-facet-tertiary .module-heading i { - display: none; -} -.nav-facet-tertiary .module-footer { - padding: 8px 12px; - border-top-width: 0; -} -.nav-facet-tertiary .module-footer a { - font-weight: normal; - color: #8C8C8C; -} -.nav-facet-tertiary .nav { - margin-bottom: 0; -} -.nav-facet-tertiary .module-content.empty { - padding: 8px 12px; - margin-top: 0; -} -.nav-facet-tertiary .nav li.active { - position: relative; -} -.nav-facet-tertiary .nav li.active > a:hover:after, -.nav-facet-tertiary .nav li.active > a:after { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - width: 17px; - height: 17px; - background-position: 0px -16px; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} -.nav-simple > .nav-btn { - padding-left: 0; - padding-right: 0; - text-align: center; -} -.nav-simple > .nav-btn .btn { - display: inline-block; -} -.js .js-hide { - display: none; -} -.js .js-hide.active { - display: block; -} -.btn, -label { - font-weight: bold; -} -.btn-rounded { - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - padding-left: 15px; - padding-right: 15px; -} -label { - cursor: pointer; - font-size: 14px; -} -label:after { - content: ":"; -} -label.radio:after, -label.checkbox:after { - content: ""; -} -input[type=radio], -input[type=checkbox] { - position: relative; - top: 7px; - padding: 0; - margin: 0; -} -input[type=radio].checkbox-onown, -input[type=checkbox].checkbox-onown { - top: 0; -} -select { - padding: 4px; -} -textarea { - max-width: 100%; -} -.control-group .btn { - position: relative; - top: -2px; -} -.control-full input, -.control-full select, -.control-full textarea { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - height: auto; - width: 100%; -} -.control-medium input, -.control-medium select, -.control-medium textarea { - width: 320px; -} -@media (max-width: 768px) { - .control-medium input, - .control-medium select, - .control-medium textarea { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 28px; - } -} -.control-large input, -.control-large .control-label { - font-size: 17.5px; - line-height: 30px; -} -.control-large input { - height: 41px; -} -.control-required { - color: #c6898b; -} -.form-actions .control-required-message { - float: left; - margin-left: 20px; - margin-bottom: 0; - line-height: 30px; -} -.form-actions .control-required-message:first-child { - margin-left: 0; -} -.form-actions { - background: none; - margin-left: -25px; - margin-right: -25px; - margin-bottom: 0; - padding-bottom: 0; -} -@media (min-width: 768px) { - .form-actions { - text-align: right; - } -} -.form-actions .action-info { - line-height: 2; - text-align: left; - color: #707070; - margin: 0; -} -@media (min-width: 768px) { - .form-actions .action-info { - float: left; - width: 50%; - } -} -.form-actions .action-info.small { - font-size: 11px; - line-height: 1.2; -} -@media (max-width: 768px) { - .form-actions .btn { - margin-top: 5px; - } -} -.form-horizontal .control-label { - width: 120px; -} -@media (min-width: 768px) { - .form-horizontal .controls { - margin-left: 130px; - } -} -.form-horizontal .info-block { - position: relative; - display: block; - font-size: 11px; - color: #aaa; - line-height: 1.3; - margin-top: 6px; -} -.form-horizontal .info-help { - padding: 6px 0; -} -.form-horizontal .info-help:before { - display: none; -} -.form-horizontal .info-help-tight { - margin-top: -10px; -} -@media (min-width: 980px) { - .form-horizontal .info-block { - padding: 6px 0 6px 0; - } - .form-horizontal .info-inline { - float: right; - width: 265px; - margin-top: 0; - padding-bottom: 0; - } -} -.form-horizontal .control-medium .info-block.info-inline { - width: 165px; -} -.form-horizontal .info-block:before { - font-size: 2.2em; - position: absolute; - left: 0; - top: 2px; -} -.form-horizontal .info-inline:before { - top: 8px; -} -.info-block .icon-large, -.info-inline .icon-large { - float: left; - font-size: 22px; - margin-right: 15px; -} -.form-horizontal .info-block a { - color: #aaa; - text-decoration: underline; -} -.form-horizontal .form-actions { - padding-left: 25px; - padding-right: 25px; -} -.form-inline input { - padding-bottom: 9px; -} -.form-inline select { - margin-top: 0; -} -.form-inline .btn { - margin-left: 5px; -} -.form-narrow label { - margin-bottom: 0; -} -.form-narrow select { - width: 100%; -} -.form-narrow .form-actions { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px 0; -} -.form-select label { - margin-right: 5px; -} -.simple-input label, -.simple-input button { - display: none; -} -.simple-input .field { - position: relative; -} -.simple-input .field-bordered { - border-bottom: 1px dotted #ddd; -} -.simple-input .field input { - width: 100%; - height: auto; - margin: 0 -7px; - padding: 7px 5px; -} -.simple-input .field .btn-search { - position: absolute; - display: block; - height: 17px; - width: 17px; - padding: 0; - top: 50%; - right: 0; - margin-top: -10px; - background-color: transparent; - border: none; - color: #999; - -webkit-transition: color 0.2s ease-in; - -moz-transition: color 0.2s ease-in; - -o-transition: color 0.2s ease-in; - transition: color 0.2s ease-in; -} -.simple-input .field .btn-search:hover { - color: #000; -} -.editor textarea { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - border-bottom: none; -} -.editor .editor-info-block { - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - display: block; - float: none; - padding: 4px 10px; - background: #ebebeb; - width: auto; - border: 1px solid #ccc; - border-top: none; - font-size: 11px; - color: #282828; -} -.editor .editor-info-block a { - color: #C14531; - text-decoration: none; -} -@media (max-width: 768px) { - [data-module="custom-fields"] .input-prepend .add-on { - display: block; - } -} -@media (max-width: 480px) { - [data-module="custom-fields"] .input-prepend { - width: 100%; - } - [data-module="custom-fields"] .control-custom input { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 28px; - } -} -.control-custom { - font-size: 0; -} -.control-custom label { - margin-bottom: 0; -} -.control-custom input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - width: 140px; -} -.control-custom input:last-of-type { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.control-custom .checkbox { - display: inline-block; - margin-left: 5px; -} -.control-custom .checkbox input { - width: auto; -} -.control-custom.disabled label, -.control-custom.disabled input { - color: #aaa; - text-decoration: line-through; - text-shadow: none; -} -.control-custom.disabled input { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - background-color: #f3f3f3; -} -.control-custom.disabled .checkbox { - color: #444; - text-decoration: none; -} -.control-custom .checkbox.btn { - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; - position: relative; - top: 0; - left: 5px; - height: 1px; - width: 9px; - padding: 3px 8px; - line-height: 18px; -} -.control-custom .checkbox.btn span { - display: none; - width: 30px; -} -.control-custom .checkbox.btn:before { - position: relative; - top: 1px; - left: -1px; - color: #fff; -} -.control-custom .checkbox.btn input { - display: none; -} -.control-custom.disabled .checkbox.btn { - color: #fff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #cc5845; - background-image: -moz-linear-gradient(top, #d36452, #C14531); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#d36452), to(#C14531)); - background-image: -webkit-linear-gradient(top, #d36452, #C14531); - background-image: -o-linear-gradient(top, #d36452, #C14531); - background-image: linear-gradient(to bottom, #d36452, #C14531); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd36452', endColorstr='#ffc14531', GradientType=0); - border-color: #C14531 #C14531 #842f22; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - *background-color: #C14531; - /* Darken IE7 buttons by default so they stand out more given they won't have borders */ - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.control-custom.disabled .checkbox.btn:hover, -.control-custom.disabled .checkbox.btn:focus, -.control-custom.disabled .checkbox.btn:active, -.control-custom.disabled .checkbox.btn.active, -.control-custom.disabled .checkbox.btn.disabled, -.control-custom.disabled .checkbox.btn[disabled] { - color: #fff; - background-color: #C14531; - *background-color: #ad3e2c; -} -.control-custom.disabled .checkbox.btn:active, -.control-custom.disabled .checkbox.btn.active { - background-color: #983627 \9; -} -.control-custom.disabled .checkbox.btn .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} -.alert-danger a, -.alert-error a { - color: #b55457; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea, -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - border-color: #c6898b; -} -.error-inline { - color: #b55457; -} -.error-block, -.error-inline { - font-size: 12px; -} -.error-block { - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - display: block; - padding: 6px 8px 3px; - background: #c6898b; - margin: -3px 0 0; - color: #fff; - width: 208px; -} -.control-medium .error-block { - width: 318px; -} -.control-full .error-block { - width: auto; -} -.control-group.error .input-prepend .error-block, -.control-custom.error .error-block { - width: auto; -} -.control-custom.error .error-block { - width: 401px; -} -.control-select.error .error-block { - width: 196px; -} -.stages { - margin: 0; - list-style: none; - *zoom: 1; - color: #aeaeae; - counter-reset: stage; - margin: -20px -25px 20px; - overflow: hidden; -} -.stages:before, -.stages:after { - display: table; - content: ""; - line-height: 0; -} -.stages:after { - clear: both; -} -.stages li { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - line-height: 27px; - counter-increment: stage; - width: 50%; - background-color: #EDEDED; - float: left; - padding: 10px 20px; - position: relative; - z-index: 0; -} -.stages li:before { - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; - content: counter(stage); - display: inline-block; - width: 27px; - height: 27px; - margin-right: 5px; - font-weight: bold; - text-align: center; - color: #fff; - background-color: #aeaeae; - z-index: 1; -} -.stages li:after { - left: 0; - border: solid rgba(237, 237, 237, 0); - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-top-color: #EDEDED; - border-bottom-color: #EDEDED; - border-width: 29px; - top: 50%; - margin-top: -29px; - margin-left: -30px; -} -.stages li.last { - position: relative; - right: -1px; -} -.stages li.last, -.stages li.last .highlight { - -webkit-border-radius: 0 3px 0 0; - -moz-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0; -} -.stages li.first:after { - content: none; - border: none; -} -.stages li.active:after { - border-color: rgba(140, 198, 138, 0); - border-top-color: #8cc68a; - border-bottom-color: #8cc68a; -} -.stages li.complete:after { - border-color: rgba(197, 226, 196, 0); - border-top-color: #c5e2c4; - border-bottom-color: #c5e2c4; -} -.stages.stage-3 li.complete:first-child:after { - content: none; -} -.stages li.active, -.stages li.complete { - background: none; -} -.stages li.active:before { - color: #8cc68a; - background: #fff; -} -.stages li.complete:before { - color: #c5e2c4; - background: #eef6ed; -} -.stages li .highlight { - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - width: 100%; - padding: 10px 52px; - border: none; - text-align: left; - text-decoration: none; - line-height: 27px; - z-index: -1; -} -@media (max-width: 768px) { - .stages li .highlight { - text-indent: -9999px; - } -} -.stages li.active .highlight { - color: #fff; - background: #8cc68a; -} -.stages li.complete .highlight { - color: #eef6ed; - background: #c5e2c4; -} -.alert > :last-child { - margin-bottom: 0; -} -.slug-preview { - font-size: 14px; - line-height: 1.5; - margin-top: 5px; - margin-left: 10px; -} -.slug-preview-value { - background-color: #faedcf; - margin-right: 3px; -} -.resource-upload-field { - position: relative; - overflow: hidden; - display: inline-block; - vertical-align: bottom; -} -.resource-upload-field label { - z-index: 0; -} -.resource-upload-field input { - opacity: 0; - filter: alpha(opacity=0); - position: absolute; - top: 0; - right: 0; - z-index: 1; - margin: 0; - border: solid transparent; - border-width: 100px 0 0 200px; - cursor: pointer; - direction: ltr; - -moz-transform: translate(-300px, 0) scale(4); -} -.resource-upload-field.loading { - display: inline-block; - background: url("../../../base/images/loading-spinner.gif") no-repeat center right; - padding-right: 5px; -} -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - font-size: 14px; -} -.select2-container-multi .select2-choices .select2-search-field input { - height: 29px; -} -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - padding-left: 10px; -} -.select2-container { - margin-top: 1px; -} -.select2-container-multi { - margin-top: 0; -} -.select2-container-multi .select2-choices .select2-search-choice { - padding: 5px 8px 5px 22px; -} -.select2-container-multi.select2-container .select2-choices { - padding-top: 3px; - padding-bottom: 3px; -} -.select2-search-choice-close, -.select2-container-multi .select2-search-choice-close { - top: 6px; - left: 5px; -} -.select2-container-multi .select2-choices { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; - background-color: #fff; - border: 1px solid #ccc; -} -.select2-container-active .select2-choices, -.select2-container-multi.select2-container-active .select2-choices { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -} -.select2-container-multi .select2-drop { - margin-top: -2px; -} -.select2-container .select2-results li { - line-height: 18px; - padding-top: 4px; - padding-bottom: 4px; -} -.control-full .select2-container { - max-width: 100%; -} -.control-group.error .select2-container input:focus, -.control-group.error .select2-container select:focus, -.control-group.error .select2-container textarea:focus { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.js .image-upload #field-image-url { - padding-right: 90px; -} -.js .image-upload #field-image-upload { - cursor: pointer; - position: absolute; - z-index: 1; - opacity: 0; - filter: alpha(opacity=0); -} -.js .image-upload .controls { - position: relative; -} -.js .image-upload .btn { - position: relative; - top: 0; - margin-right: 10px; -} -.js .image-upload .btn.hover { - color: #333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.js .image-upload .btn-remove-url { - position: absolute; - margin-right: 0; - top: 4px; - right: 5px; - padding: 0 12px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.js .image-upload .btn-remove-url .icon-remove { - margin-right: 0; -} -.add-member-form .control-label { - width: 100%; - text-align: left; -} -.add-member-form .controls { - margin-left: auto; -} -.add-member-or { - float: left; - margin-top: 75px; - width: 7%; - text-align: center; - text-transform: uppercase; - color: #999; - font-weight: bold; -} -.add-member-form .row-fluid .control-group { - float: left; - width: 45%; -} -.add-member-form .row-fluid .select2-container, -.add-member-form .row-fluid input { - width: 100% !important; -} -#recaptcha_table { - table-layout: inherit; - line-height: 1; -} -.dataset-item { - border-bottom: 1px dotted #ddd; - padding-bottom: 20px; - margin-bottom: 20px; -} -@media (max-width: 768px) { - .dataset-item { - word-wrap: break-word; - } -} -.dataset-item:last-of-type { - border-bottom: none; - margin-bottom: 0; - padding-bottom: 0; -} -.dataset-heading { - font-size: 16px; - margin-top: 0; - margin-bottom: 8px; - line-height: 1.3; -} -.dataset-heading a { - color: #333; -} -.dataset-heading .label { - position: relative; - top: -1px; -} -.dataset-private { - margin-right: 10px; - text-transform: uppercase; -} -.dataset-private .icon-lock { - width: 9px; -} -.dataset-private.pull-right { - margin-right: 0; -} -.dataset-resources { - margin-top: 8px; -} -.dataset-resources li { - display: inline; -} -.dataset-resources li a { - background-color: #aaa; -} -.dataset-heading .popular { - top: 0; -} -.resource-list { - margin: 0; - list-style: none; - margin: -10px -10px 10px -10px; -} -.resource-item { - position: relative; - padding: 10px 10px 10px 60px; - margin-bottom: 0px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.resource-item:hover { - background-color: #eee; -} -.resource-item .heading { - color: #000; - font-size: 14px; - font-weight: bold; -} -.resource-item .format-label { - position: absolute; - top: 10px; - left: 10px; -} -.resource-item .description { - font-size: 12px; - margin-bottom: 0; - min-height: 12px; -} -.resource-item .btn-group { - position: absolute; - top: 14px; - right: 10px; -} -@media (max-width: 768px) { - .resource-item .btn-group { - display: none; - } -} -.resource-list.reordering .resource-item { - border: 1px solid #ddd; - margin-bottom: 10px; - cursor: move; -} -.resource-list.reordering .resource-item .handle { - display: block; - position: absolute; - color: #888; - left: -31px; - top: 50%; - margin-top: -15px; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - border: 1px solid #ddd; - border-width: 1px 0 1px 1px; - background-color: #fff; - -webkit-border-radius: 20px 0 0 20px; - -moz-border-radius: 20px 0 0 20px; - border-radius: 20px 0 0 20px; -} -.resource-list.reordering .resource-item .handle:hover { - text-decoration: none; -} -.resource-list.reordering .resource-item:hover .handle { - background-color: #eee; -} -.resource-list.reordering .resource-item.ui-sortable-helper { - background-color: #eee; - border: 1px solid #C14531; -} -.resource-list.reordering .resource-item.ui-sortable-helper .handle { - background-color: #eee; - border-color: #C14531; - color: #333; -} -.resource-item .handle { - display: none; -} -.tag-list { - margin: 0; - list-style: none; - padding: 10px 10px 5px 10px; -} -.tag-list li { - display: inline-block; - margin-right: 5px; -} -.tag-list li:last-child { - margin-right: 0; -} -.additional-info td, -.additional-info th { - width: 50%; -} -.label[data-format=html], -.label[data-format*=html] { - background-color: #55a1ce; -} -.label[data-format=json], -.label[data-format*=json] { - background-color: #ef7100; -} -.label[data-format=xml], -.label[data-format*=xml] { - background-color: #ef7100; -} -.label[data-format=text], -.label[data-format*=text] { - background-color: #74cbec; -} -.label[data-format=csv], -.label[data-format*=csv] { - background-color: #dfb100; -} -.label[data-format=xls], -.label[data-format*=xls] { - background-color: #2db55d; -} -.label[data-format=zip], -.label[data-format*=zip] { - background-color: #686868; -} -.label[data-format=api], -.label[data-format*=api] { - background-color: #ec96be; -} -.label[data-format=pdf], -.label[data-format*=pdf] { - background-color: #e0051e; -} -.label[data-format=rdf], -.label[data-format*=rdf], -.label[data-format*=nquad], -.label[data-format*=ntriples], -.label[data-format*=turtle] { - background-color: #0b4498; -} -.view-list { - margin: 0; - list-style: none; -} -.view-list li { - position: relative; - margin-bottom: 10px; -} -.view-list li a { - display: block; - min-height: 50px; - padding: 10px; - border: 1px solid #ddd; - overflow: hidden; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.view-list li a .icon { - float: left; - width: 50px; - height: 50px; - overflow: hidden; - margin-right: 10px; - color: #444; - background-color: #eee; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.view-list li a .icon i { - display: block; - text-align: center; - font-size: 28px; - line-height: 50px; -} -.view-list li a h3 { - color: #000; - font-weight: bold; - font-size: 16px; - margin: 0 0 3px 0; -} -.view-list li a p { - margin: 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - color: #444; -} -.view-list li a.active, -.view-list li a:hover { - text-decoration: none; - border-color: #C14531; -} -.view-list li a.active .icon, -.view-list li a:hover .icon { - background-color: #C14531; - color: #f6f6f6; -} -.view-list li .arrow { - position: absolute; - display: none; - border: 8px solid transparent; - border-top-color: #C14531; - left: 50%; - bottom: -15px; - margin-left: -4px; -} -.view-list li.active a { - text-decoration: none; - border-color: #C14531; -} -.view-list li.active a .icon { - background-color: #C14531; - color: #f6f6f6; -} -.view-list li.active .arrow { - display: block; -} -.view-list.stacked { - overflow-y: hidden; - overflow-x: auto; - height: 100px; - white-space: nowrap; -} -.view-list.stacked li { - display: inline-block; - width: 250px; - margin-right: 10px; -} -.view-list.stacked li:last-child { - margin-right: 0; -} -.view-list.stacked::-webkit-scrollbar { - width: 7px; - height: 7px; -} -.view-list.stacked::-webkit-scrollbar-track { - border-radius: 10px; - background-color: #f6f6f6; -} -.view-list.stacked::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color: #c3c3c3; -} -.view-list.stacked::-webkit-scrollbar-thumb:hover { - background-color: #C14531; -} -.resource-view { - margin-top: 20px; -} -.search-form { - margin-bottom: 20px; - padding-bottom: 25px; - border-bottom: 1px dotted #ddd; -} -.search-form .search-input { - position: relative; - margin-bottom: 20px; -} -.search-form .search-input input { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin: 0; - width: 100%; - height: auto; -} -.search-form .search-input button { - cursor: pointer; - display: block; - position: absolute; - top: 50%; - margin-top: 1px; - right: 10px; - height: 20px; - padding: 0; - border: none; - background: transparent; -} -.search-form .search-input button span { - display: none; -} -.search-form .search-input button i { - color: #ccc; - -webkit-transition: color 0.2s ease-in; - -moz-transition: color 0.2s ease-in; - -o-transition: color 0.2s ease-in; - transition: color 0.2s ease-in; -} -.search-form .search-input button:hover i { - color: #000; -} -.search-form .search-input.search-giant input { - font-size: 16px; - padding: 15px; -} -.search-form .search-input.search-giant button { - margin-top: -4px; - right: 15px; - height: 30px; -} -.search-form .search-input.search-giant button i { - font-size: 28px; - width: 28px; -} -.search-form .control-order-by label, -.search-form .control-order-by select { - display: inline; -} -.search-form .control-order-by select { - width: 160px; - margin: 0; -} -.search-form h2 { - font-size: 24px; - line-height: 1.3; - color: #000; - margin-bottom: 0; - margin-top: 20px; -} -.search-form .filter-list { - color: #444; - line-height: 32px; - margin: 10px 0 0 0; -} -.search-form .filter-list .pill { - line-height: 21px; -} -.search-form .filter-list .extra { - margin-top: 10px; - font-size: 18px; - font-weight: normal; - color: #000; -} -.search-form.no-bottom-border { - border-bottom-width: 0; - margin-bottom: 0; -} -.tertiary .control-order-by { - float: none; - margin: 0; -} -.tertiary .control-order-by label { - display: block; - margin-bottom: 5px; - font-weight: normal; - font-size: 12px; -} -.tertiary .control-order-by select { - display: block; - font-size: 12px; - width: 100%; -} -.tertiary .search-input { - margin-bottom: 10px; -} -@media (min-width: 980px) { - .search-form .control-order-by { - float: right; - margin-left: 15px; - } - .tertiary .search-form .control-order-by { - float: none; - margin: 0; - } -} -.group .media-vertical .image { - margin: 0 -5px 5px; -} -.group-list:nth-child(odd) { - clear: left; -} -.group-list .module-heading { - padding-top: 15px; - padding-bottom: 15px; -} -.group-list .dataset-content { - min-height: 54px; -} -.group-list .module-heading h3 { - margin-bottom: 2px; -} -.group-list .module-heading h3 a { - color: #333; -} -.group-list .module-heading .media-image { - overflow: hidden; - max-height: 60px; -} -.group-list .module-heading .media-image img { - max-width: 85px; -} -.toolbar { - *zoom: 1; - position: relative; - margin-bottom: 10px; - padding: 5px 0; -} -.toolbar:before, -.toolbar:after { - display: table; - content: ""; - line-height: 0; -} -.toolbar:after { - clear: both; -} -.page_primary_action { - margin-bottom: 20px; -} -.toolbar .breadcrumb { - *zoom: 1; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - position: relative; - float: left; - margin: 0; - padding: 0; - border: none; - background: none; - font-size: 20px; - line-height: 1.3; -} -.toolbar .breadcrumb:before, -.toolbar .breadcrumb:after { - display: table; - content: ""; - line-height: 0; -} -.toolbar .breadcrumb:after { - clear: both; -} -.toolbar .breadcrumb li:after { - content: " / "; -} -.toolbar .breadcrumb li.active:after { - content: ""; -} -.toolbar .breadcrumb li:last-of-type:after { - content: ""; -} -.toolbar .home a { - text-decoration: none; -} -.toolbar .home span { - display: none; -} -.toolbar .breadcrumb a { - color: #505050; -} -@media (max-width: 767px) { - .toolbar .breadcrumb { - color: #fff; - text-shadow: none; - } - .toolbar .breadcrumb .home { - display: none; - } - .toolbar .breadcrumb a { - color: #fff; - text-shadow: none; - } -} -.toolbar .breadcrumb .active a, -.toolbar .breadcrumb a.active { - font-weight: bold; -} -.actions { - margin: 0; - list-style: none; - position: absolute; - top: 10px; - right: 10px; - z-index: 1; -} -.actions li { - display: inline-block; - margin-right: 5px; - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.actions li:last-of-type { - margin-right: 0; -} -.hide-heading { - display: none; -} -.page-header { - *zoom: 1; - border-bottom: 1px solid #ddd; - background-color: #f6f6f6; - -webkit-border-radius: 0 3px 0 0; - -moz-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0; -} -.page-header:before, -.page-header:after { - display: table; - content: ""; - line-height: 0; -} -.page-header:after { - clear: both; -} -.page-header .nav-tabs { - float: left; - margin-bottom: -1px; -} -.page-header .nav-tabs li.active a, -.page-header .nav-tabs a:hover { - background-color: #fff; -} -.page-header .content_action { - float: right; - margin-top: -5px; - margin-right: -7px; -} -.no-nav .page-header { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.nav-tabs-plain { - padding: 0 25px; -} -.nav-tabs-plain > .active > a, -.nav-tabs-plain > .active > a:hover { - background-color: #fff; -} -@media (min-width: 768px) { - .span9 .page-header { - margin-left: -17px; - } -} -@media (max-width: 768px) { - .page-header .nav-tabs { - margin: 5px 10px 10px -5px; - border: none; - } - .page-header .nav-tabs > li { - float: none; - } - .page-header .nav-tabs > li a { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .page-header .nav-tabs > .active > a, - .page-header .nav-tabs > .active > a:hover, - .page-header .nav-tabs > .active > a:focus { - border-bottom-color: #dddddd; - } -} -h1 { - font-size: 28px; -} -h2 { - font-size: 21px; -} -h3 { - font-size: 18px; -} -h4 { - font-size: 14px; -} -h1, -h2, -h3, -h4 { - line-height: 1.5; -} -h1 small, -h2 small, -h3 small, -h4 small { - font-size: 14px; -} -.prose h1, -.prose heading-1 h2, -.prose heading-2 { - margin-bottom: 15px; -} -.prose h3, -.prose heading-3 { - margin-bottom: 10px; -} -.table-chunky td, -.table-chunky th { - padding: 12px 15px; - font-size: 12px; -} -.table-chunky thead th, -.table-chunky thead td { - color: #fff; - background-color: #aaa; - padding-top: 10px; - padding-bottom: 10px; -} -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: transparent; -} -.table-striped tbody tr:nth-child(even) td, -.table-striped tbody tr:nth-child(even) th { - background-color: #f2f2f2; -} -.table-chunky.table-bordered { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} -.table-chunky.table-bordered thead:first-child tr:first-child th:first-child, -.table-chunky.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 2px; - -moz-border-radius-topleft: 2px; - border-top-left-radius: 2px; -} -.table-chunky.table-bordered thead:first-child tr:first-child th:last-child, -.table-chunky.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 2px; - -moz-border-radius-topright: 2px; - border-top-right-radius: 2px; -} -.table-chunky.table-bordered thead:last-child tr:last-child th:first-child, -.table-chunky.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 2px; - -moz-border-radius: 0 0 0 2px; - border-radius: 0 0 0 2px; - -webkit-border-bottom-left-radius: 2px; - -moz-border-radius-bottomleft: 2px; - border-bottom-left-radius: 2px; -} -.table-chunky.table-bordered thead:last-child tr:last-child th:last-child, -.table-chunky.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 2px; - -moz-border-radius-bottomright: 2px; - border-bottom-right-radius: 2px; -} -.ellipsis { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.ckan-icon { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; -} -.ckan-icon-fb { - width: 16px; - height: 16px; - background-position: 0px 0; -} -.ckan-icon-gplus { - width: 16px; - height: 16px; - background-position: -16px 0; -} -.ckan-icon-twitter { - width: 16px; - height: 16px; - background-position: -32px 0; -} -.ckan-icon-email { - width: 16px; - height: 16px; - background-position: -48px 0; -} -.ckan-icon-share { - width: 16px; - height: 16px; - background-position: -64px 0; -} -.ckan-icon-feed { - width: 16px; - height: 16px; - background-position: -80px 0; -} -.ckan-icon-calendar { - width: 16px; - height: 16px; - background-position: -96px 0; -} -.ckan-icon-file { - width: 16px; - height: 16px; - background-position: -112px 0; -} -.ckan-icon-lock { - width: 16px; - height: 16px; - background-position: -128px 0; -} -.ckan-icon-link-file { - width: 16px; - height: 16px; - background-position: -144px 0; -} -.ckan-icon-link-plugin { - width: 16px; - height: 16px; - background-position: -160px 0; -} -.ckan-icon-upload-file { - width: 16px; - height: 16px; - background-position: -176px 0; -} -.ckan-icon-callout { - width: 16px; - height: 16px; - background-position: -192px 0; -} -.ckan-icon-circle-cross { - width: 17px; - height: 17px; - background-position: 0px -16px; -} -.ckan-icon-circle-add { - width: 17px; - height: 17px; - background-position: -17px -16px; -} -.ckan-icon-flame { - width: 17px; - height: 17px; - background-position: -34px -16px; -} -.ckan-icon-search { - width: 17px; - height: 17px; - background-position: -51px -16px; -} -.ckan-icon-large-lock { - width: 20px; - height: 20px; - background-position: 0px -33px; -} -.ckan-icon-photo { - width: 20px; - height: 20px; - background-position: -20px -33px; -} -.ckan-icon-add { - width: 20px; - height: 20px; - background-position: -40px -33px; -} -.ckan-icon-home { - width: 20px; - height: 20px; - background-position: -60px -33px; -} -.ckan-icon-rewind { - width: 20px; - height: 20px; - background-position: -80px -33px; -} -.ckan-icon-tools { - width: 20px; - height: 20px; - background-position: -100px -33px; -} -.ckan-icon-flag { - width: 20px; - height: 20px; - background-position: -120px -33px; -} -.ckan-icon-clipboard { - width: 20px; - height: 20px; - background-position: -140px -33px; -} -.ckan-icon-share { - width: 20px; - height: 20px; - background-position: -160px -33px; -} -.ckan-icon-info { - width: 20px; - height: 20px; - background-position: -180px -33px; -} -.ckan-icon-download { - width: 20px; - height: 20px; - background-position: -200px -33px; -} -.ckan-icon-star { - width: 20px; - height: 20px; - background-position: -220px -33px; -} -.ckan-icon-info-flat { - width: 20px; - height: 20px; - background-position: -240px -33px; -} -.ckan-icon-tag { - width: 20px; - height: 20px; - background-position: -260px -33px; -} -.ckan-icon-plus { - width: 20px; - height: 20px; - background-position: -280px -33px; - width: 16px; -} -.ckan-icon-head { - width: 20px; - height: 20px; - background-position: -300px -33px; -} -.ckan-icon-arrow-e { - width: 20px; - height: 20px; - background-position: -320px -33px; - width: 16px; -} -.ckan-icon-bookmark { - width: 25px; - height: 25px; - background-position: 0px -53px; -} -.format-label { - *margin-right: .3em; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("../../../base/images/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; - text-indent: -900em; - background: url("../../../base/images/sprite-resource-icons.png") no-repeat 0 0; -} -.format-label { - width: 32px; - height: 35px; - background-position: 0px -62px; -} -.format-label[data-format=rdf], -.format-label[data-format*=rdf] { - width: 32px; - height: 35px; - background-position: -32px -62px; -} -.format-label[data-format=pdf], -.format-label[data-format*=pdf] { - width: 32px; - height: 35px; - background-position: -64px -62px; -} -.format-label[data-format=api], -.format-label[data-format*=api] { - width: 32px; - height: 35px; - background-position: -96px -62px; -} -.format-label[data-format=zip], -.format-label[data-format*=zip] { - width: 32px; - height: 35px; - background-position: -128px -62px; -} -.format-label[data-format=xls], -.format-label[data-format*=xls] { - width: 32px; - height: 35px; - background-position: -160px -62px; -} -.format-label[data-format=csv], -.format-label[data-format*=csv] { - width: 32px; - height: 35px; - background-position: -192px -62px; -} -.format-label[data-format=txt], -.format-label[data-format*=txt] { - width: 32px; - height: 35px; - background-position: -224px -62px; -} -.format-label[data-format=xml], -.format-label[data-format*=xml] { - width: 32px; - height: 35px; - background-position: -256px -62px; -} -.format-label[data-format=json], -.format-label[data-format*=json] { - width: 32px; - height: 35px; - background-position: -288px -62px; -} -.format-label[data-format=html], -.format-label[data-format*=html] { - width: 32px; - height: 35px; - background-position: -320px -62px; -} -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - text-align: right; - font-size: 14px; - line-height: 1; - width: 14px; -} -.btn [class^="icon-"], -.nav [class^="icon-"], -.module-heading [class^="icon-"], -.dropdown [class^="icon-"], -.btn [class*=" icon-"], -.nav [class*=" icon-"], -.module-heading [class*=" icon-"], -.dropdown [class*=" icon-"] { - margin-right: 4px; -} -.info-block [class^="icon-"], -.info-block [class*=" icon-"] { - float: left; - font-size: 28px; - width: 28px; - margin-right: 5px; - margin-top: 2px; -} -.breadcrumb .home .icon-home { - font-size: 24px; - width: 24px; - vertical-align: -1px; -} -.info-block-small [class^="icon-"], -.info-block-small [class*=" icon-"] { - font-size: 14px; - width: 14px; - margin-top: 1px; -} -.nav-tabs .fa:last-child, -.module-heading .fa:last-child, -.btn .fa:last-child { - margin-right: 3px; -} -.wrapper { - *zoom: 1; - background-color: #FFF; - border: 1px solid #ccc; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05); - position: relative; - background-color: #fff; - margin-bottom: 20px; - margin-left: 0; -} -.wrapper:before, -.wrapper:after { - display: table; - content: ""; - line-height: 0; -} -.wrapper:after { - clear: both; -} -@media (min-width: 768px) { - .wrapper { - background-image: url("../../../base/images/nav.png"); - background-repeat: repeat-y; - background-position: -54px 0px; - } -} -@media (min-width: 980px) { - .wrapper { - background-position: 0px 0px; - } -} -.wrapper.no-nav { - background-image: none; -} -[role=main], -.main { - position: relative; - padding-bottom: 20px; -} -@media (min-width: 768px) { - [role=main], - .main { - padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); - } -} -[role=main] { - min-height: 350px; -} -.main:after, -[role=main]:after { - bottom: 0; - border-top-width: 1px; -} -[role=main] .primary { - float: right; - margin-left: 0; -} -[role=main] .secondary { - margin-left: 0; -} -/* Filters modal */ -.no-text .text { - display: none; -} -.js body.filters-modal { - overflow: hidden; -} -.show-filters.btn, -.hide-filters { - display: none; -} -@media (max-width: 768px) { - .wrapper { - margin: 0 -20px; - border-width: 0; - -webkit-box-shadow: 0; - -moz-box-shadow: 0; - box-shadow: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - } - .js [role=main] .secondary .filters { - display: none; - position: fixed; - overflow: auto; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 1; - padding: 10px; - background-color: #000000; - background-color: rgba(0, 0, 0, 0.5); - } - .js body.filters-modal .secondary .filters { - display: block; - } - .js [role=main] .secondary .filters > div { - background-color: #fff; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - overflow: hidden; - } - .js [role=main] .secondary .filters > div .module-footer { - display: none; - } - .js body.filters-modal .secondary .filters .hide-filters { - display: inline-block; - position: absolute; - top: 14px; - right: 17px; - opacity: 0.6; - } - .js body.filters-modal .secondary .filters .hide-filters i { - font-size: 18px; - } - .js .show-filters.btn { - display: inline-block; - } -} -.primary > :last-child, -.secondary > :last-child { - margin-bottom: 0; -} -.primary .primary { - float: left; - width: 467px; - margin-left: 0; - margin-bottom: 20px; -} -.primary .primary h1:first-child, -.primary .primary h2:first-child, -.primary .primary h3:first-child, -.primary .primary h4:first-child { - margin-top: 0; -} -.primary .tertiary { - float: left; - width: 180px; - margin-left: 18px; - margin-bottom: 20px; -} -@media (min-width: 768px) { - .hero { - background: url("../../../base/images/background-tile.png"); - } -} -.hero:after { - background-color: rgba(0, 0, 0, 0.09); - background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(0, 0, 0, 0.15)), to(rgba(0, 0, 0, 0))); - background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-image: linear-gradient(top, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-repeat: repeat-x; - background-color: #f6f6f6; - border-bottom: 1px solid #d0d0d0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - -webkit-box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); - -moz-box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); - box-shadow: inset 0 -4px 0 rgba(0, 0, 0, 0.03); -} -.hero:after .back:hover { - text-decoration: none; -} -.hero:after .back:hover span { - text-decoration: underline; -} -.context-info .module-content { - padding: 15px; -} -.context-info .image { - margin-bottom: 10px; -} -.context-info .image img, -.context-info .image a { - display: block; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.context-info p { - overflow: auto; -} -.context-info code { - display: block; - font-weight: normal; - padding: 0; - margin: 0; - overflow: auto; -} -.context-info h1.heading { - margin: 0 0 5px 0; - font-size: 18px; - line-height: 1.3; - -ms-word-break: break-all; - word-break: break-all; - /* Non standard for webkit */ - word-break: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} -.context-info .info { - margin-top: 15px; - padding-top: 10px; - border-top: 1px dotted #DDD; - word-break: break-word; -} -.context-info .info dl dd { - margin-top: 3px; - margin-left: 0; -} -.context-info .nums { - *zoom: 1; - margin-top: 15px; - padding-top: 10px; - padding-bottom: 0; - border-top: 1px dotted #DDD; -} -.context-info .nums:before, -.context-info .nums:after { - display: table; - content: ""; - line-height: 0; -} -.context-info .nums:after { - clear: both; -} -.context-info .nums dl { - float: left; - width: 50%; - margin: 5px 0 0 0; - color: #444; -} -.context-info .nums dl dt { - display: block; - font-size: 13px; - font-weight: 300; -} -.context-info .nums dl dd { - display: block; - font-size: 30px; - font-weight: 700; - line-height: 36px; - margin-left: 0; -} -.context-info .nums dl dd .smallest { - font-size: 13px; -} -.context-info .nums dl dd .smaller { - font-size: 16px; -} -.context-info .nums dl dd .small { - font-size: 21px; -} -.context-info .follow_button { - margin-top: 15px; -} -.context-info.editing .module-content { - margin-top: 0; -} -.flash-messages .alert { - -webkit-box-shadow: 0 0 0 1px white; - -moz-box-shadow: 0 0 0 1px white; - box-shadow: 0 0 0 1px white; -} -.homepage .row { - position: relative; -} -.homepage .module-search { - padding: 5px; - margin: 20px 0 0 0; - color: #fff; - background: #fff; -} -.homepage .module-search .search-giant { - margin-bottom: 10px; -} -.homepage .module-search .search-giant input { - border-color: #003f52; -} -.homepage .module-search .module-content { - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; - background-color: #C14531; - border-bottom: none; -} -.homepage .module-search .module-content .heading { - margin-top: 0; - margin-bottom: 7px; - font-size: 24px; - line-height: 40px; -} -.homepage .module-search .tags { - *zoom: 1; - padding: 5px 10px 10px 10px; - background-color: #983627; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.homepage .module-search .tags:before, -.homepage .module-search .tags:after { - display: table; - content: ""; - line-height: 0; -} -.homepage .module-search .tags:after { - clear: both; -} -.homepage .module-search .tags h3, -.homepage .module-search .tags .tag { - display: block; - float: left; - margin: 5px 10px 0 0; -} -.homepage .module-search .tags h3 { - font-size: 14px; - line-height: 20px; - padding: 2px 8px; -} -.homepage .group-list { - margin: 0; -} -.homepage .box .inner { - padding: 20px 25px; -} -.homepage .stats h3 { - margin: 0 0 10px 0; -} -.homepage .stats ul { - margin: 0; - list-style: none; - *zoom: 1; -} -.homepage .stats ul:before, -.homepage .stats ul:after { - display: table; - content: ""; - line-height: 0; -} -.homepage .stats ul:after { - clear: both; -} -.homepage .stats ul li { - float: left; - width: 25%; - font-weight: 300; -} -.homepage .stats ul li a { - display: block; -} -.homepage .stats ul li a b { - display: block; - font-size: 35px; - line-height: 1.5; -} -.homepage .stats ul li a:hover { - text-decoration: none; -} -.homepage.layout-2 .stats { - margin-top: 20px; -} -@media (min-width: 768px) { - .homepage [role=main] { - padding: 20px 0; - } - .homepage.layout-1 .row1 .col2 { - position: absolute; - bottom: 0; - right: 0; - } - .homepage.layout-1 .row1 .col2 .module-search { - bottom: 0; - left: 0; - right: 0; - } -} -.account-masthead { - *zoom: 1; - min-height: 30px; - color: #fff; - background: #983627 url("../../../base/images/bg.png"); -} -.account-masthead:before, -.account-masthead:after { - display: table; - content: ""; - line-height: 0; -} -.account-masthead:after { - clear: both; -} -.account-masthead .account { - float: right; -} -.account-masthead .account ul { - *zoom: 1; -} -.account-masthead .account ul:before, -.account-masthead .account ul:after { - display: table; - content: ""; - line-height: 0; -} -.account-masthead .account ul:after { - clear: both; -} -.account-masthead .account ul li { - display: block; - float: left; - border-left: 1px solid #842f22; -} -.account-masthead .account ul li a { - display: block; - color: #f0d1cc; - font-size: 13px; - font-weight: bold; - padding: 0 10px; - line-height: 31px; -} -.account-masthead .account ul li a span.username, -.account-masthead .account ul li a span.text { - margin: 0 2px 0 4px; -} -.account-masthead .account ul li a span.text { - position: absolute; - top: -9999px; - left: -9999px; -} -.account-masthead .account ul li a:hover { - color: #f6e3e0; - background-color: #842f22; - text-decoration: none; -} -.account-masthead .account ul li a.sub { - font-weight: 300; -} -.account-masthead .account ul li a .btn { - vertical-align: 1px; - margin-left: 3px; -} -.account-masthead .account .notifications a span.badge { - font-size: 12px; - margin-left: 3px; - padding: 1px 6px; - background-color: #842f22; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - text-shadow: none; - color: #f0d1cc; -} -.account-masthead .account .notifications a:hover span { - color: #fff; - background-color: #70281c; -} -.account-masthead .account .notifications.notifications-important a span.badge { - color: #fff; - background-color: #C9403A; -} -.account-masthead .account.authed .image { - padding: 0 6px; -} -.account-masthead .account.authed .image img { - vertical-align: -6px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.masthead { - *zoom: 1; - min-height: 55px; - color: #fff; - background: #C14531 url("../../../base/images/bg.png"); -} -.masthead:before, -.masthead:after { - display: table; - content: ""; - line-height: 0; -} -.masthead:after { - clear: both; -} -.masthead .container { - position: relative; -} -.masthead a { - color: #fff; -} -.masthead hgroup h1, -.masthead hgroup h2 { - float: left; - font-size: 30px; - line-height: 1.5; -} -.masthead hgroup h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; -} -.masthead hgroup h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; -} -.masthead .nav-collapse { - padding-top: 10px; -} -.masthead .section { - float: left; -} -.masthead input[type="text"] { - border-color: #ad3e2c; -} -.masthead .navigation { - margin-right: 20px; -} -.masthead .navigation .nav-pills { - margin-bottom: 0; -} -.masthead .navigation .nav-pills li a:hover, -.masthead .navigation .nav-pills li.active a { - background-color: #983627; -} -.masthead .nav > li > a, -.masthead .nav > li > a:focus, -.masthead .nav > li > a:hover, -.masthead .nav > .active > a, -.masthead .nav > .active > a:hover, -.masthead .nav > .active > a:focus { - color: #fff; - text-shadow: none; -} -.masthead .site-search { - margin: 2px 8px 2px 0; -} -.masthead .site-search input { - width: 200px; - padding: 4px 10px; -} -.masthead .btn-navbar, -.masthead .btn-navbar:hover, -.masthead .btn-navbar:focus, -.masthead .btn-navbar:active, -.masthead .btn-navbar.active, -.masthead .btn-navbar.disabled, -.masthead .btn-navbar[disabled] { - background-color: #983627; - background-image: none; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - text-shadow: none; - margin-top: 15px; -} -.masthead .btn-navbar .icon-bar, -.masthead .btn-navbar:hover .icon-bar, -.masthead .btn-navbar:focus .icon-bar, -.masthead .btn-navbar:active .icon-bar, -.masthead .btn-navbar.active .icon-bar, -.masthead .btn-navbar.disabled .icon-bar, -.masthead .btn-navbar[disabled] .icon-bar { - margin-right: 0; -} -.masthead .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); -} -@media (min-width: 980px) { - .masthead .nav-collapse { - float: right; - } -} -@media (max-width: 767px) { - .account-masthead { - margin-left: -20px; - margin-right: -20px; - padding-left: 20px; - padding-right: 20px; - } - .masthead .section { - float: none; - } - .masthead .section .nav-collapse { - margin-bottom: 25px; - } -} -@media (max-width: 979px) { - .masthead .container { - padding-left: 20px; - padding-right: 20px; - } - .masthead .site-search { - display: none; - } -} -.site-footer { - *zoom: 1; - min-height: 55px; - color: #fff; - background: #C14531 url("../../../base/images/bg.png"); - padding: 20px 0; -} -.site-footer:before, -.site-footer:after { - display: table; - content: ""; - line-height: 0; -} -.site-footer:after { - clear: both; -} -.site-footer .container { - position: relative; -} -.site-footer a { - color: #fff; -} -.site-footer hgroup h1, -.site-footer hgroup h2 { - float: left; - font-size: 30px; - line-height: 1.5; -} -.site-footer hgroup h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; -} -.site-footer hgroup h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; -} -.site-footer .nav-collapse { - padding-top: 10px; -} -.site-footer .section { - float: left; -} -.site-footer input[type="text"] { - border-color: #ad3e2c; -} -.site-footer .navigation { - margin-right: 20px; -} -.site-footer .navigation .nav-pills { - margin-bottom: 0; -} -.site-footer .navigation .nav-pills li a:hover, -.site-footer .navigation .nav-pills li.active a { - background-color: #983627; -} -.site-footer .nav > li > a, -.site-footer .nav > li > a:focus, -.site-footer .nav > li > a:hover, -.site-footer .nav > .active > a, -.site-footer .nav > .active > a:hover, -.site-footer .nav > .active > a:focus { - color: #fff; - text-shadow: none; -} -.site-footer .site-search { - margin: 2px 8px 2px 0; -} -.site-footer .site-search input { - width: 200px; - padding: 4px 10px; -} -.site-footer .btn-navbar, -.site-footer .btn-navbar:hover, -.site-footer .btn-navbar:focus, -.site-footer .btn-navbar:active, -.site-footer .btn-navbar.active, -.site-footer .btn-navbar.disabled, -.site-footer .btn-navbar[disabled] { - background-color: #983627; - background-image: none; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - text-shadow: none; - margin-top: 15px; -} -.site-footer .btn-navbar .icon-bar, -.site-footer .btn-navbar:hover .icon-bar, -.site-footer .btn-navbar:focus .icon-bar, -.site-footer .btn-navbar:active .icon-bar, -.site-footer .btn-navbar.active .icon-bar, -.site-footer .btn-navbar.disabled .icon-bar, -.site-footer .btn-navbar[disabled] .icon-bar { - margin-right: 0; -} -.site-footer .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); -} -.site-footer, -.site-footer label, -.site-footer small { - color: #e6b5ad; -} -.site-footer a { - color: #e6b5ad; -} -.footer-links ul li { - margin-bottom: 5px; -} -.attribution small { - color: #e6b5ad; - font-size: 12px; -} -.attribution .ckan-footer-logo { - display: block; - width: 68px; - height: 21px; - margin-top: 2px; - background: url("../../../base/images/ckan-logo-footer.png") no-repeat top left; - text-indent: -900em; -} -.lang-select { - *zoom: 1; -} -.lang-select:before, -.lang-select:after { - display: table; - content: ""; - line-height: 0; -} -.lang-select:after { - clear: both; -} -.lang-select label, -.lang-select select, -.lang-select .lang-container { - float: left; - margin-top: 0; -} -.lang-dropdown { - color: #000; -} -.lang-dropdown li { - width: auto; -} -.table-selected td { - background-color: #f5f5f5; -} -.table-selected td .edit { - display: block; -} -.table-bulk-edit th input { - top: -5px; -} -.table-bulk-edit .table-actions .btn-group { - float: left; - margin: 0 10px 0 0; -} -.table-bulk-edit .context p { - margin-bottom: 0; -} -.table-header thead th { - background-color: #f6f6f6; -} -.table-edit-hover .edit { - display: none; - float: right; -} -.table-edit-hover tr:hover .edit { - display: block; -} -.js .table-toggle-more .toggle-more { - display: none; -} -.js .table-toggle-more .show-more { - display: inline; -} -.js .table-toggle-more .show-less { - display: none; -} -.js .table-toggle-more .toggle-seperator { - display: table-row; -} -.js .table-toggle-more .toggle-seperator td { - height: 11px; - padding: 0; - background-image: url("../../../base/images/table-seperator.png"); -} -.js .table .toggle-show td { - background: none; - text-align: center; -} -.js .table-toggle-less .show-less { - display: inline; -} -.js .table-toggle-less .show-more { - display: none; -} -.js .table-toggle-less .toggle-seperator { - display: none; -} -.profile .empty, -.profile .dataset-list { - margin-bottom: 20px; -} -.activity { - margin: 10px 0; - padding: 0; - list-style-type: none; - background: transparent url('../../../base/images/dotted.png') 14px 0 repeat-y; -} -.activity .item { - position: relative; - margin: 0 0 15px 0; - padding: 0; - *zoom: 1; -} -.activity .item:before, -.activity .item:after { - display: table; - content: ""; - line-height: 0; -} -.activity .item:after { - clear: both; -} -.activity .item .icon { - display: block; - position: absolute; - top: 0; - left: 0; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - color: #FFFFFF; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - font-weight: normal; - margin-right: 10px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); -} -.activity .item .gravatar { - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.activity .item .actor .gravatar { - position: absolute; - top: 0; - left: 40px; -} -.activity .item p { - font-size: 14px; - line-height: 1.5; - margin: 5px 0 0 80px; -} -.activity .item .date { - color: #999; - font-size: 12px; - white-space: nowrap; -} -.activity .item .new { - display: block; - position: absolute; - overflow: hidden; - top: -3px; - left: -3px; - width: 10px; - height: 10px; - background-color: #A35647; - border: 1px solid #FFF; - text-indent: -1000px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} -.activity .item.no-avatar p { - margin-left: 40px; -} -.activity .load-less { - margin-bottom: 15px; -} -.popover { - width: 300px; -} -.popover .popover-title { - font-weight: bold; - margin-bottom: 0; -} -.popover p.about { - margin: 0 0 10px 0; -} -.popover .popover-close { - float: right; - text-decoration: none; -} -.popover .popover-content { - font-size: 14px; - line-height: 20px; - color: #444; - word-break: break-all; -} -.popover .popover-content dl { - margin: 0; -} -.popover .popover-content dl dd { - margin-left: 0; - margin-bottom: 10px; -} -.activity .item .icon { - background-color: #999999; -} -.activity .item.failure .icon { - background-color: #B95252; -} -.activity .item.success .icon { - background-color: #69A67A; -} -.activity .item.added-tag .icon { - background-color: #6995a6; -} -.activity .item.changed-group .icon { - background-color: #767DCE; -} -.activity .item.changed-package .icon { - background-color: #8c76ce; -} -.activity .item.changed-package_extra .icon { - background-color: #769ace; -} -.activity .item.changed-resource .icon { - background-color: #aa76ce; -} -.activity .item.changed-user .icon { - background-color: #76b8ce; -} -.activity .item.changed-organization .icon { - background-color: #699fa6; -} -.activity .item.deleted-group .icon { - background-color: #B95252; -} -.activity .item.deleted-package .icon { - background-color: #b97452; -} -.activity .item.deleted-package_extra .icon { - background-color: #b95274; -} -.activity .item.deleted-resource .icon { - background-color: #b99752; -} -.activity .item.deleted-organization .icon { - background-color: #b95297; -} -.activity .item.new-group .icon { - background-color: #69A67A; -} -.activity .item.new-package .icon { - background-color: #69a68e; -} -.activity .item.new-package_extra .icon { - background-color: #6ca669; -} -.activity .item.new-resource .icon { - background-color: #81a669; -} -.activity .item.new-user .icon { - background-color: #69a6a3; -} -.activity .item.new-organization .icon { - background-color: #81a669; -} -.activity .item.removed-tag .icon { - background-color: #b95297; -} -.activity .item.deleted-related-item .icon { - background-color: #b9b952; -} -.activity .item.follow-dataset .icon { - background-color: #767DCE; -} -.activity .item.follow-user .icon { - background-color: #8c76ce; -} -.activity .item.new-related-item .icon { - background-color: #95a669; -} -.activity .item.follow-group .icon { - background-color: #8ba669; -} -.dropdown:hover .dropdown-menu { - display: block; -} -.js .dropdown .dropdown-menu, -.js .dropdown:hover .dropdown-menu { - display: none; -} -.js .dropdown.open .dropdown-menu { - display: block; -} -#followee-filter .btn { - *zoom: 1; -} -#followee-filter .btn:before, -#followee-filter .btn:after { - display: table; - content: ""; - line-height: 0; -} -#followee-filter .btn:after { - clear: both; -} -#followee-filter .btn span, -#followee-filter .btn strong { - display: block; - float: left; - line-height: 1.5; -} -#followee-filter .btn span { - font-weight: normal; -} -#followee-filter .btn strong { - margin: 0 5px; - white-space: nowrap; - max-width: 90px; - overflow: hidden; - text-overflow: ellipsis; -} -.dashboard-context { - position: relative; - margin-bottom: 20px; - padding: 20px; - border-bottom: 1px solid #DCDCDC; - background-color: #f6f6f6; - -webkit-border-radius: 3px 0 0 0; - -moz-border-radius: 3px 0 0 0; - border-radius: 3px 0 0 0; -} -.dashboard-context h2 { - margin-bottom: 10px; -} -.dashboard-context .arrow { - position: absolute; - content: ' '; - top: 30px; - right: -10px; - width: 10px; - height: 21px; - background: transparent url("../../../base/images/dashboard-followee-related.png"); -} -.popover-followee .popover-title { - display: none; -} -.popover-followee .popover-content { - padding: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.popover-followee .empty { - padding: 10px; -} -.popover-followee .popover-header { - *zoom: 1; - background-color: whiteSmoke; - padding: 5px; - border-bottom: 1px solid #ccc; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.popover-followee .popover-header:before, -.popover-followee .popover-header:after { - display: table; - content: ""; - line-height: 0; -} -.popover-followee .popover-header:after { - clear: both; -} -.popover-followee .popover-header .input-prepend { - margin-bottom: 0; -} -.popover-followee .popover-header .add-on, -.popover-followee .popover-header input { - float: left; - margin: 0; -} -.popover-followee .popover-header .add-on { - padding: 4px 8px 4px 12px; - border-right-width: 0; - -webkit-border-radius: 100px 0 0 100px; - -moz-border-radius: 100px 0 0 100px; - border-radius: 100px 0 0 100px; -} -.popover-followee .popover-header input { - padding: 4px 12px 4px 8px; - font-size: 13px; - width: 207px; - -webkit-border-radius: 0 100px 100px 0; - -moz-border-radius: 0 100px 100px 0; - border-radius: 0 100px 100px 0; -} -.popover-followee .nav { - padding: 0; - margin: 0; - max-height: 205px; - overflow: auto; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; -} -.popover-followee .nav li a { - display: block; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - padding: 7px 10px 7px 15px; - margin: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.popover-followee .nav li a i { - background-color: #C14531; - color: #fff; - margin-right: 11px; - padding: 3px 5px; - line-height: 1; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; - -webkit-box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); - -moz-box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2x rgba(0, 0, 0, 0.2); -} -.popover-followee .nav li a:hover i { - background-color: #000; -} -.popover-followee .nav li.active a i { - color: #C14531; - background-color: #fff; -} -.dashboard-me { - *zoom: 1; - padding: 15px 15px 0 15px; -} -.dashboard-me:before, -.dashboard-me:after { - display: table; - content: ""; - line-height: 0; -} -.dashboard-me:after { - clear: both; -} -.dashboard-me img { - float: left; - margin-right: 10px; - -webkit-border-radius: 100px; - -moz-border-radius: 100px; - border-radius: 100px; -} -.dashboard-me strong { - display: block; - font-size: 16px; - margin: 3px 0; -} -.resource-view-filters { - margin-bottom: 1em; -} -.resource-view-filters .resource-view-filter { - margin-bottom: 1.0em; -} -.resource-view-filters .resource-view-remove-filter { - cursor: pointer; - color: #b55457; -} -.resource-view-filters .resource-view-filter-values .select2-container { - margin-right: 0.3em; - margin-bottom: 0.2em; - width: 24% !important; -} -.resource-view-filters .resource-view-filter-values .select2-container .select2-search-choice-close { - left: auto; -} -.datapusher-status-link:hover { - text-decoration: none; -} -.datapusher-status.status-unknown { - color: #bbb; -} -.datapusher-status.status-pending { - color: #FFCC00; -} -.datapusher-status.status-error { - color: red; -} -.datapusher-status.status-complete { - color: #009900; -} -body { - background: #C14531 url("../../../base/images/bg.png"); -} -[hidden] { - display: none; -} -table { - table-layout: fixed; -} -thead th { - vertical-align: top; -} -td, -th { - word-wrap: break-word; -} -table .metric { - width: 140px; -} -code { - color: #000; - border: none; - background: none; - white-space: normal; -} -pre { - border: none; - background: none; - padding-left: 0; - padding-right: 0; -} -mark { - background: #fdf7e9; -} -blockquote p { - font-size: 1em; -} -iframe { - border: none; -} -.embedded-content h1 { - font-size: 1.4em; -} -.embedded-content h2 { - font-size: 1.4em; -} -.embedded-content h3 { - font-size: 1.2em; -} -.popular { - text-indent: -999em; -} -.empty { - color: #aaa; - font-style: italic; -} -.page-heading { - margin-top: 0; - margin-bottom: 16px; -} -.m-top { - margin-top: 15px; -} -.m-left { - margin-left: 15px; -} -.m-right { - margin-right: 15px; -} -.m-bottom { - margin-bottom: 15px; -} -.no-margin { - margin: 0; -} -.reduced-margin { - margin: 3px 5px; -} -.p-top { - padding-top: 15px; -} -.p-left { - padding-left: 15px; -} -.p-right { - padding-right: 15px; -} -.p-bottom { - padding-bottom: 15px; -} -.no-padding { - padding: 0; -} -.reduced-padding { - padding: 3px 5px; -} -.ie .lang-dropdown { - position: relative; - top: -20px; -} -.ie .module-popup { - border-bottom: none; -} -.ie .banner { - top: 0; - right: 0; - width: auto; -} -.ie .group-listing { - margin-left: -24px; -} -.ie .toolbar .breadcrumb { - filter: none; -} -.ie .toolbar .breadcrumb li { - float: left; -} -.ie .toolbar .breadcrumb li:after { - margin: 0 0.2em; -} -.ie9 .control-large input { - height: 56px; -} -.ie8 .account-masthead a.image, -.ie8 .account-masthead .username { - white-space: nowrap; -} -.ie9 .homepage .media.module-heading .media-image img, -.ie8 .homepage .media.module-heading .media-image img, -.ie7 .homepage .media.module-heading .media-image img { - width: 85px !important; -} -.ie8 .masthead .nav-collapse, -.ie7 .masthead .nav-collapse { - float: right; -} -.ie8 [role=main], -.ie7 [role=main], -.ie8 .main, -.ie7 .main { - padding-top: 10px; - background: #eee url("../../../base/images/bg.png"); -} -.ie8 .hero, -.ie7 .hero { - background: url("../../../base/images/background-tile.png"); -} -.ie8 .hero .hero-primary.module-popup .box, -.ie7 .hero .hero-primary.module-popup .box { - padding-bottom: 20px !important; - margin-bottom: 0 !important; -} -.ie8 .lang-dropdown, -.ie7 .lang-dropdown { - position: relative !important; - top: -90px !important; -} -.ie7 .alert { - position: relative; -} -.ie7 .alert .close { - position: absolute; - top: 6px !important; - right: 20px; -} -.ie7 .media-item { - width: 30%; -} -.ie7 .tags .tag-list { - *zoom: 1; -} -.ie7 .tags .tag-list:before, -.ie7 .tags .tag-list:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .tags .tag-list:after { - clear: both; -} -.ie7 .tags .tag-list li { - display: block; - float: left; -} -.ie7 .tags h3 { - float: left; -} -.ie7 .tags .tag { - display: block; -} -.ie7 .search-giant input { - width: 95%; -} -.ie7 .control-full input, -.ie7 .control-full select, -.ie7 .control-full textarea { - width: 95%; -} -.ie7 .control-full.control-large .controls input { - padding-bottom: 20px; -} -.ie7 .controls { - position: relative; -} -.ie7 .controls .info-block, -.ie7 .controls .info-inline { - position: absolute; - top: 0; - right: 0; -} -.ie7 .form-horizontal .controls { - margin-left: 0; -} -.ie7 .control-custom .checkbox { - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.ie7 .stages { - overflow: hidden; - background-color: #EDEDED; -} -.ie7 .stages li { - height: 30px; - width: 27.5%; -} -.ie7 .stages li button, -.ie7 .stages li span { - display: block; - height: 30px; - padding-left: 20px; -} -.ie7 .stages li button { - height: 50px; -} -.ie7 .stages li .highlight { - width: auto; -} -.ie7 .account-masthead .account a i { - line-height: 31px; -} -.ie7 .masthead { - position: relative; - z-index: 1; -} -.ie7 .masthead .logo img, -.ie7 .masthead nav { - *display: inline; - /* IE7 inline-block hack */ - *zoom: 1; -} -.ie7 .masthead .header-image { - display: block; -} -.ie7 .masthead .account .dropdown-menu { - z-index: 10000; -} -.ie7 .module-narrow .nav-item.image { - *zoom: 1; -} -.ie7 .module-narrow .nav-item.image:before, -.ie7 .module-narrow .nav-item.image:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .module-narrow .nav-item.image:after { - clear: both; -} -.ie7 .nav-facet .nav-item.active a { - content: 'x'; -} -.ie7 .toolbar .breadcrumb li { - padding-right: 10px; - margin-right: 5px; - background: transparent url("../../../base/images/breadcrumb-slash-ie7.png") 100% 50% no-repeat; -} -.ie7 .toolbar .breadcrumb li.active { - background-image: none; -} -.ie7 .module-heading { - *zoom: 1; - position: relative; -} -.ie7 .module-heading:before, -.ie7 .module-heading:after { - display: table; - content: ""; - line-height: 0; -} -.ie7 .module-heading:after { - clear: both; -} -.ie7 .module-heading .media-content { - position: relative; -} -.ie7 .module-heading .media-image img { - float: left; -} -.ie7 .group-listing { - position: relative; - zoom: 1; -} -.ie7 .resource-item { - position: static; - padding-bottom: 1px; -} -.ie7 .resource-item .heading { - position: relative; -} -.ie7 .resource-item .format-label { - left: -48px; -} -.ie7 .resource-item .btn-group { - position: relative; - float: right; - top: -35px; - right: 0; -} -.ie7 .media-overlay .media-heading { - background-color: #000; -} diff --git a/ckan/public-bs2/base/i18n/.gitignore b/ckan/public-bs2/base/i18n/.gitignore deleted file mode 100644 index 2ff7f12bbe7..00000000000 --- a/ckan/public-bs2/base/i18n/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -// This directory contains CKAN's automatically generated JavaScript -// translation files, which are ignored by git. This file makes sure that the -// directory itself is tracked. - -*.js - diff --git a/ckan/public-bs2/base/images/background-tag-ie7.png b/ckan/public-bs2/base/images/background-tag-ie7.png deleted file mode 100644 index 58f9ac8a1e8df9709470acb6275a52ec205803e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1271 zcmX|B3ox5m6pq@qWLb}DJa=}dqlT_{%ru=O1bGsPh$P5b@7G!h;vGv<>~5!wv4mMB ztkNA*&st*IX|>x>kE-4A7{V4Eb`(`4GHXZckv*YxX8wE6x%a#0eD^zd{t`CJ*BEJo zL?95xbUz9Q<{9{G4fJ7LD8OeU5N9s1nLH|lV8Ow`v9YmyM5tBO_yCVq#-sLnf2O$HxFL$gRSJbtT3Q+u6y)pc>+kPhQc^N9G7=aVSW!_yCX+kOeP4@Tq0|El*bUJ9oU@%%*TG(thhr?-VYEr3G&CShBCR3x) z@cI1S-d@n5xVX5wx*D#$wzf7uKMz+{C={ckqv7Gk=O zP^na!ot+JABO@cLs;c((_8^2yZEtT64-Z4m$;rvx-QBLPF1cL3va$jhfF2M7&LADE zz(Gi!mzOs?I}67_Qjiyv2T7qX1qB7rH5fra=nIGj0O%TEpyNOZxPi`X>n6H))1Ad( zaS>!I$?b%R3ALr;gW&%wVHpAwC1jTc0os4ho4Wnt<`?j_|em% zn?ATMC-cYf6yU1!+)l$2=Xg>3;mFAnS~uwuJ5=dBC}{51XJCzO{7)Zgc?Cy2rUX27 zH1{z_s|bYNKXeL_C)Qh>!^o+2iu74&lh zT<^R$PRkikA@Atjy4j>Dobo~WJ50Gdj;%N%*ITk$%%6u%wix=`_U};rr;%pDW<@vE zF8S6}aCx=641MvttKAo|mG&|p_i)ymciYHIl#PFyvv8KLUp_`FyIevgzg2Qf(!UPLW^KMQh;zZ#I=erO zmzN3K*1pe+Wk?Q@4+;}wdcITzmfwH!I%HAtz9i<0^Tqe4{OO0= zxoKwa2%pG)Q|zqlnUpC_$7jhiI~xOcf0>(U%hVLvq(?eMynf*w+OAcs6}LtfwjtJ9 qADh$B2-C_R4Q^_R;yb3vXK(0W`Cdn diff --git a/ckan/public-bs2/base/images/background-tag.png b/ckan/public-bs2/base/images/background-tag.png deleted file mode 100644 index e85d551ff75e2571f27fea9c6f0f9dab639723f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 993 zcmV<710MW|P)29jKyIYr*mO5H%Cy_|lK@iv|U_?5dHU|d>-qzNZe{ymX0+5J^9!)424WLYNBwO;N z3n?pINdXGT5VI>PDy|1uspB}6u~@83iUZKb7z?i`rNYb0OW*UnEBQGs&*lL5cw9t8 zzLe8p82*Di`}_M-_4V}=0L~>-u#&P$N=jnMWU@>?Yy0~8K51-h{K&TLBmfIfgosF? zKwVwk$DN&>wE!GR6|BnC_26Jpc*GhHzcilHaKy2(CX7l^A18 z;T|0w9iJ7h&aMX;h$zyyGApREvhwYfm6Z5c(d#zMPESw&kW&CZ0?109<2WIRh+em0 zHa|cA6@YUoCm9IawnIb=5s|uY(?69;{RZGd3Lr9>ObEbm-z;i~NEO@kA08h57C=V2 zk_?0hJR#DE5F#Q~Y}0>vdHF8@my&_V8)n({_4Qu?gor94;xIcqJNsQW{a@a0`sWR; zPzthQZ*TA5=;-JdL=_Qnn60j^epk5Ze`{f3!305&6-QH3Q(wx-ftT|A0z^bl%#xnv z-NbYyWu*(rlMD)Ub#>Y0<>fc`W+s!#Dy?;yWm$2hlzrE|ney))S35g9Y59XfP7byE zcw9t8zLd+q(Oket!K)04Q!>=F>$(r#Xr9SrZf-Q+-rnYo=0x;=2qp6$=T}ce{bW_a P00000NkvXXu0mjf@Bzqe diff --git a/ckan/public-bs2/base/images/background-tile.png b/ckan/public-bs2/base/images/background-tile.png deleted file mode 100644 index 4f7e76e5e199d8a8ad8bb1a8109b84f46277c715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^;ULVy3?!SM9f=20asfUeuAe`D{`KqEpFe+o|Ni~) z5Kr8W!zKuW;Mmbx^?MA= XTtc5OFB6gix`e^g)z4*}Q$iB}yxd{Z diff --git a/ckan/public-bs2/base/images/bg.png b/ckan/public-bs2/base/images/bg.png deleted file mode 100644 index 6418208e5563bc687d102cd0bf79fc482b31c222..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3911 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 UNp2Vv)4GbO(DWK%_3DG^w7Md5hGEI5Pmg z4$sU?cg@UvZ9;1EdjRylpRKhe-U>)0IHkloi(x@K=Yk0gjSLzJO3VT`m{?{dFfub}H3%>>X(~8a=T~3Lh@W$q-9Bjs zPt<*B;Z;XM*jT02#achwJANz?GGs^=a%AjH`Ss_+3jbAC|CH7Kck+AvHCkOl!s6ui zhl)3tmRc@QX3Vf~yy)?)@=g{@b-MGsRrhDM!zWWOaShJl~%_8Kgh?`l)xHIWD?n zsj6RFbX&_qPq4=&YU;Zr;~OIO*-xjxb_o!g$*41<#fi`3h=QPH^VEdDs^O*@{GDo# n_TKf>sh79!cd2u?V_=vNZnxQJGJ_g0BpEzi{an^LB{Ts5013e9 diff --git a/ckan/public-bs2/base/images/ckan-logo-white.svg b/ckan/public-bs2/base/images/ckan-logo-white.svg deleted file mode 100644 index 66d036f3dab..00000000000 --- a/ckan/public-bs2/base/images/ckan-logo-white.svg +++ /dev/null @@ -1,28 +0,0 @@ - - diff --git a/ckan/public-bs2/base/images/ckan-logo.png b/ckan/public-bs2/base/images/ckan-logo.png deleted file mode 100644 index 8d9cf132f6b10e6e9209b247b9e47342d8d4f6b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmeAS@N?(olHy`uVBq!ia0vp^RX}Xc!VDx0H#(;RDT4r?5ZC`C0>AY;9DsTSN`m}? z8UCl0&+HI1ezz*rW%n7SySEQEoMB*KeCX-o7*fIb_Nr=6OrS*D!}n*5?w8N3ES(t{ zI<2Ow%JG`c50TWXJ>shKCutRz*4|uR@$kv{vzfcsJiGjVa(Ts;Jni*12lS$5m0fEp z($4Aq*QosT($3@`(~li<%*(uWtn>YP5ZS8kI z^rFkT;8Dn;Y_S)Cf5Tqfn=JWjyEl{kbmLtN2fAJA8+U6le$X-A5V*--V)1)b_KoZ6 zJolS0AGn~o-dd$5=G+S_h8caO!h0tBF&}VTuX(EGm_e1WP0(k%qrc)}a&GC&Z9n&A z>K#sf7croTRgGrJ>?ab-+p@e|Ajr1uj~=H zU?zKw*>lgt4clHG_}usIU}`4YI!|-vsB^DWN)EqvdojW7MYzN4E!RcA{k`U`k=3$o z!?e?{(=sMs4=xB){?f9=vwE#_LFgN63`__Np00i_>zopr0Q3JsbN~PV diff --git a/ckan/public-bs2/base/images/ckan-logo.svg b/ckan/public-bs2/base/images/ckan-logo.svg deleted file mode 100644 index 000394d80a7..00000000000 --- a/ckan/public-bs2/base/images/ckan-logo.svg +++ /dev/null @@ -1,25 +0,0 @@ - - diff --git a/ckan/public-bs2/base/images/ckan.ico b/ckan/public-bs2/base/images/ckan.ico deleted file mode 100644 index 0d9295c77aa301fcd6751a4a499873e80a063388..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYJQ@j@_|40NH1M@YFxUH$VS}FI-Nt8OZvIdqzNLUBf2h$HRV>yO9F!Y1$O<0Se7iJE+ zJ5cn4^v18jsTZ3WaQz^?ajOaHMK=Sa-)`^mf0l8ph}MfRW9k3?{z(t?Jxl*Nc^>-b W?0tkJ?BsRmpM_Q0PgprXE)4)>797+7 diff --git a/ckan/public-bs2/base/images/dashboard-followee-related.png b/ckan/public-bs2/base/images/dashboard-followee-related.png deleted file mode 100644 index 25f7f6d28ab656b6011dbf887279288181ecb815..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2794 zcmVEX>4Tx0C?J+Q)g6D=@vcr-tj1^HV42lZa2jn55 zj)S9!ipu-pd!uXCy!YnK{>2n?1;Gf_2w45>mM5#WQz#Kz&|EGkvK~T zfD`~gdX7S-06<0ofSs5oQvjd@0AR~wV&ec%EdXFAf9BHwfSvf6djSAjlpz%XppgI| z6J>}*0BAb^tj|`8MF3bZ02F3R#5n-iEdVe{S7t~6u(trf&JYW-00;~KFj0twDF6g} z0AR=?BX|IWnE(_<@>e|ZE3OddDgXd@nX){&BsoQaTL>+22Uk}v9w^R97b_GtVFF>A zKrX_0nHe&HG!NkO%m4tOkrff(gY*4(&JM25&Nhy=4qq+mzXtyzVq)X|<DpKGaQJ>aJVl|9x!Kv}EM4F8AGNmGkLXs)PCDQ+7;@>R$13uq10I+I40eg`xs9j?N z_Dd%aSaiVR_W%I$yKlkNCzL=6 z51DUOSSq$Ed=-((3YAKgCY2j1FI1_jrmEhm3sv(~%T$l4UQ>OpMpZLYTc&xiMv2YpRx)mRPGut5K^*>%BIv?Wdily+ylO`+*KY$4Vz$Cr4+G&IO(4Q`uA9 zrwXSQO+7mGt}d!;r5mBUM0dY#r|y`ZzFvTyOmC;&dA;ZQ9DOhSRQ+xGr}ak+SO&8U zBnI0I&KNw!HF0k|9WTe*@liuv!$3o&VU=N*;e?U7(LAHoMvX=fjA_PP<0Rv4#%;!< zCI%)UCQD7~P41dfO}VBiraMeKOvla4&7#fLnKhd|G1oHZo9CO?o8Px!T6kJ4wy3ta zWl6H+TBcdP6gpNq-kQ#w?mvCS z^p@!_XIRe=&)75LwiC-K#A%&Vo6|>U7iYP1gY$@siA#dZE|)$on;XX6$i3uBboFsv z;d;{botv|p!tJQrukJSPY3_&IpUgC$DV|v~bI`-cL*P;6(LW2Hl`w1HtbR{JPl0E( z=OZs;FOgTR*RZ#xcdGYc?-xGyK60PqKI1$$-ZI`wBrnsy*W_HW0Wrec-#cqqYFCLW#$!oKatOZ#u3bsO~=u}!L*D43HXJuDrzs-rt zIhL!QE6wf9v&!3$H=OUE|LqdO65*1zrG`saEge|qy{u|EvOIBl+X~|q1uKSD2CO`| zinc0k)laMKSC_7Sy(W51Yk^+D%7VeQ0c-0ERSM;Wee2xU?Ojh;FInHUVfu!h8$K0@ zimnvf7nc=(*eKk1(e4|2y!JHg z)!SRV_x(P}zS~s+RZZ1q)n)rh`?L2yu8FGY_?G)^U9C=SaqY(g(gXbmBM!FLxzyDi z(mhmCkJc;eM-ImyzW$x>cP$Mz4ONYt#^NJzM0w=t_X*$k9t}F$c8q(h;Rn+nb{%IO zFKR-X@|s4QQ=0o*Vq3aT%s$c9>fU<%N829{oHRUHc}nwC$!Xf@g42^{^3RN&m7RTl zF8SPG+oHC6=VQ*_Y7cMkx)5~X(nbG^=R3SR&Rp`ibn>#>OB6F z(@)2{oV%K?xm;_x?s~noduI3P8=g1L-SoYA@fQEq)t)&$-M#aAZ}-Lb_1_lVesU-M z&da;mcPH+xyidGe^g!)F*+boj)jwPQ+}Q8je`>&Yp!3n(NB0JWgU|kv^^Xrj1&^7J z%Z3ex>z+71IXU7#a{cN2r$f(V&nBK1{-XZNt``^}my^G3e5L*B z!0Q>W+s4Ai9=^$VGcjKDR{QP2cieX!@1x%jPvm?ce<=TG`LXp=(5L&88IzO$1Ou4! z{9`jM+W-InL`g(JRCocM(y;*m5DWys>_21XNK5Yk-~ItaX0~mjsz3;lLZlEWL<*5Y wq!1xM2+->s)c0qx{=ZY}`?s}z`(xHaI@!;kLDeSoM*si-07*qoM6N<$f@+*RS^xk5 diff --git a/ckan/public-bs2/base/images/dotted.png b/ckan/public-bs2/base/images/dotted.png deleted file mode 100644 index fa0ae8040cbdf64a1a9c3214b062aa5c31a36c23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-S0V1_~EAxPqpr?ytNCji^4sJGsSN0MPnhd(h VVu9wjyxM`144$rjF6*2UngGv~4+;PP diff --git a/ckan/public-bs2/base/images/editing.png b/ckan/public-bs2/base/images/editing.png deleted file mode 100644 index be247c279660838504897f04a549757752825ac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmV;+05t!JP)E zp6qBxLFKk>D9G^_+Pb13$6sj6f`S}>q0KW2a{Mo8Q!=3md8a}flM#)`I~LlI3}`^! zq0suIM?DHEx2{7$LEds}Tbo+cqPMlCv8h1~df%3$J`Z}hcfF;^#Cre$002ovPDHLk FV1ke0RPz7; diff --git a/ckan/public-bs2/base/images/full-width-nav-right.png b/ckan/public-bs2/base/images/full-width-nav-right.png deleted file mode 100644 index 307d51248a40f1a146d744ffe4d00557279f8356..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99 zcmeAS@N?(olHy`uVBq!ia0y~yVB`d{89A7Mq?6v6S3rubB*-tA;XeqPM@ZKKMI=03 v978G?lWYF`*tlbdg|b$H#K#1Y9wr9QcTE4A7H`}DRKwuu>gTe~DWM4fZ$2CG diff --git a/ckan/public-bs2/base/images/icon-search-27x26.png b/ckan/public-bs2/base/images/icon-search-27x26.png deleted file mode 100644 index f276bb2b37a8625e30cf9779f64630787b387ee8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^(m*W5!3-n|!>%6!QpN#3A+CE!2aRXzS%KOGOM?7@ z83Ym<)+@~aUvR$v{eFW0hx?A-+Wml%D?MEtLn;`1C$e`r7;?C%U;Xmu_x!Sn`ipMM z=cXLtQam!HxQj7fV`@v(gUpnS4IxD#$*xH&`Y*ds56A4u07Yb^ptLwe?OXxA~PW@6h{ti`)E@HgD3r z!gCc*wp4AoaPsk)Ki!>Xo->@!@Ty*O-I8^s+|N|^ztP9dk{=hp)IB_p_Xk7E0Zykc TtuM`ij%M(5^>bP0l+XkK?X;6) diff --git a/ckan/public-bs2/base/images/loading-spinner.gif b/ckan/public-bs2/base/images/loading-spinner.gif deleted file mode 100644 index e14a0487dc604ad2f12a17257bc8f21af3c3257e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1849 zcmb8wdr(tX9tZI2z31lM+(&YVNJFGf2tkvOnD7cwta}r}L!cC>Ld!!EF|6TH0~N!z zh~$9~mU)ewQ z_ve{&=6vS+JHI*EyRr=1tPp|7KM>^Evu9?r`SIh&V`F2>%gauub9i_-xZ?GC_wL<0 zKRtgNiMx;nq#kNiIs`;0Eg-2HNfu`n}fs}5TiJRAFONk)^+ddRk4 z>a-s^Ahp(7Tj~#5_iweoR&x-EeG2$gaF;rCO9+YJPN@_{`LW-OqGl6$)94@1iSgaP z6}Tk2GH;#0-ZQ%c@Nb-S?{uW`;VV!4g(KYR?__&C?kh!c{69P}xhm4n-KK9OUKBB6 z{NSDKNpi_yj02RsRh(=z(?RGPNMhO-IbpZ(IuFBSY9$TS5@n-8AXAHw>0!)#ht(4Wj)S*45GS&?oJ=sm?4fb?b z8r$^x^ZKy4)UUNj9LhyT-dx=jq;zhinVDGx)BMSx%K;+yWcv#R=@*#0zmM4M&3tqh z&P08%;rqr7P_jJo_etB^%(r_E<|S2?mi_ouPl@kpV(l+WfsH%VoTJq`Ex+jS)wIQ( z@SV~Ro{S3%XbS;8QU?KU8R=P-EU2hs>5QZJN<8YFh|}>#&R8x;=OkNhR1YaeqOieS zj*HoJ{ki#TqDYB0ao&!lz^;I0rsT532Qbsuvn4>tHXrfIstE$O7TC26QAsdLWv_-H zk$hYIQ9eO8*pDE9U>j`Z31LaU3XyifASoatUwo`zPz6S1X_>cAd0kw#LXp4uo};mr zE9-dQ_w?fkDdYVip1TYn?z~i{ltQng9#c^LovwSA`$)3!r)JgqD1s>7T+M@g!a@j@ zN(Dn;#Op_^a{ZudXH|uO*doYoNF#gX;WcXmy{17`>f=(yf@)UrvnjP)lqg;|CH-yL z)E{?Q55)4aPhYgPh~Jocl&kBqUDwYAxRTaA<2YDN`FPsgFx3$+7u^2McMdT_@hb>C z8^K!meD(;!C4g4IFsP7tA%P+iPipv?)>O1!8Q!v%jPmT#=-XS2XY5)r>GT46 zd{lRiww_7<^YObA>s~du_E}OMzBaOn4vd=iA?|&jw8YHf>dEyUnzqJB(y%MXNYciS*VkYD8xc{?A{L7re z8hga-k{u};1pOXkA?Mf#Gk9#g8DR@~5D1G>^b8)vu=Z*@3dw?6os;z{!;jQ|yR?;Q zoE@dq*(m)%E<~CXAI9YR4Gh_tv9hF!=+bLW z|Np|x(3-5VjG(6E>FT@3%ay0C{r&yjcD*_W1bF*xIMI zyYch%$^x4Kc>}znB0LC=Cp-?w~vfAf|)Lpn%#As)GU41Pkno1ttyXG+CjAVxmoW+MuD$ d%WE)<`2vwl1799};fMeL002ovPDHLkV1nt=XyX6? diff --git a/ckan/public-bs2/base/images/nav.png b/ckan/public-bs2/base/images/nav.png deleted file mode 100644 index 7edd9d68348d6b41f15925cb4cba959c6b70c421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2742 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 diff --git a/ckan/public-bs2/base/images/od_80x15_blue.png b/ckan/public-bs2/base/images/od_80x15_blue.png deleted file mode 100644 index d62ef505f58a6a8e377b3acd86d135596050c8b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0YJ>p#0(_)mM@S2Qk(%kA+Bj@Y5)KKPp;bAai*aI zC>ZML;uuoFn0$cC#o5q-!^a>;lu1X?)j%sJGb|-4jy zPMvb$UIw*7A%{{wlO?=oR&2oU+1tL7Mk>*rJdPiY=d zWGnJi=2Xj6n{2gWDZ`p9)^9=cWi&-zm9MK^y79`MIf-Axxp-oiz2Bqk`O)oO;C79a zM=!Il>$BRWiv%ej*qXe{@a{M9Z{iGFcQOPpoch9HFgG)8+T(T0yBMr^vsu1LefIv` zt}-)CWX0`0%EAs;^^LQaygRwnVp38^j?z+-brYT3S8cyP%k#sc`L{W|&r9t*E|_3B zDPeiOnQ@}UMz>kz46mlKeC0G-->tT8qK|w)U*^OhzCO~cO%@_pnsh6C^K Z{9M6y>lSI<^#aBMgQu&X%Q~loCIC&|!ZH8= diff --git a/ckan/public-bs2/base/images/placeholder-420x220.png b/ckan/public-bs2/base/images/placeholder-420x220.png deleted file mode 100644 index d1e28140839a8d28711f771532516aaf55cee3aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 895 zcmV-_1AzRAP)qXFsK0K}Owi{ele zg`dWZDcymw7FlGh;Ol9vLjA3Riy?F53aQVhun$>9oh)<7Di!1a9n8W9Yz&zrvJhTimdYqu zuH$C&OheR+VQ0wv7^7DD&=*Y^V;<7xWmuC{Y*NV`4VfP~XzKon(O#mVEPekIof)9m z##)7wA@gHS6GW+Y2xIt6)A{^NmBkO744E4l9PSfRhG}#qhlwg47@_oH1V=;W#z+Q4 z7Hz9`3fSo|@v0o?P4Z7e=EfQpsGqg6$eY?f0i43M7ikMKL*_8kre|ue5Y2T2! zaD|H^sXb1E-p24t_oHHhC39p;8|}*56qpTrt7tUBMF;y}$XxG+Zjn|{hevNZ#o=Db zCKxg=axI}3%?kLEw|<{bPz14trVNJ6ixrfLB-_#E&@?X4Rbs1?hRlbGdb#`#uM4d% z2bp~I22F2KiW)=a1cIFk=qzs!cQ#{X5Nj<;w#+@!6#WoG_n$dvFVShwmbpi|qKX-M zN|=*|wkS~h*fRG>TUf~P!?RolKQ-c1Vw&iN%n>ao1=K-Q9CTca;FX)zt0uZB^N%z| z1vKj)? zketLsXoTao!wDhG<;*$%LC-Ir=k>fk&-?R!y*|(LNp^BTf`yI=0RR9-orgOE0BG*kQoACj;x*%p_rd=6mZ6bb%~Yc}9Qk^NOmR>2Bl3$snNIT>TfLR0=-&p} zV1I|)z9SX`!%t_d`zHqXi>CMoNX-uJItD;D4Z0u`yltZA*@c@g%s=dfP1Jgknr0_F%zsoP0JF1HKU zQ?O>6M*zYK8_b{KVSJre9f%3BU4oK8^Er@+grxjm<;i>S4^Y}DMqSR7w>8U0ti#ww zz}I&^f^snsNv#S^5DYMk2^S}ORd^idfrOWF>wxNWACQ!%iFx}fc=usgNUk3_8O>$- z
    (j`bp}$)aHjDl%A$@1z548g5?LeE{!kSL3zTEEvEO{6C~l76v|@n>-8eg8t#p zc1(+WXY|gJO95ZFgTfE%6MjNmHamCKz}rfhZ@8H1k(Qq>8_E}WsFHc1BOkFC%At6!k;iHXh%H^8D3C6Ge7Do%}oprU9a=H8pwENa+QQ| z(=CZTx)Q$D@LaxZ6*$e{jO@3s7<-)Xj%USkg0NOx4Z$q^V?VsAT;$BpQ9d~g*1;$x z8+1Df6Z8z$36vf`>)#BGD6$iIBDKy)19Es+e>3i|GrAs`Eon?rnGy&a1zMR5w&J*~xB94%v$U_6r<=0xz zMw*TT=v&%@0YDst4UFCZ+?eRzd$D z_cZzn6_)bDs}^e|5w2X(81aq^@mDGko*uR}36^_7rL+a#qmd*S<12?At<}1r z=@qTNt9H=-LY&a8$4NB~Nr6X>+7vOpZw4jOO)=S74f~V&UYENJCgd_9Te(Dec#tCr z%5H!4R(S{Z5mjYRI&;)zDNIwl$p&#>`|h=f_vMzMH^qX+RFPMj?IT8r>X^YHzR7X5 zd#R0WPoXO5nHfFhQ3tl(ITI3u&i4I=?(FlQ~a9ht_uIJeJS>A!(sbg^I%)OQZpqF z*)KhRNn>ocjc52mO=h|ykL*13U0?WAWw?;Fr}0Hg5W^ri8MTV4>kb-CLC4~PH1h}; z&r@(|?z?Qrf8#@v>Q^>X%#XXTq7>*eQGVO0vD<@YJ>@cIG=_g*HP}usDNycnUO;YP z)4u5`1>Tt8M8&EZb{lF@qZG9L|ExhLUHleRzIiH+w#P3t-y5U=AS>uQ-gZ}|Zxwn#Kp`C9 JFRi>|{{=IFrn>+D diff --git a/ckan/public-bs2/base/images/placeholder-application.png b/ckan/public-bs2/base/images/placeholder-application.png deleted file mode 100644 index 3348527579fe7f8309837b12cc81693ef6c7a4aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3772 zcmV;t4ny&YP)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy00byWL_t(|0qvZF znj}jQh3`9$dZ(D3aTblWZQHhO+stRUg>#M0&mFaS3aQcmMa3y~&M&TU3P=GdAO)m= zq(cEIAO)m=6p-{QAO)m=6p#Xveg&j}^ySIr(|^*LGu6Isu(qp&is4AbH!A zYL_cfLH~djBw957K(k!`pkvWl^o=GHId59sn^jb{rX?4QK<1mMC#No1At7wKEbxjXfl@Ke~Z>Fg4e6UXpl` z2hx*Xs^Gw5lq6aB-VM~_PAZC`wD5xuQYLD0$q(sKCnZu74m=`dB1(`1v1cv;YEHFr zW1>VP@kL7YT#0)-9`r;hX^`VFm;4-0QIy~trA&?E`J1?Cxw(M&A!&+|G%lCKJD2o0 zp7yh>?}rLDb zoXGg9Zv>1W1EvQF#H#k$9Y>vPfoTR(D?sAR7!azE*v>mg-A^n*g-NAhX3Uq_hD0Eh znfu96PsE6D1XUTYRxrzKLk_70`n9}q)U7EDk5H2DAATfvC}N^8XCV1eM{P-H>@;_= z=8^)W2iAf%O=HV(zaBc9vX^@xpZ!(=k~=ifW(+{849CCz`2KFUF~DDD+M495(}47K zm7E5E`CI#_dt31F6uBO^akQ z`d7tuF&Rx;w(XJAfy78Xd+_k#!$*&bT~QR3qFOY{9Xnrq4*!)SAO)m=6p#W^Knh3! mDIf);fE17dQa}nw3iT_|6f8^A5UU>m00000&*&c4``006$W69l58 z#;p{MfNDMEIi5t1y3@mn8=(yS& ze`s2i+pj*)Yna68!6nR86VVkz5>_ZOl6?;!8W`N%;a3R72YCRbxD9s9-uJ8+z;&>U z3=c~WP8WdjW|jaK=+Q*=2tJQ~Bso;fF~>kgVD$K;yi~_UQUVGAiHfCwf(iyQFPmK- zD8vG+Ms01j0UbWTiX&ui7C`1*=LBK^X6ejS7=l%O8KB?JU@V$}`NdO9y3hSL zshoP5R*=it^$9be-5p1s3^(z^DzJ@OriSg_Wb_M z1aa-egm_{z@hiT=ZtO=E8=LKi-N`Bs1pwIe37&r76=kU5^`BswyQ|CZU0a|~ zVT({ztn2T6V;34F&nHvyB5YRol2q?n2p;bkW?2THHm%0ol-s)Go{37i3FpEkEU}8I zTwmE{9__X^cyBS~HpGBBXE}_(6uxo`Tg>0;9HhoRJzH0QOVsY(JI9HOiF6F#ob-D< zmA_XlWCM^6&{R(Vuv7x^!$%tAhyM0WsW6ng4orX1`;4~-`+4uv)n0--EAa?L&_JIe zsUp4|^0}84S9O>oXViEd1GkmHoC1SrkFH}>ng=m|pTQSmSr3vMYux-^&W=z#Ebup6 z3Tx(-7z~>@W7b4mnw-dM=3X@{@^}!_a15m`i+YNfnvh-`oXJ3q;Y`-+iDb07N?VHb zH$XV-E~-OSC_S`ZS9XrD3DR0FK^LL&fndtcM<_Rmx)3$x)kr6sAYQaTRpm&sk|YNi z672c$3`b<(wIKgszvAbYym)E0qn}x-39AO_>I|zf+hZ?nCqMgPk%ubx;E7}TDKc3z zg4K*QjJ1~3%9);nM9Eh0B=9gJbo)41(#q8v+1tqe3_Pk!3M>-dTZrHa5AwZQ^lI1X1!0k(d87P z|Kv)Jhf_nYhmsw>{nWuB4Pp^-tkS>p|M3lS3@^lS8M zLq6&jetxyxF~~$tna?od)I7=6(`+r}DwWod))*Qe8~-rA zkRyhY6b&92Qs)(9IKM9bIO{*$!Mw4k=2clWY5 zMA6H{RSc#K!QPEtlv0LL>$wx}PvnEXUSu8!AdDwTCznLFn<+-Q2AuNrQM0ND8bqsi z_<2lxta{ief0i6SihgkITjvhU=hD++GhpU257mI`J1$3mIuSo{I*DE_7!xhv$~O`5 zp6dSw`L4S=El*I8A?UJE9jpz}4n;KWvkKS>q!`sK*0q%QRbE-2(#ZXm^D5Yu+m?}7 z7hX4cH73#1@~vf5yWc(kRpbUFg!R$xG2n3;C_}PgATVP?!J%ePZm$F0GIuA+OQG$5 z*DoJ~6AD|wRN$nrny}s88fM3DKa*>iulBPiQYM^;BXxp*EKK28?^(z92NQBcMn@V& z$tQZm7}HG)Wr_JsuR^>xlx~zVmDW)RA#KS|d@wO?xk`R#nH7mP(Kh)(eg~7WdE-1| z=xg=olKkAY;%=|IHtvqkqqp+52(|-hvIV|bc=#7h^j$=jQCIMj^GanZXvAo}O#c^5 z%3V&Kz;;IA$Cili-^b90U=f%WpN?6Am~%5~ovCqa2BiK>=@9b=eHAI;-EEEFs7UV6 zAktVvN##@L`ZBo+%Sv?$g{P(@dn#5kYo;|L4iS3}zN6Llk@XK>-QrsW7&CB&T^f?B zpPKODH!GI@fSYnIa^ut^?2R0{$74q%Gpq7>#*fDuM$pL;?@tRJkIDPUH&dHSqSTG} z7>xHitDPn5Wjy`S_}f%Zd7=!lt7X2#HFLYpYgZi`Wz`0EvIl6ogj)8Fg!MLIxEv7} z;O|BT9jz`NTWA{#m~1pz-$don%TdL~)l#BqvZz9qI9K27(nq_Gbmy$5H&#>)wAxKN z%s3qEt@GuZ5ocCr?PU?W5iPGY5^WeZ9$)@eMhj$(bE4bBn<1^m-7;S~?8}BH#--)q zAK@498@Tw%%vzK6;SMguv=eoY@z?3`7wT9x)l9j*@O^Cc$ME;{{x zQ9mxs=S#}2b)E;fUwys0+@M|y_Tspo7;Rtn<2b45(C&D3p>PadhO9-;%bPu{E}gE1 zIQRG!o=>l;USUUuPd=nvCXqm%CgmiJMiE6F<-e4Zl-!c{x<9xpgG|~@vggx0e0UhG zrJ)uGzMel?oS4p@F3LK~O6zugTXKKcb42?IJ=izM*fsn{M9A{O@b}v22Q)Rblv}tLNSeV)8ceWyYXaIQ12UP;Y-(dWl45b7BLZzZV{lQWG zt32VglCb}W%Q;kJZn4y}D0ly-u&F11bOoOZt%9YY|_ zEyWCn1b@EttM4P7+Ej)&ZyotC(cD|?>Z%2BgM%Brp?7-80N62R!0#}yvcgB|qA}L@ z2~;7=rv1_TX-4f5vv+d;uwA`WU||4kax=~DaQ^kU9sePStA;g0pRNIKDv2J|LP={1 z0`+>VSH*F4YLJJmZ_yu0TP6jhMs#-Dz&K=)Wcd{@rYT$9iVgTm_!xmx5oCnakA!FCr;;22BctNzCi5T)UKXNXWgd82@^g$C2CNwcTq3 z$@ma0e_&B?<r!&&MssvxIy&I5z?LBpvBMVzc~{{)wai((RbMPGh# z-r3l#LT(zn5~+lt;(K0Y4cnQ_u(TI*#H|?^mhe&3nQ)`?<;TDcDgAiDOPzQ;=d8u2 z?Q)!2YC$Q40XxdJhVgP!`G?qy{#epJc*O)7_IPkfOUEk8fc^4X!o<5pnq=YBz%#+% zDc8mXJsVY+w!OyT%PC5>=}k*L7oX>jGp%zKdJvscgzfKC;uxuWJk#OqPNfJ2?$0+c zs+a%vMKk2Tn3go`DI73|iPYW7CHvPuvU#;pG|p^PcyC-B~-3k&FnlOSZynYO0zTHc=2 zr`{PJtdjGjgUT%$7ZaEZwYm*Prn`n$E&GW($VP|KNwP65SVZ5CIXF5mvFCaBfJ!EV zd=zJA4-ZM}NVl5;c$4kc@QkjA#iH>=QTipnOHpyv72)aYP;ZuB>W8sn)?NYeEO zk4G=GB)l2)W0a#(v?fY9?01`?1P%>WwSte0#6Dh5 zz58c*j*kS!F<({+<041Apw8?VRx;J6o*tF~wbB|X&WrQxFh~9Kj%IV(n zLZ`F~s?MtCA2Tl5H3F0i+~TvX*1D&mb5>+yt4}{^W;2gy@xN0mov=2@-}Z$G5}sC` z@TBAPOW=w9I8pJ%9e&&tfvV{TnT80%tmTbbQzNbcze1T9a z%5}qC+9tr^r074oF7%Odv$=iEd(6%JWSNYy8@ zul|$}RAEk1P<+`6TrCjw@8Sqd>NaxVa&mj|?AZ03St kOz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- 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 diff --git a/ckan/public-bs2/base/images/placeholder-organization.png b/ckan/public-bs2/base/images/placeholder-organization.png deleted file mode 100644 index 0ea53527e8ccfefec2084002fb18e6f25603b668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3861 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 XC|@_F?lw?~00000NkvXXu0mjfn&422 diff --git a/ckan/public-bs2/base/images/sprite-ckan-icons.png b/ckan/public-bs2/base/images/sprite-ckan-icons.png deleted file mode 100644 index b827b8c4e32d407a359b3bfc97300b3a9f8f86f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13523 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 h{`@=p<@@`1hPY4McV^tY`3I "2012-07-17T14:35:35Z" - * - * client.normalizeTimestamp("2012-07-17T14:35:35+0100"); - * // => "2012-07-17T14:35:35+0100" - * - * Returns a new timestamp with timezone. - */ - normalizeTimestamp: function (string) { - var tz = /[+\-]\d{4}|Z/; - if (!tz.test(string)) { - string += 'Z'; - } - return string; - } - }); - - ckan.sandbox.setup(function (instance) { - instance.client = new Client({endpoint: ckan.SITE_ROOT}); - }); - - ckan.Client = Client; - -})(this.ckan, this.jQuery); diff --git a/ckan/public-bs2/base/javascript/i18n.js b/ckan/public-bs2/base/javascript/i18n.js deleted file mode 100644 index ccfd8125af4..00000000000 --- a/ckan/public-bs2/base/javascript/i18n.js +++ /dev/null @@ -1,101 +0,0 @@ -'use strict'; - -/* - * CKAN JavaScript i18n functionality. - * - * Adds an `i18n` attribute to the CKAN object (`this.ckan`). - * - * Singular strings can be translated using `i18n._`: - * - * ckan.i18n._('Hello, world!') - * - * The function will return the translated string in the currently selected - * language. Often, a translateable string contains dynamic parts, for example - * a username. These can be included via named `%`-placeholders: - * - * ckan.i18n._('Hello, %(name)s!', {name: 'Jessica'}) - * - * After translation the placeholders are replaced using the values passed in - * the second argument. - * - * Plural strings can be translated using `i18n.ngettext`: - * - * ckan.i18n.ngettext('%(num)d item was deleted', - * '%(num)d items were deleted', - * num_items) - * - * Here, the first two arguments contain the singular and plural translation - * strings. The third argument contains the number which is used to decide - * whether the singular form or the plural form is to be used. The `num` - * placeholder is special in plural forms and will be replaced with the value - * of the third argument. - * - * As before your strings can contain additional placeholders, and you pass - * their values using another argument: - * - * ckan.i18n.ngettext('%(name)s deleted %(num)d item', - * '%(name)s deleted %(num)d items', - * num_items, - * {name: 'Thomas'}) - * - * Note that inside a CKAN JS module you can also use the shortcuts `this._` - * and `this.ngettext`. - */ - -this.ckan = this.ckan || {}; - -(function (ckan, jQuery, Jed) { - // See: http://slexaxton.github.com/Jed/ - var domain = { - "": { - "domain": "ckan", - "lang": "en", - "plural_forms": "nplurals=2; plural=(n != 1);" - } - }; - - var jed = new Jed({ - domain: 'ckan', - locale_data: { - ckan: domain - } - }); - - ckan.i18n = {}; - - /* - * Expose JED translation interface [DEPRECATED]. - * - * Using the JED functions directly is deprecated and only kept for - * backwards-compatibility. Use `_` and `ngettext` instead. - */ - ckan.i18n.translate = jQuery.proxy(jed.translate, jed); - - /* - * Internal function to load a translation. - */ - ckan.i18n.load = function (data) { - if (data && data['']) { - // Extend our default domain data with the new keys. - jQuery.extend(domain, data);; - } - }; - - ckan.i18n._ = function (string, values) { - return jed.sprintf(jed.gettext(string), values || {}); - }; - - ckan.i18n.ngettext = function(singular, plural, num, values) { - values = values || {}; - values['num'] = num; - return jed.sprintf(jed.ngettext(singular, plural, num), values); - }; - - ckan.sandbox.extend({ - /* An alias for ckan.i18n [DEPRECATED] */ - i18n: ckan.i18n, - - /* An alias for ckan.l18n.translate() [DEPRECATED] */ - translate: ckan.i18n.translate - }); -})(this.ckan, this.jQuery, this.Jed); diff --git a/ckan/public-bs2/base/javascript/main.js b/ckan/public-bs2/base/javascript/main.js deleted file mode 100644 index 95fb9dc7bff..00000000000 --- a/ckan/public-bs2/base/javascript/main.js +++ /dev/null @@ -1,101 +0,0 @@ -// Global ckan namespace -this.ckan = this.ckan || {}; - -(function (ckan, jQuery) { - ckan.PRODUCTION = 'production'; - ckan.DEVELOPMENT = 'development'; - ckan.TESTING = 'testing'; - - /* Initialises the CKAN JavaScript setting up environment variables and - * loading localisations etc. Should be called once the page is ready. - * - * Examples - * - * jQuery(function () { - * ckan.initialize(); - * }); - * - * Returns nothing. - */ - ckan.initialize = function () { - var body = jQuery('body'); - var locale = jQuery('html').attr('lang'); - var location = window.location; - var root = location.protocol + '//' + location.host; - - function getRootFromData(key) { - return (body.data(key) || root).replace(/\/$/, ''); - } - - ckan.SITE_ROOT = getRootFromData('siteRoot'); - ckan.LOCALE_ROOT = getRootFromData('localeRoot'); - - // Convert all datetimes to the users timezone - jQuery('.automatic-local-datetime').each(function() { - moment.locale(locale); - var date = moment(jQuery(this).data('datetime')); - if (date.isValid()) { - jQuery(this).html(date.format("LL, LT ([UTC]Z)")); - } - jQuery(this).show(); - }) - - // Load the localisations before instantiating the modules. - ckan.sandbox().client.getLocaleData(locale).done(function (data) { - ckan.i18n.load(data); - ckan.module.initialize(); - }); - if (jQuery.fn.popover !== undefined) { - jQuery('[data-target="popover"]').popover(); - } - }; - - /* Returns a full url for the current site with the provided path appended. - * - * path - A path to append to the url (default: '/') - * includeLocale - If true the current locale will be added to the page. - * - * Examples - * - * var imageUrl = sandbox.url('/my-image.png'); - * // => http://example.ckan.org/my-image.png - * - * var imageUrl = sandbox.url('/my-image.png', true); - * // => http://example.ckan.org/en/my-image.png - * - * var localeUrl = sandbox.url(true); - * // => http://example.ckan.org/en - * - * Returns a url string. - */ - ckan.url = function (path, includeLocale) { - if (typeof path === 'boolean') { - includeLocale = path; - path = null; - } - - path = (path || '').replace(/^\//, ''); - - var root = includeLocale ? ckan.LOCALE_ROOT : ckan.SITE_ROOT; - return path ? root + '/' + path : root; - }; - - ckan.sandbox.extend({url: ckan.url}); - - if (ckan.ENV !== ckan.TESTING) { - jQuery(function () { - ckan.initialize(); - }); - } - -})(this.ckan, this.jQuery); - -// Show / hide filters for mobile -$(function() { - $(".show-filters").click(function() { - $("body").addClass("filters-modal"); - }); - $(".hide-filters").click(function() { - $("body").removeClass("filters-modal"); - }); -}); diff --git a/ckan/public-bs2/base/javascript/module.js b/ckan/public-bs2/base/javascript/module.js deleted file mode 100644 index 5ddd8f3d1c7..00000000000 --- a/ckan/public-bs2/base/javascript/module.js +++ /dev/null @@ -1,397 +0,0 @@ -this.ckan = this.ckan || {}; - -/* The module system ties JavaScript code to elements on the page. A module is - * simply a function that receives an element and a sandboxed module object. - * - * The sandbox provides useful methods for querying within the module element - * as well as making ajax calls and talking to other modules. The idea being to - * isolate a single component from the rest of the page keeping the codebase - * very modular and reusable. - * - * Modules are initialized through the DOM keeping boilerplate setup code to a - * minimum. If an element in the page has a "data-module" attribute then an - * instance of that module (if registered) will be created when the page loads - * and will receive the element and the sandbox mentioned above. - * - * Examples - * - * // For element: - * - * // Register a new module object, .initialize() is called on load. - * ckan.module('language-picker', { - * initialize: function () { - * var el = this.el; - * var sandbox = this.sandbox; - * - * // .el is the dom node the element was created with. - * this.el.on('change', function () { - * - * // Publish the new language so other modules can update. - * sandbox.publish('lang', this.selected); - * - * // Display a localized notification to the user. - * sandbox.notify(this._('Language changed to: %(lang)s', {lang: this.selected})); - * }); - * - * // listen for other updates to lang. - * sandbox.subscribe('lang', function (lang) { - * // Update the element select box. - * el.select(lang); - * }); - * } - * }); - * - * // Can also provide a function that returns this object. The function will - * // be passed jQuery. - * ckan.module('language-picker', function (jQuery) { - * return { - * // Module code. - * } - * }); - */ -(function (ckan, jQuery, window) { - // Prefixes for the HTML attributes use to pass options into the modules. - var MODULE_PREFIX = 'data-module'; - var MODULE_OPTION_PREFIX = 'data-module-'; - - /* BaseModule is the core of the CKAN website. It represents a single element - * in the current document and is used to add functionality to that element. - * - * I should not be used itself but rather subclasses using the ckan.module() - * method. - * - * It receives a sandbox element with various libraries and utility functions - * and should use this rather than the global objects (jQuery for instance) - * as it makes the modules much easier to test. - * - * The options property can be used to set defaults, these can be overridden - * by the user through data-* attributes on the element. - * - * element - An element that the sandbox is bound to. - * options - An object of key/value pairs. - * sandbox - A sandbox instance. - * - * Returns a new BaseModule instance. - */ - function BaseModule(el, options, sandbox) { - this.el = el instanceof jQuery ? el : jQuery(el); - this.options = jQuery.extend(true, {}, this.options, options); - this.sandbox = sandbox; - } - - jQuery.extend(BaseModule.prototype, { - /* The jQuery element for the current module */ - el: null, - - /* The options object passed into the module either via data-* attributes - * or the default settings. - */ - options: null, - - /* A scoped find function restricted to the current scope. Essentially - * the same as doing this.el.find(selector); - * - * selector - A standard jQuery/CSS selector query. - * - * Example - * - * this.$('input'); // jQuery collection of child inputs. - * - * Returns a jQuery collection. - */ - $: function (selector) { - return this.el.find(selector); - }, - - /* Helper function for getting i18n properties from the options object. - * It should be called with an i18n key and any arguments that are to - * be passed into the .fetch() method. - * - * This method is DEPRECATED. Module code should instead use the - * `_` and `ngettext` methods (`this._` and `this.ngettext`). - * - * An i18n option can either be a string, an object returned by - * ckan.i18n.translate or a function that returns one of the above. If - * a function is provided then it will be passed the same arguments that - * were passed to i18n(). - * - * key - The translation key to use. - * args... - All successive arguments are passed into the factory function. - * - * Example - * - * ckan.module.translate('trans', function (jQuery, _) { - * options: { - * i18n: { - * saved: _('Saved!'), // A translation object. - * loading: 'Loading', // A plain string (not a good idea). - * itemCount: function (data) { - * // A function can be used to provide more complex translations - * // where the arguments may affect the outcome. - * return _('There is one item').isPlural(data.items, 'There are %(items)d items') - * } - * } - * }, - * example: function () { - * this.i18n('saved'); // 'Saved!' - * this.i18n('loading'); // 'Loading' - * this.i18n('itemCount', {items: 1}); // 'There is one item' - * this.i18n('itemCount', {items: 3}); // 'There are 3 items' - * } - * - * Returns the translated string or the key if not found. - */ - i18n: function (key /* args... */) { - var args = [].slice.call(arguments, 1); - var i18n = this.options.i18n; - var trans = (i18n && i18n[key]) || key; - - // Allow the option to be a getter function that returns a Jed instance. - if (typeof trans === 'function') { - trans = trans.apply(null, args); - } - - // If the result has a fetch method, call it with the args. - return typeof trans.fetch === 'function' ? trans.fetch.apply(trans, args) : trans; - }, - - /* - * Shortcuts for i18n. - * - * Note that we cannot simply set them to their `ckan.i18n` counterparts - * since those might now have been defined, yet. Hence we redirect at - * runtime. - */ - _: function(/* args */) { - return ckan.i18n._.apply(ckan.i18n, arguments); - }, - ngettext: function(/* args */) { - return ckan.i18n.ngettext.apply(ckan.i18n, arguments); - }, - - /* Should be defined by the extending module to provide initialization - * code. This will be called directly after the instance has been - * invoked. - */ - initialize: function () {}, - - /* Called just before the element is removed from the DOM, use it to - * un-subscribe any listeners and clean up memory. - * - * Examples - * - * teardown: function () { - * this.sandbox.unsubscribe('lang', this.onLangChange); - * this.sandbox.unsubscribe('login', this.onLogin); - * } - * - * Returns nothing. - */ - teardown: function () {}, - - /* Removes the module element from the document. - * - * Returns nothing. - */ - remove: function () { - this.teardown(); - this.el.remove(); - } - }); - - /* Add a new module to the registry. - * - * This expects an object of methods/properties to be provided. These will - * then be used to create a new BaseModule subclass which will be invoked each - * time that a module appears on the page. - * - * name - A unique name for the module to be registered. - * properties - An object of module properties or a function that returns - * an object. - * - * Examples - * - * ckan.module('like-button', { - * options: { - * endpoint: '/api/v2/like' - * }, - * initialize: function () { - * var options = this.options, - * sandbox = this.sandbox, - * _ = sandbox.translate; - * - * this.el.on('click', function () { - * var url = options.endpoint; - * var message = _('Dataset was liked!').fetch(); - * sandbox.ajax( ... ); - * }); - * } - * }); - * - * Returns the ckan object. - */ - function module(name, properties) { - if (module.registry[name]) { - throw new Error('There is already a module registered as "' + name + '"'); - } - - // If a function is provided then call it to get a returns object of - // properties. - if (typeof properties === 'function') { - // The `ckan.i18n.translate` and `ckan.i18n` arguments are deprecated - // and only passed for backwards-compatibility. - properties = properties(jQuery, ckan.i18n.translate, ckan.i18n); - } - - // Provide a named constructor, this helps with debugging in the Webkit - // Web Inspector. - properties = jQuery.extend({ - constructor: function Module() { - BaseModule.apply(this, arguments); - } - }, properties); - - // Extend the instance. - module.registry[name] = jQuery.inherit(BaseModule, properties, {namespace: name}); - - return ckan; - } - - /* Holds all of the registered module functions */ - module.registry = {}; - - /* Holds all initialized instances */ - module.instances = {}; - - /* Searches the document for modules and initializes them. This should only - * be called once on page load. - * - * Examples - * - * jQuery.ready(ckan.module.initialize); - * - * Returns the module object. - */ - module.initialize = function () { - // Start caching all calls to .publish() until all modules are loaded. - ckan.pubsub.enqueue(); - - jQuery('[data-module]', document.body).each(function (index, element) { - module.initializeElement(this); - }); - - // Now trigger all .publish() calls so that all modules receive them. - ckan.pubsub.dequeue(); - - return module; - }; - - /* Initializes an individual dom modules element - * - * element = DOM node you want to initialize (not jQuery collection) - * - * Examples - * - * ckan.module.initializeElement(jQuery('[data-module="foo"]')[0]) - * - * Returns nothing - */ - module.initializeElement = function(element) { - var registry = module.registry; - var names = jQuery.trim(element.getAttribute(MODULE_PREFIX)).split(' '); - - jQuery.each(names, function (index, name) { - var Module = registry[name]; - - if (Module && typeof Module === 'function') { - module.createInstance(Module, element); - } - }); - }; - - /* Creates a new module instance for the element provided. - * - * The module factory is called with the sandbox, options object and - * translate function as arguments. In the same way as a jQuery callback the - * scope of the factory is set to the element the module is bound to. - * - * factory - The module factory function to call. - * element - The element that created the module. - * - * Examples - * - * module.createInstance(function (sb, opts, _) { - * this === sb.el[0]; // The div passed in as the second arg. - * opts === sb.opts; // Any data-module-* options on the div. - * _ === sb.translate; // A translation function. - * }, document.createInstance('div')); - * - * Returns nothing. - */ - module.createInstance = function (Module, element) { - var options = module.extractOptions(element); - var sandbox = ckan.sandbox(element, options); - - var instance = new Module(element, options, sandbox); - - if (typeof instance.initialize === 'function') { - instance.initialize(); - } - - var instances = module.instances[Module.namespace] || []; - instances.push(instance); - module.instances[Module.namespace] = instances; - }; - - /* Extracts any properties starting with MODULE_OPTION_PREFIX from the - * element and returns them as an object. - * - * Keys with additonal hyphens will be converted to camelCase. Each attribute - * will be passed to JSON.parse() so that complex object can be provided as - * options (although this is not recommended). - * - * element - The element from which to extract the attributes. - * - * Examples - * - * // Source
    - * - * module.extractOptions(div); //=> {url: "http://...", fullName: "fred"} - * - * Returns an object of extracted options. - */ - module.extractOptions = function (element) { - var attrs = element.attributes; - var index = 0; - var length = attrs.length; - var options = {}; - var prop; - var attr; - var value; - - for (; index < length; index += 1) { - attr = attrs[index]; - - if (attr.name.indexOf(MODULE_OPTION_PREFIX) === 0) { - prop = attr.name.slice(MODULE_OPTION_PREFIX.length); - - // Attempt to parse the string as JSON. If this fails then simply use - // the attribute value as is. - try { - // If we have a boolean attribute (no value) then set to true. - value = attr.value === "" ? true : jQuery.parseJSON(attr.value); - } catch (error) { - value = attr.value; - } - - options[jQuery.camelCase(prop)] = value; - } - } - - return options; - }; - - ckan.module = module; - ckan.module.BaseModule = BaseModule; - -})(this.ckan, this.jQuery, this); diff --git a/ckan/public-bs2/base/javascript/modules/activity-stream.js b/ckan/public-bs2/base/javascript/modules/activity-stream.js deleted file mode 100644 index 16314f5a661..00000000000 --- a/ckan/public-bs2/base/javascript/modules/activity-stream.js +++ /dev/null @@ -1,119 +0,0 @@ -/* Activity stream - * Handle the loading more of activity items within actiivity streams - * - * Options - * - more: are there more items to load - * - context: what's the context for the ajax calls - * - id: what's the id of the context? - * - offset: what's the current offset? - */ -this.ckan.module('activity-stream', function($) { - return { - /* options object can be extended using data-module-* attributes */ - options : { - more: null, - id: null, - context: null, - offset: null, - loading: false - }, - - /* Initialises the module setting up elements and event listeners. - * - * Returns nothing. - */ - initialize: function () { - $.proxyAll(this, /_on/); - var options = this.options; - options.more = (options.more == 'True'); - this._onBuildLoadMore(); - $(window).on('scroll', this._onScrollIntoView); - this._onScrollIntoView(); - }, - - /* Function that tells if el is within the window viewpost - * - * Returns boolean - */ - elementInViewport: function(el) { - var top = el.offsetTop; - var left = el.offsetLeft; - var width = el.offsetWidth; - var height = el.offsetHeight; - while(el.offsetParent) { - el = el.offsetParent; - top += el.offsetTop; - left += el.offsetLeft; - } - return ( - top < (window.pageYOffset + window.innerHeight) && - left < (window.pageXOffset + window.innerWidth) && - (top + height) > window.pageYOffset && - (left + width) > window.pageXOffset - ); - }, - - /* Whenever the window scrolls check if the load more button - * exists, if it's in the view and we're not already loading. - * If all conditions are satisfied... fire a click event on - * the load more button. - * - * Returns nothing - */ - _onScrollIntoView: function() { - var el = $('.load-more a', this.el); - if (el.length == 1) { - var in_viewport = this.elementInViewport(el[0]); - if (in_viewport && !this.options.loading) { - el.trigger('click'); - } - } - }, - - /* If we are able to load more... then attach the ajax request - * to the load more button. - * - * Returns nothing - */ - _onBuildLoadMore: function() { - var options = this.options; - if (options.more) { - $('.load-more', this.el).on('click', 'a', this._onLoadMoreClick); - options.offset = $('.item', this.el).length; - } - }, - - /* Fires when someone clicks the load more button - * ... and if not loading then make the API call to load - * more activities - * - * Returns nothing - */ - _onLoadMoreClick: function (event) { - event.preventDefault(); - var options = this.options; - if (!options.loading) { - options.loading = true; - $('.load-more a', this.el).html(this._('Loading...')).addClass('disabled'); - this.sandbox.client.call('GET', options.context+'_activity_list_html', '?id='+options.id+'&offset='+options.offset, this._onActivitiesLoaded); - } - }, - - /* Callback for after the API call - * - * Returns nothing - */ - _onActivitiesLoaded: function(json) { - var options = this.options; - var result = $(json.result); - options.more = ( result.data('module-more') == 'True' ); - options.offset += 30; - $('.load-less', result).remove(); - $('.load-more', this.el).remove(); - $('li', result).appendTo(this.el); - this._onBuildLoadMore(); - options.loading = false; - } - - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/api-info.js b/ckan/public-bs2/base/javascript/modules/api-info.js deleted file mode 100644 index 0271e30ed48..00000000000 --- a/ckan/public-bs2/base/javascript/modules/api-info.js +++ /dev/null @@ -1,127 +0,0 @@ -/* Loads the API Info snippet into a modal dialog. Retrieves the snippet - * url from the data-snippet-url on the module element. - * - * template - The url to the template to display in a modal. - * - * Examples - * - * API - * - */ -this.ckan.module('api-info', function (jQuery) { - return { - - /* holds the loaded lightbox */ - modal: null, - - options: { - template: null - }, - - /* Sets up the API info module. - * - * Returns nothing. - */ - initialize: function () { - jQuery.proxyAll(this, /_on/); - - this.el.on('click', this._onClick); - this.el.button(); - }, - - /* Displays a loading message in the button. If false is provided as an - * argument the message is reset. - * - * loading - Resets the message if false. - * - * Examples - * - * module.loading(); // Show - * module.loading(false); // Hide - * - * Returns nothing. - */ - loading: function (loading) { - this.el.button(loading !== false ? 'loading' : 'reset'); - }, - - /* Displays the API info box. - * - * Examples - * - * module.show() - * - * Returns nothing. - */ - show: function () { - var sandbox = this.sandbox, - module = this; - - if (this.modal) { - return this.modal.modal('show'); - } - - this.loadTemplate().done(function (html) { - module.modal = jQuery(html); - module.modal.find('.modal-header :header').append(''); - module.modal.modal().appendTo(sandbox.body); - }); - }, - - /* Hides the modal. - * - * Examples - * - * module.hide(); - * - * Returns nothing. - */ - hide: function () { - if (this.modal) { - this.modal.modal('hide'); - } - }, - - /* Loads the template and returns a promise that on complete will - * receive the html content for the modal. - * - * Examples - * - * module.loadTemplate().then(onSuccess, onError); - * - * Returns a promise instance. - */ - loadTemplate: function () { - if (!this.options.template) { - this.sandbox.notify(this._('There is no API data to load for this resource')); - return jQuery.Deferred().reject().promise(); - } - - if (!this.promise) { - this.loading(); - - // This should use sandbox.client! - this.promise = jQuery.get(this.options.template); - this.promise.then(this._onTemplateSuccess, this._onTemplateError); - } - return this.promise; - }, - - /* Event handler for clicking on the element */ - _onClick: function (event) { - event.preventDefault(); - this.show(); - }, - - /* Success handler for when the template is loaded */ - _onTemplateSuccess: function () { - this.loading(false); - }, - - /* error handler when the template fails to load */ - _onTemplateError: function () { - this.loading(false); - this.sandbox.notify(this._('Failed to load data API information')); - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/autocomplete.js b/ckan/public-bs2/base/javascript/modules/autocomplete.js deleted file mode 100644 index 8a8f5e9d69c..00000000000 --- a/ckan/public-bs2/base/javascript/modules/autocomplete.js +++ /dev/null @@ -1,275 +0,0 @@ -/* An auto-complete module for select and input elements that can pull in - * a list of terms from an API endpoint (provided using data-module-source). - * - * source - A url pointing to an API autocomplete endpoint. - * interval - The interval between requests in milliseconds (default: 1000). - * items - The max number of items to display (default: 10) - * tags - Boolean attribute if true will create a tag input. - * key - A string of the key you want to be the form value to end up on - * from the ajax returned results - * label - A string of the label you want to appear within the dropdown for - * returned results - * - * Examples - * - * // - * - */ -this.ckan.module('autocomplete', function (jQuery) { - return { - /* Options for the module */ - options: { - tags: false, - key: false, - label: false, - items: 10, - source: null, - interval: 300, - dropdownClass: '', - containerClass: '' - }, - - /* Sets up the module, binding methods, creating elements etc. Called - * internally by ckan.module.initialize(); - * - * Returns nothing. - */ - initialize: function () { - jQuery.proxyAll(this, /_on/, /format/); - this.setupAutoComplete(); - }, - - /* Sets up the auto complete plugin. - * - * Returns nothing. - */ - setupAutoComplete: function () { - var settings = { - width: 'resolve', - formatResult: this.formatResult, - formatNoMatches: this.formatNoMatches, - formatInputTooShort: this.formatInputTooShort, - dropdownCssClass: this.options.dropdownClass, - containerCssClass: this.options.containerClass - }; - - // Different keys are required depending on whether the select is - // tags or generic completion. - if (!this.el.is('select')) { - if (this.options.tags) { - settings.tags = this._onQuery; - } else { - settings.query = this._onQuery; - settings.createSearchChoice = this.formatTerm; - } - settings.initSelection = this.formatInitialValue; - } - else { - if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { - var ieversion=new Number(RegExp.$1); - if (ieversion<=7) {return} - } - } - - var select2 = this.el.select2(settings).data('select2'); - - if (this.options.tags && select2 && select2.search) { - // find the "fake" input created by select2 and add the keypress event. - // This is not part of the plugins API and so may break at any time. - select2.search.on('keydown', this._onKeydown); - } - - // This prevents Internet Explorer from causing a window.onbeforeunload - // even from firing unnecessarily - $('.select2-choice', select2.container).on('click', function() { - return false; - }); - - this._select2 = select2; - }, - - /* Looks up the completions for the current search term and passes them - * into the provided callback function. - * - * The results are formatted for use in the select2 autocomplete plugin. - * - * string - The term to search for. - * fn - A callback function. - * - * Examples - * - * module.getCompletions('cake', function (results) { - * results === {results: []} - * }); - * - * Returns a jqXHR promise. - */ - getCompletions: function (string, fn) { - var parts = this.options.source.split('?'); - var end = parts.pop(); - var source = parts.join('?') + encodeURIComponent(string) + end; - var client = this.sandbox.client; - var options = { - format: function(data) { - var completion_options = jQuery.extend(options, {objects: true}); - return { - results: client.parseCompletions(data, completion_options) - } - }, - key: this.options.key, - label: this.options.label - }; - - return client.getCompletions(source, options, fn); - }, - - /* Looks up the completions for the provided text but also provides a few - * optimisations. If there is no search term it will automatically set - * an empty array. Ajax requests will also be debounced to ensure that - * the server is not overloaded. - * - * string - The term to search for. - * fn - A callback function. - * - * Returns nothing. - */ - lookup: function (string, fn) { - var module = this; - - // Cache the last searched term otherwise we'll end up searching for - // old data. - this._lastTerm = string; - - // Kills previous timeout - clearTimeout(this._debounced); - - // OK, wipe the dropdown before we start ajaxing the completions - fn({results:[]}); - - if (string) { - // Set a timer to prevent the search lookup occurring too often. - this._debounced = setTimeout(function () { - var term = module._lastTerm; - - // Cancel the previous request if it hasn't yet completed. - if (module._last && typeof module._last.abort == 'function') { - module._last.abort(); - } - - module._last = module.getCompletions(term, fn); - }, this.options.interval); - - // This forces the ajax throbber to appear, because we've called the - // callback already and that hides the throbber - $('.select2-search input', this._select2.dropdown).addClass('select2-active'); - } - }, - - /* Formatter for the select2 plugin that returns a string for use in the - * results list with the current term emboldened. - * - * state - The current object that is being rendered. - * container - The element the content will be added to (added in 3.0) - * query - The query object (added in select2 3.0). - * - * - * Returns a text string. - */ - formatResult: function (state, container, query) { - var term = this._lastTerm || null; // same as query.term - - if (container) { - // Append the select id to the element for styling. - container.attr('data-value', state.id); - } - - return state.text.split(term).join(term && term.bold()); - }, - - /* Formatter for the select2 plugin that returns a string used when - * the filter has no matches. - * - * Returns a text string. - */ - formatNoMatches: function (term) { - return !term ? this._('Start typing…') : this._('No matches found'); - }, - - /* Formatter used by the select2 plugin that returns a string when the - * input is too short. - * - * Returns a string. - */ - formatInputTooShort: function (term, min) { - return this.ngettext( - 'Input is too short, must be at least one character', - 'Input is too short, must be at least %(num)d characters', - min - ); - }, - - /* Takes a string and converts it into an object used by the select2 plugin. - * - * term - The term to convert. - * - * Returns an object for use in select2. - */ - formatTerm: function (term) { - term = jQuery.trim(term || ''); - - // Need to replace comma with a unicode character to trick the plugin - // as it won't split this into multiple items. - return {id: term.replace(/,/g, '\u002C'), text: term}; - }, - - /* Callback function that parses the initial field value. - * - * element - The initialized input element wrapped in jQuery. - * callback - A callback to run once the formatting is complete. - * - * Returns a term object or an array depending on the type. - */ - formatInitialValue: function (element, callback) { - var value = jQuery.trim(element.val() || ''); - var formatted; - - if (this.options.tags) { - formatted = jQuery.map(value.split(","), this.formatTerm); - } else { - formatted = this.formatTerm(value); - } - - // Select2 v3.0 supports a callback for async calls. - if (typeof callback === 'function') { - callback(formatted); - } - - return formatted; - }, - - /* Callback triggered when the select2 plugin needs to make a request. - * - * Returns nothing. - */ - _onQuery: function (options) { - if (options) { - this.lookup(options.term, options.callback); - } - }, - - /* Called when a key is pressed. If the key is a comma we block it and - * then simulate pressing return. - * - * Returns nothing. - */ - _onKeydown: function (event) { - if (event.which === 188) { - event.preventDefault(); - setTimeout(function () { - var e = jQuery.Event("keydown", { which: 13 }); - jQuery(event.target).trigger(e); - }, 10); - } - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/basic-form.js b/ckan/public-bs2/base/javascript/modules/basic-form.js deleted file mode 100644 index a3c57b094a1..00000000000 --- a/ckan/public-bs2/base/javascript/modules/basic-form.js +++ /dev/null @@ -1,24 +0,0 @@ -this.ckan.module('basic-form', function (jQuery) { - return { - initialize: function () { - var message = this._('There are unsaved modifications to this form'); - - $.proxyAll(this, /_on/); - - this.el.incompleteFormWarning(message); - - // Disable the submit button on form submit, to prevent multiple - // consecutive form submissions. - this.el.on('submit', this._onSubmit); - }, - _onSubmit() { - - // The button is not disabled immediately so that its value can be sent - // the first time the form is submitted, because the "save" field is - // used in the backend. - setTimeout(function() { - this.el.find('button[name="save"]').attr('disabled', true); - }.bind(this), 0); - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/confirm-action.js b/ckan/public-bs2/base/javascript/modules/confirm-action.js deleted file mode 100644 index 7ee99fc2fb8..00000000000 --- a/ckan/public-bs2/base/javascript/modules/confirm-action.js +++ /dev/null @@ -1,124 +0,0 @@ -this.ckan.module('confirm-action', function (jQuery) { - return { - /* An object of module options */ - options: { - /* Content can be overriden by setting data-module-content to a - * *translated* string inside the template, e.g. - * - * - * {{ _('Delete') }} - * - */ - content: '', - - /* This is part of the old i18n system and is kept for backwards- - * compatibility for templates which set the content via the - * `i18n.content` attribute instead of via the `content` attribute - * as described above. - */ - i18n: { - content: '', - }, - - template: [ - '' - ].join('\n') - }, - - /* Sets up the event listeners for the object. Called internally by - * module.createInstance(). - * - * Returns nothing. - */ - initialize: function () { - jQuery.proxyAll(this, /_on/); - this.el.on('click', this._onClick); - }, - - /* Presents the user with a confirm dialogue to ensure that they wish to - * continue with the current action. - * - * Examples - * - * jQuery('.delete').click(function () { - * module.confirm(); - * }); - * - * Returns nothing. - */ - confirm: function () { - this.sandbox.body.append(this.createModal()); - this.modal.modal('show'); - - // Center the modal in the middle of the screen. - this.modal.css({ - 'margin-top': this.modal.height() * -0.5, - 'top': '50%' - }); - }, - - /* Performs the action for the current item. - * - * Returns nothing. - */ - performAction: function () { - // create a form and submit it to confirm the deletion - var form = jQuery('
    ', { - action: this.el.attr('href'), - method: 'POST' - }); - form.appendTo('body').submit(); - }, - - /* Creates the modal dialog, attaches event listeners and localised - * strings. - * - * Returns the newly created element. - */ - createModal: function () { - if (!this.modal) { - var element = this.modal = jQuery(this.options.template); - element.on('click', '.btn-primary', this._onConfirmSuccess); - element.on('click', '.btn-cancel', this._onConfirmCancel); - element.modal({show: false}); - - element.find('h3').text(this._('Please Confirm Action')); - var content = this.options.content || - this.options.i18n.content || /* Backwards-compatibility */ - this._('Are you sure you want to perform this action?'); - element.find('.modal-body').text(content); - element.find('.btn-primary').text(this._('Confirm')); - element.find('.btn-cancel').text(this._('Cancel')); - } - return this.modal; - }, - - /* Event handler that displays the confirm dialog */ - _onClick: function (event) { - event.preventDefault(); - this.confirm(); - }, - - /* Event handler for the success event */ - _onConfirmSuccess: function (event) { - this.performAction(); - }, - - /* Event handler for the cancel event */ - _onConfirmCancel: function (event) { - this.modal.modal('hide'); - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/custom-fields.js b/ckan/public-bs2/base/javascript/modules/custom-fields.js deleted file mode 100644 index bc4f7c139f1..00000000000 --- a/ckan/public-bs2/base/javascript/modules/custom-fields.js +++ /dev/null @@ -1,102 +0,0 @@ -/* Module for working with multiple custom field inputs. This will create - * a new field when the user enters text into the last field key. It also - * gives a visual indicator when fields are removed by disabling them. - * - * See the snippets/custom_form_fields.html for an example. - */ -this.ckan.module('custom-fields', function (jQuery) { - return { - options: { - /* The selector used for each custom field wrapper */ - fieldSelector: '.control-custom' - }, - - /* Initializes the module and attaches custom event listeners. This - * is called internally by ckan.module.initialize(). - * - * Returns nothing. - */ - initialize: function () { - jQuery.proxyAll(this, /_on/); - - var delegated = this.options.fieldSelector + ':last input:first'; - this.el.on('change', delegated, this._onChange); - this.el.on('change', ':checkbox', this._onRemove); - - // Style the remove checkbox like a button. - this.$('.checkbox').addClass("btn btn-danger fa fa-times"); - }, - - /* Creates a new field and appends it to the list. This currently works by - * cloning and erasing an existing input rather than using a template. In - * future using a template might be more appropriate. - * - * element - Another custom field element to wrap. - * - * Returns nothing. - */ - newField: function (element) { - this.el.append(this.cloneField(element)); - }, - - /* Clones the provided element, wipes it's content and increments it's - * for, id and name fields (if possible). - * - * current - A custom field to clone. - * - * Returns a newly created custom field element. - */ - cloneField: function (current) { - return this.resetField(jQuery(current).clone()); - }, - - /* Wipes the contents of the field provided and increments it's name, id - * and for attributes. - * - * field - A custom field to wipe. - * - * Returns the wiped element. - */ - resetField: function (field) { - function increment(index, string) { - return (string || '').replace(/\d+/, function (int) { return 1 + parseInt(int, 10); }); - } - - var input = field.find(':input'); - input.val('').attr('id', increment).attr('name', increment); - - var label = field.find('label'); - label.text(increment).attr('for', increment); - - return field; - }, - - /* Disables the provided field and input elements. Can be re-enabled by - * passing false as the second argument. - * - * field - The field to disable. - * disable - If false re-enables the element. - * - * Returns nothing. - */ - disableField: function (field, disable) { - field.toggleClass('disabled', disable !== false); - }, - - /* Event handler that fires when the last key in the custom field block - * changes. - */ - _onChange: function (event) { - if (event.target.value !== '') { - var parent = jQuery(event.target).parents(this.options.fieldSelector); - this.newField(parent); - } - }, - - /* Event handler called when the remove checkbox is checked */ - _onRemove: function (event) { - var parent = jQuery(event.target).parents(this.options.fieldSelector); - this.disableField(parent, event.target.checked); - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/dashboard.js b/ckan/public-bs2/base/javascript/modules/dashboard.js deleted file mode 100644 index 6187de9da18..00000000000 --- a/ckan/public-bs2/base/javascript/modules/dashboard.js +++ /dev/null @@ -1,86 +0,0 @@ -/* User Dashboard - * Handles the filter dropdown menu and the reduction of the notifications number - * within the header to zero - * - * Examples - * - *
    - * - */ -this.ckan.module('dashboard', function ($) { - return { - button: null, - popover: null, - searchTimeout: null, - - /* Initialises the module setting up elements and event listeners. - * - * Returns nothing. - */ - initialize: function () { - $.proxyAll(this, /_on/); - this.button = $('#followee-filter .btn'). - on('click', this._onShowFolloweeDropdown); - var title = this.button.prop('title'); - this.button.popover({ - placement: 'bottom', - title: 'Filter', - html: true, - content: $('#followee-popover').html() - }); - this.button.prop('title', title); - this.popover = this.button.data('popover').tip().addClass('popover-followee'); - }, - - /* Handles click event on the 'show me:' dropdown button - * - * Returns nothing. - */ - _onShowFolloweeDropdown: function() { - this.button.toggleClass('active'); - if (this.button.hasClass('active')) { - setTimeout(this._onInitSearch, 100); - } - return false; - }, - - /* Handles focusing on the input and making sure that the keyup - * even is applied to the input - * - * Returns nothing. - */ - _onInitSearch: function() { - var input = $('input', this.popover); - if (!input.hasClass('inited')) { - input. - on('keyup', this._onSearchKeyUp). - addClass('inited'); - } - input.focus(); - }, - - /* Handles the keyup event - * - * Returns nothing. - */ - _onSearchKeyUp: function() { - clearTimeout(this.searchTimeout); - this.searchTimeout = setTimeout(this._onSearchKeyUpTimeout, 300); - }, - - /* Handles the actual filtering of search results - * - * Returns nothing. - */ - _onSearchKeyUpTimeout: function() { - var input = $('input', this.popover); - var q = input.val().toLowerCase(); - if (q) { - $('li', this.popover).hide(); - $('li.everything, [data-search^="' + q + '"]', this.popover).show(); - } else { - $('li', this.popover).show(); - } - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/data-viewer.js b/ckan/public-bs2/base/javascript/modules/data-viewer.js deleted file mode 100644 index 5b9cbafce98..00000000000 --- a/ckan/public-bs2/base/javascript/modules/data-viewer.js +++ /dev/null @@ -1,54 +0,0 @@ -// data viewer module -// resizes the iframe when the content is loaded -this.ckan.module('data-viewer', function (jQuery) { - return { - options: { - timeout: 200, - minHeight: 400, - padding: 30 - }, - - initialize: function () { - jQuery.proxyAll(this, /_on/); - this.el.on('load', this._onLoad); - this._FirefoxFix(); - this.sandbox.subscribe('data-viewer-error', this._onDataViewerError); - }, - - _onDataViewerError: function(message) { - var parent = this.el.parent(); - $('.data-viewer-error .collapse', parent).html(message); - $('.data-viewer-error', parent).removeClass('js-hide'); - this.el.hide(); - }, - - _onLoad: function() { - var self = this; - var loc = $('body').data('site-root'); - // see if page is in part of the same domain - if (this.el.attr('src').substring(0, loc.length) === loc) { - this._recalibrate(); - setInterval(function() { - self._recalibrate(); - }, this.options.timeout); - } else { - this.el.css('height', 600); - } - }, - - _recalibrate: function() { - var height = this.el.contents().find('body').outerHeight(true); - height = Math.max(height, this.options.minHeight); - this.el.css('height', height + this.options.padding); - }, - - // firefox caches iframes so force it to get fresh content - _FirefoxFix: function() { - if(/#$/.test(this.el.src)) { - this.el.src = this.el.src.substr(0, this.src.length - 1); - } else { - this.el.src = this.el.src + '#'; - } - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/dataset-visibility.js b/ckan/public-bs2/base/javascript/modules/dataset-visibility.js deleted file mode 100644 index 4d9148f25b1..00000000000 --- a/ckan/public-bs2/base/javascript/modules/dataset-visibility.js +++ /dev/null @@ -1,32 +0,0 @@ -/* Dataset visibility toggler - * When no organization is selected in the org dropdown then set visibility to - * public always and disable dropdown - */ -this.ckan.module('dataset-visibility', function ($) { - return { - currentValue: false, - options: { - organizations: $('#field-organizations'), - visibility: $('#field-private'), - currentValue: null - }, - initialize: function() { - $.proxyAll(this, /_on/); - this.options.currentValue = this.options.visibility.val(); - this.options.organizations.on('change', this._onOrganizationChange); - this._onOrganizationChange(); - }, - _onOrganizationChange: function() { - var value = this.options.organizations.val(); - if (value) { - this.options.visibility - .prop('disabled', false) - .val(this.options.currentValue); - } else { - this.options.visibility - .prop('disabled', true) - .val('False'); - } - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/follow.js b/ckan/public-bs2/base/javascript/modules/follow.js deleted file mode 100644 index 40438f30801..00000000000 --- a/ckan/public-bs2/base/javascript/modules/follow.js +++ /dev/null @@ -1,78 +0,0 @@ -/* Follow buttons - * Handles calling the API to follow the current user - * - * action - This being the action that the button should perform. Currently: "follow" or "unfollow" - * type - The being the type of object the user is trying to support. Currently: "user", "group" or "dataset" - * id - id of the objec the user is trying to follow - * loading - State management helper - * - * Examples - * - * Follow User - * - */ -this.ckan.module('follow', function($) { - return { - /* options object can be extended using data-module-* attributes */ - options : { - action: null, - type: null, - id: null, - loading: false - }, - - /* Initialises the module setting up elements and event listeners. - * - * Returns nothing. - */ - initialize: function () { - $.proxyAll(this, /_on/); - this.el.on('click', this._onClick); - }, - - /* Handles the clicking of the follow button - * - * event - An event object. - * - * Returns nothing. - */ - _onClick: function(event) { - var options = this.options; - if ( - options.action - && options.type - && options.id - && !options.loading - ) { - event.preventDefault(); - var client = this.sandbox.client; - var path = options.action + '_' + options.type; - options.loading = true; - this.el.addClass('disabled'); - client.call('POST', path, { id : options.id }, this._onClickLoaded); - } - }, - - /* Fired after the call to the API to either follow or unfollow - * - * json - The return json from the follow / unfollow API call - * - * Returns nothing. - */ - _onClickLoaded: function(json) { - var options = this.options; - var sandbox = this.sandbox; - var oldAction = options.action; - options.loading = false; - this.el.removeClass('disabled'); - if (options.action == 'follow') { - options.action = 'unfollow'; - this.el.html(' ' + this._('Unfollow')).removeClass('btn-success').addClass('btn-danger'); - } else { - options.action = 'follow'; - this.el.html(' ' + this._('Follow')).removeClass('btn-danger').addClass('btn-success'); - } - sandbox.publish('follow-' + oldAction + '-' + options.id); - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/followers-counter.js b/ckan/public-bs2/base/javascript/modules/followers-counter.js deleted file mode 100644 index daf531ab319..00000000000 --- a/ckan/public-bs2/base/javascript/modules/followers-counter.js +++ /dev/null @@ -1,91 +0,0 @@ -/* Updates the Followers counter in the UI when the Follow/Unfollow button -* is clicked. -* -* id - id of the object the user is trying to follow/unfollow. -* num_followers - Number of followers the object has. -* -* Example -* -*
    -* 6 -*
    -* -*/ -this.ckan.module('followers-counter', function($) { - 'use strict'; - - return { - options: { - id: null, - num_followers: 0 - }, - - /* Subscribe to events when the Follow/Unfollow button is clicked. - * - * Returns nothing. - */ - initialize: function() { - $.proxyAll(this, /_on/); - - this.counterEl = this.$('span'); - this.objId = this.options.id; - - this.sandbox.subscribe('follow-follow-' + this.objId, this._onFollow); - this.sandbox.subscribe('follow-unfollow-' + this.objId, this._onUnfollow); - }, - - /* Calls a function to update the counter when the Follow button is clicked. - * - * Returns nothing. - */ - _onFollow: function() { - this._updateCounter({action: 'follow'}); - }, - - /* Calls a function to update the counter when the Unfollow button is clicked. - * - * Returns nothing. - */ - _onUnfollow: function() { - this._updateCounter({action: 'unfollow'}); - }, - - /* Handles updating the UI for Followers counter. - * - * Returns nothing. - */ - _updateCounter: function(options) { - var locale = $('html').attr('lang'); - var action = options.action; - var incrementedFollowers; - - if (action === 'follow') { - incrementedFollowers = (++this.options.num_followers).toLocaleString(locale); - } else if (action === 'unfollow') { - incrementedFollowers = (--this.options.num_followers).toLocaleString(locale); - } - - // Only update the value if it's less than 1000, because for larger - // numbers the change won't be noticeable since the value is converted - // to SI number abbreviated with "k", "m" and so on. - if (this.options.num_followers < 1000) { - this.counterEl.text(incrementedFollowers); - this.counterEl.removeAttr('title'); - } else { - this.counterEl.attr('title', incrementedFollowers); - } - }, - - /* Remove any subscriptions to prevent memory leaks. This function is - * called when a module element is removed from the page. - * - * Returns nothing. - */ - teardown: function() { - this.sandbox.unsubscribe('follow-follow-' + this.objId, this._onFollow); - this.sandbox.unsubscribe('follow-unfollow-' + this.objId, this._onUnfollow); - } - } -}); diff --git a/ckan/public-bs2/base/javascript/modules/image-upload.js b/ckan/public-bs2/base/javascript/modules/image-upload.js deleted file mode 100644 index 333dc378e30..00000000000 --- a/ckan/public-bs2/base/javascript/modules/image-upload.js +++ /dev/null @@ -1,280 +0,0 @@ - /* Image Upload - * - */ -this.ckan.module('image-upload', function($) { - return { - /* options object can be extended using data-module-* attributes */ - options: { - is_url: false, - is_upload: false, - field_upload: 'image_upload', - field_url: 'image_url', - field_clear: 'clear_upload', - field_name: 'name', - upload_label: '' - }, - - /* Should be changed to true if user modifies resource's name - * - * @type {Boolean} - */ - _nameIsDirty: false, - - /* Initialises the module setting up elements and event listeners. - * - * Returns nothing. - */ - initialize: function () { - $.proxyAll(this, /_on/); - var options = this.options; - - // firstly setup the fields - var field_upload = 'input[name="' + options.field_upload + '"]'; - var field_url = 'input[name="' + options.field_url + '"]'; - var field_clear = 'input[name="' + options.field_clear + '"]'; - var field_name = 'input[name="' + options.field_name + '"]'; - - this.input = $(field_upload, this.el); - this.field_url = $(field_url, this.el).parents('.control-group'); - this.field_image = this.input.parents('.control-group'); - this.field_url_input = $('input', this.field_url); - this.field_name = this.el.parents('form').find(field_name); - // this is the location for the upload/link data/image label - this.label_location = $('label[for="field-image-url"]'); - // determines if the resource is a data resource - this.is_data_resource = (this.options.field_url === 'url') && (this.options.field_upload === 'upload'); - - // Is there a clear checkbox on the form already? - var checkbox = $(field_clear, this.el); - if (checkbox.length > 0) { - checkbox.parents('.control-group').remove(); - } - - // Adds the hidden clear input to the form - this.field_clear = $('') - .appendTo(this.el); - - // Button to set the field to be a URL - this.button_url = $('' + - '' + - this._('Link') + '') - .prop('title', this._('Link to a URL on the internet (you can also link to an API)')) - .on('click', this._onFromWeb) - .insertAfter(this.input); - - // Button to attach local file to the form - this.button_upload = $('' + - '' + - this._('Upload') + '') - .insertAfter(this.input); - - // Button for resetting the form when there is a URL set - var removeText = this._('Remove'); - $('' - + removeText + '') - .prop('title', removeText) - .on('click', this._onRemove) - .insertBefore(this.field_url_input); - - // Update the main label (this is displayed when no data/image has been uploaded/linked) - $('label[for="field-image-upload"]').text(options.upload_label || this._('Image')); - - // Setup the file input - this.input - .on('mouseover', this._onInputMouseOver) - .on('mouseout', this._onInputMouseOut) - .on('change', this._onInputChange) - .prop('title', this._('Upload a file on your computer')) - .css('width', this.button_upload.outerWidth()); - - // Fields storage. Used in this.changeState - this.fields = $('') - .add(this.button_upload) - .add(this.button_url) - .add(this.input) - .add(this.field_url) - .add(this.field_image); - - // Disables autoName if user modifies name field - this.field_name - .on('change', this._onModifyName); - // Disables autoName if resource name already has value, - // i.e. we on edit page - if (this.field_name.val()){ - this._nameIsDirty = true; - } - - if (options.is_url) { - this._showOnlyFieldUrl(); - - this._updateUrlLabel(this._('URL')); - } else if (options.is_upload) { - this._showOnlyFieldUrl(); - - this.field_url_input.prop('readonly', true); - // If the data is an uploaded file, the filename will display rather than whole url of the site - var filename = this._fileNameFromUpload(this.field_url_input.val()); - this.field_url_input.val(filename); - - this._updateUrlLabel(this._('File')); - } else { - this._showOnlyButtons(); - } - }, - - /* Quick way of getting just the filename from the uri of the resource data - * - * url - The url of the uploaded data file - * - * Returns String. - */ - _fileNameFromUpload: function(url) { - // If it's a local CKAN image return the entire URL. - if (/^\/base\/images/.test(url)) { - return url; - } - - // remove fragment (#) - url = url.substring(0, (url.indexOf("#") === -1) ? url.length : url.indexOf("#")); - // remove query string - url = url.substring(0, (url.indexOf("?") === -1) ? url.length : url.indexOf("?")); - // extract the filename - url = url.substring(url.lastIndexOf("/") + 1, url.length); - - return url; // filename - }, - - /* Update the `this.label_location` text - * - * If the upload/link is for a data resource, rather than an image, - * the text for label[for="field-image-url"] will be updated. - * - * label_text - The text for the label of an uploaded/linked resource - * - * Returns nothing. - */ - _updateUrlLabel: function(label_text) { - if (! this.is_data_resource) { - return; - } - - this.label_location.text(label_text); - }, - - /* Event listener for when someone sets the field to URL mode - * - * Returns nothing. - */ - _onFromWeb: function() { - this._showOnlyFieldUrl(); - - this.field_url_input.focus() - .on('blur', this._onFromWebBlur); - - if (this.options.is_upload) { - this.field_clear.val('true'); - } - - this._updateUrlLabel(this._('URL')); - }, - - /* Event listener for resetting the field back to the blank state - * - * Returns nothing. - */ - _onRemove: function() { - this._showOnlyButtons(); - - this.field_url_input.val(''); - this.field_url_input.prop('readonly', false); - - this.field_clear.val('true'); - }, - - /* Event listener for when someone chooses a file to upload - * - * Returns nothing. - */ - _onInputChange: function() { - var file_name = this.input.val().split(/^C:\\fakepath\\/).pop(); - this.field_url_input.val(file_name); - this.field_url_input.prop('readonly', true); - - this.field_clear.val(''); - - this._showOnlyFieldUrl(); - - this._autoName(file_name); - - this._updateUrlLabel(this._('File')); - }, - - /* Show only the buttons, hiding all others - * - * Returns nothing. - */ - _showOnlyButtons: function() { - this.fields.hide(); - this.button_upload - .add(this.field_image) - .add(this.button_url) - .add(this.input) - .show(); - }, - - /* Show only the URL field, hiding all others - * - * Returns nothing. - */ - _showOnlyFieldUrl: function() { - this.fields.hide(); - this.field_url.show(); - }, - - /* Event listener for when a user mouseovers the hidden file input - * - * Returns nothing. - */ - _onInputMouseOver: function() { - this.button_upload.addClass('hover'); - }, - - /* Event listener for when a user mouseouts the hidden file input - * - * Returns nothing. - */ - _onInputMouseOut: function() { - this.button_upload.removeClass('hover'); - }, - - /* Event listener for changes in resource's name by direct input from user - * - * Returns nothing - */ - _onModifyName: function() { - this._nameIsDirty = true; - }, - - /* Event listener for when someone loses focus of URL field - * - * Returns nothing - */ - _onFromWebBlur: function() { - var url = this.field_url_input.val().match(/([^\/]+)\/?$/) - if (url) { - this._autoName(url.pop()); - } - }, - - /* Automatically add file name into field Name - * - * Select by attribute [name] to be on the safe side and allow to change field id - * Returns nothing - */ - _autoName: function(name) { - if (!this._nameIsDirty){ - this.field_name.val(name); - } - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/media-grid.js b/ckan/public-bs2/base/javascript/modules/media-grid.js deleted file mode 100644 index a6e269f511a..00000000000 --- a/ckan/public-bs2/base/javascript/modules/media-grid.js +++ /dev/null @@ -1,16 +0,0 @@ -/* Media Grid - * Super simple plugin that waits for all the images to be loaded in the media - * grid and then applies the jQuery.masonry to then - */ -this.ckan.module('media-grid', function ($) { - return { - initialize: function () { - var wrapper = this.el; - wrapper.imagesLoaded(function() { - wrapper.masonry({ - itemSelector: '.media-item' - }); - }); - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/popover-context.js b/ckan/public-bs2/base/javascript/modules/popover-context.js deleted file mode 100644 index 236969f0d18..00000000000 --- a/ckan/public-bs2/base/javascript/modules/popover-context.js +++ /dev/null @@ -1,257 +0,0 @@ -/* Popover context - * These appear when someone hovers over a context item in a activity stream to - * give the user more context into that particular item. It also allows for - * people to follow and unfollow quickly from within the popover - * - * id - The user_id of user - * context - The type of this popover: currently supports user & package - - * url - The URL of the profile for that user - * loading - Loading state helper - * authed - Is the current user authed ... if so what's their user_id - * template - Simple string-replace template for content of popover - * - * Examples - * - * A user - * - */ - -// Global dictionary and render store for items -window.popover_context = { - dict: { - user: {}, - dataset: {}, - group: {} - }, - render: { - user: {}, - dataset: {}, - group: {} - } -}; - -this.ckan.module('popover-context', function($) { - return { - - /* options object can be extended using data-module-* attributes */ - options : { - id: null, - loading: false, - error: false, - authed: false, - throbber: '' - }, - - /* Initialises the module setting up elements and event listeners. - * - * Returns nothing. - */ - initialize: function() { - if ( - this.options.id != true - && this.options.id != null - ) { - $.proxyAll(this, /_on/); - if ($('.account').hasClass('authed')) { - this.options.authed = $('.account').data('me'); - } - this.el.popover({ - animation: false, - html: true, - content: this.options.throbber.replace('{SITE_ROOT}', ckan.SITE_ROOT) + this._('Loading...'), - placement: 'bottom' - }); - this.el.on('mouseover', this._onMouseOver); - $(document).on('mouseup', this._onDocumentMouseUp); - this.sandbox.subscribe('follow-follow-' + this.options.id, this._onHandleFollow); - this.sandbox.subscribe('follow-unfollow-' + this.options.id, this._onHandleFollow); - } - }, - - /* Get's called on document click in order to hide popover on not hit - * - * Returns nothing. - */ - _onDocumentMouseUp: function(event) { - var popover = this.el.data('popover'); - if (typeof popover.$tip != 'undefined') { - if (popover.$tip.has(event.target).length === 0) { - this.el.popover('hide'); - } - } - }, - - /* Helper that changes the loading state of the active popover - * - * Returns nothing. - */ - loadingHelper: function(loading) { - this.options.loading = loading; - var popover = this.el.data('popover'); - if (typeof popover.$tip != 'undefined') { - if (loading) { - popover.$tip.addClass('popover-context-loading'); - } else { - popover.$tip.removeClass('popover-context-loading'); - } - } - }, - - /* Handles the showing of the popover on hover (also hides other active - * popovers) - * - * Returns nothing. - */ - _onMouseOver: function() { - $('[data-module="popover-context"]').popover('hide'); - this.el.popover('show'); - this.getData(); - }, - - /* Get's the data from the ckan api - * - * Returns nothing. - */ - getData: function() { - if (!this.options.loading) { - this.loadingHelper(true); - var id = this.options.id; - var type = this.options.type; - if (typeof window.popover_context.dict[type][id] == 'undefined') { - var client = this.sandbox.client; - var endpoint = type + '_show'; - if (type == 'dataset') { - endpoint = 'package_show'; - } - client.call('GET', endpoint, '?id=' + id, this._onHandleData, this._onHandleError); - } else { - this._onHandleData(window.popover_context.dict[type][id]); - } - } - }, - - /* Handle's a error on the call api - * - * Returns nothing. - */ - _onHandleError: function(error) { - $('[data-module="popover-context"][data-module-type="'+this.options.type+'"][data-module-id="'+this.options.id+'"]').popover('destroy'); - }, - - /* Callback from getting the endpoint from the ckan api - * - * Returns nothing. - */ - _onHandleData: function(json) { - if (json.success) { - var id = this.options.id; - var type = this.options.type; - var client = this.sandbox.client; - // set the dictionary - window.popover_context.dict[type][id] = json; - - // has this been rendered before? - if (typeof window.popover_context.render[type][id] == 'undefined') { - var params = this.sanitiseParams(json.result); - client.getTemplate('popover_context_' + type + '.html', params, this._onRenderPopover); - } else { - this._onRenderPopover(window.popover_context.render[type][id]); - } - } - }, - - /* Used to break down a raw object into something a little more - * passable into a GET request - * - * Returns object. - */ - sanitiseParams: function(raw) { - var type = this.options.type; - var params = {}; - if (type == 'user') { - params.id = raw.id; - params.name = raw.name; - params.about = raw.about; - params.display_name = raw.display_name; - params.num_followers = raw.num_followers; - params.number_administered_packages = raw.number_administered_packages; - params.number_of_edits = raw.number_of_edits; - params.is_me = ( raw.id == this.options.authed ); - } else if (type == 'dataset') { - params.id = raw.id; - params.title = raw.title; - params.name = raw.name; - params.notes = raw.notes; - params.num_resources = raw.num_resources; - params.num_tags = raw.num_tags; - } else if (type == 'group') { - params.id = raw.id; - params.title = raw.title; - params.name = raw.name; - params.description = raw.description; - params.package_count = raw.package_count; - params.num_followers = raw.num_followers; - } - return params; - }, - - /* Renders the contents of the popover - * - * Returns nothing. - */ - _onRenderPopover: function(html) { - var id = this.options.id; - var type = this.options.type; - var dict = window.popover_context.dict[type][id].result; - var popover = this.el.data('popover'); - if (typeof popover.$tip != 'undefined') { - var tip = popover.$tip; - var title = ( type == 'user' ) ? dict.display_name : dict.title; - $('.popover-title', tip).html('×' + title); - $('.popover-content', tip).html(html); - $('.popover-close', tip).on('click', this._onClickPopoverClose); - var follow_check = this.getFollowButton(); - if (follow_check) { - ckan.module.initializeElement(follow_check[0]); - } - this.loadingHelper(false); - } - // set the global - window.popover_context.render[type][id] = html; - }, - - /* Handles closing the currently open popover - * - * Returns nothing. - */ - _onClickPopoverClose: function() { - this.el.popover('hide'); - }, - - /* Handles getting the follow button form within a popover - * - * Returns jQuery collection || false. - */ - getFollowButton: function() { - var popover = this.el.data('popover'); - if (typeof popover.$tip != 'undefined') { - var button = $('[data-module="follow"]', popover.$tip); - if (button.length > 0) { - return button; - } - } - return false; - }, - - /* Callback from when you follow/unfollow a specified item... this is - * used to ensure all popovers associated to that user get re-populated - * - * Returns nothing. - */ - _onHandleFollow: function() { - delete window.popover_context.render[this.options.type][this.options.id]; - } - - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/resource-form.js b/ckan/public-bs2/base/javascript/modules/resource-form.js deleted file mode 100644 index f8bd136fb58..00000000000 --- a/ckan/public-bs2/base/javascript/modules/resource-form.js +++ /dev/null @@ -1,55 +0,0 @@ -/* Module for the resource form. Handles validation and updating the form - * with external data such as from a file upload. - */ -this.ckan.module('resource-form', function (jQuery) { - return { - /* Called by the ckan core if a corresponding element is found on the page. - * Handles setting up event listeners, adding elements to the page etc. - * - * Returns nothing. - */ - initialize: function () { - jQuery.proxyAll(this, /_on/); - this.sandbox.subscribe('resource:uploaded', this._onResourceUploaded); - }, - - /* Remove any subscriptions to prevent memory leaks. This function is - * called when a module element is removed from the page. - * - * Returns nothing.. - */ - teardown: function () { - this.sandbox.unsubscribe('resource:uploaded', this._onResourceUploaded); - }, - - /* Callback function that loads a newly uploaded resource into the form. - * Handles updating the various types of form fields. - * - * resource - A resource data object. - * - * Examples - * - * this.sandbox.subscribe('resource:uploaded', this._onResourceUploaded); - * - * Returns nothing. - */ - _onResourceUploaded: function (resource) { - var key; - var field; - - for (key in resource) { - if (resource.hasOwnProperty(key)) { - field = this.$('[name="' + key + '"]'); - - if (field.is(':checkbox, :radio')) { - this.$('[value="' + resource[key] + '"]').prop('checked', true); - } else if (field.is('select')) { - field.prop('selected', resource[key]); - } else { - field.val(resource[key]); - } - } - } - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/resource-reorder.js b/ckan/public-bs2/base/javascript/modules/resource-reorder.js deleted file mode 100644 index 794f025a235..00000000000 --- a/ckan/public-bs2/base/javascript/modules/resource-reorder.js +++ /dev/null @@ -1,141 +0,0 @@ -/* Module for reordering resources - */ -this.ckan.module('resource-reorder', function($) { - return { - options: { - id: false, - labelText: 'Reorder resources' - }, - template: { - title: '

    ', - button: [ - '', - '', - '', - '' - ].join('\n'), - form_actions: [ - '
    ', - '', - '', - '
    ' - ].join('\n'), - handle: [ - '', - '', - '' - ].join('\n'), - saving: [ - '', - '', - '', - '' - ].join('\n') - }, - is_reordering: false, - cache: false, - - initialize: function() { - jQuery.proxyAll(this, /_on/); - - var labelText = this._(this.options.labelText); - - this.html_title = $(this.template.title) - .text(labelText) - .insertBefore(this.el) - .hide(); - var button = $(this.template.button) - .on('click', this._onHandleStartReorder) - .appendTo('.page_primary_action'); - $('span', button).text(labelText); - - this.html_form_actions = $(this.template.form_actions) - .hide() - .insertAfter(this.el); - $('.save', this.html_form_actions) - .text(this._('Save order')) - .on('click', this._onHandleSave); - $('.cancel', this.html_form_actions) - .text(this._('Cancel')) - .on('click', this._onHandleCancel); - - this.html_handles = $(this.template.handle) - .hide() - .appendTo($('.resource-item', this.el)); - - this.html_saving = $(this.template.saving) - .hide() - .insertBefore($('.save', this.html_form_actions)); - $('span', this.html_saving).text(this._('Saving...')); - - this.cache = this.el.html(); - - this.el - .sortable() - .sortable('disable'); - - }, - - _onHandleStartReorder: function() { - if (!this.is_reordering) { - this.html_form_actions - .add(this.html_handles) - .add(this.html_title) - .show(); - this.el - .addClass('reordering') - .sortable('enable'); - $('.page_primary_action').hide(); - this.is_reordering = true; - } - }, - - _onHandleCancel: function() { - if ( - this.is_reordering - && !$('.cancel', this.html_form_actions).hasClass('disabled') - ) { - this.reset(); - this.is_reordering = false; - this.el.html(this.cache) - .sortable() - .sortable('disable'); - this.html_handles = $('.handle', this.el); - } - }, - - _onHandleSave: function() { - if (!$('.save', this.html_form_actions).hasClass('disabled')) { - var module = this; - module.html_saving.show(); - $('.save, .cancel', module.html_form_actions).addClass('disabled'); - var order = []; - $('.resource-item', module.el).each(function() { - order.push($(this).data('id')); - }); - module.sandbox.client.call('POST', 'package_resource_reorder', { - id: module.options.id, - order: order - }, function() { - module.html_saving.hide(); - $('.save, .cancel', module.html_form_actions).removeClass('disabled'); - module.cache = module.el.html(); - module.reset(); - module.is_reordering = false; - }); - } - }, - - reset: function() { - this.html_form_actions - .add(this.html_handles) - .add(this.html_title) - .hide(); - this.el - .removeClass('reordering') - .sortable('disable'); - $('.page_primary_action').show(); - } - - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/resource-upload-field.js b/ckan/public-bs2/base/javascript/modules/resource-upload-field.js deleted file mode 100644 index 68622962d6a..00000000000 --- a/ckan/public-bs2/base/javascript/modules/resource-upload-field.js +++ /dev/null @@ -1,280 +0,0 @@ -/* This module creates a new resource_type field for an uploaded file and - * appends file input into the page. - * - * Events: - * - * Publishes the 'resource:uploaded' event when a file is successfully - * uploaded. An callbacks receive an object of resource data. - * - * See: http://docs.ckan.org/en/latest/filestore.html - * - * options - form: General form overrides for the upload. - * template: Optional template can be provided. - * - */ -this.ckan.module('resource-upload-field', function (jQuery) { - return { - /* Default options for the module */ - options: { - form: { - method: 'POST', - file: 'file', - params: [] - }, - template: [ - '', - '', - '', - '', - '', - '' - ].join('\n') - }, - - /* Initializes the module, creates new elements and registers event - * listeners etc. This method is called by ckan.initialize() if there - * is a corresponding element on the page. - * - * Returns nothing. - */ - initialize: function () { - jQuery.proxyAll(this, /_on/); - - this.upload = jQuery(this.options.template); - this.setupFileUpload(); - this.el.append(this.upload); - - jQuery(window).on('beforeunload', this._onWindowUpload); - }, - - /* Sets up the jQuery.fileUpload() plugin with the provided options. - * - * Returns nothing. - */ - setupFileUpload: function () { - var options = this.options; - - this.upload.find('label').text(this._('Upload a file')); - this.upload.find('input[type=file]').fileupload({ - type: options.form.method, - paramName: options.form.file, - forceIframeTransport: true, // Required for XDomain request. - replaceFileInput: true, - autoUpload: false, - add: this._onUploadAdd, - send: this._onUploadSend, - done: this._onUploadDone, - fail: this._onUploadFail, - always: this._onUploadComplete - }); - }, - - /* Displays a loading spinner next to the input while uploading. This - * can be cancelled by recalling the method passing false as the first - * argument. - * - * show - If false hides the spinner (default: true). - * - * Examples - * - * module.loading(); // Show spinner - * - * module.loading(false); // Hide spinner. - * - * Returns nothing. - */ - loading: function (show) { - this.upload.toggleClass('loading', show); - }, - - /* Requests Authentication for the upload from CKAN. Uses the - * _onAuthSuccess/_onAuthError callbacks. - * - * key - A unique key for the file that is to be uploaded. - * data - The file data object from the jQuery.fileUpload() plugin. - * - * Examples - * - * onFileAdd: function (event, data) { - * this.authenticate('my-file', data); - * } - * - * Returns an jqXHR promise. - */ - authenticate: function (key, data) { - data.key = key; - - var request = this.sandbox.client.getStorageAuth(key); - var onSuccess = jQuery.proxy(this._onAuthSuccess, this, data); - return request.then(onSuccess, this._onAuthError); - }, - - /* Requests file metadata for the uploaded file and calls the - * _onMetadataSuccess/_onMetadataError callbacks. - * - * key - A unique key for the file that is to be uploaded. - * data - The file data object from the jQuery.fileUpload() plugin. - * - * Examples - * - * onFileUploaded: function (event, data) { - * this.lookupMetadata('my-file', data); - * } - * - * Returns an jqXHR promise. - */ - lookupMetadata: function (key, data) { - var request = this.sandbox.client.getStorageMetadata(key); - var onSuccess = jQuery.proxy(this._onMetadataSuccess, this, data); - return request.then(onSuccess, this._onMetadataError); - }, - - /* Displays a global notification for the upload status. - * - * message - A message string to display. - * type - The type of message eg. error/info/warning - * - * Examples - * - * module.notify('Upload failed', 'error'); - * - * Returns nothing. - */ - notify: function (message, type) { - var title = this._('An Error Occurred'); - this.sandbox.notify(title, message, type); - }, - - /* Creates a unique key for the filename provided. This is a url - * safe string with a timestamp prepended. - * - * filename - The filename for the upload. - * - * Examples - * - * module.generateKey('my file'); - * // => '2012-06-05T12:00:00.000Z/my-file' - * - * Returns a unique string. - */ - generateKey: function (filename) { - var parts = filename.split('.'); - var extension = jQuery.url.slugify(parts.pop()); - - // Clean up the filename hopefully leaving the extension intact. - filename = jQuery.url.slugify(parts.join('.')) + '.' + extension; - return jQuery.date.toISOString() + '/' + filename; - }, - - /* Attaches the beforeunload event to window to prevent away navigation - * whilst a upload is happening - * - * is_uploading: Boolean of whether we're uploading right now - * - * Returns nothing - */ - uploading: function(is_uploading) { - var method = is_uploading ? 'on' : 'off'; - jQuery(window)[method]('beforeunload', this._onWindowBeforeUnload); - }, - - /* Callback called when the jQuery file upload plugin receives a file. - * - * event - The jQuery event object. - * data - An object of file data. - * - * Returns nothing. - */ - _onUploadAdd: function (event, data) { - this.uploading(true); - if (data.files && data.files.length) { - var key = this.generateKey(data.files[0].name); - - this.authenticate(key, data); - } - }, - - /* Callback called when the jQuery file upload plugin fails to upload - * a file. - */ - _onUploadFail: function () { - this.sandbox.notify(this._('Unable to upload file')); - }, - - /* Callback called when jQuery file upload plugin sends a file */ - _onUploadSend: function () { - this.loading(); - }, - - /* Callback called when jQuery file upload plugin successfully uploads a file */ - _onUploadDone: function (event, data) { - // Need to check for a result key. A Google upload can return a 404 if - // the bucket does not exist, this is still treated as a success by the - // form upload plugin. - var result = data.result; - if (result && !(jQuery.isPlainObject(result) && result.error)) { - this.lookupMetadata(data.key, data); - } else { - this._onUploadFail(event, data); - } - }, - - /* Callback called when jQuery file upload plugin completes a request - * regardless of it's success/failure. - */ - _onUploadComplete: function () { - this.loading(false); - this.uploading(false); - }, - - /* Callback function for a successful Auth request. This cannot be - * used straight up but requires the data object to be passed in - * as the first argument. - * - * data - The data object for the current upload. - * response - The auth response object. - * - * Examples - * - * var onSuccess = jQuery.proxy(this._onAuthSuccess, this, data); - * sandbox.client.getStorageAuth(key).done(onSuccess); - * - * Returns nothing. - */ - _onAuthSuccess: function (data, response) { - data.url = response.action; - data.formData = this.options.form.params.concat(response.fields); - data.submit(); - }, - - /* Called when the request for auth credentials fails. */ - _onAuthError: function (event, data) { - this.sandbox.notify(this._('Unable to authenticate upload')); - this._onUploadComplete(); - }, - - /* Called when the request for file metadata succeeds */ - _onMetadataSuccess: function (data, response) { - var resource = this.sandbox.client.convertStorageMetadataToResource(response); - - this.sandbox.notify(this._('Resource uploaded'), '', 'success'); - this.sandbox.publish('resource:uploaded', resource); - }, - - /* Called when the request for file metadata fails */ - _onMetadataError: function () { - this.sandbox.notify(this._('Unable to get data for uploaded file')); - this._onUploadComplete(); - }, - - /* Called before the window unloads whilst uploading */ - _onWindowBeforeUnload: function(event) { - var message = this._('You are uploading a file. Are you sure you ' + - 'want to navigate away and stop this upload?'); - if (event.originalEvent.returnValue) { - event.originalEvent.returnValue = message; - } - return message; - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/resource-view-embed.js b/ckan/public-bs2/base/javascript/modules/resource-view-embed.js deleted file mode 100644 index 62eb5991e06..00000000000 --- a/ckan/public-bs2/base/javascript/modules/resource-view-embed.js +++ /dev/null @@ -1,50 +0,0 @@ -this.ckan.module('resource-view-embed', function ($) { - var modal; - var self; - - function initialize() { - self = this; - modal = $('#embed-'+this.options.id) - this.el.on('click', _onClick); - $('textarea', modal).on('focus', _selectAllCode).on('mouseup', _preventClick); - $('input', modal).on('keyup change', _updateValues); - _updateEmbedCode(); - } - - function _onClick (event) { - event.preventDefault(); - modal.modal('show'); - } - - function _selectAllCode () { - $('textarea', modal).select(); - } - - function _updateValues () { - self.options.width = $('[name="width"]', modal).val(); - self.options.height = $('[name="height"]', modal).val(); - _updateEmbedCode(); - } - - function _updateEmbedCode () { - $('[name="code"]', modal).val(_embedCode()); - } - - function _preventClick (event) { - event.preventDefault(); - } - - function _embedCode () { - return ''; - } - - return { - initialize: initialize, - options: { - id: 0, - url: '#', - width: 700, - height: 400 - } - } -}); diff --git a/ckan/public-bs2/base/javascript/modules/resource-view-filters-form.js b/ckan/public-bs2/base/javascript/modules/resource-view-filters-form.js deleted file mode 100644 index 8dd976ce5b1..00000000000 --- a/ckan/public-bs2/base/javascript/modules/resource-view-filters-form.js +++ /dev/null @@ -1,104 +0,0 @@ -ckan.module('resource-view-filters-form', function (jQuery) { - 'use strict'; - - function applyDropdown(selectField, resourceId) { - var inputField = selectField.parent().find('input'), - filterName = selectField.val(), - queryLimit = 20; - - inputField.select2({ - width: 'resolve', - minimumInputLength: 0, - ajax: { - url: ckan.url('/api/3/action/datastore_search'), - datatype: 'json', - quietMillis: 200, - cache: true, - data: function (term, page) { - var offset = (page - 1) * queryLimit, - query; - - query = { - resource_id: resourceId, - limit: queryLimit, - offset: offset, - fields: filterName, - distinct: true, - sort: filterName, - include_total: false - }; - - if (term !== '') { - var q = {}; - if (term.indexOf(' ') == -1) { - term = term + ':*'; - query.plain = false; - } - q[filterName] = term; - query.q = JSON.stringify(q); - } - - return query; - }, - results: function (data, page) { - var records = data.result.records, - hasMore = (records.length == queryLimit), - results; - - results = $.map(records, function (record) { - return { id: record[filterName], text: String(record[filterName]) }; - }); - - return { results: results, more: hasMore }; - }, - }, - initSelection: function (element, callback) { - var data = {id: element.val(), text: element.val()}; - callback(data); - }, - }); - } - - function initialize() { - var self = this, - resourceId = self.options.resourceId, - templateFilterInputs = self.options.templateFilterInputs, - inputFieldTemplateEl = $(templateFilterInputs).find('input[type="text"][name]'), - filtersDiv = self.el.find(self.options.filtersSelector), - addFilterEl = self.el.find(self.options.addFilterSelector), - removeFilterSelector = self.options.removeFilterSelector; - - var selects = filtersDiv.find('select'); - selects.each(function (i, select) { - applyDropdown($(select), resourceId); - }); - - addFilterEl.click(function (evt) { - var selectField; - evt.preventDefault(); - filtersDiv.append(templateFilterInputs); - selectField = filtersDiv.children().last().find('select'); - applyDropdown(selectField, resourceId); - }); - - filtersDiv.on('click', removeFilterSelector, function (evt) { - evt.preventDefault(); - $(this).parent().remove(); - }); - - filtersDiv.on('change', 'select', function (evt) { - var el = $(this), - parentEl = el.parent(), - inputField = parentEl.find('input'), - select2Container = parentEl.find('.select2-container'); - evt.preventDefault(); - select2Container.remove(); - inputField.replaceWith(inputFieldTemplateEl.clone()); - applyDropdown(el, resourceId); - }); - } - - return { - initialize: initialize - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/resource-view-filters.js b/ckan/public-bs2/base/javascript/modules/resource-view-filters.js deleted file mode 100644 index 99831075604..00000000000 --- a/ckan/public-bs2/base/javascript/modules/resource-view-filters.js +++ /dev/null @@ -1,187 +0,0 @@ -this.ckan.module('resource-view-filters', function (jQuery) { - 'use strict'; - - function initialize() { - var self = this, - resourceId = self.options.resourceId, - fields = self.options.fields, - dropdownTemplate = self.options.dropdownTemplate, - addFilterTemplate = '' + self._('Add Filter') + '', - filtersDiv = $('
    '); - - var filters = ckan.views.filters.get(); - _appendDropdowns(filtersDiv, resourceId, dropdownTemplate, fields, filters); - var addFilterButton = _buildAddFilterButton(self, filtersDiv, addFilterTemplate, - fields, filters, function (evt) { - // Build filters object with this element's val as key and a placeholder - // value so _appendDropdowns() will create its dropdown - var filters = {}; - filters[evt.val] = []; - - $(this).select2('destroy'); - _appendDropdowns(filtersDiv, resourceId, dropdownTemplate, fields, filters); - evt.preventDefault(); - }); - self.el.append(filtersDiv); - self.el.append(addFilterButton); - } - - function _buildAddFilterButton(self, el, template, fields, filters, onChangeCallback) { - var addFilterButton = $(template), - currentFilters = Object.keys(filters), - fieldsNotFiltered = $.grep(fields, function (field) { - return !filters.hasOwnProperty(field); - }), - data = $.map(fieldsNotFiltered, function (d) { - return { id: d, text: d }; - }); - - if (data.length === 0) { - return ''; - } - - addFilterButton.click(function (evt) { - // FIXME: Move this class name to some external variable to keep it DRY - var addFilterDiv = $('
    '), - addFilterInput = addFilterDiv.find('input'); - el.append(addFilterDiv); - - // TODO: Remove element from "data" when some select selects it. - addFilterInput.select2({ - data: data, - placeholder: self._('Select a field'), - width: 'resolve', - }).on('change', onChangeCallback); - - evt.preventDefault(); - }); - - return addFilterButton; - } - - function _appendDropdowns(dropdowns, resourceId, template, fields, filters) { - $.each(fields, function (i, field) { - if (filters.hasOwnProperty(field)) { - dropdowns.append(_buildDropdown(self.el, template, field)); - } - }); - - return dropdowns; - - function _buildDropdown(el, template, filterName) { - var theseFilters = filters[filterName] || []; - template = $(template.replace(/{filter}/g, filterName)); - // FIXME: Get the CSS class from some external variable - var dropdowns = template.find('.resource-view-filter-values'); - - // Can't use push because we need to create a new array, as we're - // modifying it. - theseFilters = theseFilters.concat([undefined]); - theseFilters.forEach(function (value, i) { - var dropdown = $(''); - - if (value !== undefined) { - dropdown.val(value); - } - - dropdowns.append(dropdown); - }); - - var queryLimit = 20; - dropdowns.find('input').select2({ - allowClear: true, - placeholder: ' ', // select2 needs a placeholder to allow clearing - width: 'resolve', - minimumInputLength: 0, - ajax: { - url: ckan.url('/api/3/action/datastore_search'), - datatype: 'json', - quietMillis: 200, - cache: true, - data: function (term, page) { - var offset = (page - 1) * queryLimit, - query; - - query = { - resource_id: resourceId, - limit: queryLimit, - offset: offset, - fields: filterName, - distinct: true, - sort: filterName, - include_total: false - }; - - - if (term !== '') { - var q = {}; - if (term.indexOf(' ') == -1) { - term = term + ':*'; - query.plain = false; - } - q[filterName] = term; - query.q = JSON.stringify(q); - } - - return query; - }, - results: function (data, page) { - var records = data.result.records, - hasMore = (records.length == queryLimit), - results; - - results = $.map(records, function (record) { - return { id: record[filterName], text: String(record[filterName]) }; - }); - - return { results: results, more: hasMore }; - } - }, - initSelection: function (element, callback) { - var data = {id: element.val(), text: element.val()}; - callback(data); - }, - }).on('change', _onChange); - - return template; - } - } - - function _onChange(evt) { - var filterName = evt.currentTarget.name, - filterValue = evt.val, - currentFilters = ckan.views.filters.get(filterName) || [], - addToIndex = currentFilters.length; - - // Make sure we're not editing the original array, but a copy. - currentFilters = currentFilters.slice(); - - if (evt.removed) { - addToIndex = currentFilters.indexOf(evt.removed.id); - if (addToIndex !== -1) { - currentFilters.splice(addToIndex, 1); - } - } - if (evt.added) { - currentFilters.splice(addToIndex, 0, filterValue); - } - - if (currentFilters.length > 0) { - ckan.views.filters.set(filterName, currentFilters); - } else { - ckan.views.filters.unset(filterName); - } - } - - return { - initialize: initialize, - options: { - dropdownTemplate: [ - '
    ', - ' {filter}:', - '
    ', - '
    ', - ].join('\n') - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/resource-view-reorder.js b/ckan/public-bs2/base/javascript/modules/resource-view-reorder.js deleted file mode 100644 index 34def7682b5..00000000000 --- a/ckan/public-bs2/base/javascript/modules/resource-view-reorder.js +++ /dev/null @@ -1,128 +0,0 @@ -/* Module for reordering resource views - */ -this.ckan.module('resource-view-reorder', function($) { - return { - options: { - id: false, - labelText: 'Reorder resource view' - }, - template: { - title: '

    ', - button: [ - '', - '', - '', - '' - ].join('\n'), - form_actions: [ - '
    ', - '', - '', - '
    ' - ].join('\n'), - saving: [ - '', - '', - '', - '' - ].join('\n') - }, - is_reordering: false, - cache: false, - - initialize: function() { - jQuery.proxyAll(this, /_on/); - - var labelText = this._(this.options.labelText); - this.html_title = $(this.template.title) - .text(labelText) - .insertBefore(this.el) - .hide(); - var button = $(this.template.button) - .on('click', this._onHandleStartReorder) - .appendTo('.page_primary_action'); - $('span', button).text(labelText); - - this.html_form_actions = $(this.template.form_actions) - .hide() - .insertAfter(this.el); - $('.save', this.html_form_actions) - .text(this._('Save order')) - .on('click', this._onHandleSave); - $('.cancel', this.html_form_actions) - .text(this._('Cancel')) - .on('click', this._onHandleCancel); - - this.html_saving = $(this.template.saving) - .hide() - .insertBefore($('.save', this.html_form_actions)); - $('span', this.html_saving).text(this._('Saving...')); - - this.cache = this.el.html(); - - this.el - .sortable() - .sortable('disable'); - - }, - - _onHandleStartReorder: function() { - if (!this.is_reordering) { - this.html_form_actions - .add(this.html_title) - .show(); - this.el - .addClass('reordering') - .sortable('enable'); - $('.page_primary_action').hide(); - this.is_reordering = true; - } - }, - - _onHandleCancel: function() { - if ( - this.is_reordering - && !$('.cancel', this.html_form_actions).hasClass('disabled') - ) { - this.reset(); - this.is_reordering = false; - this.el.html(this.cache) - .sortable() - .sortable('disable'); - } - }, - - _onHandleSave: function() { - if (!$('.save', this.html_form_actions).hasClass('disabled')) { - var module = this; - module.html_saving.show(); - $('.save, .cancel', module.html_form_actions).addClass('disabled'); - var order = []; - $('li', module.el).each(function() { - order.push($(this).data('id')); - }); - module.sandbox.client.call('POST', 'resource_view_reorder', { - id: module.options.id, - order: order - }, function() { - module.html_saving.hide(); - $('.save, .cancel', module.html_form_actions).removeClass('disabled'); - module.cache = module.el.html(); - module.reset(); - module.is_reordering = false; - }); - } - }, - - reset: function() { - this.html_form_actions - .add(this.html_title) - .hide(); - this.el - .removeClass('reordering') - .sortable('disable'); - $('.page_primary_action').show(); - } - - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/select-switch.js b/ckan/public-bs2/base/javascript/modules/select-switch.js deleted file mode 100644 index 145b33a471a..00000000000 --- a/ckan/public-bs2/base/javascript/modules/select-switch.js +++ /dev/null @@ -1,31 +0,0 @@ -/* Finds the nearest select box in a form and watches it for changes. When - * a change occurs it submits the form. It can also hide the submit button if - * required. - * - * target - A selector to watch for changes (default: select) - * button - A selector for the button to hide in the form. - * - * Examples - * - * - * - * - * - * - * - * Returns . - */ -this.ckan.module('select-switch', { - - options: { - target: 'select' - }, - - initialize: function () { - var _this = this; - - this.el.on('change', this.options.target, function () { - _this.el.submit(); - }); - } -}); diff --git a/ckan/public-bs2/base/javascript/modules/slug-preview.js b/ckan/public-bs2/base/javascript/modules/slug-preview.js deleted file mode 100644 index b93de2368c9..00000000000 --- a/ckan/public-bs2/base/javascript/modules/slug-preview.js +++ /dev/null @@ -1,79 +0,0 @@ -this.ckan.module('slug-preview-target', { - initialize: function () { - var sandbox = this.sandbox; - var options = this.options; - var el = this.el; - - sandbox.subscribe('slug-preview-created', function (preview) { - // Append the preview string after the target input. - el.after(preview); - }); - - // Make sure there isn't a value in the field already... - if (el.val() == '') { - // Once the preview box is modified stop watching it. - sandbox.subscribe('slug-preview-modified', function () { - el.off('.slug-preview'); - }); - - // Watch for updates to the target field and update the hidden slug field - // triggering the "change" event manually. - el.on('keyup.slug-preview input.slug-preview', function (event) { - sandbox.publish('slug-target-changed', this.value); - //slug.val(this.value).trigger('change'); - }); - } - } -}); - -this.ckan.module('slug-preview-slug', function (jQuery) { - return { - options: { - prefix: '', - placeholder: '' - }, - - initialize: function () { - var sandbox = this.sandbox; - var options = this.options; - var el = this.el; - var _ = sandbox.translate; - - var slug = el.slug(); - var parent = slug.parents('.control-group'); - var preview; - - if (!(parent.length)) { - return; - } - - // Leave the slug field visible - if (!parent.hasClass('error')) { - preview = parent.slugPreview({ - prefix: options.prefix, - placeholder: options.placeholder, - i18n: { - 'URL': this._('URL'), - 'Edit': this._('Edit') - } - }); - - // If the user manually enters text into the input we cancel the slug - // listeners so that we don't clobber the slug when the title next changes. - slug.keypress(function () { - if (event.charCode) { - sandbox.publish('slug-preview-modified', preview[0]); - } - }); - - sandbox.publish('slug-preview-created', preview[0]); - } - - // Watch for updates to the target field and update the hidden slug field - // triggering the "change" event manually. - sandbox.subscribe('slug-target-changed', function (value) { - slug.val(value).trigger('change'); - }); - } - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/table-selectable-rows.js b/ckan/public-bs2/base/javascript/modules/table-selectable-rows.js deleted file mode 100644 index 4a1965adcbc..00000000000 --- a/ckan/public-bs2/base/javascript/modules/table-selectable-rows.js +++ /dev/null @@ -1,95 +0,0 @@ -/* Table Selectable Rows - * Put's a select box in the of a and makes all rows - * selectable. - * - * Examples - * - *
    ...
    - * - */ -this.ckan.module('table-selectable-rows', function($) { - return { - - // Store for jQuery object for the select all checkbox - select_all: null, - // Total number of checkboxes in the table (used for checking later) - total_checkboxes: 0, - // Store for jQuery object of all table header buttons - buttons: null, - - /* Initialises the module setting up elements and event listeners. - * - * Returns nothing. - */ - initialize: function() { - $.proxyAll(this, /_on/); - this.total_checkboxes = $('input[type="checkbox"]', this.el).length; - this.select_all = $('') - .data('select-all', true) - .appendTo($('thead th:first-child', this.el)); - this.el.on('change', 'input[type="checkbox"]', this._onHandleCheckboxToggle); - this.buttons = $('th.actions .btn', this.el).addClass('disabled').prop('disabled', true); - }, - - /* Gets called whenever a user changes the :checked state on a checkbox - * within the table - * - * $e - jQuery event object - * - * Returns nothing. - */ - _onHandleCheckboxToggle: function($e) { - var checkbox = $($e.target); - if (checkbox.data('select-all')) { - this.handleSelectAll(checkbox, checkbox.is(':checked')); - } else { - this.handleSelectOne(checkbox, checkbox.is(':checked')); - } - }, - - /* Handles the checking of all row - * - * $target - jQuery checkbox object - * $checked - Boolean of whether $target is checked - * - * Returns nothing. - */ - handleSelectAll: function($target, $checked) { - $('input[type="checkbox"]', this.el).prop('checked', $checked); - if ($checked) { - $('tbody tr', this.el).addClass('table-selected'); - this.buttons.removeClass('disabled').prop('disabled', false); - } else { - $('tbody tr', this.el).removeClass('table-selected'); - this.buttons.addClass('disabled').prop('disabled', true); - } - }, - - /* Handles the checking of a single row - * - * $target - jQuery checkbox object - * $checked - Boolean of whether $target is checked - * - * Returns nothing. - */ - handleSelectOne: function($target, $checked) { - if ($checked) { - $target.parents('tr').addClass('table-selected'); - } else { - $target.parents('tr').removeClass('table-selected'); - } - var checked = $('tbody input[type="checkbox"]:checked', this.el).length; - if (checked >= this.total_checkboxes) { - this.select_all.prop('checked', true); - } else { - this.select_all.prop('checked', false); - } - if (checked > 0) { - this.buttons.removeClass('disabled').prop('disabled', false); - } else { - this.buttons.addClass('disabled').prop('disabled', true); - } - } - - }; -}); diff --git a/ckan/public-bs2/base/javascript/modules/table-toggle-more.js b/ckan/public-bs2/base/javascript/modules/table-toggle-more.js deleted file mode 100644 index 7a5c49c396a..00000000000 --- a/ckan/public-bs2/base/javascript/modules/table-toggle-more.js +++ /dev/null @@ -1,61 +0,0 @@ -/* Table toggle more - * When a table has more things to it that need to be hidden and then shown more - */ -this.ckan.module('table-toggle-more', function($) { - return { - /* options object can be extended using data-module-* attributes */ - options: {}, - - /* Initialises the module setting up elements and event listeners. - * - * Returns nothing. - */ - initialize: function () { - $.proxyAll(this, /_on/); - this.el.addClass('table-toggle-more'); - // Do we actually want this table to expand? - var rows = $('.toggle-more', this.el).length; - if (rows) { - // How much is the colspan? - var cols = $('thead tr th', this.el).length; - var template_more = [ - '', - '', - '', - '' + this._('Show more') + '', - '' + this._('Hide') + '', - '', - '', - '' - ].join('\n'); - var template_seperator = [ - '', - '', - '', - '' - ].join('\n'); - - var seperator = $(template_seperator).insertAfter($('.toggle-more:last-child', this.el)); - $(template_more).insertAfter(seperator); - - $('.show-more', this.el).on('click', this._onShowMore); - $('.show-less', this.el).on('click', this._onShowLess); - } - }, - - _onShowMore: function($e) { - $e.preventDefault(); - this.el - .removeClass('table-toggle-more') - .addClass('table-toggle-less'); - }, - - _onShowLess: function($e) { - $e.preventDefault(); - this.el - .removeClass('table-toggle-less') - .addClass('table-toggle-more'); - } - - } -}); diff --git a/ckan/public-bs2/base/javascript/notify.js b/ckan/public-bs2/base/javascript/notify.js deleted file mode 100644 index 1837a0a1262..00000000000 --- a/ckan/public-bs2/base/javascript/notify.js +++ /dev/null @@ -1,71 +0,0 @@ -(function (ckan, jQuery) { - - /* Displays a global notification banner on the screen. Takes a title - * and optional message and type arguments. - * - * title - The main message string. - * message - Additional information. - * type - A type to apply to the message (default: error) - * - * Examples - * - * ckan.notify('An error occurred', 'etc'); - * ckan.notify('Success', 'user updated', 'success'); - * - * var alert = ckan.notify('An error occurred'); - * alert.on('closed', function () { - * // Do something. - * }); - * - * Returns the error element. - */ - function notify(title, message, type) { - var alert = notify.initialize(notify.create(title, message, type)); - notify.el.append(alert); - } - - // Grab the flash message container. - notify.el = jQuery('.flash-messages', document.body); - - /* Creates a new message element. - * - * title - The main message string. - * message - Additional information. - * type - A type to apply to the message (default: error) - * - * Returns the element. - */ - notify.create = function (title, message, type) { - var alert = jQuery('
    '); - alert.addClass('alert-' + (type || 'error')); - alert.find('strong').text(title); - alert.find('span').text(message); - return alert; - }; - - /* Adds a close button and initializes the Bootstrap alert plugin. - * - * element - An element to initialize. - * - * Returns the element. - */ - notify.initialize = function (element) { - element = element instanceof jQuery ? element : jQuery(element); - return element.append(jQuery('×')).alert(); - }; - - // Initialize any alerts already on the page. - notify.el.find('.alert').each(function () { - notify.initialize(this); - }); - - // Watch for close clicks and remove the alert. - notify.el.on('click', '.close', function () { - jQuery(this).parent().alert('close'); - }); - - // Export the objects. - ckan.notify = notify; - ckan.sandbox.extend({notify: notify}); - -})(this.ckan, this.jQuery); diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.date-helpers.js b/ckan/public-bs2/base/javascript/plugins/jquery.date-helpers.js deleted file mode 100644 index 45d48a5282d..00000000000 --- a/ckan/public-bs2/base/javascript/plugins/jquery.date-helpers.js +++ /dev/null @@ -1,82 +0,0 @@ -this.jQuery.date = { - /* A map of date methods to text strings. */ - METHODS: { - "yyyy": "getUTCFullYear", - "MM": "getUTCMonth", - "dd": "getUTCDate", - "HH": "getUTCHours", - "mm": "getUTCMinutes", - "ss": "getUTCSeconds", - "fff": "getUTCMilliseconds" - }, - - /* Formatting of an ISO8601 compatible date */ - ISO8601: "yyyy-MM-ddTHH:mm:ss.fffZ", - - /* Formatting of a CKAN compatible ISO string. See helpers.py */ - CKAN8601: "yyyy-MM-ddTHH:mm:ss", - - /* Returns a date string for the format provided. - * - * format - A format string in the form "yyyy-MM-dd" - * date - A date object to output. - * - * Returns a formatted date string. - */ - format: function (format, date) { - var map = this.METHODS; - - date = date || new Date(); - - function pad(str, exp) { - str = "" + str; - exp = exp.replace(/[a-z]/ig, '0'); - return str.length !== exp.length ? exp.slice(str.length) + str : str; - } - - return format.replace(/([a-zA-Z])\1+/g, function (_, $1) { - if (map[_]) { - var value = date[map[_]](); - if (_ === 'MM') { - value += 1; - } - return pad(value, _); - } - return _; - }); - }, - - /* Generates a CKAN friendly ISO8601 timestamp. - * - * date - A date object to convert. - * - * Examples - * - * var timestamp = jQuery.date.toCKANString(new Date()); - * - * Returns a timestamp string. - */ - toCKANString: function (date) { - return this.format(this.CKAN8601, date); - }, - - /* Generates a ISO8601 timestamp. Uses the native methods if available. - * - * date - A date object to convert. - * - * Examples - * - * var timestamp = jQuery.date.toISOString(new Date()); - * - * Returns a timestamp string. - */ - toISOString: function (date) { - date = date || new Date(); - - if (date.toISOString) { - return date.toISOString(); - } else { - return this.format(this.ISO8601, date); - } - } -}; diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.form-warning.js b/ckan/public-bs2/base/javascript/plugins/jquery.form-warning.js deleted file mode 100644 index 11fc993a1cc..00000000000 --- a/ckan/public-bs2/base/javascript/plugins/jquery.form-warning.js +++ /dev/null @@ -1,41 +0,0 @@ -(function (jQuery) { - /* Accepts a form element and once changed binds an event handler to the - * window "beforeunload" event that warns a user that the form has unsaved - * changes. The notice is only displayed if the user does not submit the - * form. - * - * message - A message to display to the user (browser support dependant). - * - * Examples - * - * jQuery('form').incompleteFormWarning('Form has modified fields'); - * - * Returns the jQuery collection. - */ - jQuery.fn.incompleteFormWarning = function (message) { - return this.each(function () { - var form = jQuery(this); - var state = form.serialize(); - - function onWindowUnload(event) { - if (event.originalEvent.returnValue) { - event.originalEvent.returnValue = message; - } - return message; - } - - form.on({ - change: function () { - // See if the form has changed, if so add an event listener otherwise - // remove it. - var method = form.serialize() === state ? 'off' : 'on'; - jQuery(window)[method]('beforeunload', onWindowUnload); - }, - submit: function () { - // Allow the form to be submitted. - jQuery(window).off('beforeunload', onWindowUnload); - } - }); - }); - }; -})(this.jQuery); diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.images-loaded.js b/ckan/public-bs2/base/javascript/plugins/jquery.images-loaded.js deleted file mode 100644 index f6ac95c2e28..00000000000 --- a/ckan/public-bs2/base/javascript/plugins/jquery.images-loaded.js +++ /dev/null @@ -1,496 +0,0 @@ -/*! - * imagesLoaded PACKAGED v4.1.4 - * JavaScript is all like "You images are done yet or what?" - * MIT License - */ - -/** - * EvEmitter v1.1.0 - * Lil' event emitter - * MIT License - */ - -/* jshint unused: true, undef: true, strict: true */ - -( function( global, factory ) { - // universal module definition - /* jshint strict: false */ /* globals define, module, window */ - if ( typeof define == 'function' && define.amd ) { - // AMD - RequireJS - define( 'ev-emitter/ev-emitter',factory ); - } else if ( typeof module == 'object' && module.exports ) { - // CommonJS - Browserify, Webpack - module.exports = factory(); - } else { - // Browser globals - global.EvEmitter = factory(); - } - -}( typeof window != 'undefined' ? window : this, function() { - - - -function EvEmitter() {} - -var proto = EvEmitter.prototype; - -proto.on = function( eventName, listener ) { - if ( !eventName || !listener ) { - return; - } - // set events hash - var events = this._events = this._events || {}; - // set listeners array - var listeners = events[ eventName ] = events[ eventName ] || []; - // only add once - if ( listeners.indexOf( listener ) == -1 ) { - listeners.push( listener ); - } - - return this; -}; - -proto.once = function( eventName, listener ) { - if ( !eventName || !listener ) { - return; - } - // add event - this.on( eventName, listener ); - // set once flag - // set onceEvents hash - var onceEvents = this._onceEvents = this._onceEvents || {}; - // set onceListeners object - var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; - // set flag - onceListeners[ listener ] = true; - - return this; -}; - -proto.off = function( eventName, listener ) { - var listeners = this._events && this._events[ eventName ]; - if ( !listeners || !listeners.length ) { - return; - } - var index = listeners.indexOf( listener ); - if ( index != -1 ) { - listeners.splice( index, 1 ); - } - - return this; -}; - -proto.emitEvent = function( eventName, args ) { - var listeners = this._events && this._events[ eventName ]; - if ( !listeners || !listeners.length ) { - return; - } - // copy over to avoid interference if .off() in listener - listeners = listeners.slice(0); - args = args || []; - // once stuff - var onceListeners = this._onceEvents && this._onceEvents[ eventName ]; - - for ( var i=0; i < listeners.length; i++ ) { - var listener = listeners[i] - var isOnce = onceListeners && onceListeners[ listener ]; - if ( isOnce ) { - // remove listener - // remove before trigger to prevent recursion - this.off( eventName, listener ); - // unset once flag - delete onceListeners[ listener ]; - } - // trigger listener - listener.apply( this, args ); - } - - return this; -}; - -proto.allOff = function() { - delete this._events; - delete this._onceEvents; -}; - -return EvEmitter; - -})); - -/*! - * imagesLoaded v4.1.4 - * JavaScript is all like "You images are done yet or what?" - * MIT License - */ - -( function( window, factory ) { 'use strict'; - // universal module definition - - /*global define: false, module: false, require: false */ - - if ( typeof define == 'function' && define.amd ) { - // AMD - define( [ - 'ev-emitter/ev-emitter' - ], function( EvEmitter ) { - return factory( window, EvEmitter ); - }); - } else if ( typeof module == 'object' && module.exports ) { - // CommonJS - module.exports = factory( - window, - require('ev-emitter') - ); - } else { - // browser global - window.imagesLoaded = factory( - window, - window.EvEmitter - ); - } - -})( typeof window !== 'undefined' ? window : this, - -// -------------------------- factory -------------------------- // - -function factory( window, EvEmitter ) { - - - -var $ = window.jQuery; -var console = window.console; - -// -------------------------- helpers -------------------------- // - -// extend objects -function extend( a, b ) { - for ( var prop in b ) { - a[ prop ] = b[ prop ]; - } - return a; -} - -var arraySlice = Array.prototype.slice; - -// turn element or nodeList into an array -function makeArray( obj ) { - if ( Array.isArray( obj ) ) { - // use object if already an array - return obj; - } - - var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number'; - if ( isArrayLike ) { - // convert nodeList to array - return arraySlice.call( obj ); - } - - // array of single index - return [ obj ]; -} - -// -------------------------- imagesLoaded -------------------------- // - -/** - * @param {Array, Element, NodeList, String} elem - * @param {Object or Function} options - if function, use as callback - * @param {Function} onAlways - callback function - */ -function ImagesLoaded( elem, options, onAlways ) { - // coerce ImagesLoaded() without new, to be new ImagesLoaded() - if ( !( this instanceof ImagesLoaded ) ) { - return new ImagesLoaded( elem, options, onAlways ); - } - // use elem as selector string - var queryElem = elem; - if ( typeof elem == 'string' ) { - queryElem = document.querySelectorAll( elem ); - } - // bail if bad element - if ( !queryElem ) { - console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) ); - return; - } - - this.elements = makeArray( queryElem ); - this.options = extend( {}, this.options ); - // shift arguments if no options set - if ( typeof options == 'function' ) { - onAlways = options; - } else { - extend( this.options, options ); - } - - if ( onAlways ) { - this.on( 'always', onAlways ); - } - - this.getImages(); - - if ( $ ) { - // add jQuery Deferred object - this.jqDeferred = new $.Deferred(); - } - - // HACK check async to allow time to bind listeners - setTimeout( this.check.bind( this ) ); -} - -ImagesLoaded.prototype = Object.create( EvEmitter.prototype ); - -ImagesLoaded.prototype.options = {}; - -ImagesLoaded.prototype.getImages = function() { - this.images = []; - - // filter & find items if we have an item selector - this.elements.forEach( this.addElementImages, this ); -}; - -/** - * @param {Node} element - */ -ImagesLoaded.prototype.addElementImages = function( elem ) { - // filter siblings - if ( elem.nodeName == 'IMG' ) { - this.addImage( elem ); - } - // get background image on element - if ( this.options.background === true ) { - this.addElementBackgroundImages( elem ); - } - - // find children - // no non-element nodes, #143 - var nodeType = elem.nodeType; - if ( !nodeType || !elementNodeTypes[ nodeType ] ) { - return; - } - var childImgs = elem.querySelectorAll('img'); - // concat childElems to filterFound array - for ( var i=0; i < childImgs.length; i++ ) { - var img = childImgs[i]; - this.addImage( img ); - } - - // get child background images - if ( typeof this.options.background == 'string' ) { - var children = elem.querySelectorAll( this.options.background ); - for ( i=0; i < children.length; i++ ) { - var child = children[i]; - this.addElementBackgroundImages( child ); - } - } -}; - -var elementNodeTypes = { - 1: true, - 9: true, - 11: true -}; - -ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) { - var style = getComputedStyle( elem ); - if ( !style ) { - // Firefox returns null if in a hidden iframe https://bugzil.la/548397 - return; - } - // get url inside url("...") - var reURL = /url\((['"])?(.*?)\1\)/gi; - var matches = reURL.exec( style.backgroundImage ); - while ( matches !== null ) { - var url = matches && matches[2]; - if ( url ) { - this.addBackground( url, elem ); - } - matches = reURL.exec( style.backgroundImage ); - } -}; - -/** - * @param {Image} img - */ -ImagesLoaded.prototype.addImage = function( img ) { - var loadingImage = new LoadingImage( img ); - this.images.push( loadingImage ); -}; - -ImagesLoaded.prototype.addBackground = function( url, elem ) { - var background = new Background( url, elem ); - this.images.push( background ); -}; - -ImagesLoaded.prototype.check = function() { - var _this = this; - this.progressedCount = 0; - this.hasAnyBroken = false; - // complete if no images - if ( !this.images.length ) { - this.complete(); - return; - } - - function onProgress( image, elem, message ) { - // HACK - Chrome triggers event before object properties have changed. #83 - setTimeout( function() { - _this.progress( image, elem, message ); - }); - } - - this.images.forEach( function( loadingImage ) { - loadingImage.once( 'progress', onProgress ); - loadingImage.check(); - }); -}; - -ImagesLoaded.prototype.progress = function( image, elem, message ) { - this.progressedCount++; - this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded; - // progress event - this.emitEvent( 'progress', [ this, image, elem ] ); - if ( this.jqDeferred && this.jqDeferred.notify ) { - this.jqDeferred.notify( this, image ); - } - // check if completed - if ( this.progressedCount == this.images.length ) { - this.complete(); - } - - if ( this.options.debug && console ) { - console.log( 'progress: ' + message, image, elem ); - } -}; - -ImagesLoaded.prototype.complete = function() { - var eventName = this.hasAnyBroken ? 'fail' : 'done'; - this.isComplete = true; - this.emitEvent( eventName, [ this ] ); - this.emitEvent( 'always', [ this ] ); - if ( this.jqDeferred ) { - var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve'; - this.jqDeferred[ jqMethod ]( this ); - } -}; - -// -------------------------- -------------------------- // - -function LoadingImage( img ) { - this.img = img; -} - -LoadingImage.prototype = Object.create( EvEmitter.prototype ); - -LoadingImage.prototype.check = function() { - // If complete is true and browser supports natural sizes, - // try to check for image status manually. - var isComplete = this.getIsImageComplete(); - if ( isComplete ) { - // report based on naturalWidth - this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' ); - return; - } - - // If none of the checks above matched, simulate loading on detached element. - this.proxyImage = new Image(); - this.proxyImage.addEventListener( 'load', this ); - this.proxyImage.addEventListener( 'error', this ); - // bind to image as well for Firefox. #191 - this.img.addEventListener( 'load', this ); - this.img.addEventListener( 'error', this ); - this.proxyImage.src = this.img.src; -}; - -LoadingImage.prototype.getIsImageComplete = function() { - // check for non-zero, non-undefined naturalWidth - // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671 - return this.img.complete && this.img.naturalWidth; -}; - -LoadingImage.prototype.confirm = function( isLoaded, message ) { - this.isLoaded = isLoaded; - this.emitEvent( 'progress', [ this, this.img, message ] ); -}; - -// ----- events ----- // - -// trigger specified handler for event type -LoadingImage.prototype.handleEvent = function( event ) { - var method = 'on' + event.type; - if ( this[ method ] ) { - this[ method ]( event ); - } -}; - -LoadingImage.prototype.onload = function() { - this.confirm( true, 'onload' ); - this.unbindEvents(); -}; - -LoadingImage.prototype.onerror = function() { - this.confirm( false, 'onerror' ); - this.unbindEvents(); -}; - -LoadingImage.prototype.unbindEvents = function() { - this.proxyImage.removeEventListener( 'load', this ); - this.proxyImage.removeEventListener( 'error', this ); - this.img.removeEventListener( 'load', this ); - this.img.removeEventListener( 'error', this ); -}; - -// -------------------------- Background -------------------------- // - -function Background( url, element ) { - this.url = url; - this.element = element; - this.img = new Image(); -} - -// inherit LoadingImage prototype -Background.prototype = Object.create( LoadingImage.prototype ); - -Background.prototype.check = function() { - this.img.addEventListener( 'load', this ); - this.img.addEventListener( 'error', this ); - this.img.src = this.url; - // check if image is already complete - var isComplete = this.getIsImageComplete(); - if ( isComplete ) { - this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' ); - this.unbindEvents(); - } -}; - -Background.prototype.unbindEvents = function() { - this.img.removeEventListener( 'load', this ); - this.img.removeEventListener( 'error', this ); -}; - -Background.prototype.confirm = function( isLoaded, message ) { - this.isLoaded = isLoaded; - this.emitEvent( 'progress', [ this, this.element, message ] ); -}; - -// -------------------------- jQuery -------------------------- // - -ImagesLoaded.makeJQueryPlugin = function( jQuery ) { - jQuery = jQuery || window.jQuery; - if ( !jQuery ) { - return; - } - // set local variable - $ = jQuery; - // $().imagesLoaded() - $.fn.imagesLoaded = function( options, callback ) { - var instance = new ImagesLoaded( this, options, callback ); - return instance.jqDeferred.promise( $(this) ); - }; -}; -// try making plugin -ImagesLoaded.makeJQueryPlugin(); - -// -------------------------- -------------------------- // - -return ImagesLoaded; - -}); diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.inherit.js b/ckan/public-bs2/base/javascript/plugins/jquery.inherit.js deleted file mode 100644 index 170edcb446b..00000000000 --- a/ckan/public-bs2/base/javascript/plugins/jquery.inherit.js +++ /dev/null @@ -1,52 +0,0 @@ -(function (jQuery) { - // Cache an empty constructor function for it's prototype object. - function DummyObject() {} - - // Simple cross browser Object.create(). - function create(proto) { - if (typeof proto !== 'object') { - return {}; - } - else if (Object.create) { - return Object.create(proto); - } - - DummyObject.prototype = proto; - return new DummyObject(); - } - - /* A simple helper for sub classing objects. Works in the same way - * as Backbone.extend() for example. - * - * parent - A constructor function to extend. - * methods - An object of prototype methods/properties. - * properties - An object of static methods/properties. - * - * - * Examples - * - * function MyClass() {} - * - * var ChildClass = jQuery.inherit(MyClass, { - * method: function () {} - * }); - * - * Returns a new Constructor function. - */ - jQuery.inherit = function (parent, methods, properties) { - methods = methods || {}; - - function Object() { - parent.apply(this, arguments); - } - - var Child = methods.hasOwnProperty('constructor') ? methods.constructor : Object; - - Child.prototype = create(parent.prototype); - Child.prototype.constructor = Child; - - jQuery.extend(Child.prototype, methods); - - return jQuery.extend(Child, parent, properties, {__super__: parent.prototype}); - }; -})(this.jQuery); diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.masonry.js b/ckan/public-bs2/base/javascript/plugins/jquery.masonry.js deleted file mode 100644 index 440b0e00265..00000000000 --- a/ckan/public-bs2/base/javascript/plugins/jquery.masonry.js +++ /dev/null @@ -1,2501 +0,0 @@ -/*! - * Masonry PACKAGED v4.2.1 - * Cascading grid layout library - * https://masonry.desandro.com - * MIT License - * by David DeSandro - */ - -/** - * Bridget makes jQuery widgets - * v2.0.1 - * MIT license - */ - -/* jshint browser: true, strict: true, undef: true, unused: true */ - -( function( window, factory ) { - // universal module definition - /*jshint strict: false */ /* globals define, module, require */ - if ( typeof define == 'function' && define.amd ) { - // AMD - define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) { - return factory( window, jQuery ); - }); - } else if ( typeof module == 'object' && module.exports ) { - // CommonJS - module.exports = factory( - window, - require('jquery') - ); - } else { - // browser global - window.jQueryBridget = factory( - window, - window.jQuery - ); - } - -}( window, function factory( window, jQuery ) { -'use strict'; - -// ----- utils ----- // - -var arraySlice = Array.prototype.slice; - -// helper function for logging errors -// $.error breaks jQuery chaining -var console = window.console; -var logError = typeof console == 'undefined' ? function() {} : - function( message ) { - console.error( message ); - }; - -// ----- jQueryBridget ----- // - -function jQueryBridget( namespace, PluginClass, $ ) { - $ = $ || jQuery || window.jQuery; - if ( !$ ) { - return; - } - - // add option method -> $().plugin('option', {...}) - if ( !PluginClass.prototype.option ) { - // option setter - PluginClass.prototype.option = function( opts ) { - // bail out if not an object - if ( !$.isPlainObject( opts ) ){ - return; - } - this.options = $.extend( true, this.options, opts ); - }; - } - - // make jQuery plugin - $.fn[ namespace ] = function( arg0 /*, arg1 */ ) { - if ( typeof arg0 == 'string' ) { - // method call $().plugin( 'methodName', { options } ) - // shift arguments by 1 - var args = arraySlice.call( arguments, 1 ); - return methodCall( this, arg0, args ); - } - // just $().plugin({ options }) - plainCall( this, arg0 ); - return this; - }; - - // $().plugin('methodName') - function methodCall( $elems, methodName, args ) { - var returnValue; - var pluginMethodStr = '$().' + namespace + '("' + methodName + '")'; - - $elems.each( function( i, elem ) { - // get instance - var instance = $.data( elem, namespace ); - if ( !instance ) { - logError( namespace + ' not initialized. Cannot call methods, i.e. ' + - pluginMethodStr ); - return; - } - - var method = instance[ methodName ]; - if ( !method || methodName.charAt(0) == '_' ) { - logError( pluginMethodStr + ' is not a valid method' ); - return; - } - - // apply method, get return value - var value = method.apply( instance, args ); - // set return value if value is returned, use only first value - returnValue = returnValue === undefined ? value : returnValue; - }); - - return returnValue !== undefined ? returnValue : $elems; - } - - function plainCall( $elems, options ) { - $elems.each( function( i, elem ) { - var instance = $.data( elem, namespace ); - if ( instance ) { - // set options & init - instance.option( options ); - instance._init(); - } else { - // initialize new instance - instance = new PluginClass( elem, options ); - $.data( elem, namespace, instance ); - } - }); - } - - updateJQuery( $ ); - -} - -// ----- updateJQuery ----- // - -// set $.bridget for v1 backwards compatibility -function updateJQuery( $ ) { - if ( !$ || ( $ && $.bridget ) ) { - return; - } - $.bridget = jQueryBridget; -} - -updateJQuery( jQuery || window.jQuery ); - -// ----- ----- // - -return jQueryBridget; - -})); - -/** - * EvEmitter v1.1.0 - * Lil' event emitter - * MIT License - */ - -/* jshint unused: true, undef: true, strict: true */ - -( function( global, factory ) { - // universal module definition - /* jshint strict: false */ /* globals define, module, window */ - if ( typeof define == 'function' && define.amd ) { - // AMD - RequireJS - define( 'ev-emitter/ev-emitter',factory ); - } else if ( typeof module == 'object' && module.exports ) { - // CommonJS - Browserify, Webpack - module.exports = factory(); - } else { - // Browser globals - global.EvEmitter = factory(); - } - -}( typeof window != 'undefined' ? window : this, function() { - - - -function EvEmitter() {} - -var proto = EvEmitter.prototype; - -proto.on = function( eventName, listener ) { - if ( !eventName || !listener ) { - return; - } - // set events hash - var events = this._events = this._events || {}; - // set listeners array - var listeners = events[ eventName ] = events[ eventName ] || []; - // only add once - if ( listeners.indexOf( listener ) == -1 ) { - listeners.push( listener ); - } - - return this; -}; - -proto.once = function( eventName, listener ) { - if ( !eventName || !listener ) { - return; - } - // add event - this.on( eventName, listener ); - // set once flag - // set onceEvents hash - var onceEvents = this._onceEvents = this._onceEvents || {}; - // set onceListeners object - var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; - // set flag - onceListeners[ listener ] = true; - - return this; -}; - -proto.off = function( eventName, listener ) { - var listeners = this._events && this._events[ eventName ]; - if ( !listeners || !listeners.length ) { - return; - } - var index = listeners.indexOf( listener ); - if ( index != -1 ) { - listeners.splice( index, 1 ); - } - - return this; -}; - -proto.emitEvent = function( eventName, args ) { - var listeners = this._events && this._events[ eventName ]; - if ( !listeners || !listeners.length ) { - return; - } - // copy over to avoid interference if .off() in listener - listeners = listeners.slice(0); - args = args || []; - // once stuff - var onceListeners = this._onceEvents && this._onceEvents[ eventName ]; - - for ( var i=0; i < listeners.length; i++ ) { - var listener = listeners[i] - var isOnce = onceListeners && onceListeners[ listener ]; - if ( isOnce ) { - // remove listener - // remove before trigger to prevent recursion - this.off( eventName, listener ); - // unset once flag - delete onceListeners[ listener ]; - } - // trigger listener - listener.apply( this, args ); - } - - return this; -}; - -proto.allOff = function() { - delete this._events; - delete this._onceEvents; -}; - -return EvEmitter; - -})); - -/*! - * getSize v2.0.2 - * measure size of elements - * MIT license - */ - -/*jshint browser: true, strict: true, undef: true, unused: true */ -/*global define: false, module: false, console: false */ - -( function( window, factory ) { - 'use strict'; - - if ( typeof define == 'function' && define.amd ) { - // AMD - define( 'get-size/get-size',[],function() { - return factory(); - }); - } else if ( typeof module == 'object' && module.exports ) { - // CommonJS - module.exports = factory(); - } else { - // browser global - window.getSize = factory(); - } - -})( window, function factory() { -'use strict'; - -// -------------------------- helpers -------------------------- // - -// get a number from a string, not a percentage -function getStyleSize( value ) { - var num = parseFloat( value ); - // not a percent like '100%', and a number - var isValid = value.indexOf('%') == -1 && !isNaN( num ); - return isValid && num; -} - -function noop() {} - -var logError = typeof console == 'undefined' ? noop : - function( message ) { - console.error( message ); - }; - -// -------------------------- measurements -------------------------- // - -var measurements = [ - 'paddingLeft', - 'paddingRight', - 'paddingTop', - 'paddingBottom', - 'marginLeft', - 'marginRight', - 'marginTop', - 'marginBottom', - 'borderLeftWidth', - 'borderRightWidth', - 'borderTopWidth', - 'borderBottomWidth' -]; - -var measurementsLength = measurements.length; - -function getZeroSize() { - var size = { - width: 0, - height: 0, - innerWidth: 0, - innerHeight: 0, - outerWidth: 0, - outerHeight: 0 - }; - for ( var i=0; i < measurementsLength; i++ ) { - var measurement = measurements[i]; - size[ measurement ] = 0; - } - return size; -} - -// -------------------------- getStyle -------------------------- // - -/** - * getStyle, get style of element, check for Firefox bug - * https://bugzilla.mozilla.org/show_bug.cgi?id=548397 - */ -function getStyle( elem ) { - var style = getComputedStyle( elem ); - if ( !style ) { - logError( 'Style returned ' + style + - '. Are you running this code in a hidden iframe on Firefox? ' + - 'See http://bit.ly/getsizebug1' ); - } - return style; -} - -// -------------------------- setup -------------------------- // - -var isSetup = false; - -var isBoxSizeOuter; - -/** - * setup - * check isBoxSizerOuter - * do on first getSize() rather than on page load for Firefox bug - */ -function setup() { - // setup once - if ( isSetup ) { - return; - } - isSetup = true; - - // -------------------------- box sizing -------------------------- // - - /** - * WebKit measures the outer-width on style.width on border-box elems - * IE & Firefox<29 measures the inner-width - */ - var div = document.createElement('div'); - div.style.width = '200px'; - div.style.padding = '1px 2px 3px 4px'; - div.style.borderStyle = 'solid'; - div.style.borderWidth = '1px 2px 3px 4px'; - div.style.boxSizing = 'border-box'; - - var body = document.body || document.documentElement; - body.appendChild( div ); - var style = getStyle( div ); - - getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200; - body.removeChild( div ); - -} - -// -------------------------- getSize -------------------------- // - -function getSize( elem ) { - setup(); - - // use querySeletor if elem is string - if ( typeof elem == 'string' ) { - elem = document.querySelector( elem ); - } - - // do not proceed on non-objects - if ( !elem || typeof elem != 'object' || !elem.nodeType ) { - return; - } - - var style = getStyle( elem ); - - // if hidden, everything is 0 - if ( style.display == 'none' ) { - return getZeroSize(); - } - - var size = {}; - size.width = elem.offsetWidth; - size.height = elem.offsetHeight; - - var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box'; - - // get all measurements - for ( var i=0; i < measurementsLength; i++ ) { - var measurement = measurements[i]; - var value = style[ measurement ]; - var num = parseFloat( value ); - // any 'auto', 'medium' value will be 0 - size[ measurement ] = !isNaN( num ) ? num : 0; - } - - var paddingWidth = size.paddingLeft + size.paddingRight; - var paddingHeight = size.paddingTop + size.paddingBottom; - var marginWidth = size.marginLeft + size.marginRight; - var marginHeight = size.marginTop + size.marginBottom; - var borderWidth = size.borderLeftWidth + size.borderRightWidth; - var borderHeight = size.borderTopWidth + size.borderBottomWidth; - - var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter; - - // overwrite width and height if we can get it from style - var styleWidth = getStyleSize( style.width ); - if ( styleWidth !== false ) { - size.width = styleWidth + - // add padding and border unless it's already including it - ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth ); - } - - var styleHeight = getStyleSize( style.height ); - if ( styleHeight !== false ) { - size.height = styleHeight + - // add padding and border unless it's already including it - ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight ); - } - - size.innerWidth = size.width - ( paddingWidth + borderWidth ); - size.innerHeight = size.height - ( paddingHeight + borderHeight ); - - size.outerWidth = size.width + marginWidth; - size.outerHeight = size.height + marginHeight; - - return size; -} - -return getSize; - -}); - -/** - * matchesSelector v2.0.2 - * matchesSelector( element, '.selector' ) - * MIT license - */ - -/*jshint browser: true, strict: true, undef: true, unused: true */ - -( function( window, factory ) { - /*global define: false, module: false */ - 'use strict'; - // universal module definition - if ( typeof define == 'function' && define.amd ) { - // AMD - define( 'desandro-matches-selector/matches-selector',factory ); - } else if ( typeof module == 'object' && module.exports ) { - // CommonJS - module.exports = factory(); - } else { - // browser global - window.matchesSelector = factory(); - } - -}( window, function factory() { - 'use strict'; - - var matchesMethod = ( function() { - var ElemProto = window.Element.prototype; - // check for the standard method name first - if ( ElemProto.matches ) { - return 'matches'; - } - // check un-prefixed - if ( ElemProto.matchesSelector ) { - return 'matchesSelector'; - } - // check vendor prefixes - var prefixes = [ 'webkit', 'moz', 'ms', 'o' ]; - - for ( var i=0; i < prefixes.length; i++ ) { - var prefix = prefixes[i]; - var method = prefix + 'MatchesSelector'; - if ( ElemProto[ method ] ) { - return method; - } - } - })(); - - return function matchesSelector( elem, selector ) { - return elem[ matchesMethod ]( selector ); - }; - -})); - -/** - * Fizzy UI utils v2.0.5 - * MIT license - */ - -/*jshint browser: true, undef: true, unused: true, strict: true */ - -( function( window, factory ) { - // universal module definition - /*jshint strict: false */ /*globals define, module, require */ - - if ( typeof define == 'function' && define.amd ) { - // AMD - define( 'fizzy-ui-utils/utils',[ - 'desandro-matches-selector/matches-selector' - ], function( matchesSelector ) { - return factory( window, matchesSelector ); - }); - } else if ( typeof module == 'object' && module.exports ) { - // CommonJS - module.exports = factory( - window, - require('desandro-matches-selector') - ); - } else { - // browser global - window.fizzyUIUtils = factory( - window, - window.matchesSelector - ); - } - -}( window, function factory( window, matchesSelector ) { - - - -var utils = {}; - -// ----- extend ----- // - -// extends objects -utils.extend = function( a, b ) { - for ( var prop in b ) { - a[ prop ] = b[ prop ]; - } - return a; -}; - -// ----- modulo ----- // - -utils.modulo = function( num, div ) { - return ( ( num % div ) + div ) % div; -}; - -// ----- makeArray ----- // - -// turn element or nodeList into an array -utils.makeArray = function( obj ) { - var ary = []; - if ( Array.isArray( obj ) ) { - // use object if already an array - ary = obj; - } else if ( obj && typeof obj == 'object' && - typeof obj.length == 'number' ) { - // convert nodeList to array - for ( var i=0; i < obj.length; i++ ) { - ary.push( obj[i] ); - } - } else { - // array of single index - ary.push( obj ); - } - return ary; -}; - -// ----- removeFrom ----- // - -utils.removeFrom = function( ary, obj ) { - var index = ary.indexOf( obj ); - if ( index != -1 ) { - ary.splice( index, 1 ); - } -}; - -// ----- getParent ----- // - -utils.getParent = function( elem, selector ) { - while ( elem.parentNode && elem != document.body ) { - elem = elem.parentNode; - if ( matchesSelector( elem, selector ) ) { - return elem; - } - } -}; - -// ----- getQueryElement ----- // - -// use element as selector string -utils.getQueryElement = function( elem ) { - if ( typeof elem == 'string' ) { - return document.querySelector( elem ); - } - return elem; -}; - -// ----- handleEvent ----- // - -// enable .ontype to trigger from .addEventListener( elem, 'type' ) -utils.handleEvent = function( event ) { - var method = 'on' + event.type; - if ( this[ method ] ) { - this[ method ]( event ); - } -}; - -// ----- filterFindElements ----- // - -utils.filterFindElements = function( elems, selector ) { - // make array of elems - elems = utils.makeArray( elems ); - var ffElems = []; - - elems.forEach( function( elem ) { - // check that elem is an actual element - if ( !( elem instanceof HTMLElement ) ) { - return; - } - // add elem if no selector - if ( !selector ) { - ffElems.push( elem ); - return; - } - // filter & find items if we have a selector - // filter - if ( matchesSelector( elem, selector ) ) { - ffElems.push( elem ); - } - // find children - var childElems = elem.querySelectorAll( selector ); - // concat childElems to filterFound array - for ( var i=0; i < childElems.length; i++ ) { - ffElems.push( childElems[i] ); - } - }); - - return ffElems; -}; - -// ----- debounceMethod ----- // - -utils.debounceMethod = function( _class, methodName, threshold ) { - // original method - var method = _class.prototype[ methodName ]; - var timeoutName = methodName + 'Timeout'; - - _class.prototype[ methodName ] = function() { - var timeout = this[ timeoutName ]; - if ( timeout ) { - clearTimeout( timeout ); - } - var args = arguments; - - var _this = this; - this[ timeoutName ] = setTimeout( function() { - method.apply( _this, args ); - delete _this[ timeoutName ]; - }, threshold || 100 ); - }; -}; - -// ----- docReady ----- // - -utils.docReady = function( callback ) { - var readyState = document.readyState; - if ( readyState == 'complete' || readyState == 'interactive' ) { - // do async to allow for other scripts to run. metafizzy/flickity#441 - setTimeout( callback ); - } else { - document.addEventListener( 'DOMContentLoaded', callback ); - } -}; - -// ----- htmlInit ----- // - -// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/ -utils.toDashed = function( str ) { - return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) { - return $1 + '-' + $2; - }).toLowerCase(); -}; - -var console = window.console; -/** - * allow user to initialize classes via [data-namespace] or .js-namespace class - * htmlInit( Widget, 'widgetName' ) - * options are parsed from data-namespace-options - */ -utils.htmlInit = function( WidgetClass, namespace ) { - utils.docReady( function() { - var dashedNamespace = utils.toDashed( namespace ); - var dataAttr = 'data-' + dashedNamespace; - var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' ); - var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace ); - var elems = utils.makeArray( dataAttrElems ) - .concat( utils.makeArray( jsDashElems ) ); - var dataOptionsAttr = dataAttr + '-options'; - var jQuery = window.jQuery; - - elems.forEach( function( elem ) { - var attr = elem.getAttribute( dataAttr ) || - elem.getAttribute( dataOptionsAttr ); - var options; - try { - options = attr && JSON.parse( attr ); - } catch ( error ) { - // log error, do not initialize - if ( console ) { - console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className + - ': ' + error ); - } - return; - } - // initialize - var instance = new WidgetClass( elem, options ); - // make available via $().data('namespace') - if ( jQuery ) { - jQuery.data( elem, namespace, instance ); - } - }); - - }); -}; - -// ----- ----- // - -return utils; - -})); - -/** - * Outlayer Item - */ - -( function( window, factory ) { - // universal module definition - /* jshint strict: false */ /* globals define, module, require */ - if ( typeof define == 'function' && define.amd ) { - // AMD - RequireJS - define( 'outlayer/item',[ - 'ev-emitter/ev-emitter', - 'get-size/get-size' - ], - factory - ); - } else if ( typeof module == 'object' && module.exports ) { - // CommonJS - Browserify, Webpack - module.exports = factory( - require('ev-emitter'), - require('get-size') - ); - } else { - // browser global - window.Outlayer = {}; - window.Outlayer.Item = factory( - window.EvEmitter, - window.getSize - ); - } - -}( window, function factory( EvEmitter, getSize ) { -'use strict'; - -// ----- helpers ----- // - -function isEmptyObj( obj ) { - for ( var prop in obj ) { - return false; - } - prop = null; - return true; -} - -// -------------------------- CSS3 support -------------------------- // - - -var docElemStyle = document.documentElement.style; - -var transitionProperty = typeof docElemStyle.transition == 'string' ? - 'transition' : 'WebkitTransition'; -var transformProperty = typeof docElemStyle.transform == 'string' ? - 'transform' : 'WebkitTransform'; - -var transitionEndEvent = { - WebkitTransition: 'webkitTransitionEnd', - transition: 'transitionend' -}[ transitionProperty ]; - -// cache all vendor properties that could have vendor prefix -var vendorProperties = { - transform: transformProperty, - transition: transitionProperty, - transitionDuration: transitionProperty + 'Duration', - transitionProperty: transitionProperty + 'Property', - transitionDelay: transitionProperty + 'Delay' -}; - -// -------------------------- Item -------------------------- // - -function Item( element, layout ) { - if ( !element ) { - return; - } - - this.element = element; - // parent layout class, i.e. Masonry, Isotope, or Packery - this.layout = layout; - this.position = { - x: 0, - y: 0 - }; - - this._create(); -} - -// inherit EvEmitter -var proto = Item.prototype = Object.create( EvEmitter.prototype ); -proto.constructor = Item; - -proto._create = function() { - // transition objects - this._transn = { - ingProperties: {}, - clean: {}, - onEnd: {} - }; - - this.css({ - position: 'absolute' - }); -}; - -// trigger specified handler for event type -proto.handleEvent = function( event ) { - var method = 'on' + event.type; - if ( this[ method ] ) { - this[ method ]( event ); - } -}; - -proto.getSize = function() { - this.size = getSize( this.element ); -}; - -/** - * apply CSS styles to element - * @param {Object} style - */ -proto.css = function( style ) { - var elemStyle = this.element.style; - - for ( var prop in style ) { - // use vendor property if available - var supportedProp = vendorProperties[ prop ] || prop; - elemStyle[ supportedProp ] = style[ prop ]; - } -}; - - // measure position, and sets it -proto.getPosition = function() { - var style = getComputedStyle( this.element ); - var isOriginLeft = this.layout._getOption('originLeft'); - var isOriginTop = this.layout._getOption('originTop'); - var xValue = style[ isOriginLeft ? 'left' : 'right' ]; - var yValue = style[ isOriginTop ? 'top' : 'bottom' ]; - // convert percent to pixels - var layoutSize = this.layout.size; - var x = xValue.indexOf('%') != -1 ? - ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 ); - var y = yValue.indexOf('%') != -1 ? - ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 ); - - // clean up 'auto' or other non-integer values - x = isNaN( x ) ? 0 : x; - y = isNaN( y ) ? 0 : y; - // remove padding from measurement - x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight; - y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom; - - this.position.x = x; - this.position.y = y; -}; - -// set settled position, apply padding -proto.layoutPosition = function() { - var layoutSize = this.layout.size; - var style = {}; - var isOriginLeft = this.layout._getOption('originLeft'); - var isOriginTop = this.layout._getOption('originTop'); - - // x - var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight'; - var xProperty = isOriginLeft ? 'left' : 'right'; - var xResetProperty = isOriginLeft ? 'right' : 'left'; - - var x = this.position.x + layoutSize[ xPadding ]; - // set in percentage or pixels - style[ xProperty ] = this.getXValue( x ); - // reset other property - style[ xResetProperty ] = ''; - - // y - var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom'; - var yProperty = isOriginTop ? 'top' : 'bottom'; - var yResetProperty = isOriginTop ? 'bottom' : 'top'; - - var y = this.position.y + layoutSize[ yPadding ]; - // set in percentage or pixels - style[ yProperty ] = this.getYValue( y ); - // reset other property - style[ yResetProperty ] = ''; - - this.css( style ); - this.emitEvent( 'layout', [ this ] ); -}; - -proto.getXValue = function( x ) { - var isHorizontal = this.layout._getOption('horizontal'); - return this.layout.options.percentPosition && !isHorizontal ? - ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px'; -}; - -proto.getYValue = function( y ) { - var isHorizontal = this.layout._getOption('horizontal'); - return this.layout.options.percentPosition && isHorizontal ? - ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px'; -}; - -proto._transitionTo = function( x, y ) { - this.getPosition(); - // get current x & y from top/left - var curX = this.position.x; - var curY = this.position.y; - - var compareX = parseInt( x, 10 ); - var compareY = parseInt( y, 10 ); - var didNotMove = compareX === this.position.x && compareY === this.position.y; - - // save end position - this.setPosition( x, y ); - - // if did not move and not transitioning, just go to layout - if ( didNotMove && !this.isTransitioning ) { - this.layoutPosition(); - return; - } - - var transX = x - curX; - var transY = y - curY; - var transitionStyle = {}; - transitionStyle.transform = this.getTranslate( transX, transY ); - - this.transition({ - to: transitionStyle, - onTransitionEnd: { - transform: this.layoutPosition - }, - isCleaning: true - }); -}; - -proto.getTranslate = function( x, y ) { - // flip cooridinates if origin on right or bottom - var isOriginLeft = this.layout._getOption('originLeft'); - var isOriginTop = this.layout._getOption('originTop'); - x = isOriginLeft ? x : -x; - y = isOriginTop ? y : -y; - return 'translate3d(' + x + 'px, ' + y + 'px, 0)'; -}; - -// non transition + transform support -proto.goTo = function( x, y ) { - this.setPosition( x, y ); - this.layoutPosition(); -}; - -proto.moveTo = proto._transitionTo; - -proto.setPosition = function( x, y ) { - this.position.x = parseInt( x, 10 ); - this.position.y = parseInt( y, 10 ); -}; - -// ----- transition ----- // - -/** - * @param {Object} style - CSS - * @param {Function} onTransitionEnd - */ - -// non transition, just trigger callback -proto._nonTransition = function( args ) { - this.css( args.to ); - if ( args.isCleaning ) { - this._removeStyles( args.to ); - } - for ( var prop in args.onTransitionEnd ) { - args.onTransitionEnd[ prop ].call( this ); - } -}; - -/** - * proper transition - * @param {Object} args - arguments - * @param {Object} to - style to transition to - * @param {Object} from - style to start transition from - * @param {Boolean} isCleaning - removes transition styles after transition - * @param {Function} onTransitionEnd - callback - */ -proto.transition = function( args ) { - // redirect to nonTransition if no transition duration - if ( !parseFloat( this.layout.options.transitionDuration ) ) { - this._nonTransition( args ); - return; - } - - var _transition = this._transn; - // keep track of onTransitionEnd callback by css property - for ( var prop in args.onTransitionEnd ) { - _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ]; - } - // keep track of properties that are transitioning - for ( prop in args.to ) { - _transition.ingProperties[ prop ] = true; - // keep track of properties to clean up when transition is done - if ( args.isCleaning ) { - _transition.clean[ prop ] = true; - } - } - - // set from styles - if ( args.from ) { - this.css( args.from ); - // force redraw. http://blog.alexmaccaw.com/css-transitions - var h = this.element.offsetHeight; - // hack for JSHint to hush about unused var - h = null; - } - // enable transition - this.enableTransition( args.to ); - // set styles that are transitioning - this.css( args.to ); - - this.isTransitioning = true; - -}; - -// dash before all cap letters, including first for -// WebkitTransform => -webkit-transform -function toDashedAll( str ) { - return str.replace( /([A-Z])/g, function( $1 ) { - return '-' + $1.toLowerCase(); - }); -} - -var transitionProps = 'opacity,' + toDashedAll( transformProperty ); - -proto.enableTransition = function(/* style */) { - // HACK changing transitionProperty during a transition - // will cause transition to jump - if ( this.isTransitioning ) { - return; - } - - // make `transition: foo, bar, baz` from style object - // HACK un-comment this when enableTransition can work - // while a transition is happening - // var transitionValues = []; - // for ( var prop in style ) { - // // dash-ify camelCased properties like WebkitTransition - // prop = vendorProperties[ prop ] || prop; - // transitionValues.push( toDashedAll( prop ) ); - // } - // munge number to millisecond, to match stagger - var duration = this.layout.options.transitionDuration; - duration = typeof duration == 'number' ? duration + 'ms' : duration; - // enable transition styles - this.css({ - transitionProperty: transitionProps, - transitionDuration: duration, - transitionDelay: this.staggerDelay || 0 - }); - // listen for transition end event - this.element.addEventListener( transitionEndEvent, this, false ); -}; - -// ----- events ----- // - -proto.onwebkitTransitionEnd = function( event ) { - this.ontransitionend( event ); -}; - -proto.onotransitionend = function( event ) { - this.ontransitionend( event ); -}; - -// properties that I munge to make my life easier -var dashedVendorProperties = { - '-webkit-transform': 'transform' -}; - -proto.ontransitionend = function( event ) { - // disregard bubbled events from children - if ( event.target !== this.element ) { - return; - } - var _transition = this._transn; - // get property name of transitioned property, convert to prefix-free - var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName; - - // remove property that has completed transitioning - delete _transition.ingProperties[ propertyName ]; - // check if any properties are still transitioning - if ( isEmptyObj( _transition.ingProperties ) ) { - // all properties have completed transitioning - this.disableTransition(); - } - // clean style - if ( propertyName in _transition.clean ) { - // clean up style - this.element.style[ event.propertyName ] = ''; - delete _transition.clean[ propertyName ]; - } - // trigger onTransitionEnd callback - if ( propertyName in _transition.onEnd ) { - var onTransitionEnd = _transition.onEnd[ propertyName ]; - onTransitionEnd.call( this ); - delete _transition.onEnd[ propertyName ]; - } - - this.emitEvent( 'transitionEnd', [ this ] ); -}; - -proto.disableTransition = function() { - this.removeTransitionStyles(); - this.element.removeEventListener( transitionEndEvent, this, false ); - this.isTransitioning = false; -}; - -/** - * removes style property from element - * @param {Object} style -**/ -proto._removeStyles = function( style ) { - // clean up transition styles - var cleanStyle = {}; - for ( var prop in style ) { - cleanStyle[ prop ] = ''; - } - this.css( cleanStyle ); -}; - -var cleanTransitionStyle = { - transitionProperty: '', - transitionDuration: '', - transitionDelay: '' -}; - -proto.removeTransitionStyles = function() { - // remove transition - this.css( cleanTransitionStyle ); -}; - -// ----- stagger ----- // - -proto.stagger = function( delay ) { - delay = isNaN( delay ) ? 0 : delay; - this.staggerDelay = delay + 'ms'; -}; - -// ----- show/hide/remove ----- // - -// remove element from DOM -proto.removeElem = function() { - this.element.parentNode.removeChild( this.element ); - // remove display: none - this.css({ display: '' }); - this.emitEvent( 'remove', [ this ] ); -}; - -proto.remove = function() { - // just remove element if no transition support or no transition - if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) { - this.removeElem(); - return; - } - - // start transition - this.once( 'transitionEnd', function() { - this.removeElem(); - }); - this.hide(); -}; - -proto.reveal = function() { - delete this.isHidden; - // remove display: none - this.css({ display: '' }); - - var options = this.layout.options; - - var onTransitionEnd = {}; - var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle'); - onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd; - - this.transition({ - from: options.hiddenStyle, - to: options.visibleStyle, - isCleaning: true, - onTransitionEnd: onTransitionEnd - }); -}; - -proto.onRevealTransitionEnd = function() { - // check if still visible - // during transition, item may have been hidden - if ( !this.isHidden ) { - this.emitEvent('reveal'); - } -}; - -/** - * get style property use for hide/reveal transition end - * @param {String} styleProperty - hiddenStyle/visibleStyle - * @returns {String} - */ -proto.getHideRevealTransitionEndProperty = function( styleProperty ) { - var optionStyle = this.layout.options[ styleProperty ]; - // use opacity - if ( optionStyle.opacity ) { - return 'opacity'; - } - // get first property - for ( var prop in optionStyle ) { - return prop; - } -}; - -proto.hide = function() { - // set flag - this.isHidden = true; - // remove display: none - this.css({ display: '' }); - - var options = this.layout.options; - - var onTransitionEnd = {}; - var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle'); - onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd; - - this.transition({ - from: options.visibleStyle, - to: options.hiddenStyle, - // keep hidden stuff hidden - isCleaning: true, - onTransitionEnd: onTransitionEnd - }); -}; - -proto.onHideTransitionEnd = function() { - // check if still hidden - // during transition, item may have been un-hidden - if ( this.isHidden ) { - this.css({ display: 'none' }); - this.emitEvent('hide'); - } -}; - -proto.destroy = function() { - this.css({ - position: '', - left: '', - right: '', - top: '', - bottom: '', - transition: '', - transform: '' - }); -}; - -return Item; - -})); - -/*! - * Outlayer v2.1.0 - * the brains and guts of a layout library - * MIT license - */ - -( function( window, factory ) { - 'use strict'; - // universal module definition - /* jshint strict: false */ /* globals define, module, require */ - if ( typeof define == 'function' && define.amd ) { - // AMD - RequireJS - define( 'outlayer/outlayer',[ - 'ev-emitter/ev-emitter', - 'get-size/get-size', - 'fizzy-ui-utils/utils', - './item' - ], - function( EvEmitter, getSize, utils, Item ) { - return factory( window, EvEmitter, getSize, utils, Item); - } - ); - } else if ( typeof module == 'object' && module.exports ) { - // CommonJS - Browserify, Webpack - module.exports = factory( - window, - require('ev-emitter'), - require('get-size'), - require('fizzy-ui-utils'), - require('./item') - ); - } else { - // browser global - window.Outlayer = factory( - window, - window.EvEmitter, - window.getSize, - window.fizzyUIUtils, - window.Outlayer.Item - ); - } - -}( window, function factory( window, EvEmitter, getSize, utils, Item ) { -'use strict'; - -// ----- vars ----- // - -var console = window.console; -var jQuery = window.jQuery; -var noop = function() {}; - -// -------------------------- Outlayer -------------------------- // - -// globally unique identifiers -var GUID = 0; -// internal store of all Outlayer intances -var instances = {}; - - -/** - * @param {Element, String} element - * @param {Object} options - * @constructor - */ -function Outlayer( element, options ) { - var queryElement = utils.getQueryElement( element ); - if ( !queryElement ) { - if ( console ) { - console.error( 'Bad element for ' + this.constructor.namespace + - ': ' + ( queryElement || element ) ); - } - return; - } - this.element = queryElement; - // add jQuery - if ( jQuery ) { - this.$element = jQuery( this.element ); - } - - // options - this.options = utils.extend( {}, this.constructor.defaults ); - this.option( options ); - - // add id for Outlayer.getFromElement - var id = ++GUID; - this.element.outlayerGUID = id; // expando - instances[ id ] = this; // associate via id - - // kick it off - this._create(); - - var isInitLayout = this._getOption('initLayout'); - if ( isInitLayout ) { - this.layout(); - } -} - -// settings are for internal use only -Outlayer.namespace = 'outlayer'; -Outlayer.Item = Item; - -// default options -Outlayer.defaults = { - containerStyle: { - position: 'relative' - }, - initLayout: true, - originLeft: true, - originTop: true, - resize: true, - resizeContainer: true, - // item options - transitionDuration: '0.4s', - hiddenStyle: { - opacity: 0, - transform: 'scale(0.001)' - }, - visibleStyle: { - opacity: 1, - transform: 'scale(1)' - } -}; - -var proto = Outlayer.prototype; -// inherit EvEmitter -utils.extend( proto, EvEmitter.prototype ); - -/** - * set options - * @param {Object} opts - */ -proto.option = function( opts ) { - utils.extend( this.options, opts ); -}; - -/** - * get backwards compatible option value, check old name - */ -proto._getOption = function( option ) { - var oldOption = this.constructor.compatOptions[ option ]; - return oldOption && this.options[ oldOption ] !== undefined ? - this.options[ oldOption ] : this.options[ option ]; -}; - -Outlayer.compatOptions = { - // currentName: oldName - initLayout: 'isInitLayout', - horizontal: 'isHorizontal', - layoutInstant: 'isLayoutInstant', - originLeft: 'isOriginLeft', - originTop: 'isOriginTop', - resize: 'isResizeBound', - resizeContainer: 'isResizingContainer' -}; - -proto._create = function() { - // get items from children - this.reloadItems(); - // elements that affect layout, but are not laid out - this.stamps = []; - this.stamp( this.options.stamp ); - // set container style - utils.extend( this.element.style, this.options.containerStyle ); - - // bind resize method - var canBindResize = this._getOption('resize'); - if ( canBindResize ) { - this.bindResize(); - } -}; - -// goes through all children again and gets bricks in proper order -proto.reloadItems = function() { - // collection of item elements - this.items = this._itemize( this.element.children ); -}; - - -/** - * turn elements into Outlayer.Items to be used in layout - * @param {Array or NodeList or HTMLElement} elems - * @returns {Array} items - collection of new Outlayer Items - */ -proto._itemize = function( elems ) { - - var itemElems = this._filterFindItemElements( elems ); - var Item = this.constructor.Item; - - // create new Outlayer Items for collection - var items = []; - for ( var i=0; i < itemElems.length; i++ ) { - var elem = itemElems[i]; - var item = new Item( elem, this ); - items.push( item ); - } - - return items; -}; - -/** - * get item elements to be used in layout - * @param {Array or NodeList or HTMLElement} elems - * @returns {Array} items - item elements - */ -proto._filterFindItemElements = function( elems ) { - return utils.filterFindElements( elems, this.options.itemSelector ); -}; - -/** - * getter method for getting item elements - * @returns {Array} elems - collection of item elements - */ -proto.getItemElements = function() { - return this.items.map( function( item ) { - return item.element; - }); -}; - -// ----- init & layout ----- // - -/** - * lays out all items - */ -proto.layout = function() { - this._resetLayout(); - this._manageStamps(); - - // don't animate first layout - var layoutInstant = this._getOption('layoutInstant'); - var isInstant = layoutInstant !== undefined ? - layoutInstant : !this._isLayoutInited; - this.layoutItems( this.items, isInstant ); - - // flag for initalized - this._isLayoutInited = true; -}; - -// _init is alias for layout -proto._init = proto.layout; - -/** - * logic before any new layout - */ -proto._resetLayout = function() { - this.getSize(); -}; - - -proto.getSize = function() { - this.size = getSize( this.element ); -}; - -/** - * get measurement from option, for columnWidth, rowHeight, gutter - * if option is String -> get element from selector string, & get size of element - * if option is Element -> get size of element - * else use option as a number - * - * @param {String} measurement - * @param {String} size - width or height - * @private - */ -proto._getMeasurement = function( measurement, size ) { - var option = this.options[ measurement ]; - var elem; - if ( !option ) { - // default to 0 - this[ measurement ] = 0; - } else { - // use option as an element - if ( typeof option == 'string' ) { - elem = this.element.querySelector( option ); - } else if ( option instanceof HTMLElement ) { - elem = option; - } - // use size of element, if element - this[ measurement ] = elem ? getSize( elem )[ size ] : option; - } -}; - -/** - * layout a collection of item elements - * @api public - */ -proto.layoutItems = function( items, isInstant ) { - items = this._getItemsForLayout( items ); - - this._layoutItems( items, isInstant ); - - this._postLayout(); -}; - -/** - * get the items to be laid out - * you may want to skip over some items - * @param {Array} items - * @returns {Array} items - */ -proto._getItemsForLayout = function( items ) { - return items.filter( function( item ) { - return !item.isIgnored; - }); -}; - -/** - * layout items - * @param {Array} items - * @param {Boolean} isInstant - */ -proto._layoutItems = function( items, isInstant ) { - this._emitCompleteOnItems( 'layout', items ); - - if ( !items || !items.length ) { - // no items, emit event with empty array - return; - } - - var queue = []; - - items.forEach( function( item ) { - // get x/y object from method - var position = this._getItemLayoutPosition( item ); - // enqueue - position.item = item; - position.isInstant = isInstant || item.isLayoutInstant; - queue.push( position ); - }, this ); - - this._processLayoutQueue( queue ); -}; - -/** - * get item layout position - * @param {Outlayer.Item} item - * @returns {Object} x and y position - */ -proto._getItemLayoutPosition = function( /* item */ ) { - return { - x: 0, - y: 0 - }; -}; - -/** - * iterate over array and position each item - * Reason being - separating this logic prevents 'layout invalidation' - * thx @paul_irish - * @param {Array} queue - */ -proto._processLayoutQueue = function( queue ) { - this.updateStagger(); - queue.forEach( function( obj, i ) { - this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i ); - }, this ); -}; - -// set stagger from option in milliseconds number -proto.updateStagger = function() { - var stagger = this.options.stagger; - if ( stagger === null || stagger === undefined ) { - this.stagger = 0; - return; - } - this.stagger = getMilliseconds( stagger ); - return this.stagger; -}; - -/** - * Sets position of item in DOM - * @param {Outlayer.Item} item - * @param {Number} x - horizontal position - * @param {Number} y - vertical position - * @param {Boolean} isInstant - disables transitions - */ -proto._positionItem = function( item, x, y, isInstant, i ) { - if ( isInstant ) { - // if not transition, just set CSS - item.goTo( x, y ); - } else { - item.stagger( i * this.stagger ); - item.moveTo( x, y ); - } -}; - -/** - * Any logic you want to do after each layout, - * i.e. size the container - */ -proto._postLayout = function() { - this.resizeContainer(); -}; - -proto.resizeContainer = function() { - var isResizingContainer = this._getOption('resizeContainer'); - if ( !isResizingContainer ) { - return; - } - var size = this._getContainerSize(); - if ( size ) { - this._setContainerMeasure( size.width, true ); - this._setContainerMeasure( size.height, false ); - } -}; - -/** - * Sets width or height of container if returned - * @returns {Object} size - * @param {Number} width - * @param {Number} height - */ -proto._getContainerSize = noop; - -/** - * @param {Number} measure - size of width or height - * @param {Boolean} isWidth - */ -proto._setContainerMeasure = function( measure, isWidth ) { - if ( measure === undefined ) { - return; - } - - var elemSize = this.size; - // add padding and border width if border box - if ( elemSize.isBorderBox ) { - measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight + - elemSize.borderLeftWidth + elemSize.borderRightWidth : - elemSize.paddingBottom + elemSize.paddingTop + - elemSize.borderTopWidth + elemSize.borderBottomWidth; - } - - measure = Math.max( measure, 0 ); - this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px'; -}; - -/** - * emit eventComplete on a collection of items events - * @param {String} eventName - * @param {Array} items - Outlayer.Items - */ -proto._emitCompleteOnItems = function( eventName, items ) { - var _this = this; - function onComplete() { - _this.dispatchEvent( eventName + 'Complete', null, [ items ] ); - } - - var count = items.length; - if ( !items || !count ) { - onComplete(); - return; - } - - var doneCount = 0; - function tick() { - doneCount++; - if ( doneCount == count ) { - onComplete(); - } - } - - // bind callback - items.forEach( function( item ) { - item.once( eventName, tick ); - }); -}; - -/** - * emits events via EvEmitter and jQuery events - * @param {String} type - name of event - * @param {Event} event - original event - * @param {Array} args - extra arguments - */ -proto.dispatchEvent = function( type, event, args ) { - // add original event to arguments - var emitArgs = event ? [ event ].concat( args ) : args; - this.emitEvent( type, emitArgs ); - - if ( jQuery ) { - // set this.$element - this.$element = this.$element || jQuery( this.element ); - if ( event ) { - // create jQuery event - var $event = jQuery.Event( event ); - $event.type = type; - this.$element.trigger( $event, args ); - } else { - // just trigger with type if no event available - this.$element.trigger( type, args ); - } - } -}; - -// -------------------------- ignore & stamps -------------------------- // - - -/** - * keep item in collection, but do not lay it out - * ignored items do not get skipped in layout - * @param {Element} elem - */ -proto.ignore = function( elem ) { - var item = this.getItem( elem ); - if ( item ) { - item.isIgnored = true; - } -}; - -/** - * return item to layout collection - * @param {Element} elem - */ -proto.unignore = function( elem ) { - var item = this.getItem( elem ); - if ( item ) { - delete item.isIgnored; - } -}; - -/** - * adds elements to stamps - * @param {NodeList, Array, Element, or String} elems - */ -proto.stamp = function( elems ) { - elems = this._find( elems ); - if ( !elems ) { - return; - } - - this.stamps = this.stamps.concat( elems ); - // ignore - elems.forEach( this.ignore, this ); -}; - -/** - * removes elements to stamps - * @param {NodeList, Array, or Element} elems - */ -proto.unstamp = function( elems ) { - elems = this._find( elems ); - if ( !elems ){ - return; - } - - elems.forEach( function( elem ) { - // filter out removed stamp elements - utils.removeFrom( this.stamps, elem ); - this.unignore( elem ); - }, this ); -}; - -/** - * finds child elements - * @param {NodeList, Array, Element, or String} elems - * @returns {Array} elems - */ -proto._find = function( elems ) { - if ( !elems ) { - return; - } - // if string, use argument as selector string - if ( typeof elems == 'string' ) { - elems = this.element.querySelectorAll( elems ); - } - elems = utils.makeArray( elems ); - return elems; -}; - -proto._manageStamps = function() { - if ( !this.stamps || !this.stamps.length ) { - return; - } - - this._getBoundingRect(); - - this.stamps.forEach( this._manageStamp, this ); -}; - -// update boundingLeft / Top -proto._getBoundingRect = function() { - // get bounding rect for container element - var boundingRect = this.element.getBoundingClientRect(); - var size = this.size; - this._boundingRect = { - left: boundingRect.left + size.paddingLeft + size.borderLeftWidth, - top: boundingRect.top + size.paddingTop + size.borderTopWidth, - right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ), - bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth ) - }; -}; - -/** - * @param {Element} stamp -**/ -proto._manageStamp = noop; - -/** - * get x/y position of element relative to container element - * @param {Element} elem - * @returns {Object} offset - has left, top, right, bottom - */ -proto._getElementOffset = function( elem ) { - var boundingRect = elem.getBoundingClientRect(); - var thisRect = this._boundingRect; - var size = getSize( elem ); - var offset = { - left: boundingRect.left - thisRect.left - size.marginLeft, - top: boundingRect.top - thisRect.top - size.marginTop, - right: thisRect.right - boundingRect.right - size.marginRight, - bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom - }; - return offset; -}; - -// -------------------------- resize -------------------------- // - -// enable event handlers for listeners -// i.e. resize -> onresize -proto.handleEvent = utils.handleEvent; - -/** - * Bind layout to window resizing - */ -proto.bindResize = function() { - window.addEventListener( 'resize', this ); - this.isResizeBound = true; -}; - -/** - * Unbind layout to window resizing - */ -proto.unbindResize = function() { - window.removeEventListener( 'resize', this ); - this.isResizeBound = false; -}; - -proto.onresize = function() { - this.resize(); -}; - -utils.debounceMethod( Outlayer, 'onresize', 100 ); - -proto.resize = function() { - // don't trigger if size did not change - // or if resize was unbound. See #9 - if ( !this.isResizeBound || !this.needsResizeLayout() ) { - return; - } - - this.layout(); -}; - -/** - * check if layout is needed post layout - * @returns Boolean - */ -proto.needsResizeLayout = function() { - var size = getSize( this.element ); - // check that this.size and size are there - // IE8 triggers resize on body size change, so they might not be - var hasSizes = this.size && size; - return hasSizes && size.innerWidth !== this.size.innerWidth; -}; - -// -------------------------- methods -------------------------- // - -/** - * add items to Outlayer instance - * @param {Array or NodeList or Element} elems - * @returns {Array} items - Outlayer.Items -**/ -proto.addItems = function( elems ) { - var items = this._itemize( elems ); - // add items to collection - if ( items.length ) { - this.items = this.items.concat( items ); - } - return items; -}; - -/** - * Layout newly-appended item elements - * @param {Array or NodeList or Element} elems - */ -proto.appended = function( elems ) { - var items = this.addItems( elems ); - if ( !items.length ) { - return; - } - // layout and reveal just the new items - this.layoutItems( items, true ); - this.reveal( items ); -}; - -/** - * Layout prepended elements - * @param {Array or NodeList or Element} elems - */ -proto.prepended = function( elems ) { - var items = this._itemize( elems ); - if ( !items.length ) { - return; - } - // add items to beginning of collection - var previousItems = this.items.slice(0); - this.items = items.concat( previousItems ); - // start new layout - this._resetLayout(); - this._manageStamps(); - // layout new stuff without transition - this.layoutItems( items, true ); - this.reveal( items ); - // layout previous items - this.layoutItems( previousItems ); -}; - -/** - * reveal a collection of items - * @param {Array of Outlayer.Items} items - */ -proto.reveal = function( items ) { - this._emitCompleteOnItems( 'reveal', items ); - if ( !items || !items.length ) { - return; - } - var stagger = this.updateStagger(); - items.forEach( function( item, i ) { - item.stagger( i * stagger ); - item.reveal(); - }); -}; - -/** - * hide a collection of items - * @param {Array of Outlayer.Items} items - */ -proto.hide = function( items ) { - this._emitCompleteOnItems( 'hide', items ); - if ( !items || !items.length ) { - return; - } - var stagger = this.updateStagger(); - items.forEach( function( item, i ) { - item.stagger( i * stagger ); - item.hide(); - }); -}; - -/** - * reveal item elements - * @param {Array}, {Element}, {NodeList} items - */ -proto.revealItemElements = function( elems ) { - var items = this.getItems( elems ); - this.reveal( items ); -}; - -/** - * hide item elements - * @param {Array}, {Element}, {NodeList} items - */ -proto.hideItemElements = function( elems ) { - var items = this.getItems( elems ); - this.hide( items ); -}; - -/** - * get Outlayer.Item, given an Element - * @param {Element} elem - * @param {Function} callback - * @returns {Outlayer.Item} item - */ -proto.getItem = function( elem ) { - // loop through items to get the one that matches - for ( var i=0; i < this.items.length; i++ ) { - var item = this.items[i]; - if ( item.element == elem ) { - // return item - return item; - } - } -}; - -/** - * get collection of Outlayer.Items, given Elements - * @param {Array} elems - * @returns {Array} items - Outlayer.Items - */ -proto.getItems = function( elems ) { - elems = utils.makeArray( elems ); - var items = []; - elems.forEach( function( elem ) { - var item = this.getItem( elem ); - if ( item ) { - items.push( item ); - } - }, this ); - - return items; -}; - -/** - * remove element(s) from instance and DOM - * @param {Array or NodeList or Element} elems - */ -proto.remove = function( elems ) { - var removeItems = this.getItems( elems ); - - this._emitCompleteOnItems( 'remove', removeItems ); - - // bail if no items to remove - if ( !removeItems || !removeItems.length ) { - return; - } - - removeItems.forEach( function( item ) { - item.remove(); - // remove item from collection - utils.removeFrom( this.items, item ); - }, this ); -}; - -// ----- destroy ----- // - -// remove and disable Outlayer instance -proto.destroy = function() { - // clean up dynamic styles - var style = this.element.style; - style.height = ''; - style.position = ''; - style.width = ''; - // destroy items - this.items.forEach( function( item ) { - item.destroy(); - }); - - this.unbindResize(); - - var id = this.element.outlayerGUID; - delete instances[ id ]; // remove reference to instance by id - delete this.element.outlayerGUID; - // remove data for jQuery - if ( jQuery ) { - jQuery.removeData( this.element, this.constructor.namespace ); - } - -}; - -// -------------------------- data -------------------------- // - -/** - * get Outlayer instance from element - * @param {Element} elem - * @returns {Outlayer} - */ -Outlayer.data = function( elem ) { - elem = utils.getQueryElement( elem ); - var id = elem && elem.outlayerGUID; - return id && instances[ id ]; -}; - - -// -------------------------- create Outlayer class -------------------------- // - -/** - * create a layout class - * @param {String} namespace - */ -Outlayer.create = function( namespace, options ) { - // sub-class Outlayer - var Layout = subclass( Outlayer ); - // apply new options and compatOptions - Layout.defaults = utils.extend( {}, Outlayer.defaults ); - utils.extend( Layout.defaults, options ); - Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions ); - - Layout.namespace = namespace; - - Layout.data = Outlayer.data; - - // sub-class Item - Layout.Item = subclass( Item ); - - // -------------------------- declarative -------------------------- // - - utils.htmlInit( Layout, namespace ); - - // -------------------------- jQuery bridge -------------------------- // - - // make into jQuery plugin - if ( jQuery && jQuery.bridget ) { - jQuery.bridget( namespace, Layout ); - } - - return Layout; -}; - -function subclass( Parent ) { - function SubClass() { - Parent.apply( this, arguments ); - } - - SubClass.prototype = Object.create( Parent.prototype ); - SubClass.prototype.constructor = SubClass; - - return SubClass; -} - -// ----- helpers ----- // - -// how many milliseconds are in each unit -var msUnits = { - ms: 1, - s: 1000 -}; - -// munge time-like parameter into millisecond number -// '0.4s' -> 40 -function getMilliseconds( time ) { - if ( typeof time == 'number' ) { - return time; - } - var matches = time.match( /(^\d*\.?\d*)(\w*)/ ); - var num = matches && matches[1]; - var unit = matches && matches[2]; - if ( !num.length ) { - return 0; - } - num = parseFloat( num ); - var mult = msUnits[ unit ] || 1; - return num * mult; -} - -// ----- fin ----- // - -// back in global -Outlayer.Item = Item; - -return Outlayer; - -})); - -/*! - * Masonry v4.2.1 - * Cascading grid layout library - * https://masonry.desandro.com - * MIT License - * by David DeSandro - */ - -( function( window, factory ) { - // universal module definition - /* jshint strict: false */ /*globals define, module, require */ - if ( typeof define == 'function' && define.amd ) { - // AMD - define( [ - 'outlayer/outlayer', - 'get-size/get-size' - ], - factory ); - } else if ( typeof module == 'object' && module.exports ) { - // CommonJS - module.exports = factory( - require('outlayer'), - require('get-size') - ); - } else { - // browser global - window.Masonry = factory( - window.Outlayer, - window.getSize - ); - } - -}( window, function factory( Outlayer, getSize ) { - - - -// -------------------------- masonryDefinition -------------------------- // - - // create an Outlayer layout class - var Masonry = Outlayer.create('masonry'); - // isFitWidth -> fitWidth - Masonry.compatOptions.fitWidth = 'isFitWidth'; - - var proto = Masonry.prototype; - - proto._resetLayout = function() { - this.getSize(); - this._getMeasurement( 'columnWidth', 'outerWidth' ); - this._getMeasurement( 'gutter', 'outerWidth' ); - this.measureColumns(); - - // reset column Y - this.colYs = []; - for ( var i=0; i < this.cols; i++ ) { - this.colYs.push( 0 ); - } - - this.maxY = 0; - this.horizontalColIndex = 0; - }; - - proto.measureColumns = function() { - this.getContainerWidth(); - // if columnWidth is 0, default to outerWidth of first item - if ( !this.columnWidth ) { - var firstItem = this.items[0]; - var firstItemElem = firstItem && firstItem.element; - // columnWidth fall back to item of first element - this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth || - // if first elem has no width, default to size of container - this.containerWidth; - } - - var columnWidth = this.columnWidth += this.gutter; - - // calculate columns - var containerWidth = this.containerWidth + this.gutter; - var cols = containerWidth / columnWidth; - // fix rounding errors, typically with gutters - var excess = columnWidth - containerWidth % columnWidth; - // if overshoot is less than a pixel, round up, otherwise floor it - var mathMethod = excess && excess < 1 ? 'round' : 'floor'; - cols = Math[ mathMethod ]( cols ); - this.cols = Math.max( cols, 1 ); - }; - - proto.getContainerWidth = function() { - // container is parent if fit width - var isFitWidth = this._getOption('fitWidth'); - var container = isFitWidth ? this.element.parentNode : this.element; - // check that this.size and size are there - // IE8 triggers resize on body size change, so they might not be - var size = getSize( container ); - this.containerWidth = size && size.innerWidth; - }; - - proto._getItemLayoutPosition = function( item ) { - item.getSize(); - // how many columns does this brick span - var remainder = item.size.outerWidth % this.columnWidth; - var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; - // round if off by 1 pixel, otherwise use ceil - var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth ); - colSpan = Math.min( colSpan, this.cols ); - // use horizontal or top column position - var colPosMethod = this.options.horizontalOrder ? - '_getHorizontalColPosition' : '_getTopColPosition'; - var colPosition = this[ colPosMethod ]( colSpan, item ); - // position the brick - var position = { - x: this.columnWidth * colPosition.col, - y: colPosition.y - }; - // apply setHeight to necessary columns - var setHeight = colPosition.y + item.size.outerHeight; - var setMax = colSpan + colPosition.col; - for ( var i = colPosition.col; i < setMax; i++ ) { - this.colYs[i] = setHeight; - } - - return position; - }; - - proto._getTopColPosition = function( colSpan ) { - var colGroup = this._getTopColGroup( colSpan ); - // get the minimum Y value from the columns - var minimumY = Math.min.apply( Math, colGroup ); - - return { - col: colGroup.indexOf( minimumY ), - y: minimumY, - }; - }; - - /** - * @param {Number} colSpan - number of columns the element spans - * @returns {Array} colGroup - */ - proto._getTopColGroup = function( colSpan ) { - if ( colSpan < 2 ) { - // if brick spans only one column, use all the column Ys - return this.colYs; - } - - var colGroup = []; - // how many different places could this brick fit horizontally - var groupCount = this.cols + 1 - colSpan; - // for each group potential horizontal position - for ( var i = 0; i < groupCount; i++ ) { - colGroup[i] = this._getColGroupY( i, colSpan ); - } - return colGroup; - }; - - proto._getColGroupY = function( col, colSpan ) { - if ( colSpan < 2 ) { - return this.colYs[ col ]; - } - // make an array of colY values for that one group - var groupColYs = this.colYs.slice( col, col + colSpan ); - // and get the max value of the array - return Math.max.apply( Math, groupColYs ); - }; - - // get column position based on horizontal index. #873 - proto._getHorizontalColPosition = function( colSpan, item ) { - var col = this.horizontalColIndex % this.cols; - var isOver = colSpan > 1 && col + colSpan > this.cols; - // shift to next row if item can't fit on current row - col = isOver ? 0 : col; - // don't let zero-size items take up space - var hasSize = item.size.outerWidth && item.size.outerHeight; - this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex; - - return { - col: col, - y: this._getColGroupY( col, colSpan ), - }; - }; - - proto._manageStamp = function( stamp ) { - var stampSize = getSize( stamp ); - var offset = this._getElementOffset( stamp ); - // get the columns that this stamp affects - var isOriginLeft = this._getOption('originLeft'); - var firstX = isOriginLeft ? offset.left : offset.right; - var lastX = firstX + stampSize.outerWidth; - var firstCol = Math.floor( firstX / this.columnWidth ); - firstCol = Math.max( 0, firstCol ); - var lastCol = Math.floor( lastX / this.columnWidth ); - // lastCol should not go over if multiple of columnWidth #425 - lastCol -= lastX % this.columnWidth ? 0 : 1; - lastCol = Math.min( this.cols - 1, lastCol ); - // set colYs to bottom of the stamp - - var isOriginTop = this._getOption('originTop'); - var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) + - stampSize.outerHeight; - for ( var i = firstCol; i <= lastCol; i++ ) { - this.colYs[i] = Math.max( stampMaxY, this.colYs[i] ); - } - }; - - proto._getContainerSize = function() { - this.maxY = Math.max.apply( Math, this.colYs ); - var size = { - height: this.maxY - }; - - if ( this._getOption('fitWidth') ) { - size.width = this._getContainerFitWidth(); - } - - return size; - }; - - proto._getContainerFitWidth = function() { - var unusedCols = 0; - // count unused columns - var i = this.cols; - while ( --i ) { - if ( this.colYs[i] !== 0 ) { - break; - } - unusedCols++; - } - // fit container to columns that have been used - return ( this.cols - unusedCols ) * this.columnWidth - this.gutter; - }; - - proto.needsResizeLayout = function() { - var previousWidth = this.containerWidth; - this.getContainerWidth(); - return previousWidth != this.containerWidth; - }; - - return Masonry; - -})); diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.proxy-all.js b/ckan/public-bs2/base/javascript/plugins/jquery.proxy-all.js deleted file mode 100644 index f9b3bbf1c01..00000000000 --- a/ckan/public-bs2/base/javascript/plugins/jquery.proxy-all.js +++ /dev/null @@ -1,47 +0,0 @@ -(function (jQuery) { - /* Works in a similar fashion to underscore's _.bindAll() but also accepts - * regular expressions for method names. - * - * obj - An object to proxy methods. - * args... - Successive method names or regular expressions to bind. - * - * Examples - * - * var obj = { - * _onClick: function () {} - * _onSave: function () {} - * }; - * - * // Provide method names to proxy/bind to obj scope. - * jQuery.bindAll(obj, '_onClick', '_onSave'); - * - * // Use a RegExp to match patterns. - * jQuery.bindAll(obj, /^_on/); - * - * Returns the original object. - */ - jQuery.proxyAll = function (obj /*, args... */) { - var methods = [].slice.call(arguments, 1); - var index = 0; - var length = methods.length; - var property; - var method; - - for (; index < length; index += 1) { - method = methods[index]; - - for (property in obj) { - if (typeof obj[property] === 'function') { - if ((method instanceof RegExp && method.test(property)) || property === method) { - if (obj[property].proxied !== true) { - obj[property] = jQuery.proxy(obj[property], obj); - obj[property].proxied = true; - } - } - } - } - } - - return obj; - }; -})(this.jQuery); diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.slug-preview.js b/ckan/public-bs2/base/javascript/plugins/jquery.slug-preview.js deleted file mode 100644 index fd3cb170cb9..00000000000 --- a/ckan/public-bs2/base/javascript/plugins/jquery.slug-preview.js +++ /dev/null @@ -1,80 +0,0 @@ -/* Creates a new preview element for a slug field that displays an example of - * what the slug will look like. Also provides an edit button to toggle back - * to the original form element. - * - * options - An object of plugin options (defaults to slugPreview.defaults). - * prefix: An optional prefix to apply before the slug field. - * placeholder: Optional placeholder when there is no slug. - * i18n: Provide alternative translations for the plugin string. - * template: Provide alternative markup for the plugin. - * - * Examples - * - * var previews = jQuery('[name=slug]').slugPreview({ - * prefix: 'example.com/resource/', - * placeholder: '', - * i18n: {edit: 'éditer'} - * }); - * // previews === preview objects. - * // previews.end() === [name=slug] objects. - * - * Returns the newly created collection of preview elements.. - */ -(function ($, window) { - var escape = $.url.escape; - - function slugPreview(options) { - options = $.extend(true, slugPreview.defaults, options || {}); - - var collected = this.map(function () { - var element = $(this); - var field = element.find('input'); - var preview = $(options.template); - var value = preview.find('.slug-preview-value'); - var required = $('
    ').append($('.control-required', element).clone()).html(); - - function setValue() { - var val = escape(field.val()) || options.placeholder; - value.text(val); - } - - preview.find('strong').html(required + ' ' + options.i18n['URL'] + ':'); - preview.find('.slug-preview-prefix').text(options.prefix); - preview.find('button').text(options.i18n['Edit']).click(function (event) { - event.preventDefault(); - element.show(); - preview.hide(); - }); - - setValue(); - field.on('change', setValue); - - element.after(preview).hide(); - - return preview[0]; - }); - - // Append the new elements to the current jQuery stack so that the caller - // can modify the elements. Then restore the originals by calling .end(). - return this.pushStack(collected); - } - - slugPreview.defaults = { - prefix: '', - placeholder: '', - i18n: { - 'URL': 'URL', - 'Edit': 'Edit' - }, - template: [ - '
    ', - '', - '', - '', - '
    ' - ].join('\n') - }; - - $.fn.slugPreview = slugPreview; - -})(this.jQuery, this); diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.slug.js b/ckan/public-bs2/base/javascript/plugins/jquery.slug.js deleted file mode 100644 index 22e17b18b45..00000000000 --- a/ckan/public-bs2/base/javascript/plugins/jquery.slug.js +++ /dev/null @@ -1,83 +0,0 @@ -/* Restricts the input into the field to just slug safe characters. - * - * The element will also fire the "slugify" event passing in the new and - * previous strings as arguments. - * - * Examples - * - * var slug = jQuery([name=slug]).slug(); - * - * slug.on('slugify', function (event, current, previous) { - * console.log("value was: %s, and is now %s", current, previous); - * }); - * - * Returns the jQuery collection. - */ -(function ($) { - - /* Handles the on change event that "slugifies" the entire string. This - * catches text pasted into the input. - * - * event - the DOM event object. - * - * Returns nothing. - */ - function onChange(event) { - var value = this.value; - var updated = $.url.slugify(value, true); - - if (value !== updated) { - this.value = updated; - $(this).trigger('slugify', [this.value, value]); - } - } - - /* Handles the keypress event that will convert each character as the user - * inputs new text. This will not catch text pasted into the input. - * - * event - the DOM event object. - * - * Returns nothing. - */ - function onKeypress(event) { - if (!event.charCode) { - return; - } - - event.preventDefault(); - - var value = this.value; - var start = this.selectionStart; - var end = this.selectionEnd; - var char = String.fromCharCode(event.charCode); - var updated; - var range; - - if (this.setSelectionRange) { - updated = value.substring(0, start) + char + value.substring(end, value.length); - - this.value = $.url.slugify(updated, false); - this.setSelectionRange(start + 1, start + 1); - } else if (document.selection && document.selection.createRange) { - range = document.selection.createRange(); - range.text = char + range.text; - } - - $(this).trigger('slugify', [this.value, value]); - } - - /* The jQuery plugin for converting an input. - */ - $.fn.slug = function () { - return this.each(function () { - $(this).on({ - 'blur.slug': onChange, - 'change.slug': onChange, - 'keypress.slug': onKeypress - }); - }); - }; - - // Export the methods onto the plugin for testability. - $.extend($.fn.slug, {onChange: onChange, onKeypress: onKeypress}); -})(this.jQuery); diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.truncator.js b/ckan/public-bs2/base/javascript/plugins/jquery.truncator.js deleted file mode 100644 index 983f45b246a..00000000000 --- a/ckan/public-bs2/base/javascript/plugins/jquery.truncator.js +++ /dev/null @@ -1,145 +0,0 @@ -// HTML Truncator for jQuery -// by Henrik Nyh 2008-02-28. -// Free to modify and redistribute with credit. - -// EDIT: This plug-in has been modified from the original source to enable -// some additional functionality. -// -// a) We now return the newly created "truncated" elements as a jQuery -// collection. This can be restored as usual using .end(). -// b) We trigger the "expand.truncate" and "collapse.truncate" events when -// the occur. The event object has an additional .relatedTarget property -// which is the original expanded element. -// c) We add an "ellipses" option that places the ellipses outside of the -// expand/collapse links. -// -// We do this because this is the best plug-in I've found that handles -// truncation of elements containing HTML components. Even better would be -// to find one that can also be provided with a number of lines. -// -// Requirements are: -// -// 1. Must truncate the contents of an element keeping elements intact. -// 2. Must be extensible trigger events when expand/collapse occurs. -// 3. Truncate to a set number of lines rather than just characters. -// -(function($) { - - var trailing_whitespace = true; - - $.fn.truncate = function(options) { - - var opts = $.extend({}, $.fn.truncate.defaults, options); - - var collected = this.map(function() { - - var content_length = $.trim(squeeze($(this).text())).length; - if (content_length <= opts.max_length) - return; // bail early if not overlong - - // include more text, link prefix, and link suffix in max length - var actual_max_length = opts.max_length - opts.more.length - opts.link_prefix.length - opts.link_suffix.length; - - var truncated_node = recursivelyTruncate(this, actual_max_length); - var full_node = $(this).hide(); - - truncated_node.insertAfter(full_node); - - findNodeForMore(truncated_node).append(opts.ellipses + opts.link_prefix+''+opts.more+''+opts.link_suffix); - findNodeForLess(full_node).append(opts.link_prefix+''+opts.less+''+opts.link_suffix); - - truncated_node.find('a:last').click(function(event) { - event.preventDefault(); - truncated_node.hide(); full_node.show(); - - // Trigger an event for extensibility. - truncated_node.trigger({ - type: 'expand.truncate', - relatedTarget: full_node[0] - }); - }); - full_node.find('a:last').click(function(event) { - event.preventDefault(); - truncated_node.show(); full_node.hide(); - - // Trigger an event for extensibility. - truncated_node.trigger({ - type: 'collapse.truncate', - relatedTarget: full_node[0] - }); - }); - - // Return our new truncated node. - return truncated_node[0]; - }); - - // Return the newly created elements. - return this.pushStack(collected); - } - - // Note that the " (…more)" bit counts towards the max length – so a max - // length of 10 would truncate "1234567890" to "12 (…more)". - $.fn.truncate.defaults = { - max_length: 100, - more: 'more', - less: 'less', - ellipses: '…', - css_more_class: 'truncator-link truncator-more', - css_less_class: 'truncator-link truncator-less', - link_prefix: ' (', - link_suffix: ')' - }; - - function recursivelyTruncate(node, max_length) { - return (node.nodeType == 3) ? truncateText(node, max_length) : truncateNode(node, max_length); - } - - function truncateNode(node, max_length) { - var node = $(node); - var new_node = node.clone().empty(); - var truncatedChild; - node.contents().each(function() { - var remaining_length = max_length - new_node.text().length; - if (remaining_length == 0) return; // breaks the loop - truncatedChild = recursivelyTruncate(this, remaining_length); - if (truncatedChild) new_node.append(truncatedChild); - }); - return new_node; - } - - function truncateText(node, max_length) { - var text = squeeze(node.data); - if (trailing_whitespace) // remove initial whitespace if last text - text = text.replace(/^ /, ''); // node had trailing whitespace. - trailing_whitespace = !!text.match(/ $/); - var text = text.slice(0, max_length); - // Ensure HTML entities are encoded - // http://debuggable.com/posts/encode-html-entities-with-jquery:480f4dd6-13cc-4ce9-8071-4710cbdd56cb - text = $('
    ').text(text).html(); - return text; - } - - // Collapses a sequence of whitespace into a single space. - function squeeze(string) { - return string.replace(/\s+/g, ' '); - } - - // Finds the last, innermost block-level element - function findNodeForMore(node) { - var $node = $(node); - var last_child = $node.children(":last"); - if (!last_child) return node; - var display = last_child.css('display'); - if (!display || display=='inline') return $node; - return findNodeForMore(last_child); - }; - - // Finds the last child if it's a p; otherwise the parent - function findNodeForLess(node) { - var $node = $(node); - var last_child = $node.children(":last"); - if (last_child && last_child.is('p')) return last_child; - return node; - }; - -})(jQuery); diff --git a/ckan/public-bs2/base/javascript/plugins/jquery.url-helpers.js b/ckan/public-bs2/base/javascript/plugins/jquery.url-helpers.js deleted file mode 100644 index f92d62923da..00000000000 --- a/ckan/public-bs2/base/javascript/plugins/jquery.url-helpers.js +++ /dev/null @@ -1,167 +0,0 @@ -/* .slugify() based on jQuery Slugify a string! by Pablo Bandin - * - * See: http://tracehello.wordpress.com/2011/06/15/jquery-real-slugify-plugin/ - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ -(function ($, window) { - $.url = { - /* Escapes a string for use in a url component. All special characters - * are url encoded and spaces are replaced by a plus rather than a %20. - * - * string - A string to convert. - * - * Examples - * - * jQuery.url.escape('apples & pears'); //=> "apples+%26+pears" - * - * Returns the escaped string. - */ - escape: function (string) { - return window.encodeURIComponent(string || '').replace(/%20/g, '+'); - }, - - /* Converts a string into a url compatible slug. Characters that cannot - * be converted will be replaced by hyphens. - * - * string - The string to convert. - * trim - Remove starting, trailing and duplicate hyphens (default: true) - * - * Examples - * - * jQuery.url.slugify('apples & pears'); //=> 'apples-pears' - * - * Returns the new slug. - */ - slugify: function (string, trim) { - var str = ''; - var index = 0; - var length = string.length; - var map = this.map; - - for (;index < length; index += 1) { - str += map[string.charCodeAt(index).toString(16)] || '-'; - } - - str = str.toLowerCase(); - - return trim === false ? str : str.replace(/\-+/g, '-').replace(/^-|-$/g, ''); - } - }; - - // The following takes two sets of characters, the first a set of hexadecimal - // Unicode character points, the second their visually similar counterparts. - // I'm not 100% sure this is the best way to handle such characters but - // it seems to be a common practice. - var unicode = ('20 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 ' + - '47 48 49 50 51 52 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 70 ' + - '71 72 73 74 75 76 77 78 79 100 101 102 103 104 105 106 107 108 109 ' + - '110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 ' + - '126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 ' + - '142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 ' + - '158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 ' + - '174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 ' + - '190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 ' + - '206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 ' + - '222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 ' + - '238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 ' + - '254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ' + - '270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 ' + - '286 287 288 289 290 291 292 293 294 295 296 297 298 299 363 364 ' + - '365 366 367 368 369 386 388 389 390 391 392 393 394 395 396 397 ' + - '398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 ' + - '414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 ' + - '430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 ' + - '446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 ' + - '462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 ' + - '478 479 480 481 490 491 492 493 494 495 496 497 498 499 500 501 ' + - '502 503 504 505 506 507 508 509 510 511 512 513 514 515 531 532 ' + - '533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 ' + - '549 550 551 552 553 554 555 556 561 562 563 564 565 566 567 568 ' + - '569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 ' + - '585 586 587 4a 4b 4c 4d 4e 4f 5a 6a 6b 6c 6d 6e 6f 7a a2 a3 a5 a7 ' + - 'a9 aa ae b2 b3 b5 b6 b9 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ' + - 'ce cf d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df e0 e1 e2 e3 ' + - 'e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f8 f9 fa ' + - 'fb fc fd ff 10a 10b 10c 10d 10e 10f 11a 11b 11c 11d 11e 11f 12a ' + - '12b 12c 12d 12e 12f 13a 13b 13c 13d 13e 13f 14a 14b 14c 14d 14e ' + - '14f 15a 15b 15c 15d 15e 15f 16a 16b 16c 16d 16e 16f 17a 17b 17c ' + - '17d 17e 17f 18a 18b 18c 18d 18e 18f 19a 19b 19c 19d 19e 19f 1a0 ' + - '1a1 1a2 1a3 1a4 1a5 1a6 1a7 1a8 1a9 1aa 1ab 1ac 1ad 1ae 1af 1b0 ' + - '1b1 1b2 1b3 1b4 1b5 1b6 1b7 1b8 1b9 1ba 1bb 1bc 1bd 1be 1bf 1c4 ' + - '1c5 1c6 1c7 1c8 1c9 1ca 1cb 1cc 1cd 1ce 1cf 1d0 1d1 1d2 1d3 1d4 ' + - '1d5 1d6 1d7 1d8 1d9 1da 1db 1dc 1dd 1de 1df 1e0 1e1 1e2 1e3 1e4 ' + - '1e5 1e6 1e7 1e8 1e9 1ea 1eb 1ec 1ed 1ee 1ef 1f0 1f1 1f2 1f3 1f4 ' + - '1f5 1f6 1f7 1f8 1f9 1fa 1fb 1fc 1fd 1fe 1ff 20a 20b 20c 20d 20e ' + - '20f 21a 21b 21c 21d 21e 21f 22a 22b 22c 22d 22e 22f 23a 23b 23c ' + - '23d 23e 23f 24a 24b 24c 24d 24e 24f 25a 25b 25c 25d 25e 25f 26a ' + - '26b 26c 26d 26e 26f 27a 27b 27c 27d 27e 27f 28a 28b 28c 28d 28e ' + - '28f 29a 29b 29c 29d 29e 29f 2a0 2a1 2a2 2a3 2a4 2a5 2a6 2a7 2a8 ' + - '2a9 2aa 2ab 2ac 2ae 2af 2b0 2b1 2b2 2b3 2b4 2b5 2b6 2b7 2b8 2df ' + - '2e0 2e1 2e2 2e3 2e4 36a 36b 36c 36d 36e 36f 37b 37c 37d 38a 38c ' + - '38e 38f 39a 39b 39c 39d 39e 39f 3a0 3a1 3a3 3a4 3a5 3a6 3a7 3a8 ' + - '3a9 3aa 3ab 3ac 3ad 3ae 3af 3b0 3b1 3b2 3b3 3b4 3b5 3b6 3b7 3b8 ' + - '3b9 3ba 3bb 3bc 3bd 3be 3bf 3c0 3c1 3c2 3c3 3c4 3c5 3c6 3c7 3c8 ' + - '3c9 3ca 3cb 3cc 3cd 3ce 3d0 3d1 3d2 3d3 3d4 3d5 3d6 3d7 3d8 3d9 ' + - '3da 3db 3dc 3dd 3de 3df 3e2 3e3 3e4 3e5 3e6 3e7 3e8 3e9 3ea 3eb ' + - '3ec 3ed 3ee 3ef 3f0 3f1 3f2 3f3 3f4 3f5 3f6 3f7 3f8 3f9 3fa 3fb ' + - '3fc 3fd 3fe 3ff 40a 40b 40c 40d 40e 40f 41a 41b 41c 41d 41e 41f ' + - '42a 42b 42c 42d 42e 42f 43a 43b 43c 43d 43e 43f 44a 44b 44c 44d ' + - '44e 44f 45a 45b 45c 45d 45e 45f 46a 46b 46c 46d 46e 46f 47a 47b ' + - '47c 47d 47e 47f 48a 48b 48c 48d 48e 48f 49a 49b 49c 49d 49e 49f ' + - '4a0 4a1 4a2 4a3 4a4 4a5 4a6 4a7 4a8 4a9 4aa 4ab 4ac 4ad 4ae 4af ' + - '4b0 4b1 4b2 4b3 4b4 4b5 4b6 4b7 4b8 4b9 4ba 4bb 4bc 4bd 4be 4bf ' + - '4c0 4c1 4c2 4c3 4c4 4c5 4c6 4c7 4c8 4c9 4ca 4cb 4cc 4cd 4ce 4cf ' + - '4d0 4d1 4d2 4d3 4d4 4d5 4d6 4d7 4d8 4d9 4da 4db 4dc 4dd 4de 4df ' + - '4e0 4e1 4e2 4e3 4e4 4e5 4e6 4e7 4e8 4e9 4ea 4eb 4ec 4ed 4ee 4ef ' + - '4f0 4f1 4f2 4f3 4f4 4f5 4f6 4f7 4f8 4f9 4fa 4fb 4fc 4fd 4fe 4ff ' + - '50a 50b 50c 50d 50e 50f 51a 51b 51c 51d 53a 53b 53c 53d 53e 53f ' + - '54a 54b 54c 54d 54e 54f 56a 56b 56c 56d 56e 56f 57a 57b 57c 57d ' + - '57e 57f 5f').split(' '); - - var replacement = ('- 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I P Q R S T ' + - 'U V W X Y a b c d e f g h i p q r s t u v w x y A a A a A a C c C c ' + - 'D d E e E e E e E e G g G g H h H h I i I i IJ ij J j K k k L l L l ' + - 'N n N n N n n O o OE oe R r R r R r S s T t T t T t U u U u U u W w ' + - 'Y y Y Z b B b b b b C C c D E F f G Y h i I K k A a A a E e E e I i ' + - 'R r R r U u U u S s n d 8 8 Z z A a E e O o Y y l n t j db qp < ? ? ' + - 'B U A E e J j a a a b c e d d e e g g g Y x u h h i i w m n n N o oe ' + - 'm o r R R S f f f f t t u Z Z 3 3 ? ? 5 C O B a e i o u c d A ' + - 'E H i A B r A E Z H O I E E T r E S I I J jb A B B r D E X 3 N N P ' + - 'C T y O X U h W W a 6 B r d e x 3 N N P C T Y qp x U h W W e e h r ' + - 'e s i i j jb W w Tb tb IC ic A a IA ia Y y O o V v V v Oy oy C c R ' + - 'r F f H h X x 3 3 d d d d R R R R JT JT E e JT jt JX JX U D Q N T ' + - '2 F r p z 2 n x U B j t n C R 8 R O P O S w f q n t q t n p h a n ' + - 'a u j u 2 n 2 n g l uh p o S u J K L M N O Z j k l m n o z c f Y s ' + - 'c a r 2 3 u p 1 A A A A A A AE C E E E E I I I I D N O O O O O X O ' + - 'U U U U Y p b a a a a a a ae c e e e e i i i i o n o o o o o o u u ' + - 'u u y y C c C c D d E e G g G g I i I i I i l L l L l L n n O o O ' + - 'o S s S s S s U u U u U u z Z z Z z f D d d q E e l h w N n O O o ' + - 'P P P p R S s E l t T t T U u U U Y y Z z 3 3 3 3 2 5 5 5 p DZ Dz ' + - 'dz Lj Lj lj NJ Nj nj A a I i O o U u U u U u U u U u e A a A a AE ' + - 'ae G g G g K k Q q Q q 3 3 J dz dZ DZ g G h p N n A a AE ae O o I ' + - 'i O o O o T t 3 3 H h O o O o O o A C c L T s Q q R r Y y e 3 3 3 ' + - '3 j i I I I h w R r R R r r u v A M Y Y B G H j K L q ? c dz d3 dz ' + - 'ts tf tc fn ls lz ww u u h h j r r r R W Y x Y 1 s x c h m r t v x ' + - 'c c c I O Y O K A M N E O TT P E T Y O X Y O I Y a e n i v a b y d ' + - 'e c n 0 1 k j u v c o tt p s o t u q X Y w i u o u w b e Y Y Y O w ' + - 'x Q q C c F f N N W w q q h e S s X x 6 6 t t x e c j O E E p p C ' + - 'M M p C C C Hb Th K N Y U K jI M H O TT b bI b E IO R K JI M H O N ' + - 'b bI b e io r Hb h k n y u mY my Im Im 3 3 O o W w W W H H B b P p ' + - 'K k K k K k K k H h H h Ih ih O o C c T t Y y Y y X x TI ti H h H ' + - 'h H h E e E e I X x K k jt jt H h H h H h M m l A a A a AE ae E e ' + - 'e e E e X X 3 3 3 3 N n N n O o O o O o E e Y y Y y Y y H h R r bI ' + - 'bi F f X x X x H h G g T t Q q W w d r L Iu O y m o N U Y S d h l ' + - 'lu d y w 2 n u y un _').split(' '); - - // Map the Unicode characters to their counterparts in an object. - var map = {}; - for (var index = 0, length = unicode.length; index < length; index += 1) { - map[unicode[index]] = replacement[index]; - } - - $.url.map = map; - -})(this.jQuery, this); diff --git a/ckan/public-bs2/base/javascript/pubsub.js b/ckan/public-bs2/base/javascript/pubsub.js deleted file mode 100644 index b55ddfbb5b5..00000000000 --- a/ckan/public-bs2/base/javascript/pubsub.js +++ /dev/null @@ -1,139 +0,0 @@ -this.ckan = this.ckan || {}; - -/* The ckan.pubsub object allows the various components of the CKAN site - * to talk to each other. This is primarily used by modules using the sandbox - * object to pass messages between themselves but it may also be useful - * for the libraries themselves to broadcast notifications. - * - * This implementation is built on top of the exiting jQuery event logic - * and as such uses a pubsub.events object to manage handlers. - */ -(function (ckan, $) { - // NOTE: These methods all use pubsub internally to refer to themself rather - // than "this", this is to ensure access to the events object. However they - // all return "this" so they retain the chain of the parent object. - // eg. pubsub.publish() returns pubsub and sandbox.publish() returns sandbox. - var pubsub = { - /* An empty jQuery object to use for event management. */ - events: $({}), - - /* An array for holding queued items. Queue is disabled when null */ - queue: null, - - /* Publishes an event to all modules. Can be used to notify other modules - * that an area of the site has changed. - * - * topic - A topic string. These are global to all modules to choose - * them carefully. - * args* - All successive arguments are passed into callbacks. - * - * Returns the sandbox object. - */ - publish: function (topic /* arguments */) { - if (pubsub.queue) { - pubsub.queue.push([].slice.call(arguments)); - } else { - pubsub.events.triggerHandler(topic, [].slice.call(arguments, 1)); - } - return this; - }, - - /* Subscribes a module to a topic. The callback will receive any - * arguments provided by the publisher. - * - * topic - The topic to subscribe to. - * callback - A function to be called when subscribing. - * - * Returns this sandbox object. - */ - subscribe: function (topic, callback) { - if ($.isPlainObject(topic)) { - $.each(topic, $.proxy(pubsub.subscribe, this)); - return this; - } - - // Call fn, stripping out the 1st argument (the event object). - function wrapper() { - return callback.apply(this, [].slice.call(arguments, 1)); - } - - // Add .guid property to function to allow it to be easily unbound. Note - // that $.guid is new in jQuery 1.4+, and $.event.guid was used before. - wrapper.guid = callback.guid = callback.guid || ($.guid += 1); - - // Bind the handler. - pubsub.events.on(topic, wrapper); - return this; - }, - - /* Unsubscribes a module from a topic. If no callback is provided then - * all handlers for that topic will be unsubscribed. - * - * topic - The topic to unsubscribe from. - * callback - An optional callback to unsubscribe. - * - * Returns the sandbox object. - */ - unsubscribe: function (topic, callback) { - pubsub.events.off(topic, arguments); - return this; - }, - - /* Starts caching all published events. After this is called no - * subscriptions will be called until .dequeue() is called. This is useful - * for deferring events until the page has loaded. - * - * Examples - * - * pubsub.enqueue(); - * jQuery.ready(pubsub.dequeue); - * - * Returns itself. - */ - enqueue: function () { - if (!pubsub.queue) { - pubsub.queue = []; - } - return this; - }, - - /* Loops through each item in the queue and publishes it. - * - * Examples - * - * if (allModulesLoaded) { - * pubsub.dequeue(); - * } - * - * Returns itself. - */ - dequeue: function () { - if (pubsub.queue) { - var queue = pubsub.queue; - var index = 0; - var length = queue.length; - - // We set the queue to null here to prevent events published within the - // following loop to be added to the queue. This reduces the chances - // of an infinite loop but does mean that events may be called out of - // order. - pubsub.queue = null; - - for (;index < length; index += 1) { - pubsub.publish.apply(pubsub, queue[index]); - } - } - return this; - } - }; - - ckan.pubsub = pubsub; - - // Extend the sandbox with the pubsub methods. - ckan.sandbox.extend({ - publish: pubsub.publish, - subscribe: pubsub.subscribe, - unsubscribe: pubsub.unsubscribe - }); - -})(this.ckan, this.jQuery); diff --git a/ckan/public-bs2/base/javascript/resource.config b/ckan/public-bs2/base/javascript/resource.config deleted file mode 100644 index 8037ce0bded..00000000000 --- a/ckan/public-bs2/base/javascript/resource.config +++ /dev/null @@ -1,68 +0,0 @@ -[main] - -dont_bundle = tracking.js - -[depends] - -main = vendor/vendor -ckan = vendor/bootstrap -tracking.js = vendor/jquery.js - -[custom render order] - -apply_html_class = 1 - -[inline scripts] - -apply_html_class = - document.getElementsByTagName('html')[0].className += ' js'; - -[groups] - -ckan = - modules/select-switch.js - modules/slug-preview.js - modules/basic-form.js - modules/confirm-action.js - modules/api-info.js - modules/autocomplete.js - modules/custom-fields.js - modules/data-viewer.js - modules/table-selectable-rows.js - modules/resource-form.js - modules/resource-upload-field.js - modules/resource-reorder.js - modules/resource-view-reorder.js - modules/follow.js - modules/activity-stream.js - modules/dashboard.js - modules/resource-view-embed.js - view-filters.js - modules/resource-view-filters-form.js - modules/resource-view-filters.js - modules/table-toggle-more.js - modules/dataset-visibility.js - modules/media-grid.js - modules/image-upload.js - modules/followers-counter.js - -main = - apply_html_class - plugins/jquery.inherit.js - plugins/jquery.proxy-all.js - plugins/jquery.url-helpers.js - plugins/jquery.date-helpers.js - plugins/jquery.slug.js - plugins/jquery.slug-preview.js - plugins/jquery.truncator.js - plugins/jquery.masonry.js - plugins/jquery.form-warning.js - plugins/jquery.images-loaded.js - - sandbox.js - module.js - pubsub.js - client.js - notify.js - i18n.js - main.js diff --git a/ckan/public-bs2/base/javascript/sandbox.js b/ckan/public-bs2/base/javascript/sandbox.js deleted file mode 100644 index 56cb0060857..00000000000 --- a/ckan/public-bs2/base/javascript/sandbox.js +++ /dev/null @@ -1,131 +0,0 @@ -this.ckan = this.ckan || {}; - -/* The sandbox is a simple way to give modules access to common functionality - * while restricting their access to the rest of the document. This is done - * in an attempt to encourage modular code that has fewer dependencies. - * - * The sandbox provides access to the module element and it's children via the - * .el and .$() properties. Talking to other modules should occur via the - * .publish() and .subscribe() methods which are shared globally among all - * instances. - * - * Ajax is available via the .ajax() method which is simply the jQuery.ajax() - * method. - * - * Other core libraries can extend all sandbox instances by using the - * ckan.sandbox.extend() method which extends the Sandbox.prototype. These - * extensions will then be available to all modules. - * - * Examples - * - * var sandbox = ckan.sandbox(jQuery('#module'), {opt1: 1, opt2: 2}); - * - * sandbox.$('a'); // Query the module for anchors. - * sandbox.subscribe('my-event', callback); // Subscribe to events. - * sandbox.publish('other-event'); // Publish to all other instances. - * - * // Extension - * ckan.sandbox.extend({ - * translate: ckan.i18n.translate - * }); - * - * // All instances now have the .translate() method. - * sandbox.translate('my special message').fetch(); - * - */ -(function (ckan, $) { - var callbacks = []; - - /* Creates a new instance of Sandbox. - * - * Examples - * - * new Sandbox(); - * - * Returns a new instance of Sandbox. - */ - function Sandbox(callbacks) { - var index = 0; - var length = callbacks ? callbacks.length : 0; - - // Allow libraries to add objects/arrays to the sandbox object as they - // cannot be added to the prototype without being shared. - for (; index < length; index += 1) { - callbacks[index](this); - } - } - - $.extend(Sandbox.prototype, { - /* A scoped find function restricted to the current scope. */ - jQuery: $, - - /* An alias for jQuery.ajax() */ - ajax: $.ajax, - - body: $(document.body), - - location: window.location, - - window: window - }); - - /* Factory function for creating new sandbox instances. This should be - * used in preference to the Sandbox constructor. - * - * Returns a new Sandbox instance. - */ - function sandbox(element, options) { - return new sandbox.Sandbox(ckan.sandbox.callbacks); - } - - /* Allows the extension of the Sandbox prototype by other core libraries. - * - * NOTE: Modules should not use this. - * - * props - Properties/methods to add to the sandbox. - * - * Examples - * - * ckan.sandbox.extend({ - * translate: ckan.i18n.translate - * }); - * - * Returns the ckan object. - */ - sandbox.extend = function (props) { - $.extend(Sandbox.prototype, props || {}); - return ckan; - }; - - /* Allows the extension of the Sandbox with objects and arrays. These - * cannot be added to the prototype without them being shared across - * all instances. - * - * fn - A callback that receives the sandbox object. - * - * Examples - * - * ckan.sandbox.setup(function (sandbox) { - * sandbox.myObject = {}; - * sandbox.myArray = []; - * }); - * - * Returns the ckan object. - */ - sandbox.setup = function setup(fn) { - var callbacks = ckan.sandbox.callbacks = ckan.sandbox.callbacks || []; - - if (typeof fn === 'function') { - callbacks.push(fn); - } else { - throw new Error('ckan.sandbox.setup() must be passed a function'); - } - - return ckan; - }; - - // Export Sandbox for testing. - ckan.sandbox = sandbox; - ckan.sandbox.Sandbox = Sandbox; - -})(this.ckan, this.jQuery); diff --git a/ckan/public-bs2/base/javascript/tracking.js b/ckan/public-bs2/base/javascript/tracking.js deleted file mode 100644 index 3aa8edf7f5e..00000000000 --- a/ckan/public-bs2/base/javascript/tracking.js +++ /dev/null @@ -1,21 +0,0 @@ -$(function (){ - // Tracking - var url = location.pathname; - // remove any site root from url - url = url.substring($('body').data('locale-root'), url.length); - // trim any trailing / - url = url.replace(/\/*$/, ''); - $.ajax({url : $('body').data('site-root') + '_tracking', - type : 'POST', - data : {url:url, type:'page'}, - timeout : 300 }); - $('a.resource-url-analytics').click(function (e){ - var url = $(e.target).closest('a').attr('href'); - $.ajax({url : $('body').data('site-root') + '_tracking', - data : {url:url, type:'resource'}, - type : 'POST', - complete : function () {location.href = url;}, - timeout : 30}); - e.preventDefault(); - }); -}); diff --git a/ckan/public-bs2/base/javascript/view-filters.js b/ckan/public-bs2/base/javascript/view-filters.js deleted file mode 100644 index cec83fe34e3..00000000000 --- a/ckan/public-bs2/base/javascript/view-filters.js +++ /dev/null @@ -1,239 +0,0 @@ -/** - * Return a new JSON object of the old string. - * Turns: - * file.js?a=1&b.c=3.0&b.d=four&a_false_value=false&a_null_value=null - * Into: - * {"a":1,"b":{"c":3,"d":"four"},"a_false_value":false,"a_null_value":null} - * @version 1.1.0 - * @date July 16, 2010 - * @since 1.0.0, June 30, 2010 - * @package jquery-sparkle {@link http://balupton.com/projects/jquery-sparkle} - * @author Benjamin "balupton" Lupton {@link http://balupton.com} - * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://balupton.com} - * @license MIT License {@link http://creativecommons.org/licenses/MIT/} - */ -String.prototype.queryStringToJSON = String.prototype.queryStringToJSON || function ( ) -{ // Turns a params string or url into an array of params - // Prepare - var params = String(this); - // Remove url if need be - params = params.substring(params.indexOf('?')+1); - // params = params.substring(params.indexOf('#')+1); - // Change + to %20, the %20 is fixed up later with the decode - params = params.replace(/\+/g, '%20'); - // Do we have JSON string - if ( params.substring(0,1) === '{' && params.substring(params.length-1) === '}' ) - { // We have a JSON string - return eval(decodeURIComponent(params)); - } - // We have a params string - params = params.split(/\&(amp\;)?/); - var json = {}; - // We have params - for ( var i = 0, n = params.length; i < n; ++i ) - { - // Adjust - var param = params[i] || null; - if ( param === null ) { continue; } - param = param.split('='); - if ( param === null ) { continue; } - // ^ We now have "var=blah" into ["var","blah"] - - // Get - var key = param[0] || null; - if ( key === null ) { continue; } - if ( typeof param[1] === 'undefined' ) { continue; } - var value = param[1]; - // ^ We now have the parts - - // Fix - key = decodeURIComponent(key); - value = decodeURIComponent(value); - - // Set - // window.console.log({'key':key,'value':value}, split); - var keys = key.split('.'); - if ( keys.length === 1 ) - { // Simple - json[key] = value; - } - else - { // Advanced (Recreating an object) - var path = '', - cmd = ''; - // Ensure Path Exists - $.each(keys,function(ii,key){ - path += '["'+key.replace(/"/g,'\\"')+'"]'; - jsonCLOSUREGLOBAL = json; // we have made this a global as closure compiler struggles with evals - cmd = 'if ( typeof jsonCLOSUREGLOBAL'+path+' === "undefined" ) jsonCLOSUREGLOBAL'+path+' = {}'; - eval(cmd); - json = jsonCLOSUREGLOBAL; - delete jsonCLOSUREGLOBAL; - }); - // Apply Value - jsonCLOSUREGLOBAL = json; // we have made this a global as closure compiler struggles with evals - valueCLOSUREGLOBAL = value; // we have made this a global as closure compiler struggles with evals - cmd = 'jsonCLOSUREGLOBAL'+path+' = valueCLOSUREGLOBAL'; - eval(cmd); - json = jsonCLOSUREGLOBAL; - delete jsonCLOSUREGLOBAL; - delete valueCLOSUREGLOBAL; - } - // ^ We now have the parts added to your JSON object - } - return json; -}; - -this.ckan = this.ckan || {}; -this.ckan.views = this.ckan.views || {}; - -this.ckan.views.filters = (function (queryString) { - 'use strict'; - - var api = { - get: get, - set: set, - setAndRedirectTo: setAndRedirectTo, - unset: unset, - _searchParams: {}, - _initialize: _initialize, - _setLocationHref: _setLocationHref, - }; - - function get(filterName) { - var filters = api._searchParams.filters || {}; - - if (filterName) { - return filters[filterName]; - } else { - return filters; - } - } - - function set(name, value) { - var url = window.location.href; - - setAndRedirectTo(name, value, url); - } - - function setAndRedirectTo(name, value, url) { - api._searchParams.filters = api._searchParams.filters || {}; - api._searchParams.filters[name] = value; - - _redirectTo(url); - - return api; - } - - function unset(name, value) { - var thisFilters = get(name); - - if (thisFilters) { - var originalLength = thisFilters.length; - - // value and thisFilters are strings and equal - if (thisFilters === value || value === undefined) { - delete api._searchParams.filters[name]; - } else if ($.isArray(thisFilters)) { - thisFilters = _removeElementsFromArray(thisFilters, value); - - // if we end up with an empty array, delete the filters param - if (thisFilters.length === 0) { - delete api._searchParams.filters[name]; - } else { - api._searchParams.filters[name] = thisFilters; - } - } - - var haveFiltersChanged = (get(name) === undefined || - get(name).length != originalLength); - if (haveFiltersChanged) { - _redirectTo(window.location.href); - } - } - - return api; - } - - function _redirectTo(url) { - var urlBase = url.split('?')[0], - urlQueryString = url.split('?')[1] || '', - defaultParams = urlQueryString.queryStringToJSON(), - queryString = _encodedParams(defaultParams), - destinationUrl; - - destinationUrl = urlBase + '?' + queryString; - - api._setLocationHref(destinationUrl); - } - - function _encodedParams(defaultParams) { - var params = $.extend({}, defaultParams || {}, api._searchParams); - - if (params.filters) { - params.filters = $.map(params.filters, function (fields, filter) { - if (!$.isArray(fields)) { - fields = [fields]; - } - - var fieldsStr = $.map(fields, function (field) { - return filter + ':' + field; - }); - - return fieldsStr.join('|'); - }).join('|'); - } - - return $.param(params); - } - - function _setLocationHref(destinationUrl) { - window.location.href = destinationUrl; - } - - function _removeElementsFromArray(array, elements) { - var arrayCopy = array.slice(0); - - if (!$.isArray(elements)) { - elements = [elements]; - } - - for (var i = 0; i < elements.length; i++) { - var index = $.inArray(elements[i], arrayCopy); - if (index > -1) { - arrayCopy.splice(index, 1); - } - } - - return arrayCopy; - } - - function _initialize(queryString) { - // The filters are in format 'field:value|field:value|field:value' - var searchParams = queryString.queryStringToJSON(); - - if (searchParams.filters) { - var filters = {}, - fieldValuesStr = String(searchParams.filters).split('|'), - i, - len; - - for (i = 0, len = fieldValuesStr.length; i < len; i++) { - var fieldValue = fieldValuesStr[i].match(/([^:]+):(.*)/), - field = fieldValue[1], - value = fieldValue[2]; - - filters[field] = filters[field] || []; - filters[field].push(value); - } - - searchParams.filters = filters; - } - - api._searchParams = searchParams; - } - - _initialize(queryString); - - return api; -})(window.location.search); diff --git a/ckan/public-bs2/base/less/activity.less b/ckan/public-bs2/base/less/activity.less deleted file mode 100644 index 6071fabc5f0..00000000000 --- a/ckan/public-bs2/base/less/activity.less +++ /dev/null @@ -1,126 +0,0 @@ -.activity { - margin: 10px 0; - padding: 0; - list-style-type: none; - background: transparent url('@{imagePath}/dotted.png') 14px 0 repeat-y; - .item { - position: relative; - margin: 0 0 15px 0; - padding: 0; - .clearfix; - .icon { - display: block; - position: absolute; - top: 0; - left: 0; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - color: @activityColorText; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); - font-weight: normal; - margin-right: 10px; - .border-radius(100px); - .box-shadow(inset 0 1px 2px rgba(0, 0, 0, 0.2)); - } - .gravatar { - .border-radius(100px); - } - .actor .gravatar { - position: absolute; - top: 0; - left: 40px; - } - p { - font-size: 14px; - line-height: 1.5; - margin: 5px 0 0 80px; - } - .date { - color: #999; - font-size: 12px; - white-space: nowrap; - } - .new { - display: block; - position: absolute; - overflow: hidden; - top: -3px; - left: -3px; - width: 10px; - height: 10px; - background-color: #A35647; - border: 1px solid #FFF; - text-indent: -1000px; - .border-radius(100px); - .box-shadow(0 1px 2px rgba(0, 0, 0, 0.2)); - } - &.no-avatar p { - margin-left: 40px; - } - } - .load-less { - margin-bottom: 15px; - } -} - -// For profile information that appears in the popover -.popover { - width: 300px; - .popover-title { - font-weight: bold; - margin-bottom: 0; - } - p.about { - margin: 0 0 10px 0; - } - .popover-close { - float: right; - text-decoration: none; - } - .popover-content { - font-size: @baseFontSize; - line-height: @baseLineHeight; - color: @layoutTextColor; - word-break: break-all; - dl { - margin: 0; - dd { - margin-left: 0; - margin-bottom: 10px; - } - } - } -} - -// colors -.activity .item { - & .icon { background-color: @activityColorBlank; } // Non defined - &.failure .icon { background-color: @activityColorDelete; } - &.success .icon { background-color: @activityColorNew; } - &.added-tag .icon { background-color: spin(@activityColorNew, 60); } - &.changed-group .icon { background-color: @activityColorModify; } - &.changed-package .icon { background-color: spin(@activityColorModify, 20); } - &.changed-package_extra .icon { background-color: spin(@activityColorModify, -20); } - &.changed-resource .icon { background-color: spin(@activityColorModify, 40); } - &.changed-user .icon { background-color: spin(@activityColorModify, -40); } - &.changed-organization .icon { background-color: spin(@activityColorNew, 50); } - &.deleted-group .icon { background-color: @activityColorDelete; } - &.deleted-package .icon { background-color: spin(@activityColorDelete, 20); } - &.deleted-package_extra .icon { background-color: spin(@activityColorDelete, -20); } - &.deleted-resource .icon { background-color: spin(@activityColorDelete, 40); } - &.deleted-organization .icon { background-color: spin(@activityColorDelete, -40); } - &.new-group .icon { background-color: @activityColorNew; } - &.new-package .icon { background-color: spin(@activityColorNew, 20); } - &.new-package_extra .icon { background-color: spin(@activityColorNew, -20); } - &.new-resource .icon { background-color: spin(@activityColorNew, -40); } - &.new-user .icon { background-color: spin(@activityColorNew, 40); } - &.new-organization .icon { background-color: spin(@activityColorNew, -40); } - &.removed-tag .icon { background-color: spin(@activityColorDelete, -40); } - &.deleted-related-item .icon { background-color: spin(@activityColorDelete, 60); } - &.follow-dataset .icon { background-color: @activityColorNeutral; } - &.follow-user .icon { background-color: spin(@activityColorNeutral, 20); } - &.new-related-item .icon { background-color: spin(@activityColorNew, -60); } - &.follow-group .icon { background-color: spin(@activityColorNew, -50); } -} diff --git a/ckan/public-bs2/base/less/ckan.less b/ckan/public-bs2/base/less/ckan.less deleted file mode 100644 index c78d13dd7f9..00000000000 --- a/ckan/public-bs2/base/less/ckan.less +++ /dev/null @@ -1,142 +0,0 @@ -@import "variables.less"; -@import "custom.less"; -@import "mixins.less"; -@import "module.less"; -@import "media.less"; -@import "nav.less"; -@import "forms.less"; -@import "dataset.less"; -@import "search.less"; -@import "group.less"; -@import "toolbar.less"; -@import "prose.less"; -@import "icons.less"; -@import "layout.less"; -@import "homepage.less"; -@import "masthead.less"; -@import "footer.less"; -@import "tables.less"; -@import "profile.less"; -@import "activity.less"; -@import "dropdown.less"; -@import "dashboard.less"; -@import "resource-view.less"; -@import "datapusher.less"; - -body { - // Using the masthead/footer gradient prevents the color from changing - // at the bottom of the window on pages with little content. - background: @mastheadBackgroundColor url("@{bgPath}"); -} - -[hidden] { - display: none; -} - -table { - table-layout: fixed; -} - -thead th { - vertical-align: top; -} - -td, th { - word-wrap: break-word; -} - -table .metric { - width: 140px; -} - -code { - color: @codeTextColor; - border: none; - background: none; - white-space: normal; -} - -pre { - border: none; - background: none; - padding-left: 0; - padding-right: 0; -} - -mark { - background: @highlightBackground; -} - -blockquote p { - font-size: 1em; -} - -iframe { - border: none; -} - -.embedded-content h1 { - font-size: 1.8em; -} - -.embedded-content h2 { - font-size: 1.4em; -} - -.embedded-content h3 { - font-size: 1.2em; -} - -.popular { - text-indent: -999em; -} - -.empty { - color: @emptyTextColor; - font-style: italic; -} - -.page-heading { - margin-top: 0; - margin-bottom: 16px; -} - -.m-top { - margin-top: @gutterSmallX; -} -.m-left { - margin-left: @gutterSmallX; -} -.m-right { - margin-right: @gutterSmallX; -} -.m-bottom { - margin-bottom: @gutterSmallX; -} -.no-margin { - margin: 0; -} -.reduced-margin { - margin: 3px 5px; -} - -.p-top { - padding-top: @gutterSmallX; -} -.p-left { - padding-left: @gutterSmallX; -} -.p-right { - padding-right: @gutterSmallX; -} -.p-bottom { - padding-bottom: @gutterSmallX; -} -.no-padding { - padding: 0; -} -.reduced-padding { - padding: 3px 5px; -} - -@import "iehacks.less"; diff --git a/ckan/public-bs2/base/less/custom.less b/ckan/public-bs2/base/less/custom.less deleted file mode 100644 index 8696e5c815e..00000000000 --- a/ckan/public-bs2/base/less/custom.less +++ /dev/null @@ -1 +0,0 @@ -// This file is needed in order for ./bin/less to compile in less 1.3.1+ diff --git a/ckan/public-bs2/base/less/dashboard.less b/ckan/public-bs2/base/less/dashboard.less deleted file mode 100644 index 286f72bb968..00000000000 --- a/ckan/public-bs2/base/less/dashboard.less +++ /dev/null @@ -1,130 +0,0 @@ -#followee-filter { - .btn { - .clearfix(); - span, - strong { - display: block; - float: left; - line-height: 1.5; - } - span { - font-weight: normal; - } - strong { - margin: 0 5px; - white-space: nowrap; - max-width: 90px; - overflow: hidden; - text-overflow: ellipsis; - } - } -} - -.dashboard-context { - position: relative; - margin-bottom: 20px; - padding: 20px; - border-bottom: 1px solid #DCDCDC; - background-color: @moduleHeadingBackgroundColor; - .border-radius(3px 0 0 0); - h2 { - margin-bottom: 10px; - } - .arrow { - position: absolute; - content: ' '; - top: 30px; - right: -10px; - width: 10px; - height: 21px; - background: transparent url("@{imagePath}/dashboard-followee-related.png"); - } -} - -.popover-followee { - .popover-title { - display: none; - } - .popover-content { - padding: 0; - .border-radius(3px); - } - .empty { - padding: 10px; - } - .popover-header { - .clearfix(); - background-color: whiteSmoke; - padding: 5px; - border-bottom: 1px solid @inputBorder; - .border-radius(3px 3px 0 0); - .input-prepend { - margin-bottom: 0; - } - .add-on, - input { - float: left; - margin: 0; - } - .add-on { - padding: 4px 8px 4px 12px; - border-right-width: 0; - .border-radius(100px 0 0 100px); - } - input { - padding: 4px 12px 4px 8px; - font-size: 13px; - width: 207px; - .border-radius(0 100px 100px 0); - } - } - .nav { - padding: 0; - margin: 0; - max-height: 205px; - overflow: auto; - .border-radius(0 0 3px 3px); - li { - a { - display: block; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - padding: 7px 10px 7px 15px; - margin: 0; - .border-radius(0); - i { - background-color: @layoutLinkColor; - color: @inputBackground; - margin-right: 11px; - padding: 3px 5px; - line-height: 1; - .border-radius(100px); - .box-shadow(inset 0 1px 2x rgba(0, 0, 0, 0.2)); - } - &:hover i { - background-color: #000; - } - } - &.active a i { - color: @layoutLinkColor; - background-color: @inputBackground; - } - } - } -} - -.dashboard-me { - .clearfix; - padding: 15px 15px 0 15px; - img { - float: left; - margin-right: 10px; - .border-radius(100px); - } - strong { - display: block; - font-size: 16px; - margin: 3px 0; - } -} diff --git a/ckan/public-bs2/base/less/datapusher.less b/ckan/public-bs2/base/less/datapusher.less deleted file mode 100644 index f147c0c3f6c..00000000000 --- a/ckan/public-bs2/base/less/datapusher.less +++ /dev/null @@ -1,18 +0,0 @@ -.datapusher-status-link:hover { - text-decoration: none; -} - -.datapusher-status { - &.status-unknown { - color: #bbb; - } - &.status-pending { - color: #FFCC00; - } - &.status-error { - color: red; - } - &.status-complete { - color: #009900; - } -} \ No newline at end of file diff --git a/ckan/public-bs2/base/less/dataset.less b/ckan/public-bs2/base/less/dataset.less deleted file mode 100644 index d812248084a..00000000000 --- a/ckan/public-bs2/base/less/dataset.less +++ /dev/null @@ -1,340 +0,0 @@ -.dataset-item { - border-bottom: 1px dotted @genericBorderColor; - padding-bottom: 20px; - margin-bottom: 20px; -} -@media (max-width: 768px) { - .dataset-item { - word-wrap:break-word; - } -} - -.dataset-item:last-of-type { - border-bottom: none; - margin-bottom: 0; - padding-bottom: 0; -} - -.dataset-heading { - font-size: 16px; - margin-top: 0; - margin-bottom: 8px; - line-height: 1.3; -} - -.dataset-heading a { - color: @listingHeadingTextColor; -} - -.dataset-heading .label { - position: relative; - top: -1px; -} - -.dataset-private { - margin-right: 10px; - text-transform: uppercase; - .icon-lock { - width: 9px; - } - &.pull-right { - margin-right: 0; - } -} - -.dataset-resources { - margin-top: 8px; -} - -.dataset-resources li { - display: inline; -} - -.dataset-resources li a { - background-color: @resourceFormatBackground; -} - -.dataset-heading .popular { - top: 0; -} - -// Resource List - -.resource-list { - .unstyled; - margin: -10px -10px 10px -10px; -} - -.resource-item { - position: relative; - padding: 10px 10px 10px 60px; - margin-bottom: 0px; - .border-radius(3px); - &:hover { - background-color: @layoutBackgroundColor; - } -} - -.resource-item .heading { - color: @layoutBoldColor; - font-size: 14px; - font-weight: bold; -} - -.resource-item .format-label { - position: absolute; - top: 10px; - left: 10px; -} - -.resource-item .description { - font-size: 12px; - margin-bottom: 0; - min-height: 12px; -} - -.resource-item .btn-group { - position: absolute; - top: 14px; - right: 10px; -} -@media (max-width: 768px) { - .resource-item .btn-group { - display:none; - } -} - -.resource-list.reordering { - .resource-item { - border: 1px solid @moduleHeadingBorderColor; - margin-bottom: 10px; - cursor: move; - .handle { - display: block; - position: absolute; - color: @moduleHeadingActionTextColor; - left: -31px; - top: 50%; - margin-top: -15px; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - border: 1px solid @moduleHeadingBorderColor; - border-width: 1px 0 1px 1px; - background-color: @moduleBackgroundColor; - .border-radius(20px 0 0 20px); - &:hover { - text-decoration: none; - } - } - &:hover .handle { - background-color: @layoutBackgroundColor; - } - &.ui-sortable-helper { - background-color: @layoutBackgroundColor; - border: 1px solid @layoutLinkColor; - .handle { - background-color: @layoutBackgroundColor; - border-color: @layoutLinkColor; - color: @navLinkColor; - } - } - } -} -.resource-item .handle { - display: none; -} - -// Dataset Forms - -// Tag List - -.tag-list { - .unstyled; - padding: 10px 10px 5px 10px; -} - -.tag-list li { - display: inline-block; - margin-right: 5px; -} - -.tag-list li:last-child { - margin-right: 0; -} - -// Additional Info - -.additional-info td, -.additional-info th { - width: 50%; -} - -// FORMATS - -.label[data-format=html], -.label[data-format*=html] { - background-color: #55a1ce; -} - -.label[data-format=json], -.label[data-format*=json] { - background-color: #ef7100; -} - -.label[data-format=xml], -.label[data-format*=xml] { - background-color: #ef7100; -} - -.label[data-format=text], -.label[data-format*=text] { - background-color: #74cbec; -} - -.label[data-format=csv], -.label[data-format*=csv] { - background-color: #dfb100; -} - -.label[data-format=xls], -.label[data-format*=xls] { - background-color: #2db55d; -} - -.label[data-format=zip], -.label[data-format*=zip] { - background-color: #686868; -} - -.label[data-format=api], -.label[data-format*=api] { - background-color: #ec96be; -} - -.label[data-format=pdf], -.label[data-format*=pdf] { - background-color: #e0051e; -} - -.label[data-format=rdf], -.label[data-format*=rdf], -.label[data-format*=nquad], -.label[data-format*=ntriples], -.label[data-format*=turtle] { - background-color: #0b4498; -} - -// Views -.view-list { - .unstyled; - li { - position: relative; - margin-bottom: 10px; - a { - display: block; - min-height: 50px; - padding: 10px; - border: 1px solid @moduleHeadingBorderColor; - overflow: hidden; - .border-radius(3px); - .icon { - float: left; - width: 50px; - height: 50px; - overflow: hidden; - margin-right: 10px; - color: @layoutTextColor; - background-color: @layoutBackgroundColor; - .border-radius(3px); - i { - display: block; - text-align: center; - font-size: 28px; - line-height: 50px; - } - } - h3 { - font-weight: bold; - color: @layoutBoldColor; - font-weight: bold; - font-size: 16px; - margin: 0 0 3px 0; - } - p { - margin: 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - color: @layoutTextColor; - } - &.active, - &:hover { - text-decoration: none; - border-color: @layoutLinkColor; - .icon { - background-color: @layoutLinkColor; - color: @navActiveBackgroundColor; - } - } - } - .arrow { - position: absolute; - display: none; - border: 8px solid transparent; - border-top-color: @layoutLinkColor; - left: 50%; - bottom: -15px; - margin-left: -4px; - } - &.active { - a { - text-decoration: none; - border-color: @layoutLinkColor; - .icon { - background-color: @layoutLinkColor; - color: @navActiveBackgroundColor; - } - } - .arrow { - display: block; - } - } - } - &.stacked { - overflow-y: hidden; - overflow-x: auto; - height: 100px; - white-space: nowrap; - li { - display: inline-block; - width: 250px; - margin-right: 10px; - &:last-child { - margin-right: 0; - } - } - - &::-webkit-scrollbar { - width: 7px; - height: 7px; - } - &::-webkit-scrollbar-track { - border-radius: 10px; - background-color: @navActiveBackgroundColor; - } - &::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color: darken(@navActiveBackgroundColor, 20%); - &:hover { - background-color: @layoutLinkColor; - } - } - - } -} - -.resource-view { - margin-top: 20px; -} diff --git a/ckan/public-bs2/base/less/dropdown.less b/ckan/public-bs2/base/less/dropdown.less deleted file mode 100644 index 318c62aca18..00000000000 --- a/ckan/public-bs2/base/less/dropdown.less +++ /dev/null @@ -1,14 +0,0 @@ -// Allow the dropdown to work without JavaScript -.dropdown:hover .dropdown-menu { - display: block; -} -// Default to normal dropdown behaviour when JavaScript is enabled -.js .dropdown { - .dropdown-menu, - &:hover .dropdown-menu { - display: none; - } - &.open .dropdown-menu { - display: block; - } -} diff --git a/ckan/public-bs2/base/less/footer.less b/ckan/public-bs2/base/less/footer.less deleted file mode 100644 index 042ed9028ea..00000000000 --- a/ckan/public-bs2/base/less/footer.less +++ /dev/null @@ -1,51 +0,0 @@ -.site-footer { - .masthead(); - padding: 20px 0; -} - -.site-footer, -.site-footer label, -.site-footer small { - color: @footerTextColor; -} - -.site-footer a { - color: @footerLinkColor; -} - -.footer-links ul li { - margin-bottom: 5px; -} - -.attribution small { - color: @footerTextColor; - font-size: 12px; -} - -.attribution .ckan-footer-logo { - display: block; - width: 68px; - height: 21px; - margin-top: 2px; - background: url("@{imagePath}/ckan-logo-footer.png") no-repeat top left; - text-indent: -900em; -} - -.lang-select { - .clearfix; -} - -.lang-select label, -.lang-select select, -.lang-select .lang-container { - float: left; - margin-top: 0; -} - -.lang-dropdown { - color: @inputColor; -} - -.lang-dropdown li { - width: auto; -} diff --git a/ckan/public-bs2/base/less/forms.less b/ckan/public-bs2/base/less/forms.less deleted file mode 100644 index 167ec990ed9..00000000000 --- a/ckan/public-bs2/base/less/forms.less +++ /dev/null @@ -1,806 +0,0 @@ -.js .js-hide { - display:none; -} - -.js .js-hide.active { - display: block; -} - -.btn, -label { - font-weight: bold; -} - -.btn-rounded { - .border-radius(100px); - padding-left: 15px; - padding-right: 15px; -} - -label { - cursor: pointer; - font-size: 14px; -} - -label:after { - content: ":"; -} - -label.radio:after, -label.checkbox:after { - content: ""; -} - -input[type=radio], -input[type=checkbox] { - position: relative; - top: 7px; - padding: 0; - margin: 0; - &.checkbox-onown { - top: 0; - } -} - -select { - padding: 4px; -} - -textarea { - max-width: 100%; -} - -.control-group .btn { - position: relative; - top: -2px; -} - -.control-full input, -.control-full select, -.control-full textarea { - .box-sizing(border-box); - height: auto; - width: 100%; -} - -.control-medium input, -.control-medium select, -.control-medium textarea { - width: 320px; -} -@media (max-width: 768px) { - .control-medium input, - .control-medium select, - .control-medium textarea { - width: 100%; - .box-sizing(border-box); - min-height:28px; - } -} - -.control-large input, -.control-large .control-label { - font-size: @baseFontSize * 1.25; - line-height: @baseLineHeight * 1.5; -} - -.control-large input { - height: (@baseLineHeight*2)+1; -} - -.control-required { - color: @errorBorder; -} - -.form-actions .control-required-message { - float: left; - margin-left: 20px; - margin-bottom: 0; - line-height: 30px; - &:first-child { - margin-left: 0; - } -} - -.form-actions { - background: none; - margin-left: -@gutterX; - margin-right: -@gutterX; - margin-bottom: 0; // Prevents reduces the padding when included in a module. - padding-bottom: 0; -} -@media (min-width: 768px) { - .form-actions { - text-align: right; - } -} - -.form-actions .action-info { - line-height: 2; - text-align: left; - color: @formInfoText; - margin: 0; -} -@media (min-width: 768px) { - .form-actions .action-info { - float: left; - width: 50%; - } -} - -.form-actions .action-info.small { - font-size: 11px; - line-height: 1.2; -} - -@media (max-width: 768px) { - .form-actions .btn { - margin-top:5px; - } -} - -// Override the default form widths. -.form-horizontal .control-label { - width: 120px; -} -@media (min-width: 768px) { - .form-horizontal .controls { - margin-left: 130px; - } -} - -.form-horizontal .info-block { - position: relative; - display: block; - font-size: 11px; - color: @emptyTextColor; - line-height: 1.3; - margin-top: 6px; -} - -.form-horizontal .info-help { - padding: 6px 0; - &:before { - display: none; - } -} -.form-horizontal .info-help-tight { - margin-top: -10px; -} - -@media (min-width: 980px) { - .form-horizontal .info-block { - padding: 6px 0 6px 0; - } - .form-horizontal .info-inline { - float: right; - width: 265px; - margin-top: 0; - padding-bottom: 0; - } -} - -.form-horizontal .control-medium .info-block.info-inline { - width: 165px; -} - -.form-horizontal .info-block:before { - font-size: 2.2em; - position: absolute; - left: 0; - top: 2px; -} - -.form-horizontal .info-inline:before { - top: 8px; -} - -.info-block, -.info-inline { - .icon-large { - float: left; - font-size: 22px; - margin-right: @gutterSmallX; - } -} - -.form-horizontal .info-block a { - color: @emptyTextColor; - text-decoration: underline; -} - -.form-horizontal .form-actions { - padding-left: @gutterX; - padding-right: @gutterX; -} - -.form-inline input { - padding-bottom: 9px; -} - -.form-inline select { - margin-top: 0; -} - -.form-inline .btn { - margin-left: 5px; -} - -// Form Narrow - -.form-narrow label { - margin-bottom: 0; -} - -.form-narrow select { - width: 100%; -} - -.form-narrow .form-actions { - margin-left: -@gutterSmallX; - margin-right: -@gutterSmallX; - padding: 10px @gutterSmallX 0; -} - -// Inline Select Forms - -.form-select label { - margin-right: 5px; -} - -// Single Field Inputs - -.simple-input label, -.simple-input button { - display: none; -} - -.simple-input .field { - position: relative; -} - -.simple-input .field-bordered { - border-bottom: 1px dotted @genericBorderColor; -} - -.simple-input .field input { - width: 100%; - height: auto; - margin: 0 -7px; // Pull input out into gutter - padding: 7px 5px; -} - -.simple-input .field .btn-search { - position: absolute; - display: block; - height: 17px; - width: 17px; - padding: 0; - top: 50%; - right: 0; - margin-top: -10px; - background-color: transparent; - border: none; - color: #999; - .transition(color 0.2s ease-in); - &:hover { - color: #000; - } -} - -.editor textarea { - .border-radius(@inputBorderRadius @inputBorderRadius 0 0); - border-bottom: none; -} - -.editor .editor-info-block { - .border-radius(0 0 @inputBorderRadius @inputBorderRadius); - display: block; - float: none; - padding: 4px 10px; - background: #ebebeb; - width: auto; - border: 1px solid @inputBorder; - border-top: none; - font-size: 11px; - color: #282828; -} - -.editor .editor-info-block a { - color: @layoutLinkColor; - text-decoration: none; -} - -// Custom Fields -@media (max-width: 768px) { - [data-module="custom-fields"] { - .input-prepend .add-on { - display:block; - } - } -} -@media (max-width: 480px) { - [data-module="custom-fields"] { - .input-prepend { - width:100%; - } - .control-custom input { - width:100%; - .box-sizing(border-box); - min-height:28px; - } - } -} - -// Controls - -// Custom Key/Value input - -.control-custom { - font-size: 0; // Remove whitespace between fields. -} - -.control-custom label { - margin-bottom: 0; -} - -.control-custom input { - .border-radius(0); - width: 140px; -} - -.control-custom input:last-of-type { - .border-radius(0 3px 3px 0); -} - -.control-custom .checkbox { - display: inline-block; - margin-left: 5px; -} - -.control-custom .checkbox input { - width: auto; -} - -.control-custom.disabled label, -.control-custom.disabled input { - color: @disabledCustomInputTextColor; - text-decoration: line-through; - text-shadow: none; -} - -.control-custom.disabled input { - .box-shadow(none); - background-color: @disabledCustomInputBackground; -} - -.control-custom.disabled .checkbox { - color: @layoutTextColor; - text-decoration: none; -} - -// JavaScript Enabled Remove Button - -.control-custom .checkbox.btn { - .border-radius(15px); - position: relative; - top: 0; - left: 5px; - height: 1px; - width: 9px; - padding: 3px 8px; - line-height: 18px; -} - -.control-custom .checkbox.btn span { - display: none; - width: 30px; -} - -.control-custom .checkbox.btn:before { - position: relative; - top: 1px; - left: -1px; - color: #fff; -} - -.control-custom .checkbox.btn input { - display: none; -} - -.control-custom.disabled .checkbox.btn { - .btn-primary; -} - -// Errors - -.alert-danger a, .alert-error a { - color: @errorText; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea, -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - border-color: @errorBorder; -} - -.error-inline { - color: @errorText; -} - -.error-block, -.error-inline { - font-size: 12px; -} - -.error-block { - .border-radius(0 0 @inputBorderRadius @inputBorderRadius); - display: block; - padding: 6px 8px 3px; - background: @errorBorder; - margin: -@inputBorderRadius 0 0; - color: @inputBackground; - width: 208px; -} - -.control-medium .error-block { - width: 318px; -} - -.control-full .error-block { - width: auto; -} - -.control-group.error .input-prepend .error-block, -.control-custom.error .error-block { - width: auto; -} - -.control-custom.error .error-block { - width: 401px; -} - -.control-select.error .error-block { - width: 196px; -} - -// Stages -// Builds form stages out of an ordered list. The following CSS uses tag -// selectors on the .active class to prevent the styles bleeding into the -// anchor element which can also have an active class. - -.stages { - .unstyled; - .clearfix; - color: @stagesTextColor; - counter-reset: stage; - margin: -@gutterY -@gutterX @gutterY; - overflow: hidden; -} - -.stages li { - .box-sizing(border-box); - line-height: 27px; - counter-increment: stage; - width: 50%; - background-color: @stagesBackground; - float: left; - padding: 10px 20px; - position: relative; - z-index: 0; -} - -.stages li:before { - .border-radius(14px); - content: counter(stage); - display: inline-block; - width: 27px; - height: 27px; - margin-right: 5px; - font-weight: bold; - text-align: center; - color: @stagesCounterTextColor; - background-color: @stagesCounterBackground; - z-index: 1; -} - -.stages li:after { - left: 0; - border: solid @stagesTransparentBackground; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-top-color: @stagesBackground; - border-bottom-color: @stagesBackground; - border-width: 29px; // Needs to be an odd number - top: 50%; - margin-top: -29px; - margin-left: -30px; -} - -.stages li.last { - position: relative; - right: -1px; -} - -.stages li.last, -.stages li.last .highlight { - .border-radius(0 3px 0 0); -} - -.stages li.first:after { - content: none; - border: none; -} - -.stages li.active:after { - border-color: @stagesActiveTransparentBackground; - border-top-color: @stagesActiveBackground; - border-bottom-color: @stagesActiveBackground; -} - -.stages li.complete:after { - border-color: @stagesCompleteTransparentBackground; - border-top-color: @stagesCompleteBackground; - border-bottom-color: @stagesCompleteBackground; -} - -.stages.stage-3 li.complete:first-child:after { - content: none; -} - -.stages li.active, -.stages li.complete { - background: none; -} - -.stages li.active:before { - color: @stagesCounterActiveTextColor; - background: @stagesCounterActiveBackground; -} - -.stages li.complete:before { - color: @stagesCounterCompleteTextColor; - background: @stagesCounterCompleteBackground; -} - -// Needs to style spa, button and a elements. -.stages li .highlight { - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - width: 100%; - padding: 10px 52px; - border: none; - text-align: left; - text-decoration: none; - line-height: 27px; - z-index: -1; -} -@media (max-width: 768px) { - .stages li .highlight { - text-indent:-9999px; - } -} -.stages li.active .highlight { - color: @stagesActiveTextColor; - background: @stagesActiveBackground; -} - -.stages li.complete .highlight { - color: @stagesCompleteTextColor; - background: @stagesCompleteBackground; -} - -// Errors - -.alert > :last-child { - margin-bottom: 0; -} - -// Slug Preview Field - -.slug-preview { - font-size: 14px; - line-height: 1.5; - margin-top: 5px; - margin-left: 10px; -} - -.slug-preview-value { - background-color: #faedcf; - margin-right: 3px; -} - -// Upload File - -.resource-upload-field { - position: relative; - overflow: hidden; - display: inline-block; - vertical-align: bottom; -} - -.resource-upload-field label { - z-index: 0; -} - -.resource-upload-field input { - .opacity(0); - position: absolute; - top: 0; - right: 0; - z-index: 1; - margin: 0; - border: solid transparent; - border-width: 100px 0 0 200px; - cursor: pointer; - direction: ltr; - -moz-transform: translate(-300px, 0) scale(4); -} - -.resource-upload-field.loading { - display: inline-block; - background: url("@{imagePath}/loading-spinner.gif") no-repeat center right; - padding-right: 5px; -} - -// Select2 - -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - font-size: 14px; -} - -.select2-container-multi .select2-choices .select2-search-field input { - height: 29px; -} - -.select2-container .select2-choice input, -.select2-container-multi .select2-choices .select2-search-field:first-child input { - // Only apply if there are no other tags (ie. is the first child) - padding-left: 10px; -} - -.select2-container { - margin-top: 1px; -} - -.select2-container-multi { - margin-top: 0; -} - -.select2-container-multi .select2-choices .select2-search-choice { - padding: 5px 8px 5px 22px; -} - -.select2-container-multi.select2-container .select2-choices { - padding-top: 3px; - padding-bottom: 3px; -} - -.select2-search-choice-close, -.select2-container-multi .select2-search-choice-close { - top: 6px; - left: 5px; -} - -.select2-container-multi .select2-choices { - .border-radius(3px); - .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); - @transition: border linear .2s, box-shadow linear .2s; - .transition(@transition); - background-color: @inputBackground; - border: 1px solid @inputBorder; -} - -.select2-container-active .select2-choices, -.select2-container-multi.select2-container-active .select2-choices { - border-color: rgba(82,168,236,.8); - outline: 0; - outline: thin dotted \9; /* IE6-9 */ - .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)"); -} - -.select2-container-multi .select2-drop { - margin-top: -2px; -} - -.select2-container .select2-results li { - line-height: 18px; - padding-top: 4px; - padding-bottom: 4px; -} - -.control-full .select2-container { - // Important is bad but select2 incorrectly calculates the width and sets it on the element. - // Commenting out, as I cannot reproduce this problem (SS) - //width: 520px !important; - max-width:100%; -} - -.control-group.error .select2-container { - input:focus, - select:focus, - textarea:focus { - .box-shadow(none); - } -} - -.js .image-upload { - #field-image-url { - padding-right: 90px; - } - #field-image-upload { - cursor: pointer; - position: absolute; - z-index: 1; - .opacity(0); - } - .controls { - position: relative; - } - .btn { - position: relative; - top: 0; - margin-right: 10px; - &.hover { - color: @grayDark; - text-decoration: none; - background-position: 0 -15px; - .transition(background-position .1s linear); - } - } - .btn-remove-url { - position: absolute; - margin-right: 0; - top: 4px; - right: 5px; - padding: 0 12px; - .border-radius(100px); - .icon-remove { - margin-right: 0; - } - } -} -.add-member-form .control-label { - width: 100%; - text-align: left; -} - -.add-member-form .controls { - margin-left: auto; -} - -.add-member-or { - float: left; - margin-top: 75px; - width: 7%; - text-align: center; - text-transform: uppercase; - color: @grayLight; - font-weight: bold; -} - -.add-member-form .row-fluid .control-group { - float: left; - width: 45%; -} - -.add-member-form .row-fluid { - .select2-container, input { - width: 100% !important; - } -} - -#recaptcha_table { - table-layout: inherit; - line-height: 1; -} diff --git a/ckan/public-bs2/base/less/group.less b/ckan/public-bs2/base/less/group.less deleted file mode 100644 index 2b7393c4a5f..00000000000 --- a/ckan/public-bs2/base/less/group.less +++ /dev/null @@ -1,37 +0,0 @@ -.group .media-vertical .image { - margin: 0 -5px 5px; -} - -// Group List - -// A group item summary plus a list of datasets belonging to the group. - -// TODO: This should really be on the parent. -.group-list:nth-child(odd) { - clear: left; -} - -.group-list .module-heading { - padding-top: 15px; - padding-bottom: 15px; -} - -.group-list .dataset-content { - min-height: 54px; -} - -.group-list .module-heading h3 { - margin-bottom: 2px; -} - -.group-list .module-heading h3 a { - color: @listingHeadingTextColor; -} - -.group-list .module-heading .media-image { - overflow: hidden; - max-height: 60px; - img { - max-width: 85px; - } -} diff --git a/ckan/public-bs2/base/less/homepage.less b/ckan/public-bs2/base/less/homepage.less deleted file mode 100644 index 85a852f70b3..00000000000 --- a/ckan/public-bs2/base/less/homepage.less +++ /dev/null @@ -1,103 +0,0 @@ -.homepage { - - .row { - position: relative; - } - - .module-search { - padding: 5px; - margin: 20px 0 0 0; - color: @mastheadTextColor; - background: @layoutTrimBackgroundColor; - .search-giant { - margin-bottom: 10px; - input { - border-color: darken(@mastheadBackgroundColorEnd, 5); - } - } - .module-content { - .border-radius(3px 3px 0 0); - background-color: @mastheadBackgroundColor; - border-bottom: none; - .heading { - margin-top: 0; - margin-bottom: 7px; - font-size: 24px; - line-height: 40px; - } - } - .tags { - .clearfix(); - padding: 5px 10px 10px 10px; - background-color: darken(@mastheadBackgroundColor, 10%); - .border-radius(0 0 3px 3px); - h3, - .tag { - display: block; - float: left; - margin: 5px 10px 0 0; - } - h3 { - font-size: @baseFontSize; - line-height: @baseLineHeight; - padding: 2px 8px; - } - } - } - - .group-list { - margin: 0; - } - - .box .inner { - padding: @gutterY @gutterX; - } - - .stats { - h3 { - margin: 0 0 10px 0; - } - ul { - .unstyled; - .clearfix; - li { - float: left; - width: 25%; - font-weight: 300; - a { - display: block; - b { - display: block; - font-size: @fontSizeLarge*2; - line-height: 1.5; - } - &:hover { - text-decoration: none; - } - } - } - } - } - - - &.layout-2 .stats { - margin-top: @gutterY; - } - -} - -@media (min-width: 768px) { - .homepage [role=main] { - padding: 20px 0; - } - .homepage.layout-1 .row1 .col2 { - position: absolute; - bottom: 0; - right: 0; - .module-search { - bottom: 0; - left: 0; - right: 0; - } - } -} diff --git a/ckan/public-bs2/base/less/icons.less b/ckan/public-bs2/base/less/icons.less deleted file mode 100644 index 1d4a02717fc..00000000000 --- a/ckan/public-bs2/base/less/icons.less +++ /dev/null @@ -1,206 +0,0 @@ -@smallX: 16px; -@smallY: 16px; -@smallOffsetX: -@smallX; -@smallOffsetY: 0; -@mediumX: 17px; -@mediumY: 17px; -@mediumOffsetX: -@mediumX; -@mediumOffsetY: -@smallY; -@largeX: 20px; -@largeY: 20px; -@largeOffsetX: -@largeX; -@largeOffsetY: -@smallY - @mediumY; -@hugeX: 25px; -@hugeY: 25px; -@hugeOffsetX: -@hugeX; -@hugeOffsetY: -@smallY - @mediumY - @largeY; -@formatMediumX: 32px; -@formatMediumY: 35px; -@formatMediumOffsetX: -@formatMediumX; -@formatMediumOffsetY: -62px; - -.ckan-icon { - .ie7-restore-right-whitespace; - display: inline-block; - vertical-align: text-bottom; - position: relative; - top: 2px; - width: 16px; - height: 16px; - background-image: url("@{imagePath}/sprite-ckan-icons.png"); - background-repeat: no-repeat; - background-position: 16px 16px; -} - -.ckan-icon-background-position(@offset, @size) { - @w: "@{size}X"; - @h: "@{size}Y"; - @x: "@{size}OffsetX"; - @y: "@{size}OffsetY"; - width: @@w; - height: @@h; - background-position: (@@x * @offset) @@y; -} - -// SMALL - -.ckan-icon-fb { .ckan-icon-background-position(0, "small") } -.ckan-icon-gplus { .ckan-icon-background-position(1, "small") } -.ckan-icon-twitter { .ckan-icon-background-position(2, "small") } -.ckan-icon-email { .ckan-icon-background-position(3, "small") } -.ckan-icon-share { .ckan-icon-background-position(4, "small") } -.ckan-icon-feed { .ckan-icon-background-position(5, "small") } -.ckan-icon-calendar { .ckan-icon-background-position(6, "small") } -.ckan-icon-file { .ckan-icon-background-position(7, "small") } -.ckan-icon-lock { .ckan-icon-background-position(8, "small") } -.ckan-icon-link-file { .ckan-icon-background-position(9, "small") } -.ckan-icon-link-plugin { .ckan-icon-background-position(10, "small") } -.ckan-icon-upload-file { .ckan-icon-background-position(11, "small") } -.ckan-icon-callout { .ckan-icon-background-position(12, "small") } - -// MEDIUM - -.ckan-icon-circle-cross { .ckan-icon-background-position(0, "medium") } -.ckan-icon-circle-add { .ckan-icon-background-position(1, "medium") } -.ckan-icon-flame { .ckan-icon-background-position(2, "medium") } -.ckan-icon-search { .ckan-icon-background-position(3, "medium") } - -// LARGE - -.ckan-icon-large-lock{ .ckan-icon-background-position(0, "large") } -.ckan-icon-photo { .ckan-icon-background-position(1, "large") } -.ckan-icon-add { .ckan-icon-background-position(2, "large") } -.ckan-icon-home { .ckan-icon-background-position(3, "large") } -.ckan-icon-rewind { .ckan-icon-background-position(4, "large") } -.ckan-icon-tools { .ckan-icon-background-position(5, "large") } -.ckan-icon-flag { .ckan-icon-background-position(6, "large") } -.ckan-icon-clipboard { .ckan-icon-background-position(7, "large") } -.ckan-icon-share { .ckan-icon-background-position(8, "large") } -.ckan-icon-info { .ckan-icon-background-position(9, "large") } -.ckan-icon-download { .ckan-icon-background-position(10, "large") } -.ckan-icon-star { .ckan-icon-background-position(11, "large") } -.ckan-icon-info-flat { .ckan-icon-background-position(12, "large") } -.ckan-icon-tag { .ckan-icon-background-position(13, "large") } -.ckan-icon-plus { .ckan-icon-background-position(14, "large"); width: 16px; } -.ckan-icon-head { .ckan-icon-background-position(15, "large") } -.ckan-icon-arrow-e { .ckan-icon-background-position(16, "large"); width: 16px; } - -.ckan-icon-bookmark { .ckan-icon-background-position(0, "huge"); } - -// RESOURCE FORMAT ICONS - -.format-label { - .ckan-icon; - - text-indent: -900em; - background: url("@{imagePath}/sprite-resource-icons.png") no-repeat 0 0; -} - -.format-label { - .ckan-icon-background-position(0, "formatMedium"); -} - -.format-label[data-format=rdf], -.format-label[data-format*=rdf] { - .ckan-icon-background-position(1, "formatMedium"); -} - -.format-label[data-format=pdf], -.format-label[data-format*=pdf] { - .ckan-icon-background-position(2, "formatMedium"); -} - -.format-label[data-format=api], -.format-label[data-format*=api] { - .ckan-icon-background-position(3, "formatMedium"); -} - -.format-label[data-format=zip], -.format-label[data-format*=zip] { - .ckan-icon-background-position(4, "formatMedium"); -} - -.format-label[data-format=xls], -.format-label[data-format*=xls] { - .ckan-icon-background-position(5, "formatMedium"); -} - -.format-label[data-format=csv], -.format-label[data-format*=csv] { - .ckan-icon-background-position(6, "formatMedium"); -} - -.format-label[data-format=txt], -.format-label[data-format*=txt] { - .ckan-icon-background-position(7, "formatMedium"); -} - -.format-label[data-format=xml], -.format-label[data-format*=xml] { - .ckan-icon-background-position(8, "formatMedium"); -} - -.format-label[data-format=json], -.format-label[data-format*=json] { - .ckan-icon-background-position(9, "formatMedium"); -} - -.format-label[data-format=html], -.format-label[data-format*=html] { - .ckan-icon-background-position(10, "formatMedium"); -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - text-align: right; - font-size: 14px; - line-height: 1; - width: 14px; -} - -.btn, -.nav, -.module-heading, -.dropdown { - [class^="icon-"], - [class*=" icon-"] { - margin-right: 4px; - } -} - -.info-block { - [class^="icon-"], - [class*=" icon-"] { - float: left; - font-size: 28px; - width: 28px; - margin-right: 5px; - margin-top: 2px; - } -} - -.breadcrumb .home .icon-home { - font-size: 24px; - width: 24px; - vertical-align: -1px; -} - -.info-block-small { - [class^="icon-"], - [class*=" icon-"] { - font-size: 14px; - width: 14px; - margin-top: 1px; - } -} - -.nav-tabs, -.module-heading, -.btn { - .fa { - &:last-child { - margin-right: 3px; - } - } -} diff --git a/ckan/public-bs2/base/less/iehacks.less b/ckan/public-bs2/base/less/iehacks.less deleted file mode 100644 index 116f3efd6bd..00000000000 --- a/ckan/public-bs2/base/less/iehacks.less +++ /dev/null @@ -1,245 +0,0 @@ -// Generic Internet Explorer -.ie { - - .lang-dropdown { - position: relative; - top: -20px; - } - - .module-popup { - border-bottom: none; - } - - .banner { - top: 0; - right: 0; - width: auto; - } - - .group-listing { - margin-left: -24px; // Include border around items. - } - - .toolbar .breadcrumb { - filter: none; // Remove filter set by the gradient mixin. - li { - float: left; // Fixes inline block display issues. - &:after { - margin: 0 0.2em; - } - } - } - -} - -// Internet Explorer 9 -.ie9 { - .control-large input { - height: 56px; // Fixes cropped text in IE9 - } -} - -// Internet Explorer 8 -.ie8 { - .account-masthead { - a.image, - .username { - white-space: nowrap; - } - } -} - -// Internet Explorer 7, 8 & 9 -.ie9, -.ie8, -.ie7 { - .homepage .media.module-heading .media-image img { - width: 85px !important; - } -} - -// Internet Explorer 7 & 8 -.ie8, -.ie7 { - .masthead .nav-collapse { - float:right; - } - [role=main], .main { - padding-top: 10px; - background: @layoutBackgroundColor url("@{bgPath}"); - } - // Homepage - .hero { - background: url("@{imagePath}/background-tile.png"); - .hero-primary.module-popup .box { - padding-bottom: 20px !important; - margin-bottom: 0 !important; - } - } - // Footer - .lang-dropdown { - position: relative !important; - top: -90px !important; - } -} - -// Internet Explorer 7 -.ie7 { - - // Generic fixes - .alert { - position: relative; - .close { - position: absolute; - top: 6px !important; - right: @gutterSmallY; - } - } - .media-item { - width: 30%; - } - .tags { - .tag-list { - .clearfix; - li { - display: block; - float: left; - } - } - h3 { - float: left; - } - .tag { - display: block; - } - } - - // Form based fixes - .search-giant input { - width: 95%; - } - .control-full { - input, - select, - textarea { - width: 95%; - } - &.control-large .controls input { - padding-bottom: 20px; - } - } - .controls { - position: relative; - .info-block, - .info-inline { - position: absolute; - top: 0; - right: 0; - } - } - .form-horizontal .controls { - margin-left: 0; - } - .control-custom .checkbox { - .ie7-inline-block; - } - .stages { - overflow: hidden; - background-color: @stagesBackground; - li { - height: 30px; - width: 27.5%; - button, - span { - display: block; - height: 30px; - padding-left: 20px; - } - button { - height: 50px; - } - .highlight { - width: auto; - } - } - } - - // Header - .account-masthead { - .account a i { - line-height: 31px; - } - } - .masthead { - position: relative; - z-index: 1; - .logo img, - nav { - .ie7-inline-block; - } - .header-image { - display: block; - } - .account .dropdown-menu { - z-index: 10000; - } - } - - // Navs - .module-narrow .nav-item.image { - .clearfix; - } - .nav-facet .nav-item.active a { - content: 'x'; - } - - // Toolbar - .toolbar .breadcrumb li { - padding-right: 10px; - margin-right: 5px; - background: transparent url("@{imagePath}/breadcrumb-slash-ie7.png") 100% 50% no-repeat; - &.active { - background-image: none; - } - } - - // Modules - .module-heading { - .clearfix; - position: relative; - .media-content { - position: relative; - } - .media-image img { - float: left; - } - } - .group-listing { - position: relative; - zoom: 1; - } - - // Resource Item listing on dataset page - .resource-item { - position: static; - padding-bottom: 1px; - .heading { - position: relative; - } - .format-label { - left: -48px; - } - .btn-group { - position: relative; - float: right; - top: -35px; - right: 0; - } - } - - // Adds proper BG color for IE7 - .media-overlay .media-heading { - background-color: #000; - } - -} diff --git a/ckan/public-bs2/base/less/layout.less b/ckan/public-bs2/base/less/layout.less deleted file mode 100644 index 88d7a47ac88..00000000000 --- a/ckan/public-bs2/base/less/layout.less +++ /dev/null @@ -1,251 +0,0 @@ -.wrapper { - .clearfix(); - .box(); - position: relative; - background-color:#fff; - margin-bottom: 20px; - margin-left:0; -} -@media (min-width: 768px) { - .wrapper { - background-image:url("@{imagePath}/nav.png"); - background-repeat:repeat-y; - background-position:-54px 0px; - } -} -@media (min-width: 980px) { - .wrapper { - background-position:0px 0px; - } -} - -.wrapper.no-nav { - background-image: none; -} - -[role=main], .main { - position: relative; - padding-bottom: 20px; -} -@media (min-width: 768px) { - [role=main], .main { - padding-top: 10px; - background: @layoutBackgroundColor url("@{bgPath}"); - } -} - -[role=main] { - min-height: 350px; -} - -.main:after, -[role=main]:after { - bottom: 0; - border-top-width: 1px; -} - -[role=main] .primary { - float: right; - margin-left: 0; // Remove grid margin. -} - -[role=main] .secondary { - margin-left: 0; // Remove grid margin. -} - -/* Filters modal */ -.no-text .text { - display:none; -} -.js body.filters-modal { - overflow:hidden; -} -.show-filters.btn, -.hide-filters { - display:none; -} -@media (max-width: 768px) { - .wrapper { - margin: 0 -20px; - border-width: 0; - .box-shadow(0); - .border-radius(0); - } - .js [role=main] .secondary .filters { - display:none; - position:fixed; - overflow:auto; - top:0; - left:0; - right:0; - bottom:0; - z-index:1; - padding:10px; - background-color:rgb(0,0,0); - background-color:rgba(0,0,0,0.50); - } - .js body.filters-modal .secondary .filters { - display:block; - } - .js [role=main] .secondary .filters > div { - background-color:#fff; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - overflow:hidden; - } - .js [role=main] .secondary .filters > div .module-footer { - display:none; - } - .js body.filters-modal .secondary .filters .hide-filters { - display:inline-block; - position:absolute; - top:14px; - right:17px; - opacity:0.6; - i { - font-size:18px; - } - } - .js .show-filters.btn { - display:inline-block; - } -} - -.primary > :last-child, -.secondary > :last-child { - margin-bottom: 0; -} - -.primary { - .primary { - float: left; - width: 467px; - margin-left: 0; - margin-bottom: 20px; - h1, h2, h3, h4 { - &:first-child { - margin-top: 0; - } - } - } - .tertiary { - float: left; - width: 180px; - margin-left: 18px; - margin-bottom: 20px; - } -} - -@media (min-width: 768px) { - .hero { - background: url("@{imagePath}/background-tile.png"); - } -} - -.hero:after { - // Need to manually declare this here. If you pass rgba() through to - // #gradient it breaks the filter property in IE7. - .rgba-vertial-gradient(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0)); - background-color: @moduleHeadingBackgroundColor; - border-bottom: 1px solid darken(@moduleHeadingBorderColor, 5%); - .border-radius(3px 3px 0 0); - .box-shadow(inset 0 -4px 0 rgba(0, 0, 0, 0.03)); - .back:hover { - text-decoration: none; - span { - text-decoration: underline; - } - } -} - -.context-info { - .module-content { - padding: 15px; - } - .image { - margin-bottom: 10px; - img, - a { - display: block; - .border-radius(4px); - } - } - p { - overflow: auto; - } - code { - display: block; - font-weight: normal; - padding: 0; - margin: 0; - overflow: auto; - } - h1.heading { - margin: 0 0 5px 0; - font-size: 18px; - line-height: 1.3; - .break-word(); - } - .info { - margin-top: 15px; - padding-top: 10px; - border-top: 1px dotted #DDD; - word-break: break-word; - dl dd { - margin-top: 3px; - margin-left: 0; - } - } - .nums { - .clearfix; - margin-top: 15px; - padding-top: 10px; - padding-bottom: 0; - border-top: 1px dotted #DDD; - dl { - float: left; - width: 50%; - margin: 5px 0 0 0; - color: @layoutTextColor; - dt { - display: block; - font-size: 13px; - font-weight: 300; - } - dd { - display: block; - font-size: 30px; - font-weight: 700; - line-height: 36px; - margin-left: 0; - .smallest { - font-size: 13px; - } - .smaller { - font-size: 16px; - } - .small { - font-size: 21px; - } - } - } - } - .follow_button { - margin-top: 15px; - } - &.editing { - .module-heading { - - } - .module-content { - margin-top: 0; - } - } -} - -.flash-messages { - .alert { - .box-shadow(0 0 0 1px white); - } -} diff --git a/ckan/public-bs2/base/less/main.less b/ckan/public-bs2/base/less/main.less deleted file mode 100644 index 3616d4ee915..00000000000 --- a/ckan/public-bs2/base/less/main.less +++ /dev/null @@ -1,60 +0,0 @@ - -// Bootstrap imports - -// CSS Reset -@import "../vendor/bootstrap/less/reset.less"; - -// Core variables and mixins -@import "../vendor/bootstrap/less/variables.less"; // Modify this for custom colors, font-sizes, etc -@import "../vendor/bootstrap/less/mixins.less"; - -// Grid system and page structure -@import "../vendor/bootstrap/less/scaffolding.less"; -@import "../vendor/bootstrap/less/grid.less"; -@import "../vendor/bootstrap/less/layouts.less"; - -// Base CSS -@import "../vendor/bootstrap/less/type.less"; -@import "../vendor/bootstrap/less/code.less"; -@import "../vendor/bootstrap/less/forms.less"; -@import "../vendor/bootstrap/less/tables.less"; - -// Components: common -// @import "../vendor/bootstrap/less/sprites.less"; // Replaced by font-awesome.less -@import "../vendor/bootstrap/less/dropdowns.less"; -@import "../vendor/bootstrap/less/wells.less"; -@import "../vendor/bootstrap/less/component-animations.less"; -@import "../vendor/bootstrap/less/close.less"; - -// Components: Buttons & Alerts -@import "../vendor/bootstrap/less/buttons.less"; -@import "../vendor/bootstrap/less/button-groups.less"; -@import "../vendor/bootstrap/less/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less - -// Components: Nav -@import "../vendor/bootstrap/less/navs.less"; -@import "../vendor/bootstrap/less/navbar.less"; -@import "../vendor/bootstrap/less/breadcrumbs.less"; -@import "../vendor/bootstrap/less/pagination.less"; -@import "../vendor/bootstrap/less/pager.less"; - -// Components: Popovers -@import "../vendor/bootstrap/less/modals.less"; -@import "../vendor/bootstrap/less/tooltip.less"; - -// Components: Misc -@import "../vendor/bootstrap/less/thumbnails.less"; -@import "../vendor/bootstrap/less/labels-badges.less"; -@import "../vendor/bootstrap/less/progress-bars.less"; -@import "../vendor/bootstrap/less/accordion.less"; -@import "../vendor/bootstrap/less/carousel.less"; -@import "../vendor/bootstrap/less/hero-unit.less"; -@import "../vendor/bootstrap/less/popovers.less"; - -// Utility classes -@import "../vendor/bootstrap/less/utilities.less"; // Has to be last to override when necessary - -@import "../vendor/bootstrap/less/responsive.less"; - -// CKAN -@import "ckan.less"; diff --git a/ckan/public-bs2/base/less/masthead.less b/ckan/public-bs2/base/less/masthead.less deleted file mode 100644 index ebb13672783..00000000000 --- a/ckan/public-bs2/base/less/masthead.less +++ /dev/null @@ -1,225 +0,0 @@ -@notificationsBg: #C9403A; - -.account-masthead { - .clearfix(); - min-height: 30px; - color: @mastheadTextColor; - background: darken(@mastheadBackgroundColor, 10%) url("@{bgPath}"); - .account { - float: right; - ul { - .clearfix(); - li { - display: block; - float: left; - border-left: 1px solid darken(@mastheadBackgroundColor, 15%); - a { - display: block; - color: mix(@mastheadBackgroundColor, @mastheadLinkColor, 25%); - font-size: 13px; - font-weight: bold; - padding: 0 10px; - line-height: 31px; - span.username, - span.text { - margin: 0 2px 0 4px; - } - - span.text { - position: absolute; - top: -9999px; - left: -9999px; - } - - &:hover { - color: mix(@mastheadBackgroundColor, @mastheadLinkColor, 15%); - background-color: darken(@mastheadBackgroundColor, 15%); - text-decoration: none; - } - &.sub { - font-weight: 300; - } - .btn { - vertical-align: 1px; - margin-left: 3px; - } - } - } - } - .notifications { - a { - span.badge { - font-size: 12px; - margin-left: 3px; - padding: 1px 6px; - background-color: darken(@mastheadBackgroundColor, 15%); - .border-radius(4px); - text-shadow:none; - color: mix(@mastheadBackgroundColor, @mastheadLinkColor, 25%); - } - &:hover span { - color: @mastheadLinkColor; - background-color: darken(@mastheadBackgroundColor, 20%); - } - } - &.notifications-important a { - span.badge { - color: @mastheadLinkColor; - background-color: @notificationsBg; - } - } - } - &.authed { - .image { - padding: 0 6px; - img { - vertical-align: -6px; - .border-radius(4px); - } - } - } - } -} - -.masthead { - .clearfix(); - min-height: 55px; - color: @mastheadTextColor; - background: @mastheadBackgroundColor url("@{bgPath}"); - - .container { - position: relative; - } - - a { - color: @mastheadLinkColor; - } - - hgroup { - h1, - h2 { - float: left; - font-size: 30px; - line-height: 1.5; - } - h1 { - font-weight: 900; - letter-spacing: -1px; - margin: 3px 0; - } - h2 { - position: absolute; - bottom: -3px; - left: 0; - margin: 0; - font-size: 15px; - font-weight: normal; - line-height: 1.2; - white-space: nowrap; - } - } - .logo{ - display: inline-block; - img{ - max-height: @logoMaxHeight; - } - } - .nav-collapse { - padding-top:10px; - } - - .section { - float: left; - } - - input[type="text"] { - border-color: darken(@mastheadBackgroundColor, 5); - } - - .navigation { - margin-right: 20px; - .nav-pills { - margin-bottom: 0; - li { - a:hover, - &.active a { - background-color: darken(@mastheadBackgroundColor, 10%); - } - } - } - } - .nav > li > a, - .nav > li > a:focus, - .nav > li > a:hover, - .nav > .active > a, - .nav > .active > a:hover, - .nav > .active > a:focus { - color: #fff; - text-shadow: none; - } - - .site-search { - margin: 2px 8px 2px 0; - input { - width: 200px; - padding: 4px 10px; - } - } - - .btn-navbar, - .btn-navbar:hover, - .btn-navbar:focus, - .btn-navbar:active, - .btn-navbar.active, - .btn-navbar.disabled, - .btn-navbar[disabled] { - background-color: darken(@mastheadBackgroundColor, 10%); - background-image: none; - border:none; - .box-shadow(none); - text-shadow: none; - margin-top:15px; - .icon-bar { - margin-right:0; - } - } - - .debug { - position: absolute; - top: 37px; - left: 10px; - color: rgba(255, 255, 255, 0.5); - } -} - -@media (min-width: 980px) { - .masthead .nav-collapse { - float:right; - } -} - -@media (max-width: 767px) { - .account-masthead { - margin-left:-20px; - margin-right:-20px; - padding-left:20px; - padding-right:20px; - } - .masthead .section { - float: none; - .nav-collapse { - margin-bottom: @gutterX; - } - } -} -@media (max-width: 979px) { - .masthead { - .container { - padding-left:20px; - padding-right:20px; - } - .site-search { - display:none; - } - } -} diff --git a/ckan/public-bs2/base/less/media.less b/ckan/public-bs2/base/less/media.less deleted file mode 100644 index c4b9abbefb0..00000000000 --- a/ckan/public-bs2/base/less/media.less +++ /dev/null @@ -1,153 +0,0 @@ -// Banner -.banner { - .transform(rotate(45deg)); - .transform-origin(center, center); - position: absolute; - top: 15px; - right: -35px; - width: 80px; - color: @bannerTextColor; - background-color: @bannerBackgroundColor; - padding: 1px 20px; - font-size: 11px; - text-align: center; - text-transform: uppercase; -} - - -.media-grid { - .unstyled; - .clearfix; - margin: 0 -25px; - padding-bottom: 15px; - background: lighten(@layoutBackgroundColor, 5%) url("@{bgPath}"); - border: 1px solid @moduleHeadingBorderColor; - border-width: 1px 0; -} -@media (min-width: 768px) { - .media-grid { - margin-left:-27px; - } - .module-content { - .wide .media-grid { - margin-left:-25px; - } - } -} - -.media-item { - position: relative; - float: left; - width: 189px; - padding: 15px; - margin: 15px 0 0 15px; - background-color: white; - .border-radius(3px); - span.count { - color: #999; - } - .media-image { - margin-bottom: 5px; - } - .media-edit { - opacity: 0; - position: absolute; - right: 15px; - bottom: 15px; - .transition(opacity 0.2s ease-in); - } - &:hover { - z-index: 1; - .media-edit { - opacity: 1; - } - } -} - -.media-view { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: 1px solid @moduleHeadingBorderColor; - overflow: hidden; - .transition(all 0.2s ease-in); - .border-radius(3px); - &:hover, - &.hovered { - border-color: @mastheadBackgroundColor; - .box-shadow(0 0 0 4px rgba(0, 0, 0, 0.1)); - .banner { - background-color: @bannerBackgroundColor; - } - } - span { - display: none; - } - .banner { - display: block; - background-color: darken(@moduleHeadingBorderColor, 15%); - .transition(background-color 0.2s ease-in); - } -} - -.media-image { - .border-radius(4px); -} - -.media-heading { - font-size: 18px; - line-height: 1.3; - margin: 5px 0; - .break-word(); -} - -// Overlay - -.media-overlay { - position: relative; - min-height: 35px; // Min height for the heading. -} - -.media-overlay .media-heading { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 12px 10px; - margin: 0; - background-color: #000; - background-color: rgba(0, 0, 0, 0.8); - font-size: 13px; - color: #fff; - z-index: 1; - .border-radius(0 0 3px 3px); -} - -.media-overlay .media-image { - float: none; - display: block; - margin-right: 0; -} - -.media-item.is-expander { - .truncator-link { - .transition(opacity 0.2s ease-in); - position: absolute; - z-index: 10; - left: 15px; - bottom: 15px; - opacity: 0; - } - &:hover { - padding-bottom: 35px; - .truncator-link { - opacity: 1; - } - } -} - -.wide .media-item { - width: 186px; -} diff --git a/ckan/public-bs2/base/less/mixins.less b/ckan/public-bs2/base/less/mixins.less deleted file mode 100644 index 43bfb2c408c..00000000000 --- a/ckan/public-bs2/base/less/mixins.less +++ /dev/null @@ -1,153 +0,0 @@ -.break-word { - -ms-word-break: break-all; - word-break: break-all; - - /* Non standard for webkit */ - word-break: break-word; - - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; -} - -.transform (@func) { - -webkit-transform: @arguments; - -moz-transform: @arguments; - -ms-transform: @arguments; - -o-transform: @arguments; - transform: @arguments; -} - -.transform-origin (@x, @y) { - -webkit-transform-origin: @arguments; - -moz-transform-origin: @arguments; - -ms-transform-origin: @arguments; - -o-transform-origin: @arguments; - transform-origin: @arguments; -} - -// Allows use of rgba() in gradients. This will not provide a fallback for IE. -.rgba-vertial-gradient(@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; -} - -.rgba-vertical-gradient-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; -} - -.tag { - display: inline-block; - margin-bottom: 4px; - color: @tabTextColor; - background-color: @tagBackgroundColor; - padding: 1px 10px; - border: 1px solid darken(@tagBackgroundColor, 10%); - .border-radius(100px); - .box-shadow(inset 0 1px 0 lighten(@tagBackgroundColor, 10%)); -} - -a.tag:hover { - text-decoration: none; - color: #fff; - background-color: @btnPrimaryBackground; - border: 1px solid darken(@btnPrimaryBackground, 10%); - .box-shadow(inset 0 1px 0 lighten(@btnPrimaryBackground, 10%)); -} - -.pill { - display: inline-block; - background-color: @pillBackgroundColor; - color: @pillTextColor; - padding: 2px 10px 1px 10px; - margin-right: 5px; - font-weight: normal; - .border-radius(100px); - a { - color: @pillTextColor; - &.remove { - font-size: 11px; - } - } -} - -.unstyled { - margin: 0; - list-style: none; -} - -.simple-item { - font-size: 12px; - line-height: 14 / 12em; - padding: 7px @gutterX; - border-bottom: 1px dotted @genericBorderColor; - &:last-of-type { - border-bottom: 0; - } -} - -.simple-list { - .clearfix; - .unstyled; - - & > li { - .simple-item; - } - - .ckan-icon { - position: relative; - top: 0px; - } -} - -.module-narrow .simple-list > li { - padding-left: @gutterSmallX; - padding-right: @gutterSmallX; - position: relative; -} - -.listing li { - text-align: right; - //overflow: hidden; - //white-space: nowrap; - //text-overflow: ellipsis; - margin-bottom: 5px; -} - -.listing .key, -.listing .value { -} - -.listing .key { - clear: right; - font-weight: bold; -} - -.js .tab-content { - display: none; -} - -.js .tab-content.active { - display: block; -} - -.box { - background-color: #FFF; - border: 1px solid @layoutTrimBorderColor; - .border-radius(4px); - .box-shadow(0 0 0 4px rgba(0, 0, 0, 0.05)); -} diff --git a/ckan/public-bs2/base/less/module.less b/ckan/public-bs2/base/less/module.less deleted file mode 100644 index 46a4b5c8d8e..00000000000 --- a/ckan/public-bs2/base/less/module.less +++ /dev/null @@ -1,229 +0,0 @@ -.module { - margin: 20px 0; -} - -.module-heading { - .clearfix; - margin: 0; - padding: 7px @gutterX; - font-size: 14px; - line-height: 1.3; - background-color: @moduleHeadingBackgroundColor; - border-top: 1px solid @moduleHeadingBorderColor; - border-bottom: 1px solid @moduleHeadingBorderColor; -} - -.module-content { - padding: 0 @gutterX; - margin: 20px 0; -} -@media (min-width: 768px) { - .span9 div.module-content { - padding-left:10px; - } -} - -.module-content:first-child { - margin-top: 0; - padding-top: @gutterY; -} - -.module-content:last-child { - margin-bottom: 0; - padding-bottom: @gutterY; -} - -.module-content > :last-child { - margin-bottom: 0; -} - -.module:first-child .module-heading { - .border-radius(3px 0 0 0); - border-top-width: 0; -} - -.module:last-child { - margin-bottom: 20px; -} - -.module-footer { - padding: 7px @gutterX 7px; - margin: 0; - border-top: 1px dotted @genericBorderColor; -} - -.module .read-more { - font-weight: bold; - color: @layoutBoldColor; -} - -.module-content .pagination { - margin-left: -25px; - margin-right: -25px; - margin-bottom: -20px; -} - -.module .pagination > ul { - .border-radius(0); - .box-shadow(none); - border: 0; -} - -.module .pagination li a { - border-top: 1px solid @moduleHeadingBorderColor;; - border-bottom: 1px solid @moduleHeadingBorderColor;; - padding-top: 7px; - padding-bottom: 7px; -} - -.module .pagination li:first-child a, -.module .pagination li:last-child a { - .border-radius(0); -} - -.module-content-shallow { - padding: 0; - margin-top: 10px; - padding-bottom: 10px; -} - -.module h1 { - margin-bottom: 20px; -} - -// Module Shallow - -.module-shallow .module-content { - padding: 10px; - margin: 0; -} - -.module-shallow .module-tags { - margin-top: 0; - margin-bottom: 0; -} - -.module-shallow .module-content:first-child { - padding-top: 10px; -} - -.module-shallow .module-content:last-child { - padding-bottom: 10px; -} - -// Secondary column specific - -.module-narrow { - .module-heading, - .module-content, - .module-footer { - padding-left: @gutterSmallX; - padding-right: @gutterSmallX; - } -} - -// Module Grid - -.module-grid { - .unstyled; - .media-grid; - // .media-wide; -} - -.module-item { - .media-item; - .makeColumn(6); - padding-top: 10px; - padding-bottom: 10px; - padding-right: 50px; - overflow: hidden; - position: relative; -} - -.module-item.first { - clear: left; -} - -// GROUP - -.group .content img { - margin: 0 -5px 5px; - max-width: initial; -} - -.group .content h3 { - font-size: 14px; - line-height: 1.3; -} - -.group-listing { - margin-left: -20px; // Same as .row -} - -// PREVIEW - -.ckanext-datapreview { - position: relative; - clear: both; - - padding-top: 15px; - margin-top: 0; - - & > iframe { - min-height: 650px; - } - & > img { - max-height: 500px; - max-width: 100%; - overflow: hidden; - } -} - -.package-info { - h4 { - margin-bottom: 10px; - } -} - -.module-resource { - background-color: @layoutTrimBackgroundColor; - border-bottom: 1px solid @genericBorderColor; - margin-top: 0; - margin-bottom: 0; - .border-radius(3px 3px 0 0); - .actions { - position: relative; - float: right; - top: -10px; - right: -15px; - } -} - -.module .module-tags { - padding-bottom: 8px; -} - -.secondary, -.primary { - .module:first-child { - margin-top: 0; - } -} - -.no-nav .module:last-child { - margin-top: 0; -} - -.module-image { - float: left; - width: 50px; - height: 50px; - line-height: 50px; - text-align: center; - margin-right: 15px; - img { - max-width: 50px; - max-height: 50px; - vertical-align: middle; - } -} diff --git a/ckan/public-bs2/base/less/nav.less b/ckan/public-bs2/base/less/nav.less deleted file mode 100644 index 53f06112034..00000000000 --- a/ckan/public-bs2/base/less/nav.less +++ /dev/null @@ -1,167 +0,0 @@ -.nav-simple, -.nav-aside { - .simple-list; // Adds border and padding. - padding-bottom: 0; -} - -.nav-aside { - border-top: 1px dotted #DDD; - border-bottom: 1px dotted #DDD; - margin-bottom: 15px; -} - -.nav-item > a, -.nav-aside li a { - color: @navLinkColor; - font-size: @baseFontSize; - line-height: @baseLineHeight; - margin: -7px -@gutterX; - padding: 7px @gutterX; -} - -.nav-item.active, -.nav-aside li.active { - background-color: @navActiveBackgroundColor; -} - -.nav-item.active > a, -.nav-aside li.active a { - position: relative; - color: @navItemActiveTextColor; - background-color: @navItemActiveBackgroundColor; - &:hover { - color: @navItemActiveTextColor; - background-color: @navItemActiveBackgroundColor; - } -} -@media (min-width: 768px) { - .nav-item.active > a:before, - .nav-aside li.active a:before { - content: ' '; - position: absolute; - top: 0; - right: -6px; - width: 6px; - height: 34px; - background-image: url("@{imagePath}/nav-active.png?1"); - } -} - -.nav-item.active > a span, -.nav-aside li.active a span { - white-space: nowrap; - overflow:hidden; - display:block; -} - -.module-narrow .nav-item > a, -.module-narrow .nav-aside li a { - padding-left: @gutterSmallX; - padding-right: @gutterSmallX; - position: relative; -} - -.module-narrow .nav-item.image, -.module-narrow .nav-aside li.image { - position: relative; -} - -.module-narrow .nav-item.image > a, -.module-narrow .nav-aside li.image a { - padding-left: @gutterSmallX + 27; - padding-right: @gutterSmallX + 27; -} - -.module-narrow .nav-item.image > img, -.module-narrow .nav-aside li.image img { - position: absolute; - top: 50%; - left: @gutterSmallX; - width: 20px; - height: 20px; - margin-top: -10px; - z-index: 2; -} - -// FACET NAVIGATION - -.nav-facet .nav-item > a:hover:after, -.nav-facet .nav-item.active > a:after { - .ckan-icon; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; -} - -.nav-facet .nav-item > a:hover:after { - .ckan-icon-circle-add; -} - -.nav-facet .nav-item.active > a:after { - .ckan-icon-circle-cross; - right: 3px; -} - -.user-list { - .unstyled; - li { - margin: 0 0 10px 0; - } - .gravatar { - vertical-align: -4px; - margin-right: 3px; - .border-radius(100px); - } -} - -.nav-facet-tertiary { - margin: 10px 0; - .module-heading { - margin-bottom: 5px; - padding: 8px 12px; - border-bottom-width: 0; - .border-radius(5px); - i { - display: none; - } - } - .module-footer { - padding: 8px 12px; - border-top-width: 0; - a { - font-weight: normal; - color: #8C8C8C; - } - } - .nav { - margin-bottom: 0; - } - .module-content.empty { - padding: 8px 12px; - margin-top: 0; - } - .nav li.active { - position: relative; - } - .nav li.active > a:hover:after, - .nav li.active > a:after { - .ckan-icon; - .ckan-icon-circle-cross; - content: ""; - position: absolute; - top: 50%; - right: 5px; - margin-top: -8px; - } -} - -.nav-simple > .nav-btn { - padding-left: 0; - padding-right: 0; - text-align: center; - .btn { - display: inline-block; - } -} diff --git a/ckan/public-bs2/base/less/profile.less b/ckan/public-bs2/base/less/profile.less deleted file mode 100644 index ac613664b89..00000000000 --- a/ckan/public-bs2/base/less/profile.less +++ /dev/null @@ -1,6 +0,0 @@ -.profile { - .empty, - .dataset-list { - margin-bottom: 20px; - } -} diff --git a/ckan/public-bs2/base/less/prose.less b/ckan/public-bs2/base/less/prose.less deleted file mode 100644 index 8c870cc5018..00000000000 --- a/ckan/public-bs2/base/less/prose.less +++ /dev/null @@ -1,96 +0,0 @@ -h1 { - font-size: 28px; -} -h2 { - font-size: 21px; -} -h3 { - font-size: 18px; -} -h4 { - font-size: @baseFontSize; -} - -h1, h2, h3, h4 { - line-height: 1.5; - small { - font-size: @baseFontSize; - } -} - -.prose { - h1, heading-1 - h2, heading-2 { - margin-bottom: 15px; - } - - h3, heading-3 { - margin-bottom: 10px; - } -} - -.table-chunky td, -.table-chunky th { - padding: 12px 15px; - font-size: 12px; -} - -.table-chunky thead th, -.table-chunky thead td { - color: @chunkyTableHeaderTextColor; - background-color: @chunkyTableHeaderBackgroundColor; - padding-top: 10px; - padding-bottom: 10px; -} - -.table-striped { - tbody { - tr:nth-child(odd) td, - tr:nth-child(odd) th { - background-color: transparent; - } - tr:nth-child(even) td, - tr:nth-child(even) th { - background-color: @chunkyTableStripeBackgroundColor; - } - } -} - -// Oh boy. -.table-chunky.table-bordered { - @radius: 2px; - .border-radius(@radius); - // 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 { - -webkit-border-top-left-radius: @radius; - -moz-border-radius-topleft: @radius; - border-top-left-radius: @radius; - } - thead:first-child tr:first-child th:last-child, - tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: @radius; - -moz-border-radius-topright: @radius; - border-top-right-radius: @radius; - } - // 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 { - .border-radius(0 0 0 @radius); - -webkit-border-bottom-left-radius: @radius; - -moz-border-radius-bottomleft: @radius; - border-bottom-left-radius: @radius; - } - thead:last-child tr:last-child th:last-child, - tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: @radius; - -moz-border-radius-bottomright: @radius; - border-bottom-right-radius: @radius; - } -} - -.ellipsis { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} diff --git a/ckan/public-bs2/base/less/resource-view.less b/ckan/public-bs2/base/less/resource-view.less deleted file mode 100644 index 23b59540ef3..00000000000 --- a/ckan/public-bs2/base/less/resource-view.less +++ /dev/null @@ -1,22 +0,0 @@ -.resource-view-filters { - margin-bottom: 1em; - - .resource-view-filter { - margin-bottom: 1.0em; - } - - .resource-view-remove-filter { - cursor: pointer; - color: @errorText; - } - - .resource-view-filter-values .select2-container { - margin-right: 0.3em; - margin-bottom: 0.2em; - width: 24% !important; - - .select2-search-choice-close { - left: auto; - } - } -} diff --git a/ckan/public-bs2/base/less/search.less b/ckan/public-bs2/base/less/search.less deleted file mode 100644 index f7ade63790a..00000000000 --- a/ckan/public-bs2/base/less/search.less +++ /dev/null @@ -1,123 +0,0 @@ -.search-form { - // .clearfix; - margin-bottom: 20px; - padding-bottom: 25px; - border-bottom: 1px dotted @genericBorderColor; - - // Normal search box - .search-input { - position: relative; - margin-bottom: 20px; - input { - .box-sizing(border-box); - margin: 0; - width: 100%; - height: auto; - } - button { - cursor: pointer; - display: block; - position: absolute; - top: 50%; - margin-top: 1px; - right: 10px; - height: 20px; - padding: 0; - border: none; - background: transparent; - span { - display: none; - } - i { - color: @inputBorder; - .transition(color 0.2s ease-in); - } - &:hover i { - color: @inputColor; - } - } - &.search-giant { - input { - font-size: 16px; - padding: 15px; - } - button { - margin-top: -4px; - right: 15px; - height: 30px; - i { - font-size: 28px; - width: 28px; - } - } - } - } - .control-order-by { - label, - select { - display: inline; - } - select { - width: 160px; - margin: 0; - } - } - h2 { - font-size: 24px; - line-height: 1.3; - color: @layoutBoldColor; - margin-bottom: 0; - margin-top:20px; - } - .filter-list { - color: @layoutTextColor; - line-height: 32px; - margin: 10px 0 0 0; - .pill { - line-height: 21px; - } - .extra { - margin-top: 10px; - font-size: 18px; - font-weight: normal; - color: @layoutBoldColor; - } - } - &.no-bottom-border { - border-bottom-width: 0; - margin-bottom: 0; - } -} - -.tertiary { - .control-order-by { - float: none; - margin: 0; - label { - display: block; - margin-bottom: 5px; - font-weight: normal; - font-size: 12px; - } - select { - display: block; - font-size: 12px; - width: 100%; - } - } - .search-input { - margin-bottom: 10px; - } -} -@media (min-width: 980px) { - .search-form .control-order-by { - float:right; - margin-left:15px; - } - .tertiary { - .search-form .control-order-by { - float: none; - margin: 0; - } - } -} diff --git a/ckan/public-bs2/base/less/tables.less b/ckan/public-bs2/base/less/tables.less deleted file mode 100644 index bc80be194f0..00000000000 --- a/ckan/public-bs2/base/less/tables.less +++ /dev/null @@ -1,70 +0,0 @@ -.table-selected td { - background-color: @formActionsBackground; - .edit { - display: block; - } -} - -.table-bulk-edit { - th input { - top: -5px; - } - .table-actions .btn-group { - float: left; - margin: 0 10px 0 0; - } - .context p { - margin-bottom: 0; - } -} - -.table-header thead th { - background-color: @moduleHeadingBackgroundColor; -} - -.table-edit-hover { - .edit { - display: none; - float: right; - } - tr:hover .edit { - display: block; - } -} - -.js { - .table-toggle-more { - .toggle-more { - display: none; - } - .show-more { - display: inline; - } - .show-less { - display: none; - } - .toggle-seperator { - display: table-row; - td { - height: 11px; - padding: 0; - background-image: url("@{imagePath}/table-seperator.png"); - } - } - } - .table .toggle-show td { - background: none; - text-align: center; - } - .table-toggle-less { - .show-less { - display: inline; - } - .show-more { - display: none; - } - .toggle-seperator { - display: none; - } - } -} diff --git a/ckan/public-bs2/base/less/toolbar.less b/ckan/public-bs2/base/less/toolbar.less deleted file mode 100644 index e8406b80cb2..00000000000 --- a/ckan/public-bs2/base/less/toolbar.less +++ /dev/null @@ -1,145 +0,0 @@ -.toolbar { - .clearfix; - position: relative; - margin-bottom: 10px; - padding: 5px 0; -} - -.page_primary_action { - margin-bottom: 20px; -} - -.toolbar .breadcrumb { - .clearfix; - .box-shadow(none); - position: relative; - float: left; - margin: 0; - padding: 0; - border: none; - background: none; - font-size: 20px; - line-height: 1.3; -} - -.toolbar .breadcrumb li:after { - content: " / "; -} - -.toolbar .breadcrumb li.active:after { - content: ""; -} - -// Needs to be a separate declaration as IE chokes on the last-of-type. -.toolbar .breadcrumb li:last-of-type:after { - content: ""; -} - -.toolbar .home a { - text-decoration: none; -} - -.toolbar .home span { - display: none; -} - -.toolbar .breadcrumb a { - color: @breadcrumbTextColor; -} -@media (max-width: 767px) { - .toolbar .breadcrumb { - color:#fff; - text-shadow:none; - .home { - display:none; - } - a { - color:#fff; - text-shadow:none; - } - } -} - -.toolbar .breadcrumb .active a, -.toolbar .breadcrumb a.active { - font-weight: bold; -} - -.actions { - .unstyled; - position: absolute; - top: 10px; - right: 10px; - z-index: 1; -} - -.actions li { - display: inline-block; - margin-right: 5px; - .ie7-inline-block; -} - -.actions li:last-of-type { - margin-right: 0; -} - -.hide-heading { - display: none; -} - -.page-header { - .clearfix; - border-bottom: 1px solid @moduleHeadingBorderColor; - background-color: @moduleHeadingBackgroundColor; - .border-radius(0 3px 0 0); - .nav-tabs { - float: left; - margin-bottom: -1px; - li.active a, - a:hover { - background-color: @moduleBackgroundColor; - } - } - .content_action { - float: right; - margin-top: -5px; - margin-right: -7px; - } -} - -.no-nav .page-header { - .border-radius(3px 3px 0 0); -} - -.nav-tabs-plain { - padding: 0 @gutterX; - & > .active > a, - & > .active > a:hover { - background-color: @moduleBackgroundColor; - } -} - -@media (min-width: 768px) { - .span9 .page-header { - margin-left:-17px; - } -} -@media (max-width: 768px) { - .page-header .nav-tabs { - margin:5px 10px 10px -5px; - border:none; - } - .page-header .nav-tabs > li { - float: none; - } - .page-header .nav-tabs > li a { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .page-header .nav-tabs > .active > a, - .page-header .nav-tabs > .active > a:hover, - .page-header .nav-tabs > .active > a:focus { - border-bottom-color:#dddddd; - } -} diff --git a/ckan/public-bs2/base/less/variables.less b/ckan/public-bs2/base/less/variables.less deleted file mode 100644 index 8ac44efb25c..00000000000 --- a/ckan/public-bs2/base/less/variables.less +++ /dev/null @@ -1,125 +0,0 @@ -// Base variables -@imagePath: "../../../base/images"; -@spritePath: "@{imagePath}/sprite-ckan-icons.png"; -@bgPath: "@{imagePath}/bg.png"; -@FontAwesomePath: "../../../base/vendor/font-awesome/font"; - -// Layout Variables -@layoutFontFamily: 'Helvetica Neue', Helvetica, Arial, sans-serif; -@layoutTextColor: #444; -@layoutBoldColor: #000; -@layoutLinkColor: #187794; -@layoutBackgroundColor: #eee; -@layoutTrimBackgroundColor: #fff; -@layoutTrimBorderColor: #ccc; -@logoMaxHeight: 55px; - -@navLinkColor: #333; -@navActiveBackgroundColor: #f6f6f6; - -// Module Variables -@moduleBackgroundColor: #fff; -@moduleHeadingBorderColor: #ddd; -@moduleHeadingBackgroundColor: #f6f6f6; -@moduleHeadingActionTextColor: #888; -@moduleExpandedBackgroundColor: rgba(255, 255, 255, 0.9); - -@tabTextColor: #111; -@tagBackgroundColor: #f6f6f6; - -@gutterX: 25px; -@gutterY: 20px; -@gutterSmallX: 15px; -@gutterSmallY: @gutterY; - -@emptyTextColor: #aaa; -@genericBorderColor: #ddd; - -@breadcrumbTextColor: #505050; - -@mastheadTextColor: #fff; -@mastheadLinkColor: @mastheadTextColor; -@mastheadBackgroundColor: #005d7a; -@mastheadBackgroundColorStart: #005d7a; -@mastheadBackgroundColorEnd: #00536b; - -@navItemActiveTextColor: #FFF; -@navItemActiveBackgroundColor: #8CA0A6; - -@pillTextColor: @navItemActiveTextColor; -@pillBackgroundColor: darken(@navItemActiveBackgroundColor, 10%); - -@bannerTextColor: @mastheadTextColor; -@bannerBackgroundColor: @mastheadBackgroundColor; - - -@footerTextColor: #CCDEE3; -@footerLinkColor: @footerTextColor; - -@inputColor: @black; -@inputBackground: @white; -@inputBorder: #ccc; -@inputBorderRadius: 3px; -@disabledCustomInputTextColor: #aaa; -@disabledCustomInputBackground: #f3f3f3; - -@highlightBackground: #fdf7e9; -@highlightHoverBackground: #fdf3d9; - -// Forms - -@errorText: #b55457; -@errorBackground: lighten(#c6898b, 30%); -@errorBorder: #c6898b; - -@formInfoText: #707070; - -@stagesTextColor: #aeaeae; -@stagesBackground: #EDEDED; -@stagesTransparentBackground: rgba(237, 237, 237, 0); // Used for arrows. -@stagesActiveTextColor: #fff; -@stagesActiveBackground: #8cc68a; -@stagesActiveTransparentBackground: rgba(140, 198, 138, 0); -@stagesCompleteTextColor: #eef6ed; -@stagesCompleteBackground: #c5e2c4; -@stagesCompleteTransparentBackground: rgba(197, 226, 196, 0); -@stagesCounterTextColor: #fff; -@stagesCounterBackground: #aeaeae; -@stagesCounterActiveTextColor: #8cc68a; -@stagesCounterActiveBackground: #fff; -@stagesCounterCompleteTextColor: #c5e2c4; -@stagesCounterCompleteBackground: #eef6ed; - -@codeTextColor: #000; - - -// Datasets - -@listingHeadingTextColor: #333; -@resourceFormatBackground: #aaa; - -// Table - -@chunkyTableHeaderTextColor: #fff; -@chunkyTableHeaderBackgroundColor: #aaa; -@chunkyTableStripeBackgroundColor: #f2f2f2; - -// Twitter Bootstrap Overrides -@bodyBackground: @layoutBackgroundColor; -@btnBackground: #ffffff; -@btnBackgroundHighlight: #eaeaea; -@btnPrimaryBackground: #30778d; -@btnPrimaryBackgroundHighlight: #085871; -@baseFontFamily: @layoutFontFamily; -@textColor: @layoutTextColor; -@linkColor: @layoutLinkColor; -@iconSpritePath: "../images/bootstrap-glyphicons-halflings.png"; -@iconWhiteSpritePath: "../images/bootstrap-glyphicons-halflings-white.png"; - -// Activity Stream base colors -@activityColorText: #FFFFFF; -@activityColorBlank: #999999; -@activityColorNew: #69A67A; -@activityColorNeutral: #767DCE; -@activityColorModify: #767DCE; -@activityColorDelete: #B95252; diff --git a/ckan/public-bs2/base/test/index.html b/ckan/public-bs2/base/test/index.html deleted file mode 100644 index 990142a7cf0..00000000000 --- a/ckan/public-bs2/base/test/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - Mocha Tests - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ckan/public-bs2/base/test/primer/index.html b/ckan/public-bs2/base/test/primer/index.html deleted file mode 100644 index 0ce2ad5e5bc..00000000000 --- a/ckan/public-bs2/base/test/primer/index.html +++ /dev/null @@ -1,647 +0,0 @@ - - - - - CKAN Primer - - - - - -
    -

    CKAN CSS Primer

    -
    -

    This is an empty module

    -
    -
    -

    Module Heading

    -
    -

    This is an example module with a heading and stuff

    -
    -
    -
    -

    Module Heading

    - -
    -
    -

    Module Heading

    - - -
    -
    -

    General Prose

    -
    -

    Sections Linked

    -

    The main page header of this guide is an h1 element. Any header elements may include links, as depicted in the example.

    -

    The secondary header above is an h2 element, which may be used for any form of important page-level header. More than one may be used per page. Consider using an h2 unless you need a header level of less importance, or as a sub-header to an existing h2 element.

    -

    Third-Level Header Linked

    -

    The header above is an h3 element, which may be used for any form of page-level header which falls below the h2 header in a document hierarchy.

    -

    Fourth-Level Header Linked

    -

    The header above is an h4 element, which may be used for any form of page-level header which falls below the h3 header in a document hierarchy.

    -
    Fifth-Level Header Linked
    -

    The header above is an h5 element, which may be used for any form of page-level header which falls below the h4 header in a document hierarchy.

    -
    Sixth-Level Header Linked
    -

    The header above is an h6 element, which may be used for any form of page-level header which falls below the h5 header in a document hierarchy.

    - -

    Grouping content

    -

    Paragraphs

    -

    All paragraphs are wrapped in p tags. Additionally, p elements can be wrapped with a blockquote element if the p element is indeed a quote. Historically, blockquote has been used purely to force indents, but this is now achieved using CSS. Reserve blockquote for quotes.

    - -

    Horizontal rule

    -

    The hr element represents a paragraph-level thematic break, e.g. a scene change in a story, or a transition to another topic within a section of a reference book. The following extract from Pandora’s Star by Peter F. Hamilton shows two paragraphs that precede a scene change and the paragraph that follows it:

    -
    -

    Dudley was ninety-two, in his second life, and fast approaching time for another rejuvenation. Despite his body having the physical age of a standard fifty-year-old, the prospect of a long degrading campaign within academia was one he regarded with dread. For a supposedly advanced civilization, the Intersolar Commonwearth could be appallingly backward at times, not to mention cruel.

    -

    Maybe it won’t be that bad, he told himself. The lie was comforting enough to get him through the rest of the night’s shift.

    -
    -

    The Carlton AllLander drove Dudley home just after dawn. Like the astronomer, the vehicle was old and worn, but perfectly capable of doing its job. It had a cheap diesel engine, common enough on a semi-frontier world like Gralmond, although its drive array was a thoroughly modern photoneural processor. With its high suspension and deep-tread tyres it could plough along the dirt track to the observatory in all weather and seasons, including the metre-deep snow of Gralmond’s winters.

    -
    - -

    Pre-formatted text

    -

    The pre element represents a block of pre-formatted text, in which structure is represented by typographic conventions rather than by elements. Such examples are an e-mail (with paragraphs indicated by blank lines, lists indicated by lines prefixed with a bullet), fragments of computer code (with structure indicated according to the conventions of that language) or displaying ASCII art. Here’s an example showing the printable characters of ASCII:

    -
    -
      ! " # $ % & ' ( ) * + , - . /
    -    0 1 2 3 4 5 6 7 8 9 : ; < = > ?
    -    @ A B C D E F G H I J K L M N O
    -    P Q R S T U V W X Y Z [ \ ] ^ _
    -    ` a b c d e f g h i j k l m n o
    -    p q r s t u v w x y z { | } ~ 
    -
    - -

    Blockquotes

    -

    The blockquote element represents a section that is being quoted from another source.

    -
    -
    -

    Many forms of Government have been tried, and will be tried in this world of sin and woe. No one pretends that democracy is perfect or all-wise. Indeed, it has been said that democracy is the worst form of government except all those other forms that have been tried from time to time.

    -
    -

    Winston Churchill, in a speech to the House of Commons. 11th November 1947

    -
    -

    Additionally, you might wish to cite the source, as in the above example. The correct method involves including the cite attribute on the blockquote element, but since no browser makes any use of that information, it’s useful to link to the source also.

    - -

    Ordered list

    -

    The ol element denotes an ordered list, and various numbering schemes are available through the CSS (including 1,2,3… a,b,c… i,ii,iii… and so on). Each item requires a surrounding <li> and </li> tag, to denote individual items within the list (as you may have guessed, li stands for list item).

    -
    -
      -
    1. This is an ordered list.
    2. -
    3. - This is the second item, which contains a sub list -
        -
      1. This is the sub list, which is also ordered.
      2. -
      3. It has two items.
      4. -
      -
    4. -
    5. This is the final item on this list.
    6. -
    -
    - -

    Unordered list

    -

    The ul element denotes an unordered list (ie. a list of loose items that don’t require numbering, or a bulleted list). Again, each item requires a surrounding <li> and </li> tag, to denote individual items. Here is an example list showing the constituent parts of the British Isles:

    -
    -
      -
    • - United Kingdom of Great Britain and Northern Ireland: -
        -
      • England
      • -
      • Scotland
      • -
      • Wales
      • -
      • Northern Ireland
      • -
      -
    • -
    • Republic of Ireland
    • -
    • Isle of Man
    • -
    • - Channel Islands: -
        -
      • Bailiwick of Guernsey
      • -
      • Bailiwick of Jersey
      • -
      -
    • -
    -
    -

    Sometimes we may want each list item to contain block elements, typically a paragraph or two.

    -
    -
      -
    • -

      The British Isles is an archipelago consisting of the two large islands of Great Britain and Ireland, and many smaller surrounding islands.

      -
    • -
    • -

      Great Britain is the largest island of the archipelago. Ireland is the second largest island of the archipelago and lies directly to the west of Great Britain.

      -
    • -
    • -

      The full list of islands in the British Isles includes over 1,000 islands, of which 51 have an area larger than 20 km2.

      -
    • -
    -
    - -

    Definition list

    -

    The dl element is for another type of list called a definition list. Instead of list items, the content of a dl consists of dt (Definition Term) and dd (Definition description) pairs. Though it may be called a “definition list”, dl can apply to other scenarios where a parent/child relationship is applicable. For example, it may be used for marking up dialogues, with each dt naming a speaker, and each dd containing his or her words.

    -
    -
    -
    This is a term.
    -
    This is the definition of that term, which both live in a dl.
    -
    Here is another term.
    -
    And it gets a definition too, which is this line.
    -
    Here is term that shares a definition with the term below.
    -
    Here is a defined term.
    -
    dt terms may stand on their own without an accompanying dd, but in that case they share descriptions with the next available dt. You may not have a dd without a parent dt.
    -
    -
    - -

    Figures

    -

    Figures are usually used to refer to images:

    -
    -
    - Example image -
    -

    This is a placeholder image, with supporting caption.

    -
    -
    -
    -

    Here, a part of a poem is marked up using figure:

    -
    -
    -

    ‘Twas brillig, and the slithy toves
    - Did gyre and gimble in the wabe;
    - All mimsy were the borogoves,
    - And the mome raths outgrabe.

    -
    -

    Jabberwocky (first verse). Lewis Carroll, 1832-98

    -
    -
    -
    - -

    Text-level Semantics

    -

    There are a number of inline HTML elements you may use anywhere within other elements.

    - -

    Links and anchors

    -

    The a element is used to hyperlink text, be that to another page, a named fragment on the current page or any other location on the web. Example:

    - - -

    Stressed emphasis

    -

    The em element is used to denote text with stressed emphasis, i.e., something you’d pronounce differently. Where italicizing is required for stylistic differentiation, the i element may be preferable. Example:

    -
    -

    You simply must try the negitoro maki!

    -
    - -

    Strong importance

    -

    The strong element is used to denote text with strong importance. Where bolding is used for stylistic differentiation, the b element may be preferable. Example:

    -
    -

    Don’t stick nails in the electrical outlet.

    -
    - -

    Small print

    -

    The small element is used to represent disclaimers, caveats, legal restrictions, or copyrights (commonly referred to as ‘small print’). It can also be used for attributions or satisfying licensing requirements. Example:

    -
    -

    Copyright © 1922-2011 Acme Corporation. All Rights Reserved.

    -
    - -

    Strikethrough

    -

    The s element is used to represent content that is no longer accurate or relevant. When indicating document edits i.e., marking a span of text as having been removed from a document, use the del element instead. Example:

    -
    -

    Recommended retail price: £3.99 per bottle
    Now selling for just £2.99 a bottle!

    -
    - -

    Citations

    -

    The cite element is used to represent the title of a work (e.g. a book, essay, poem, song, film, TV show, sculpture, painting, musical, exhibition, etc). This can be a work that is being quoted or referenced in detail (i.e. a citation), or it can just be a work that is mentioned in passing. Example:

    -
    -

    Universal Declaration of Human Rights, United Nations, December 1948. Adopted by General Assembly resolution 217 A (III).

    -
    - -

    Inline quotes

    -

    The q element is used for quoting text inline. Example showing nested quotations:

    -
    -

    John said, I saw Lucy at lunch, she told me Mary wants you to get some ice cream on your way home. I think I will get some at Ben and Jerry’s, on Gloucester Road.

    -
    - -

    Definition

    -

    The dfn element is used to highlight the first use of a term. The title attribute can be used to describe the term. Example:

    -
    -

    Bob’s canine mother and equine father sat him down and carefully explained that he was an allopolyploid organism.

    -
    - -

    Abbreviation

    -

    The abbr element is used for any abbreviated text, whether it be acronym, initialism, or otherwise. Generally, it’s less work and useful (enough) to mark up only the first occurrence of any particular abbreviation on a page, and ignore the rest. Any text in the title attribute will appear when the user’s mouse hovers the abbreviation (although notably, this does not work in Internet Explorer for Windows). Example abbreviations:

    -
    -

    BBC, HTML, and Staffs.

    -
    - -

    Time

    -

    The time element is used to represent either a time on a 24 hour clock, or a precise date in the proleptic Gregorian calendar, optionally with a time and a time-zone offset. Example:

    -
    -

    Queen Elizabeth II was proclaimed sovereign of each of the Commonwealth realms on and , after the death of her father, King George VI.

    -
    - -

    Code

    -

    The code element is used to represent fragments of computer code. Useful for technology-oriented sites, not so useful otherwise. Example:

    -
    -

    When you call the activate() method on the robotSnowman object, the eyes glow.

    -
    -

    Used in conjunction with the pre element:

    -
    -
    function getJelly() {
    -        echo $aDeliciousSnack;
    -    }
    -
    - -

    Variable

    -

    The var element is used to denote a variable in a mathematical expression or programming context, but can also be used to indicate a placeholder where the contents should be replaced with your own value. Example:

    -
    -

    If there are n pipes leading to the ice cream factory then I expect at least n flavours of ice cream to be available for purchase!

    -
    - -

    Sample output

    -

    The samp element is used to represent (sample) output from a program or computing system. Useful for technology-oriented sites, not so useful otherwise. Example:

    -
    -

    The computer said Too much cheese in tray two but I didn’t know what that meant.

    -
    - -

    Keyboard entry

    -

    The kbd element is used to denote user input (typically via a keyboard, although it may also be used to represent other input methods, such as voice commands). Example:

    -

    -

    To take a screenshot on your Mac, press ⌘ Cmd + ⇧ Shift + 3.

    -
    - -

    Superscript and subscript text

    -

    The sup element represents a superscript and the sub element represents a sub. These elements must be used only to mark up typographical conventions with specific meanings, not for typographical presentation. As a guide, only use these elements if their absence would change the meaning of the content. Example:

    -
    -

    The coordinate of the ith point is (xi, yi). For example, the 10th point has coordinate (x10, y10).

    -

    f(x, n) = log4xn

    -
    - -

    Italicised

    -

    The i element is used for text in an alternate voice or mood, or otherwise offset from the normal prose. Examples include taxonomic designations, technical terms, idiomatic phrases from another language, the name of a ship or other spans of text whose typographic presentation is typically italicised. Example:

    -
    -

    There is a certain je ne sais quoi in the air.

    -
    - -

    Emboldened

    -

    The b element is used for text stylistically offset from normal prose without conveying extra importance, such as key words in a document abstract, product names in a review, or other spans of text whose typographic presentation is typically emboldened. Example:

    -
    -

    You enter a small room. Your sword glows brighter. A rat scurries past the corner wall.

    -
    - -

    Marked or highlighted text

    -

    The mark element is used to represent a run of text marked or highlighted for reference purposes. When used in a quotation it indicates a highlight not originally present but added to bring the reader’s attention to that part of the text. When used in the main prose of a document, it indicates a part of the document that has been highlighted due to its relevance to the user’s current activity. Example:

    -
    -

    I also have some kittens who are visiting me these days. They’re really cute. I think they like my garden! Maybe I should adopt a kitten.

    -
    - -

    Edits

    -

    The del element is used to represent deleted or retracted text which still must remain on the page for some reason. Meanwhile its counterpart, the ins element, is used to represent inserted text. Both del and ins have a datetime attribute which allows you to include a timestamp directly in the element. Example inserted text and usage:

    -
    -

    She bought two five pairs of shoes.

    -
    - -

    Tabular data

    -

    Tables should be used when displaying tabular data. The thead, tfoot and tbody elements enable you to group rows within each a table.

    -

    If you use these elements, you must use every element. They should appear in this order: thead, tfoot and tbody, so that browsers can render the foot before receiving all the data. You must use these tags within the table element.

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The Very Best Eggnog
    IngredientsServes 12Serves 24
    Milk1 quart2 quart
    Cinnamon Sticks21
    Vanilla Bean, Split12
    Cloves510
    Mace10 blades20 blades
    Egg Yolks1224
    Cups Sugar1 ½ cups3 cups
    Dark Rum1 ½ cups3 cups
    Brandy1 ½ cups3 cups
    Vanilla1 tbsp2 tbsp
    Half-and-half or Light Cream1 quart2 quart
    Freshly grated nutmeg to taste
    -
    - -

    Forms

    -

    Forms can be used when you wish to collect data from users. The fieldset element enables you to group related fields within a form, and each one should contain a corresponding legend. The label element ensures field descriptions are associated with their corresponding form widgets.

    -
    -
    -
    - Legend -
    - - - Note about this field -
    -
    - - - Note about this field -
    -
    - - - Note about this field -
    -
    - - - Note about this field -
    -
    - - - Note about this field -
    -
    - - -
    -
    - - - Note about this selection -
    -
    - Checkbox * -
    - - - -
    -
    -
    -
    - Radio - -
    -
    -
    - - -
    -
    -
    -
    - -

    This block is copyright © 2012 Paul Robert Lloyd. Code covered by the MIT license.

    -
    -
    -

    Dataset Results

    -
    -
    -
      -
    • -

      Counselling in London Central, Camden

      - -
      -

      This is an application programming interface (API) that opens up - core EU legislative data for further use. The interface uses JSON, - meaning that you have easy to use machine-readable access to - metadata on European Union legislation.

      -

      It will be useful if you - want to use or analyze European Union legislative data in a way - that the official databases are not originally build for. The API - extracts, organize and connects data from various official - sources.

      -
      -
    • -
    -
    -
    -
    -
    -
      -
    • -

      Counselling in London Central, Camden

      - -
      -

      This is an application programming interface (API) that opens up - core EU legislative data for further use. The interface uses JSON, - meaning that you have easy to use machine-readable access to - metadata on European Union legislation.

      -

      It will be useful if you - want to use or analyze European Union legislative data in a way - that the official databases are not originally build for. The API - extracts, organize and connects data from various official - sources.

      -
      -
    • -
    • -

      Counselling in London Central, Camden

      - -
      -

      This is an application programming interface (API) that opens up - core EU legislative data for further use. The interface uses JSON, - meaning that you have easy to use machine-readable access to - metadata on European Union legislation.

      -

      It will be useful if you - want to use or analyze European Union legislative data in a way - that the official databases are not originally build for. The API - extracts, organize and connects data from various official - sources.

      -
      -
    • -
    • -

      Counselling in London Central, Camden

      - -
      -

      This is an application programming interface (API) that opens up - core EU legislative data for further use. The interface uses JSON, - meaning that you have easy to use machine-readable access to - metadata on European Union legislation.

      -

      It will be useful if you - want to use or analyze European Union legislative data in a way - that the official databases are not originally build for. The API - extracts, organize and connects data from various official - sources.

      -
      -
    • -
    -
    - -
    -
    -

    - 4 datasets found for "London" - + - Tags: - camden [remove] - Format: - HTML [remove] - CSV [remove] -

    -
    -
    - -
    -

    Masthead (Site Header)

    -
    -
    -

    My Site Title

    -

    My Site Tagline

    -
    - -
    -
    -
    -
    -

    My Site Title

    -

    My Site Tagline

    -
    - - -
    -
    - -
    - - diff --git a/ckan/public-bs2/base/test/spec/ckan.spec.js b/ckan/public-bs2/base/test/spec/ckan.spec.js deleted file mode 100644 index 2af2e759dd7..00000000000 --- a/ckan/public-bs2/base/test/spec/ckan.spec.js +++ /dev/null @@ -1,70 +0,0 @@ -describe('ckan.initialize()', function () { - beforeEach(function () { - this.promise = jQuery.Deferred(); - this.target = sinon.stub(ckan.Client.prototype, 'getLocaleData').returns(this.promise); - }); - - afterEach(function () { - this.target.restore(); - }); - - it('should load the localisations for the current page', function () { - ckan.initialize() - assert.called(this.target); - }); - - it('should load the localisations into the i18n library', function () { - var target = sinon.stub(ckan.i18n, 'load'); - var data = {lang: {}}; - - ckan.initialize(); - this.promise.resolve(data); - - assert.called(target); - assert.calledWith(target, data); - - target.restore(); - }); - - it('should initialize the module on the page', function () { - var target = sinon.stub(ckan.module, 'initialize'); - - ckan.initialize(); - this.promise.resolve(); - - assert.called(target); - target.restore(); - }); -}); - -describe('ckan.url()', function () { - beforeEach(function () { - ckan.SITE_ROOT = 'http://example.com'; - ckan.LOCALE_ROOT = ckan.SITE_ROOT + '/en'; - }); - - it('should return the ckan.SITE_ROOT', function () { - var target = ckan.url(); - assert.equal(target, ckan.SITE_ROOT); - }); - - it('should return the ckan.LOCALE_ROOT if true is passed', function () { - var target = ckan.url(true); - assert.equal(target, ckan.LOCALE_ROOT); - }); - - it('should append the path provided', function () { - var target = ckan.url('/test.html'); - assert.equal(target, ckan.SITE_ROOT + '/test.html'); - }); - - it('should append the path to the locale provided', function () { - var target = ckan.url('/test.html', true); - assert.equal(target, ckan.LOCALE_ROOT + '/test.html'); - }); - - it('should handle missing preceding slashes', function () { - var target = ckan.url('test.html'); - assert.equal(target, ckan.SITE_ROOT + '/test.html'); - }); -}); diff --git a/ckan/public-bs2/base/test/spec/client.spec.js b/ckan/public-bs2/base/test/spec/client.spec.js deleted file mode 100644 index c9d90caf81a..00000000000 --- a/ckan/public-bs2/base/test/spec/client.spec.js +++ /dev/null @@ -1,405 +0,0 @@ -/*globals describe beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.Client()', function () { - var Client = ckan.Client; - - beforeEach(function () { - this.client = new Client(); - }); - - it('should add a new instance to each client', function () { - var target = ckan.sandbox().client; - - assert.instanceOf(target, Client); - }); - - it('should set the .endpoint property to options.endpoint', function () { - var client = new Client({endpoint: 'http://example.com'}); - assert.equal(client.endpoint, 'http://example.com'); - }); - - it('should default the endpoint to a blank string', function () { - assert.equal(this.client.endpoint, ''); - }); - - describe('.url(path)', function () { - beforeEach(function () { - this.client.endpoint = 'http://api.example.com'; - }); - - it('should return the path with the enpoint prepended', function () { - assert.equal(this.client.url('/api/endpoint'), 'http://api.example.com/api/endpoint'); - }); - - it('should normalise preceding slashes in the path', function () { - assert.equal(this.client.url('api/endpoint'), 'http://api.example.com/api/endpoint'); - }); - - it('should return the string if it already has a protocol', function () { - assert.equal(this.client.url('http://example.com/my/endpoint'), 'http://example.com/my/endpoint'); - }); - }); - - describe('.getTemplate(filename, params, success, error)', function () { - beforeEach(function () { - this.fakePromise = sinon.stub(jQuery.Deferred()); - this.fakePromise.then.returns(this.fakePromise); - sinon.stub(jQuery, 'get').returns(this.fakePromise); - }); - - afterEach(function () { - jQuery.get.restore(); - }); - - it('should return a jQuery promise', function () { - var target = this.client.getTemplate('test.html'); - assert.ok(target === this.fakePromise, 'target === this.fakePromise'); - }); - - it('should request the template file', function () { - var target = this.client.getTemplate('test.html'); - assert.called(jQuery.get); - assert.calledWith(jQuery.get, '/api/1/util/snippet/test.html', {}); - }); - - it('should request the template file with any provided params', function () { - var options = {limit: 5, page: 2}; - var target = this.client.getTemplate('test.html', options); - assert.called(jQuery.get); - assert.calledWith(jQuery.get, '/api/1/util/snippet/test.html', options); - }); - }); - - describe('.getLocaleData(locale, success, error)', function () { - beforeEach(function () { - this.fakePromise = sinon.stub(jQuery.Deferred()); - this.fakePromise.then.returns(this.fakePromise); - sinon.stub(jQuery, 'getJSON').returns(this.fakePromise); - }); - - afterEach(function () { - jQuery.getJSON.restore(); - }); - - it('should return a jQuery promise', function () { - var target = this.client.getLocaleData('en'); - assert.ok(target === this.fakePromise, 'target === this.fakePromise'); - }); - - it('should request the locale provided', function () { - var target = this.client.getLocaleData('en'); - assert.called(jQuery.getJSON); - assert.calledWith(jQuery.getJSON, '/api/i18n/en'); - }); - }); - - describe('.getCompletions(url, options, success, error)', function () { - beforeEach(function () { - this.fakePiped = sinon.stub(jQuery.Deferred()); - this.fakePiped.then.returns(this.fakePiped); - this.fakePiped.promise.returns(this.fakePiped); - - this.fakePromise = sinon.stub(jQuery.Deferred()); - this.fakePromise.pipe.returns(this.fakePiped); - - sinon.stub(jQuery, 'ajax').returns(this.fakePromise); - }); - - afterEach(function () { - jQuery.ajax.restore(); - }); - - it('should return a jQuery promise', function () { - var target = this.client.getCompletions('url'); - assert.ok(target === this.fakePiped, 'target === this.fakePiped'); - }); - - it('should make an ajax request for the url provided', function () { - function success() {} - function error() {} - - var target = this.client.getCompletions('url', success, error); - - assert.called(jQuery.ajax); - assert.calledWith(jQuery.ajax, {url: '/url'}); - - assert.called(this.fakePiped.then); - assert.calledWith(this.fakePiped.then, success, error); - }); - - it('should pipe the result through .parseCompletions()', function () { - var target = this.client.getCompletions('url'); - - assert.called(this.fakePromise.pipe); - assert.calledWith(this.fakePromise.pipe, this.client.parseCompletions); - }); - - it('should allow a custom format option to be provided', function () { - function format() {} - - var target = this.client.getCompletions('url', {format: format}); - - assert.called(this.fakePromise.pipe); - assert.calledWith(this.fakePromise.pipe, format); - }); - - }); - - describe('.parseCompletions(data, options)', function () { - it('should return a string of tags for a ResultSet collection', function () { - var data = { - ResultSet: { - Result: [ - {"Name": "1 percent"}, {"Name": "18thc"}, {"Name": "19thcentury"} - ] - } - }; - - var target = this.client.parseCompletions(data, {}); - - assert.deepEqual(target, ["1 percent", "18thc", "19thcentury"]); - }); - - it('should return a string of formats for a ResultSet collection', function () { - var data = { - ResultSet: { - Result: [ - {"Format": "json"}, {"Format": "csv"}, {"Format": "text"} - ] - } - }; - - var target = this.client.parseCompletions(data, {}); - - assert.deepEqual(target, ["json", "csv", "text"]); - }); - - it('should strip out duplicates with a case insensitive comparison', function () { - var data = { - ResultSet: { - Result: [ - {"Name": " Test"}, {"Name": "test"}, {"Name": "TEST"} - ] - } - }; - - var target = this.client.parseCompletions(data, {}); - - assert.deepEqual(target, ["Test"]); - }); - - it('should return an array of objects if options.objects is true', function () { - var data = { - ResultSet: { - Result: [ - {"Format": "json"}, {"Format": "csv"}, {"Format": "text"} - ] - } - }; - - var target = this.client.parseCompletions(data, {objects: true}); - - assert.deepEqual(target, [ - {id: "json", text: "json"}, - {id: "csv", text: "csv"}, - {id: "text", text: "text"} - ]); - }); - - it('should call .parsePackageCompletions() id data is a string', function () { - var data = 'Name|id'; - var target = sinon.stub(this.client, 'parsePackageCompletions'); - - this.client.parseCompletions(data, {objects: true}); - - assert.called(target); - assert.calledWith(target, data); - }); - }); - - describe('.parseCompletionsForPlugin(data)', function () { - it('should return a string of tags for a ResultSet collection', function () { - var data = { - ResultSet: { - Result: [ - {"Name": "1 percent"}, {"Name": "18thc"}, {"Name": "19thcentury"} - ] - } - }; - - var target = this.client.parseCompletionsForPlugin(data); - - assert.deepEqual(target, { - results: [ - {id: "1 percent", text: "1 percent"}, - {id: "18thc", text: "18thc"}, - {id: "19thcentury", text: "19thcentury"} - ] - }); - }); - }); - - describe('.parsePackageCompletions(string, options)', function () { - it('should parse the package completions string', function () { - var data = 'Package 1|package-1\nPackage 2|package-2\nPackage 3|package-3\n'; - var target = this.client.parsePackageCompletions(data); - - assert.deepEqual(target, ['package-1', 'package-2', 'package-3']); - }); - - it('should return an object if options.object is true', function () { - var data = 'Package 1|package-1\nPackage 2|package-2\nPackage 3|package-3\n'; - var target = this.client.parsePackageCompletions(data, {objects: true}); - - assert.deepEqual(target, [ - {id: 'package-1', text: 'Package 1'}, - {id: 'package-2', text: 'Package 2'}, - {id: 'package-3', text: 'Package 3'} - ]); - }); - }); - - describe('.getStorageAuth()', function () { - beforeEach(function () { - this.fakePromise = sinon.mock(jQuery.Deferred()); - sinon.stub(jQuery, 'ajax').returns(this.fakePromise); - }); - - afterEach(function () { - jQuery.ajax.restore(); - }); - - it('should return a jQuery promise', function () { - var target = this.client.getStorageAuth('filename'); - assert.equal(target, this.fakePromise); - }); - - it('should call request a new auth token', function () { - function success() {} - function error() {} - - var target = this.client.getStorageAuth('filename', success, error); - - assert.called(jQuery.ajax); - assert.calledWith(jQuery.ajax, { - url: '/api/storage/auth/form/filename', - success: success, - error: error - }); - }); - }); - - describe('.getStorageMetadata()', function () { - beforeEach(function () { - this.fakePromise = sinon.mock(jQuery.Deferred()); - sinon.stub(jQuery, 'ajax').returns(this.fakePromise); - }); - - afterEach(function () { - jQuery.ajax.restore(); - }); - - it('should return a jQuery promise', function () { - var target = this.client.getStorageMetadata('filename'); - assert.equal(target, this.fakePromise); - }); - - it('should call request a new auth token', function () { - function success() {} - function error() {} - - var target = this.client.getStorageMetadata('filename', success, error); - - assert.called(jQuery.ajax); - assert.calledWith(jQuery.ajax, { - url: '/api/storage/metadata/filename', - success: success, - error: error - }); - }); - - it('should throw an error if no filename is provided', function () { - var client = this.client; - assert.throws(function () { - client.getStorageMetadata(); - }); - }); - }); - - describe('.convertStorageMetadataToResource(meta)', function () { - beforeEach(function () { - this.meta = { - "_checksum": "md5:527c97d2aa3ed1b40aea4b7ddf98692e", - "_content_length": 122632, - "_creation_date": "2012-07-17T14:35:35", - "_label": "2012-07-17T13:35:35.540Z/cat.jpg", - "_last_modified": "2012-07-17T14:35:35", - "_location": "http://example.com/storage/f/2012-07-17T13%3A35%3A35.540Z/cat.jpg", - "filename-original": "cat.jpg", - "key": "2012-07-17T13:35:35.540Z/cat.jpg", - "uploaded-by": "user" - }; - }); - - it('should return a representation for a resource', function () { - var target = this.client.convertStorageMetadataToResource(this.meta); - - assert.deepEqual(target, { - url: 'http://example.com/storage/f/2012-07-17T13%3A35%3A35.540Z/cat.jpg', - key: '2012-07-17T13:35:35.540Z/cat.jpg', - name: 'cat.jpg', - size: 122632, - created: "2012-07-17T14:35:35", - last_modified: "2012-07-17T14:35:35", - format: 'jpg', - mimetype: null, - resource_type: 'file.upload', // Is this standard? - owner: 'user', - hash: 'md5:527c97d2aa3ed1b40aea4b7ddf98692e', - cache_url: 'http://example.com/storage/f/2012-07-17T13%3A35%3A35.540Z/cat.jpg', - cache_url_updated: '2012-07-17T14:35:35' - }); - }); - - it('should provide a full url', function () { - ckan.SITE_ROOT = 'http://example.com'; - - this.meta._location = "/storage/f/2012-07-17T13%3A35%3A35.540Z/cat.jpg"; - var target = this.client.convertStorageMetadataToResource(this.meta); - assert.equal(target.url, 'http://example.com/storage/f/2012-07-17T13%3A35%3A35.540Z/cat.jpg'); - }); - - it('should not include microseconds or timezone in timestamps', function () { - ckan.SITE_ROOT = 'http://example.com'; - - var target = this.client.convertStorageMetadataToResource(this.meta); - assert.ok(!(/\.\d\d\d/).test(target.last_modified), 'no microseconds'); - assert.ok(!(/((\+|\-)\d{4}|Z)$/).test(target.last_modified), 'no timezone'); - }); - - it('should use the mime type for the format if found', function () { - this.meta._format = 'image/jpeg'; - var target = this.client.convertStorageMetadataToResource(this.meta); - - assert.equal(target.format, 'image/jpeg', 'format'); - assert.equal(target.mimetype, 'image/jpeg', 'mimetype'); - }); - }); - - describe('.normalizeTimestamp(timestamp)', function () { - it('should add a timezone to a timestamp without one', function () { - var target = this.client.normalizeTimestamp("2012-07-17T14:35:35"); - assert.equal(target, "2012-07-17T14:35:35Z"); - }); - - it('should not add a timezone to a timestamp with one already', function () { - var target = this.client.normalizeTimestamp("2012-07-17T14:35:35Z"); - assert.equal(target, "2012-07-17T14:35:35Z", 'timestamp with Z'); - - target = this.client.normalizeTimestamp("2012-07-17T14:35:35+0100"); - assert.equal(target, "2012-07-17T14:35:35+0100", 'timestamp with +0100'); - - target = this.client.normalizeTimestamp("2012-07-17T14:35:35-0400"); - assert.equal(target, "2012-07-17T14:35:35-0400", 'timestamp with -0400'); - }); - }); -}); diff --git a/ckan/public-bs2/base/test/spec/i18n.spec.js b/ckan/public-bs2/base/test/spec/i18n.spec.js deleted file mode 100644 index fd4ed8fddfa..00000000000 --- a/ckan/public-bs2/base/test/spec/i18n.spec.js +++ /dev/null @@ -1,116 +0,0 @@ -describe('ckan.i18n', function () { - describe('ckan.i18n.translate', function () { - it('should work while being deprecated', function () { - var x = ckan.i18n.translate('foo'); - assert.deepProperty(x, 'fetch'); - assert.equal(x.fetch(), 'FOO'); - assert.deepProperty(x, 'ifPlural'); - }); - }); - - describe('._(string, [values])', function () { - it('should return the translated string', function () { - assert.equal(ckan.i18n._('foo'), 'FOO'); - }); - - it('should return the key when no translation exists', function () { - assert.equal(ckan.i18n._('no translation'), 'no translation'); - }); - - it('should fill in placeholders', function () { - assert.equal( - ckan.i18n._('hello %(name)s!', {name: 'Julia'}), - 'HELLO Julia!' - ); - }); - - it('should fill in placeholders when no translation exists', function () { - assert.equal( - ckan.i18n._('no %(attr)s translation', {attr: 'good'}), - 'no good translation' - ); - }); - }); - - describe('.ngettext(singular, plural, number, [values])', function () { - var ngettext = ckan.i18n.ngettext; - - it('should return the translated strings', function () { - assert.equal(ngettext('bar', 'bars', 1), 'BAR'); - assert.equal(ngettext('bar', 'bars', 0), 'BARS'); - assert.equal(ngettext('bar', 'bars', 2), 'BARS'); - }); - - it('should return the key when no translation exists', function () { - assert.equal( - ngettext('no translation', 'no translations', 1), - 'no translation' - ); - assert.equal( - ngettext('no translation', 'no translations', 0), - 'no translations' - ); - assert.equal( - ngettext('no translation', 'no translations', 2), - 'no translations' - ); - }); - - it('should fill in placeholders', function () { - assert.equal( - ngettext('%(color)s shirt', '%(color)s shirts', 1, {color: 'RED'}), - 'RED SHIRT' - ); - assert.equal( - ngettext('%(color)s shirt', '%(color)s shirts', 0, {color: 'RED'}), - 'RED SHIRTS' - ); - assert.equal( - ngettext('%(color)s shirt', '%(color)s shirts', 2, {color: 'RED'}), - 'RED SHIRTS' - ); - }); - - it('should fill in placeholders when no translation exists', function () { - assert.equal( - ngettext('no %(attr)s translation', 'no %(attr)s translations', - 1, {attr: 'good'}), - 'no good translation' - ); - assert.equal( - ngettext('no %(attr)s translation', 'no %(attr)s translations', - 0, {attr: 'good'}), - 'no good translations' - ); - assert.equal( - ngettext('no %(attr)s translation', 'no %(attr)s translations', - 2, {attr: 'good'}), - 'no good translations' - ); - }); - - it('should provide a magic `num` placeholder', function () { - assert.equal(ngettext('%(num)d item', '%(num)d items', 1), '1 ITEM'); - assert.equal(ngettext('%(num)d item', '%(num)d items', 0), '0 ITEMS'); - assert.equal(ngettext('%(num)d item', '%(num)d items', 2), '2 ITEMS'); - }); - - it('should provide `num` when no translation exists', function () { - assert.equal( - ngettext('%(num)d missing translation', - '%(num)d missing translations', 1), - '1 missing translation' - ); - assert.equal( - ngettext('%(num)d missing translation', - '%(num)d missing translations', 0), - '0 missing translations' - ); - assert.equal( - ngettext('%(num)d missing translation', - '%(num)d missing translations', 2), - '2 missing translations' - ); - }); - }); -}); diff --git a/ckan/public-bs2/base/test/spec/module.spec.js b/ckan/public-bs2/base/test/spec/module.spec.js deleted file mode 100644 index 7dc1774bb44..00000000000 --- a/ckan/public-bs2/base/test/spec/module.spec.js +++ /dev/null @@ -1,418 +0,0 @@ -/*globals describe beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.module(id, properties|callback)', function () { - beforeEach(function () { - ckan.module.registry = {}; - ckan.module.instances = {}; - this.factory = {}; - }); - - it('should add a new item to the registry', function () { - ckan.module('test', this.factory); - - assert.instanceOf(new ckan.module.registry.test(), ckan.module.BaseModule); - }); - - it('should allow a function to be provided', function () { - var target = sinon.stub().returns({}); - ckan.module('test', target); - - assert.called(target); - }); - - it('should pass jQuery, i18n.translate() and i18n into the function', function () { - // Note: This behavior is deprecated but kept for backwards-compatibility - var target = sinon.stub().returns({}); - ckan.module('test', target); - - assert.calledWith(target, jQuery, ckan.i18n.translate, ckan.i18n); - }); - - it('should throw an exception if the module is already defined', function () { - ckan.module('name', this.factory); - assert.throws(function () { - ckan.module('name', this.factory); - }); - }); - - it('should return the ckan object', function () { - assert.equal(ckan.module('name', this.factory), ckan); - }); - - describe('.initialize()', function () { - beforeEach(function () { - this.element1 = jQuery('
    ').appendTo(this.fixture); - this.element2 = jQuery('
    ').appendTo(this.fixture); - this.element3 = jQuery('
    ').appendTo(this.fixture); - - this.test1 = sinon.spy(); - - // Add test1 to the registry. - ckan.module.registry = { - test1: this.test1 - }; - - this.target = sinon.stub(ckan.module, 'createInstance'); - }); - - afterEach(function () { - this.target.restore(); - }); - - it('should find all elements with the "data-module" attribute', function () { - ckan.module.initialize(); - assert.called(this.target); - }); - - it('should skip modules that are not functions', function () { - ckan.module.initialize(); - assert.calledTwice(this.target); - }); - - it('should call module.createInstance() with the element and factory', function () { - ckan.module.initialize(); - assert.calledWith(this.target, this.test1, this.element1[0]); - assert.calledWith(this.target, this.test1, this.element2[0]); - }); - - it('should return the module object', function () { - assert.equal(ckan.module.initialize(), ckan.module); - }); - - it('should initialize more than one module sepearted by a space', function () { - this.fixture.empty(); - this.element4 = jQuery('
    ').appendTo(this.fixture); - this.test2 = ckan.module.registry.test2 = sinon.spy(); - - ckan.module.initialize(); - - assert.calledWith(this.target, this.test1, this.element4[0]); - assert.calledWith(this.target, this.test2, this.element4[0]); - }); - - it('should defer all published events untill all modules have loaded', function () { - var pubsub = ckan.pubsub; - var callbacks = []; - - // Ensure each module is loaded. Three in total. - ckan.module.registry = { - test1: function () {}, - test2: function () {} - }; - - // Call a function to publish and subscribe to an event on each instance. - this.target.restore(); - this.target = sinon.stub(ckan.module, 'createInstance', function () { - var callback = sinon.spy(); - - pubsub.publish('test'); - pubsub.subscribe('test', callback); - - callbacks.push(callback); - }); - - ckan.module.initialize(); - - // Ensure that all subscriptions received all messages. - assert.ok(callbacks.length, 'no callbacks were created'); - jQuery.each(callbacks, function () { - assert.calledThrice(this); - }); - }); - }); - - describe('.createInstance(Module, element)', function () { - beforeEach(function () { - this.element = document.createElement('div'); - this.factory = ckan.module.BaseModule; - this.factory.options = this.defaults = {test1: 'a', test2: 'b', test3: 'c'}; - - this.sandbox = { - i18n: { - translate: sinon.spy() - } - }; - sinon.stub(ckan, 'sandbox').returns(this.sandbox); - - this.extractedOptions = {test1: 1, test2: 2}; - sinon.stub(ckan.module, 'extractOptions').returns(this.extractedOptions); - }); - - afterEach(function () { - ckan.sandbox.restore(); - ckan.module.extractOptions.restore(); - }); - - it('should extract the options from the element', function () { - ckan.module.createInstance(this.factory, this.element); - - assert.called(ckan.module.extractOptions); - assert.calledWith(ckan.module.extractOptions, this.element); - }); - - it('should not modify the defaults object', function () { - var clone = jQuery.extend({}, this.defaults); - ckan.module.createInstance(this.factory, this.element); - - assert.deepEqual(this.defaults, clone); - }); - - it('should create a sandbox object', function () { - ckan.module.createInstance(this.factory, this.element); - assert.called(ckan.sandbox); - assert.calledWith(ckan.sandbox, this.element); - }); - - it('should initialize the module factory with the sandbox, options and translate function', function () { - var target = sinon.spy(); - ckan.module.createInstance(target, this.element); - - assert.called(target); - assert.calledWith(target, this.element, this.extractedOptions, this.sandbox); - }); - - it('should initialize the module as a constructor', function () { - var target = sinon.spy(); - ckan.module.createInstance(target, this.element); - - assert.calledWithNew(target); - - }); - - it('should call the .initialize() method if one exists', function () { - var init = sinon.spy(); - var target = sinon.stub().returns({ - initialize: init - }); - - ckan.module.createInstance(target, this.element); - - assert.called(init); - }); - - it('should push the new instance into an array under ckan.module.instances', function () { - var target = function MyModule() { return {'mock': 'instance'}; }; - target.namespace = 'test'; - - ckan.module.createInstance(target, this.element); - - assert.deepEqual(ckan.module.instances.test, [{'mock': 'instance'}]); - }); - - it('should push further instances into the existing array under ckan.module.instances', function () { - var target = function MyModule() { return {'mock': 'instance3'}; }; - target.namespace = 'test'; - - ckan.module.instances.test = [{'mock': 'instance1'}, {'mock': 'instance2'}]; - ckan.module.createInstance(target, this.element); - - assert.deepEqual(ckan.module.instances.test, [ - {'mock': 'instance1'}, {'mock': 'instance2'}, {'mock': 'instance3'} - ]); - }); - - }); - - describe('.extractOptions(element)', function () { - it('should extract the data keys from the element', function () { - var element = jQuery('
    ', { - 'data-not-module': 'skip', - 'data-module': 'skip', - 'data-module-a': 'capture', - 'data-module-b': 'capture', - 'data-module-c': 'capture' - })[0]; - - var target = ckan.module.extractOptions(element); - - assert.deepEqual(target, {a: 'capture', b: 'capture', c: 'capture'}); - }); - - it('should convert JSON contents of keys into JS primitives', function () { - var element = jQuery('
    ', { - 'data-module-null': 'null', - 'data-module-int': '100', - 'data-module-arr': '[1, 2, 3]', - 'data-module-obj': '{"a": 1, "b":2, "c": 3}', - 'data-module-str': 'hello' - })[0]; - - var target = ckan.module.extractOptions(element); - - assert.deepEqual(target, { - 'null': null, - 'int': 100, - 'arr': [1, 2, 3], - 'obj': {"a": 1, "b": 2, "c": 3}, - 'str': 'hello' - }); - }); - - it('should simply use strings for content that it cannot parse as JSON', function () { - var element = jQuery('
    ', { - 'data-module-url': 'http://example.com/path/to.html', - 'data-module-bad': '{oh: 1, no' - })[0]; - - var target = ckan.module.extractOptions(element); - - assert.deepEqual(target, { - 'url': 'http://example.com/path/to.html', - 'bad': '{oh: 1, no' - }); - }); - - it('should convert keys with hyphens into camelCase', function () { - var element = jQuery('
    ', { - 'data-module-long-property': 'long', - 'data-module-really-very-long-property': 'longer' - })[0]; - - var target = ckan.module.extractOptions(element); - - assert.deepEqual(target, { - 'longProperty': 'long', - 'reallyVeryLongProperty': 'longer' - }); - }); - - it('should set boolean attributes to true', function () { - var element = jQuery('
    ', { - 'data-module-long-property': '' - })[0]; - - var target = ckan.module.extractOptions(element); - - assert.deepEqual(target, {'longProperty': true}); - }); - }); - - describe('BaseModule(element, options, sandbox)', function () { - var BaseModule = ckan.module.BaseModule; - - beforeEach(function () { - this.el = jQuery('
    '); - this.options = {}; - this.sandbox = ckan.sandbox(); - this.module = new BaseModule(this.el, this.options, this.sandbox); - }); - - it('should assign .el as the element option', function () { - assert.ok(this.module.el === this.el); - }); - - it('should wrap .el in jQuery if not already wrapped', function () { - var element = document.createElement('div'); - var target = new BaseModule(element, this.options, this.sandbox); - - assert.ok(target.el instanceof jQuery); - }); - - it('should deep extend the options object', function () { - // Lazy check :/ - var target = sinon.stub(jQuery, 'extend'); - new BaseModule(this.el, this.options, this.sandbox); - - assert.called(target); - assert.calledWith(target, true, {}, BaseModule.prototype.options, this.options); - - target.restore(); - }); - - it('should assign the sandbox property', function () { - assert.equal(this.module.sandbox, this.sandbox); - }); - - describe('.$(selector)', function () { - it('should find children within the module element', function () { - this.module.el.append(jQuery('')); - assert.equal(this.module.$('input').length, 2); - }); - }); - - describe('.i18n()', function () { - // Note: This function is deprecated but kept for backwards-compatibility - beforeEach(function () { - this.i18n = { - first: 'first string', - second: {fetch: sinon.stub().returns('second string')}, - third: sinon.stub().returns('third string') - }; - - this.module.options.i18n = this.i18n; - }); - - it('should return the translation string', function () { - var target = this.module.i18n('first'); - assert.equal(target, 'first string'); - }); - - it('should call fetch on the translation string if it exists', function () { - var target = this.module.i18n('second'); - assert.equal(target, 'second string'); - }); - - it('should return just the key if no translation exists', function () { - var target = this.module.i18n('missing'); - assert.equal(target, 'missing'); - }); - - it('should call the translation function if one is provided', function () { - var target = this.module.i18n('third'); - assert.equal(target, 'third string'); - }); - - it('should pass the argments after the key into trans.fetch()', function () { - var target = this.module.options.i18n.second.fetch; - this.module.i18n('second', 1, 2, 3); - assert.called(target); - assert.calledWith(target, 1, 2, 3); - }); - - it('should pass the argments after the key into the translation function', function () { - var target = this.module.options.i18n.third; - this.module.i18n('third', 1, 2, 3); - assert.called(target); - assert.calledWith(target, 1, 2, 3); - }); - }); - - describe('._()', function () { - it('should be a shortcut for ckan.i18n._', function () { - /* - * In a module, this._ is a shortcut for ckan.i18n._, - * but it's not a direct reference. - */ - assert.equal(this.module._('foo'), 'FOO'); - }); - }); - - describe('.ngettext()', function () { - it('should be a shortcut for ckan.i18n.ngettext', function () { - /* - * In a module, this.ngettext is a shortcut for ckan.i18n.ngettext, - * but it's not a direct reference. - */ - assert.equal(this.module.ngettext('bar', 'bars', 1), 'BAR'); - assert.equal(this.module.ngettext('bar', 'bars', 0), 'BARS'); - assert.equal(this.module.ngettext('bar', 'bars', 2), 'BARS'); - }); - }); - - describe('.remove()', function () { - it('should teardown the module', function () { - var target = sinon.stub(this.module, 'teardown'); - - this.module.remove(); - - assert.called(target); - }); - - it('should remove the element from the page', function () { - this.fixture.append(this.module.el); - this.module.remove(); - - assert.equal(this.fixture.children().length, 0); - }); - }); - }); -}); diff --git a/ckan/public-bs2/base/test/spec/modules/autocomplete.spec.js b/ckan/public-bs2/base/test/spec/modules/autocomplete.spec.js deleted file mode 100644 index 93a8fb57a54..00000000000 --- a/ckan/public-bs2/base/test/spec/modules/autocomplete.spec.js +++ /dev/null @@ -1,315 +0,0 @@ -/*globals describe beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.modules.AutocompleteModule()', function () { - var Autocomplete = ckan.module.registry['autocomplete']; - - beforeEach(function () { - // Stub select2 plugin if loaded. - if (jQuery.fn.select2) { - this.select2 = sinon.stub(jQuery.fn, 'select2'); - } else { - this.select2 = jQuery.fn.select2 = sinon.stub().returns({ - data: sinon.stub().returns({ - on: sinon.stub() - }) - }); - } - - this.el = document.createElement('input'); - this.sandbox = ckan.sandbox(); - this.sandbox.body = this.fixture; - this.module = new Autocomplete(this.el, {}, this.sandbox); - }); - - afterEach(function () { - this.module.teardown(); - - if (this.select2.restore) { - this.select2.restore(); - } else { - delete jQuery.fn.select2; - } - }); - - describe('.initialize()', function () { - it('should bind callback methods to the module', function () { - var target = sinon.stub(jQuery, 'proxyAll'); - - this.module.initialize(); - - assert.called(target); - assert.calledWith(target, this.module, /_on/, /format/); - - target.restore(); - }); - - it('should setup the autocomplete plugin', function () { - var target = sinon.stub(this.module, 'setupAutoComplete'); - - this.module.initialize(); - - assert.called(target); - }); - }); - - describe('.setupAutoComplete()', function () { - it('should initialize the autocomplete plugin', function () { - this.module.setupAutoComplete(); - - assert.called(this.select2); - assert.calledWith(this.select2, { - width: 'resolve', - query: this.module._onQuery, - dropdownCssClass: '', - containerCssClass: '', - formatResult: this.module.formatResult, - formatNoMatches: this.module.formatNoMatches, - formatInputTooShort: this.module.formatInputTooShort, - createSearchChoice: this.module.formatTerm, // Not used by tags. - initSelection: this.module.formatInitialValue - }); - }); - - it('should initialize the autocomplete plugin with a tags callback if options.tags is true', function () { - this.module.options.tags = true; - this.module.setupAutoComplete(); - - assert.called(this.select2); - assert.calledWith(this.select2, { - width: 'resolve', - tags: this.module._onQuery, - dropdownCssClass: '', - containerCssClass: '', - formatResult: this.module.formatResult, - formatNoMatches: this.module.formatNoMatches, - formatInputTooShort: this.module.formatInputTooShort, - initSelection: this.module.formatInitialValue - }); - - it('should watch the keydown event on the select2 input'); - - it('should allow a custom css class to be added to the dropdown', function () { - this.module.options.dropdownClass = 'tags'; - this.module.setupAutoComplete(); - - assert.called(this.select2); - assert.calledWith(this.select2, { - width: 'resolve', - tags: this.module._onQuery, - dropdownCssClass: 'tags', - containerCssClass: '', - formatResult: this.module.formatResult, - formatNoMatches: this.module.formatNoMatches, - formatInputTooShort: this.module.formatInputTooShort, - initSelection: this.module.formatInitialValue - }); - }); - - it('should allow a custom css class to be added to the container', function () { - this.module.options.containerClass = 'tags'; - this.module.setupAutoComplete(); - - assert.called(this.select2); - assert.calledWith(this.select2, { - width: 'resolve', - tags: this.module._onQuery, - dropdownCssClass: '', - containerCssClass: 'tags', - formatResult: this.module.formatResult, - formatNoMatches: this.module.formatNoMatches, - formatInputTooShort: this.module.formatInputTooShort, - initSelection: this.module.formatInitialValue - }); - }); - - }); - }); - - describe('.getCompletions(term, fn)', function () { - beforeEach(function () { - this.term = 'term'; - this.module.options.source = 'http://example.com?term=?'; - - this.target = sinon.stub(this.sandbox.client, 'getCompletions'); - }); - - it('should get the completions from the client', function () { - this.module.getCompletions(this.term); - assert.called(this.target); - }); - - it('should replace the last ? in the source url with the term', function () { - this.module.getCompletions(this.term); - assert.calledWith(this.target, 'http://example.com?term=term'); - }); - - it('should escape special characters in the term', function () { - this.module.getCompletions('term with spaces'); - assert.calledWith(this.target, 'http://example.com?term=term%20with%20spaces'); - }); - }); - - describe('.lookup(term, fn)', function () { - beforeEach(function () { - sinon.stub(this.module, 'getCompletions'); - this.target = sinon.spy(); - this.module.setupAutoComplete(); - }); - - it('should set the _lastTerm property', function () { - this.module.lookup('term', this.target); - assert.equal(this.module._lastTerm, 'term'); - }); - - it('should call the fn immediately if there is no term', function () { - this.module.lookup('', this.target); - assert.called(this.target); - assert.calledWith(this.target, {results: []}); - }); - - it('should debounce the request if there is a term'); - it('should cancel the last request'); - }); - - describe('.formatResult(state)', function () { - beforeEach(function () { - this.module._lastTerm = 'term'; - }); - - it('should return the string with the last term wrapped in bold tags', function () { - var target = this.module.formatResult({id: 'we have termites', text: 'we have termites'}); - assert.equal(target, 'we have termites'); - }); - - it('should return the string with each instance of the term wrapped in bold tags', function () { - var target = this.module.formatResult({id: 'we have a termite terminology', text: 'we have a termite terminology'}); - assert.equal(target, 'we have a termite terminology'); - }); - - it('should return the term if there is no last term saved', function () { - delete this.module._lastTerm; - var target = this.module.formatResult({id: 'we have a termite terminology', text: 'we have a termite terminology'}); - assert.equal(target, 'we have a termite terminology'); - }); - }); - - describe('.formatNoMatches(term)', function () { - it('should return the no matches string if there is a term', function () { - var target = this.module.formatNoMatches('term'); - assert.equal(target, 'No matches found'); - }); - - it('should return the empty string if there is no term', function () { - var target = this.module.formatNoMatches(''); - assert.equal(target, 'Start typing…'); - }); - }); - - describe('.formatInputTooShort(term, min)', function () { - it('should return the plural input too short string', function () { - var target = this.module.formatInputTooShort('term', 2); - assert.equal(target, 'Input is too short, must be at least 2 characters'); - }); - - it('should return the singular input too short string', function () { - var target = this.module.formatInputTooShort('term', 1); - assert.equal(target, 'Input is too short, must be at least one character'); - }); - }); - - describe('.formatTerm()', function () { - it('should return an item object with id and text properties', function () { - assert.deepEqual(this.module.formatTerm('test'), {id: 'test', text: 'test'}); - }); - - it('should trim whitespace from the value', function () { - assert.deepEqual(this.module.formatTerm(' test '), {id: 'test', text: 'test'}); - }); - - it('should convert commas in ids into unicode characters', function () { - assert.deepEqual(this.module.formatTerm('test, test'), {id: 'test\u002C test', text: 'test, test'}); - }); - }); - - describe('.formatInitialValue(element, callback)', function () { - beforeEach(function () { - this.callback = sinon.spy(); - }); - - it('should pass an item object with id and text properties into the callback', function () { - var target = jQuery(''); - - this.module.formatInitialValue(target, this.callback); - assert.calledWith(this.callback, {id: 'test', text: 'test'}); - }); - - it('should pass an array of properties into the callback if options.tags is true', function () { - this.module.options.tags = true; - var target = jQuery('', {value: "test, test"}); - - this.module.formatInitialValue(target, this.callback); - assert.calledWith(this.callback, [{id: 'test', text: 'test'}, {id: 'test', text: 'test'}]); - }); - - it('should return the value if no callback is provided (to support select2 v2.1)', function () { - var target = jQuery(''); - - assert.deepEqual(this.module.formatInitialValue(target), {id: 'test', text: 'test'}); - }); - }); - - describe('._onQuery(options)', function () { - it('should lookup the current term with the callback', function () { - var target = sinon.stub(this.module, 'lookup'); - - this.module._onQuery({term: 'term', callback: 'callback'}); - - assert.called(target); - assert.calledWith(target, 'term', 'callback'); - }); - - it('should do nothing if there is no options object', function () { - var target = sinon.stub(this.module, 'lookup'); - this.module._onQuery(); - assert.notCalled(target); - }); - }); - - describe('._onKeydown(event)', function () { - beforeEach(function () { - this.keyDownEvent = jQuery.Event("keydown", { which: 188 }); - this.fakeEvent = {}; - this.clock = sinon.useFakeTimers(); - this.jQuery = sinon.stub(jQuery.fn, 'init', jQuery.fn.init); - this.Event = sinon.stub(jQuery, 'Event').returns(this.fakeEvent); - this.trigger = sinon.stub(jQuery.fn, 'trigger'); - }); - - afterEach(function () { - this.clock.restore(); - this.jQuery.restore(); - this.Event.restore(); - this.trigger.restore(); - }); - - it('should trigger fake "return" keypress if a comma is pressed', function () { - this.module._onKeydown(this.keyDownEvent); - - this.clock.tick(100); - - assert.called(this.jQuery); - assert.called(this.Event); - assert.called(this.trigger); - assert.calledWith(this.trigger, this.fakeEvent); - }); - - it('should do nothing if another key is pressed', function () { - this.keyDownEvent.which = 200; - - this.module._onKeydown(this.keyDownEvent); - - this.clock.tick(100); - - assert.notCalled(this.Event); - }); - }); -}); diff --git a/ckan/public-bs2/base/test/spec/modules/basic-form.spec.js b/ckan/public-bs2/base/test/spec/modules/basic-form.spec.js deleted file mode 100644 index 9d0628fc86b..00000000000 --- a/ckan/public-bs2/base/test/spec/modules/basic-form.spec.js +++ /dev/null @@ -1,39 +0,0 @@ -/*globals describe beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.module.BasicFormModule()', function () { - var BasicFormModule = ckan.module.registry['basic-form']; - - beforeEach(function () { - sinon.stub(jQuery.fn, 'incompleteFormWarning'); - - this.el = document.createElement('form'); - this.el.innerHTML = '' - this.sandbox = ckan.sandbox(); - this.sandbox.body = this.fixture; - this.sandbox.body.append(this.el) - this.module = new BasicFormModule(this.el, {}, this.sandbox); - }); - - afterEach(function () { - this.module.teardown(); - jQuery.fn.incompleteFormWarning.restore(); - }); - - describe('.initialize()', function () { - it('should attach the jQuery.fn.incompleteFormWarning() to the form', function () { - this.module.initialize(); - assert.called(jQuery.fn.incompleteFormWarning); - }); - - it('should disable the submit button on form submit', function(done) { - this.module.initialize(); - this.module._onSubmit(); - - setTimeout(function() { - var buttonAttrDisabled = this.el.querySelector('button').getAttribute('disabled'); - - assert.ok(buttonAttrDisabled === 'disabled') - done(); - }.bind(this), 0); - }); - }); -}); diff --git a/ckan/public-bs2/base/test/spec/modules/confirm-action.spec.js b/ckan/public-bs2/base/test/spec/modules/confirm-action.spec.js deleted file mode 100644 index d90b36d6941..00000000000 --- a/ckan/public-bs2/base/test/spec/modules/confirm-action.spec.js +++ /dev/null @@ -1,118 +0,0 @@ -/*globals describe beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.module.ConfirmActionModule()', function () { - var ConfirmActionModule = ckan.module.registry['confirm-action']; - - beforeEach(function () { - jQuery.fn.modal = sinon.spy(); - - this.el = document.createElement('button'); - this.sandbox = ckan.sandbox(); - this.sandbox.body = this.fixture; - this.module = new ConfirmActionModule(this.el, {}, this.sandbox); - }); - - afterEach(function () { - this.module.teardown(); - }); - - describe('.initialize()', function () { - it('should watch for clicks on the module element', function () { - var target = sinon.stub(this.module.el, 'on'); - this.module.initialize(); - assert.called(target); - assert.calledWith(target, 'click', this.module._onClick); - }); - }); - - describe('.confirm()', function () { - it('should append the modal to the document body', function () { - this.module.confirm(); - assert.equal(this.fixture.children().length, 1); - assert.equal(this.fixture.find('.modal').length, 1); - }); - - it('should show the modal dialog', function () { - this.module.confirm(); - assert.called(jQuery.fn.modal); - assert.calledWith(jQuery.fn.modal, 'show'); - }); - }); - - describe('.performAction()', function () { - it('should submit the action'); - }); - - describe('.createModal()', function () { - it('should create the modal element', function () { - var target = this.module.createModal(); - - assert.ok(target.hasClass('modal')); - }); - - it('should set the module.modal property', function () { - var target = this.module.createModal(); - - assert.ok(target === this.module.modal); - }); - - it('should bind the success/cancel listeners', function () { - var target = sinon.stub(jQuery.fn, 'on'); - - this.module.createModal(); - - // Not an ideal check as this implementation could be done in many ways. - assert.calledTwice(target); - assert.calledWith(target, 'click', '.btn-primary', this.module._onConfirmSuccess); - assert.calledWith(target, 'click', '.btn-cancel', this.module._onConfirmCancel); - - target.restore(); - }); - - it('should initialise the modal plugin', function () { - this.module.createModal(); - assert.called(jQuery.fn.modal); - assert.calledWith(jQuery.fn.modal, {show: false}); - }); - - it('should allow to customize the content', function () { - this.module.options.content = 'some custom content'; - var target = this.module.createModal(); - - assert.equal(target.find('.modal-body').text(), 'some custom content'); - }); - }); - - describe('._onClick()', function () { - it('should prevent the default action', function () { - var target = {preventDefault: sinon.spy()}; - this.module._onClick(target); - - assert.called(target.preventDefault); - }); - - it('should display the confirmation dialog', function () { - var target = sinon.stub(this.module, 'confirm'); - this.module._onClick({preventDefault: sinon.spy()}); - assert.called(target); - }); - }); - - describe('._onConfirmSuccess()', function () { - it('should perform the action', function () { - var target = sinon.stub(this.module, 'performAction'); - this.module._onConfirmSuccess(jQuery.Event('click')); - assert.called(target); - }); - }); - - describe('._onConfirmCancel()', function () { - it('should hide the modal', function () { - this.module.modal = jQuery('
    '); - this.module._onConfirmCancel(jQuery.Event('click')); - - assert.called(jQuery.fn.modal); - assert.calledWith(jQuery.fn.modal, 'hide'); - }); - }); - -}); diff --git a/ckan/public-bs2/base/test/spec/modules/custom-fields.spec.js b/ckan/public-bs2/base/test/spec/modules/custom-fields.spec.js deleted file mode 100644 index ad2d7b71f19..00000000000 --- a/ckan/public-bs2/base/test/spec/modules/custom-fields.spec.js +++ /dev/null @@ -1,175 +0,0 @@ -/*globals describe before beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.module.CustomFieldsModule()', function () { - var CustomFieldsModule = ckan.module.registry['custom-fields']; - - before(function (done) { - this.loadFixture('custom_fields.html', function (template) { - this.template = template; - done(); - }); - }); - - beforeEach(function () { - this.fixture.html(this.template); - this.el = this.fixture.find('[data-module]'); - this.sandbox = ckan.sandbox(); - this.sandbox.body = this.fixture; - this.module = new CustomFieldsModule(this.el, {}, this.sandbox); - }); - - afterEach(function () { - this.module.teardown(); - }); - - describe('.initialize()', function () { - it('should bind all functions beginning with _on to the module scope', function () { - var target = sinon.stub(jQuery, 'proxyAll'); - - this.module.initialize(); - - assert.called(target); - assert.calledWith(target, this.module, /_on/); - - target.restore(); - }); - - it('should listen for changes to the last "key" input', function () { - var target = sinon.stub(this.module, '_onChange'); - - this.module.initialize(); - this.module.$('input[name*=key]').change(); - - assert.calledOnce(target); - }); - - it('should listen for changes to all checkboxes', function () { - var target = sinon.stub(this.module, '_onRemove'); - - this.module.initialize(); - this.module.$(':checkbox').trigger('change'); - - assert.calledOnce(target); - }); - - it('should add "button" classes to the remove input', function () { - this.module.initialize(); - - assert.equal(this.module.$('.checkbox.btn').length, 1, 'each item should have the .btn class'); - assert.equal(this.module.$('.checkbox.fa-times').length, 1, 'each item shoud have the .fa-times class'); - }); - }); - - describe('.newField(element)', function () { - it('should append a new field to the element', function () { - var element = document.createElement('div'); - sinon.stub(this.module, 'cloneField').returns(element); - - this.module.newField(); - - assert.ok(jQuery.contains(this.module.el[0], element)); - }); - }); - - describe('.cloneField(element)', function () { - it('should clone the provided field', function () { - var element = document.createElement('div'); - var init = sinon.stub(jQuery.fn, 'init', jQuery.fn.init); - var clone = sinon.stub(jQuery.fn, 'clone', jQuery.fn.clone); - - this.module.cloneField(element); - - assert.called(init); - assert.calledWith(init, element); - assert.called(clone); - - init.restore(); - clone.restore(); - }); - - it('should return the cloned element', function () { - var element = document.createElement('div'); - var cloned = document.createElement('div'); - var init = sinon.stub(jQuery.fn, 'init', jQuery.fn.init); - var clone = sinon.stub(jQuery.fn, 'clone').returns(jQuery(cloned)); - - assert.ok(this.module.cloneField(element)[0] === cloned); - - init.restore(); - clone.restore(); - }); - }); - - describe('.resetField(element)', function () { - beforeEach(function () { - this.field = jQuery('
    '); - }); - - it('should empty all input values', function () { - var target = this.module.resetField(this.field); - assert.equal(target.find(':input').val(), ''); - }); - - it('should increment any integers in the input names by one', function () { - var target = this.module.resetField(this.field); - assert.equal(target.find(':input').attr('name'), 'field-2'); - }); - - it('should increment any numbers in the label text by one', function () { - var target = this.module.resetField(this.field); - assert.equal(target.find('label').text(), 'Field 2'); - }); - - it('should increment any numbers in the label for by one', function () { - var target = this.module.resetField(this.field); - assert.equal(target.find('label').attr('for'), 'field-2'); - }); - }); - - describe('.disableField(field, disable)', function () { - beforeEach(function () { - this.target = this.module.$('.control-custom:first'); - }); - - it('should add a .disable class to the element', function () { - this.module.disableField(this.target); - assert.isTrue(this.target.hasClass('disabled')); - }); - - it('should remove a .disable class to the element if disable is false', function () { - this.target.addClass('disable'); - - this.module.disableField(this.target, false); - assert.isFalse(this.target.hasClass('disabled')); - }); - - }); - - describe('._onChange(event)', function () { - it('should call .newField() with the custom control', function () { - var target = sinon.stub(this.module, 'newField'); - var field = this.module.$('[name*=key]:last').val('test'); - - this.module._onChange(jQuery.Event('change', {target: field[0]})); - - assert.called(target); - }); - - it('should not call .newField() if the target field is empty', function () { - var target = sinon.stub(this.module, 'newField'); - var field = this.module.$('[name*=key]:last').val(''); - - this.module._onChange(jQuery.Event('change', {target: field[0]})); - - assert.notCalled(target); - }); - }); - - describe('._onRemove(event)', function () { - it('should call .disableField() with the custom control', function () { - var target = sinon.stub(this.module, 'disableField'); - this.module._onRemove(jQuery.Event('change', {target: this.module.$(':checkbox')[0]})); - - assert.called(target); - }); - }); -}); diff --git a/ckan/public-bs2/base/test/spec/modules/followers-counter.spec.js b/ckan/public-bs2/base/test/spec/modules/followers-counter.spec.js deleted file mode 100644 index eb9d9eff741..00000000000 --- a/ckan/public-bs2/base/test/spec/modules/followers-counter.spec.js +++ /dev/null @@ -1,186 +0,0 @@ -/*globals describe beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.module.FollowersCounterModule()', function() { - var FollowersCounterModule = ckan.module.registry['followers-counter']; - - beforeEach(function() { - this.initialCounter = 10; - this.el = jQuery('
    ' + this.initialCounter + '
    '); - this.sandbox = ckan.sandbox(); - this.module = new FollowersCounterModule(this.el, {}, this.sandbox); - this.module.options.num_followers = this.initialCounter; - }); - - afterEach(function() { - this.module.teardown(); - }); - - describe('.initialize()', function() { - it('should bind callback methods to the module', function() { - var target = sinon.stub(jQuery, 'proxyAll'); - - this.module.initialize(); - - assert.called(target); - assert.calledWith(target, this.module, /_on/); - - target.restore(); - }); - - it('should subscribe to the "follow-follow-some-id" event', function() { - var target = sinon.stub(this.sandbox, 'subscribe'); - - this.module.options = {id: 'some-id'}; - this.module.initialize(); - - assert.called(target); - assert.calledWith(target, 'follow-follow-some-id', this.module._onFollow); - - target.restore(); - }); - - it('should subscribe to the "follow-unfollow-some-id" event', function() { - var target = sinon.stub(this.sandbox, 'subscribe'); - - this.module.options = {id: 'some-id'}; - this.module.initialize(); - - assert.called(target); - assert.calledWith(target, 'follow-unfollow-some-id', this.module._onUnfollow); - - target.restore(); - }); - }); - - describe('.teardown()', function() { - it('should unsubscribe to the "follow-follow-some-id" event', function() { - var target = sinon.stub(this.sandbox, 'unsubscribe'); - - this.module.options = {id: 'some-id'}; - this.module.initialize(); - this.module.teardown(); - - assert.called(target); - assert.calledWith(target, 'follow-follow-some-id', this.module._onFollow); - - target.restore(); - }); - - it('should unsubscribe to the "follow-unfollow-some-id" event', function() { - var target = sinon.stub(this.sandbox, 'unsubscribe'); - - this.module.options = {id: 'some-id'}; - this.module.initialize(); - this.module.teardown(); - - assert.called(target); - assert.calledWith(target, 'follow-unfollow-some-id', this.module._onUnfollow); - - target.restore(); - }); - }); - - describe('._onFollow', function() { - it('should call _onFollow on "follow-follow-some-id" event', function() { - var target = sinon.stub(this.module, '_onFollow'); - - this.module.options = {id: 'some-id'}; - this.module.initialize(); - - this.sandbox.publish('follow-follow-some-id'); - - assert.called(target); - }); - - it('should call _updateCounter when ._onFollow is called', function() { - var target = sinon.stub(this.module, '_updateCounter'); - - this.module.options = {id: 'some-id'}; - this.module.initialize(); - - this.module._onFollow(); - - assert.called(target); - assert.calledWith(target, {action: 'follow'}); - }); - }); - - describe('._onUnfollow', function() { - it('should call _onUnfollow on "follow-unfollow-some-id" event', function() { - var target = sinon.stub(this.module, '_onUnfollow'); - - this.module.options = {id: 'some-id'}; - this.module.initialize(); - - this.sandbox.publish('follow-unfollow-some-id'); - - assert.called(target); - }); - - it('should call _updateCounter when ._onUnfollow is called', function() { - var target = sinon.stub(this.module, '_updateCounter'); - - this.module.options = {id: 'some-id'}; - this.module.initialize(); - - this.module._onUnfollow(); - - assert.called(target); - assert.calledWith(target, {action: 'unfollow'}); - }); - }); - - describe('._updateCounter', function() { - it('should increment this.options.num_followers on calling _onFollow', function() { - this.module.initialize(); - this.module._onFollow(); - - assert.equal(this.module.options.num_followers, ++this.initialCounter); - }); - - it('should increment the counter value in the DOM on calling _onFollow', function() { - var counterVal; - - this.module.initialize(); - this.module._onFollow(); - - counterVal = this.module.counterEl.text(); - counterVal = parseInt(counterVal, 10); - - assert.equal(counterVal, ++this.initialCounter); - }); - - it('should decrement this.options.num_followers on calling _onUnfollow', function() { - this.module.initialize(); - this.module._onUnfollow(); - - assert.equal(this.module.options.num_followers, --this.initialCounter); - }); - - it('should decrement the counter value in the DOM on calling _onUnfollow', function() { - var counterVal; - - this.module.initialize(); - this.module._onUnfollow(); - - counterVal = this.module.counterEl.text(); - counterVal = parseInt(counterVal, 10); - - assert.equal(counterVal, --this.initialCounter); - }); - - it('should not change the counter value in the DOM when the value is greater than 1000', function() { - var beforeCounterVal = 1536; - var afterCounterVal; - - this.module.options = {num_followers: beforeCounterVal}; - this.module.initialize(); - this.module.counterEl.text(this.module.options.num_followers); - this.module._onFollow(); - - afterCounterVal = this.module.counterEl.text(); - afterCounterVal = parseInt(afterCounterVal, 10); - - assert.equal(beforeCounterVal, afterCounterVal); - }); - }); - }); diff --git a/ckan/public-bs2/base/test/spec/modules/image-upload.spec.js b/ckan/public-bs2/base/test/spec/modules/image-upload.spec.js deleted file mode 100644 index f0f2939494d..00000000000 --- a/ckan/public-bs2/base/test/spec/modules/image-upload.spec.js +++ /dev/null @@ -1,65 +0,0 @@ -/*globals describe beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.modules.ImageUploadModule()', function () { - var ImageUploadModule = ckan.module.registry['image-upload']; - - beforeEach(function () { - this.el = document.createElement('div'); - this.sandbox = ckan.sandbox(); - this.module = new ImageUploadModule(this.el, {}, this.sandbox); - this.module.el.html([ - '
    ', - '', - ]); - this.module.initialize(); - this.module.field_name = jQuery('', {type: 'text'}) - }); - - afterEach(function () { - this.module.teardown(); - }); - - describe('._onFromWeb()', function () { - - it('should change name when url changed', function () { - this.module.field_url_input.val('http://example.com/some_image.png'); - this.module._onFromWebBlur(); - assert.equal(this.module.field_name.val(), 'some_image.png'); - - this.module.field_url_input.val('http://example.com/undefined_file'); - this.module._onFromWebBlur(); - assert.equal(this.module.field_name.val(), 'undefined_file'); - }); - - it('should ignore url changes if name was manualy changed', function () { - this.module.field_url_input.val('http://example.com/some_image.png'); - this.module._onFromWebBlur(); - assert.equal(this.module.field_name.val(), 'some_image.png'); - - this.module._onModifyName(); - - this.module.field_url_input.val('http://example.com/undefined_file'); - this.module._onFromWebBlur(); - assert.equal(this.module.field_name.val(), 'some_image.png'); - }); - - it('should ignore url changes if name was filled before', function () { - this.module._nameIsDirty = true; - this.module.field_name.val('prefilled'); - - this.module.field_url_input.val('http://example.com/some_image.png'); - this.module._onFromWebBlur(); - assert.equal(this.module.field_name.val(), 'prefilled'); - - this.module.field_url_input.val('http://example.com/second_some_image.png'); - this.module._onFromWebBlur(); - assert.equal(this.module.field_name.val(), 'prefilled'); - - this.module._onModifyName() - - this.module.field_url_input.val('http://example.com/undefined_file'); - this.module._onFromWebBlur(); - assert.equal(this.module.field_name.val(), 'prefilled'); - }); - }); - -}); diff --git a/ckan/public-bs2/base/test/spec/modules/resource-form.spec.js b/ckan/public-bs2/base/test/spec/modules/resource-form.spec.js deleted file mode 100644 index 78975e32f8a..00000000000 --- a/ckan/public-bs2/base/test/spec/modules/resource-form.spec.js +++ /dev/null @@ -1,74 +0,0 @@ -/*globals describe beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.modules.ResourceFormModule()', function () { - var ResourceFormModule = ckan.module.registry['resource-form']; - - beforeEach(function () { - this.el = document.createElement('form'); - this.sandbox = ckan.sandbox(); - this.module = new ResourceFormModule(this.el, {}, this.sandbox); - }); - - afterEach(function () { - this.module.teardown(); - }); - - describe('.initialize()', function () { - it('should subscribe to the "resource:uploaded" event', function () { - var target = sinon.stub(this.sandbox, 'subscribe'); - - this.module.initialize(); - - assert.called(target); - assert.calledWith(target, 'resource:uploaded', this.module._onResourceUploaded); - - target.restore(); - }); - }); - - describe('.teardown()', function () { - it('should unsubscribe from the "resource:uploaded" event', function () { - var target = sinon.stub(this.sandbox, 'unsubscribe'); - - this.module.teardown(); - - assert.called(target); - assert.calledWith(target, 'resource:uploaded', this.module._onResourceUploaded); - - target.restore(); - }); - }); - - describe('._onResourceUploaded()', function () { - beforeEach(function () { - this.module.el.html([ - '', - '', - '', - '', - '', - '' - ].join('')); - - this.resource = { - text: 'text', - checkbox: "check", - radio: "radio2", - hidden: "hidden", - select: "option1" - }; - }); - - it('should set the values on appropriate fields', function () { - var res = this.resource; - - this.module._onResourceUploaded(res); - - jQuery.each(this.module.el.serializeArray(), function (idx, field) { - assert.equal(field.value, res[field.name]); - }); - }); - }); -}); diff --git a/ckan/public-bs2/base/test/spec/modules/resource-upload-field.spec.js b/ckan/public-bs2/base/test/spec/modules/resource-upload-field.spec.js deleted file mode 100644 index dcf2ca0630e..00000000000 --- a/ckan/public-bs2/base/test/spec/modules/resource-upload-field.spec.js +++ /dev/null @@ -1,290 +0,0 @@ -/*globals describe beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.modules.ResourceUploadFieldModule()', function () { - var ResourceFileUploadModule = ckan.module.registry['resource-upload-field']; - - beforeEach(function () { - jQuery.fn.fileupload = sinon.spy(); - - this.el = jQuery('
    '); - this.sandbox = ckan.sandbox(); - this.module = new ResourceFileUploadModule(this.el, {}, this.sandbox); - this.module.initialize(); - }); - - afterEach(function () { - this.module.teardown(); - }); - - describe('.initialize()', function () { - beforeEach(function () { - // Create un-initialised module. - this.module.teardown(); - this.module = new ResourceFileUploadModule(this.el, {}, this.sandbox); - }); - - it('should create the #upload field', function () { - this.module.initialize(); - assert.ok(typeof this.module.upload === 'object'); - }); - - it('should append the upload field to the module element', function () { - this.module.initialize(); - - assert.ok(jQuery.contains(this.el[0], this.module.upload[0])); - }); - - it('should call .setupFileUpload()', function () { - var target = sinon.stub(this.module, 'setupFileUpload'); - - this.module.initialize(); - - assert.called(target); - }); - }); - - describe('.setupFileUpload()', function () { - it('should set the label text on the form input', function () { - this.module.initialize(); - this.module.setupFileUpload(); - - assert.equal(this.module.upload.find('label').text(), 'Upload a file'); - }); - - it('should setup the file upload with relevant options', function () { - this.module.initialize(); - this.module.setupFileUpload(); - - assert.called(jQuery.fn.fileupload); - assert.calledWith(jQuery.fn.fileupload, { - type: 'POST', - paramName: 'file', - forceIframeTransport: true, // Required for XDomain request. - replaceFileInput: true, - autoUpload: false, - add: this.module._onUploadAdd, - send: this.module._onUploadSend, - done: this.module._onUploadDone, - fail: this.module._onUploadFail, - always: this.module._onUploadComplete - }); - }); - }); - - describe('.loading(show)', function () { - it('should add a loading class to the upload element', function () { - this.module.loading(); - - assert.ok(this.module.upload.hasClass('loading')); - }); - - it('should remove the loading class if false is passed as an argument', function () { - this.module.upload.addClass('loading'); - this.module.loading(); - - assert.ok(!this.module.upload.hasClass('loading')); - }); - }); - - describe('.authenticate(key, data)', function () { - beforeEach(function () { - this.fakeThen = sinon.spy(); - this.fakeProxy = sinon.stub(jQuery, 'proxy').returns('onsuccess'); - - this.target = sinon.stub(this.sandbox.client, 'getStorageAuth'); - this.target.returns({ - then: this.fakeThen - }); - }); - - afterEach(function () { - jQuery.proxy.restore(); - }); - - it('should request authentication for the upload', function () { - this.module.authenticate('test', {}); - assert.called(this.target); - assert.calledWith(this.target, 'test'); - }); - - it('should register success and error callbacks', function () { - this.module.authenticate('test', {}); - assert.called(this.fakeThen); - assert.calledWith(this.fakeThen, 'onsuccess', this.module._onAuthError); - }); - - it('should save the key on the data object', function () { - var data = {}; - - this.module.authenticate('test', data); - - assert.equal(data.key, 'test'); - }); - }); - - describe('.lookupMetadata(key, data)', function () { - beforeEach(function () { - this.fakeThen = sinon.spy(); - this.fakeProxy = sinon.stub(jQuery, 'proxy').returns('onsuccess'); - - this.target = sinon.stub(this.sandbox.client, 'getStorageMetadata'); - this.target.returns({ - then: this.fakeThen - }); - }); - - afterEach(function () { - jQuery.proxy.restore(); - }); - - it('should request metadata for the upload key', function () { - this.module.lookupMetadata('test', {}); - assert.called(this.target); - assert.calledWith(this.target, 'test'); - }); - - it('should register success and error callbacks', function () { - this.module.lookupMetadata('test', {}); - assert.called(this.fakeThen); - assert.calledWith(this.fakeThen, 'onsuccess', this.module._onMetadataError); - }); - }); - - describe('.notify(message, type)', function () { - it('should call the sandbox.notify() method', function () { - var target = sinon.stub(this.sandbox, 'notify'); - - this.module.notify('this is an example message', 'info'); - - assert.called(target); - assert.calledWith(target, 'An Error Occurred', 'this is an example message', 'info'); - }); - }); - - describe('.generateKey(file)', function () { - it('should generate a unique filename prefixed with a timestamp', function () { - var now = new Date(); - var date = jQuery.date.toISOString(now); - var clock = sinon.useFakeTimers(now.getTime()); - var target = this.module.generateKey('this is my file.png'); - - assert.equal(target, date + '/this-is-my-file.png'); - - clock.restore(); - }); - }); - - describe('._onUploadAdd(event, data)', function () { - beforeEach(function () { - this.target = sinon.stub(this.module, 'authenticate'); - sinon.stub(this.module, 'generateKey').returns('stubbed'); - }); - - it('should authenticate the upload if a file is provided', function () { - var data = {files: [{name: 'my_file.jpg'}]}; - this.module._onUploadAdd({}, data); - - assert.called(this.target); - assert.calledWith(this.target, 'stubbed', data); - }); - - it('should not authenticate the upload if no file is provided', function () { - var data = {files: []}; - this.module._onUploadAdd({}, data); - - assert.notCalled(this.target); - }); - }); - - describe('._onUploadSend()', function () { - it('should display the loading spinner', function () { - var target = sinon.stub(this.module, 'loading'); - this.module._onUploadSend({}, {}); - - assert.called(target); - }); - }); - - describe('._onUploadDone()', function () { - it('should request the metadata for the file', function () { - var target = sinon.stub(this.module, 'lookupMetadata'); - this.module._onUploadDone({}, {result: {}}); - - assert.called(target); - }); - - it('should call the fail handler if the "result" key in the data is undefined', function () { - var target = sinon.stub(this.module, '_onUploadFail'); - this.module._onUploadDone({}, {result: undefined}); - - assert.called(target); - }); - - it('should call the fail handler if the "result" object has an "error" key', function () { - var target = sinon.stub(this.module, '_onUploadFail'); - this.module._onUploadDone({}, {result: {error: 'failed'}}); - - assert.called(target); - }); - }); - - describe('._onUploadComplete()', function () { - it('should hide the loading spinner', function () { - var target = sinon.stub(this.module, 'loading'); - this.module._onUploadComplete({}, {}); - - assert.called(target); - assert.calledWith(target, false); - }); - }); - - describe('._onAuthSuccess()', function () { - beforeEach(function () { - this.target = { - submit: sinon.spy() - }; - - this.response = { - action: 'action', - fields: [{name: 'name', value: 'value'}] - }; - }); - - it('should set the data url', function () { - this.module._onAuthSuccess(this.target, this.response); - - assert.equal(this.target.url, this.response.action); - }); - - it('should set the additional form data', function () { - this.module._onAuthSuccess(this.target, this.response); - - assert.deepEqual(this.target.formData, this.response.fields); - }); - - it('should merge the form data with the options', function () { - this.module.options.form.params = [{name: 'option', value: 'option'}]; - this.module._onAuthSuccess(this.target, this.response); - - assert.deepEqual(this.target.formData, [{name: 'option', value: 'option'}, {name: 'name', value: 'value'}]); - }); - - it('should call data.submit()', function () { - this.module._onAuthSuccess(this.target, this.response); - assert.called(this.target.submit); - }); - }); - - describe('._onMetadataSuccess()', function () { - it('should publish the "resource:uploaded" event', function () { - var resource = {url: 'http://', name: 'My File'}; - var target = sinon.stub(this.sandbox, 'publish'); - - sinon.stub(this.sandbox.client, 'convertStorageMetadataToResource').returns(resource); - - this.module._onMetadataSuccess(); - - assert.called(target); - assert.calledWith(target, "resource:uploaded", resource); - }); - }); -}); diff --git a/ckan/public-bs2/base/test/spec/notify.spec.js b/ckan/public-bs2/base/test/spec/notify.spec.js deleted file mode 100644 index 48a2e612691..00000000000 --- a/ckan/public-bs2/base/test/spec/notify.spec.js +++ /dev/null @@ -1,46 +0,0 @@ -/*globals describe beforeEach afterEach it assert sinon ckan jQuery */ -describe('ckan.notify()', function () { - beforeEach(function () { - this.element = jQuery('
    '); - this.fixture.append(this.element); - - ckan.notify.el = this.element; - }); - - it('should append a notification to the element', function () { - ckan.notify('test'); - assert.equal(this.element.children().length, 1, 'should be one child'); - ckan.notify('test'); - assert.equal(this.element.children().length, 2, 'should be two children'); - }); - - it('should append a notification title', function () { - ckan.notify('test'); - assert.equal(this.element.find('strong').text(), 'test'); - }); - - it('should append a notification body', function () { - ckan.notify('test', 'this is a message'); - assert.equal(this.element.find('span').text(), 'this is a message'); - }); - - it('should escape all content', function () { - ckan.notify(' - - - - - - - - - - - - - - - diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/tests/css-tests.css b/ckan/public-bs2/base/vendor/bootstrap/less/tests/css-tests.css deleted file mode 100755 index 0f5604ee686..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/tests/css-tests.css +++ /dev/null @@ -1,150 +0,0 @@ -/*! - * Bootstrap CSS Tests - */ - - -/* Remove background image */ -body { - background-image: none; -} - -/* Space out subhead */ -.subhead { - margin-bottom: 36px; -} -/*h4 { - margin-bottom: 5px; -} -*/ - -.type-test { - margin-bottom: 20px; - padding: 0 20px 20px; - background: url(../../docs/assets/img/grid-baseline-20px.png); -} -.type-test h1, -.type-test h2, -.type-test h3, -.type-test h4, -.type-test h5, -.type-test h6 { - background-color: rgba(255,0,0,.2); -} - - -/* colgroup tests */ -.col1 { - background-color: rgba(255,0,0,.1); -} -.col2 { - background-color: rgba(0,255,0,.1); -} -.col3 { - background-color: rgba(0,0,255,.1); -} - - -/* Fluid row inputs */ -#rowInputs .row > [class*=span], -#fluidRowInputs .row-fluid > [class*=span] { - background-color: rgba(255,0,0,.1); -} - - -/* Fluid grid */ -.fluid-grid { - margin-bottom: 45px; -} -.fluid-grid .row { - height: 40px; - padding-top: 10px; - margin-top: 10px; - color: #ddd; - text-align: center; -} -.fluid-grid .span1 { - background-color: #999; -} - - -/* Gradients */ - -[class^="gradient-"] { - width: 100%; - height: 400px; - margin: 20px 0; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.gradient-horizontal { - background-color: #333333; - background-image: -moz-linear-gradient(left, #555555, #333333); - background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#555555), to(#333333)); - background-image: -webkit-linear-gradient(left, #555555, #333333); - background-image: -o-linear-gradient(left, #555555, #333333); - background-image: linear-gradient(to right, #555555, #333333); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff555555', endColorstr='#ff333333', GradientType=1); -} - -.gradient-vertical { - background-color: #474747; - background-image: -moz-linear-gradient(top, #555555, #333333); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#333333)); - background-image: -webkit-linear-gradient(top, #555555, #333333); - background-image: -o-linear-gradient(top, #555555, #333333); - background-image: linear-gradient(to bottom, #555555, #333333); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff555555', endColorstr='#ff333333', GradientType=0); -} - -.gradient-directional { - background-color: #333333; - background-image: -moz-linear-gradient(45deg, #555555, #333333); - background-image: -webkit-linear-gradient(45deg, #555555, #333333); - background-image: -o-linear-gradient(45deg, #555555, #333333); - background-image: linear-gradient(45deg, #555555, #333333); - background-repeat: repeat-x; -} - -.gradient-vertical-three { - background-color: #8940a5; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#00b3ee), color-stop(50%, #7a43b6), to(#c3325f)); - background-image: -webkit-linear-gradient(#00b3ee, #7a43b6 50%, #c3325f); - background-image: -moz-linear-gradient(top, #00b3ee, #7a43b6 50%, #c3325f); - background-image: -o-linear-gradient(#00b3ee, #7a43b6 50%, #c3325f); - background-image: linear-gradient(#00b3ee, #7a43b6 50%, #c3325f); - background-repeat: no-repeat; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff00b3ee', endColorstr='#ffc3325f', GradientType=0); -} - -.gradient-radial { - background-color: #333333; - background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(#555555), to(#333333)); - background-image: -webkit-radial-gradient(circle, #555555, #333333); - background-image: -moz-radial-gradient(circle, #555555, #333333); - background-image: -o-radial-gradient(circle, #555555, #333333); - background-repeat: no-repeat; -} - -.gradient-striped { - background-color: #555555; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.gradient-horizontal-three { - background-color: #00b3ee; - background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(#00b3ee), color-stop(50%, #7a43b6), to(#c3325f)); - background-image: -webkit-linear-gradient(left, #00b3ee, #7a43b6 50%, #c3325f); - background-image: -moz-linear-gradient(left, #00b3ee, #7a43b6 50%, #c3325f); - background-image: -o-linear-gradient(left, #00b3ee, #7a43b6 50%, #c3325f); - background-image: linear-gradient(to right, #00b3ee, #7a43b6 50%, #c3325f); - background-repeat: no-repeat; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00b3ee', endColorstr='#c3325f', GradientType=0); -} diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/tests/css-tests.html b/ckan/public-bs2/base/vendor/bootstrap/less/tests/css-tests.html deleted file mode 100755 index eb8891ee298..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/tests/css-tests.html +++ /dev/null @@ -1,1399 +0,0 @@ - - - - - CSS Tests · Twitter Bootstrap - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -

    CSS Tests

    -

    One stop shop for quick debugging and edge-case tests of CSS.

    -
    -
    - - -
    - -
    - - - - - - - -
    -
    -
    -

    h1. Heading 1

    -

    h2. Heading 2

    -

    h3. Heading 3

    -

    h4. Heading 4

    -
    h5. Heading 5
    -
    h6. Heading 6
    -

    Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

    -
    -
    -
    -
    -

    h1. Heading 1

    -

    Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

    -

    h2. Heading 2

    -

    Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

    -

    h3. Heading 3

    -

    Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

    -

    h4. Heading 4

    -

    Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

    -
    h5. Heading 5
    -

    Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

    -
    h6. Heading 6
    -

    Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

    -
    -
    -
    - - - - - - - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -

    - - - - - - - - -
    -
    -
    12 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    -
    -
    11 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    1 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    -
    -
    10 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    2 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    -
    -
    9 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    3 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    -
    -
    8 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    4 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    -
    -
    7 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    5 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    -
    -
    6 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    6 -
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    1
    -
    -
    -
    -
    - - - - - - - -
    -
    -

    Bordered without thead

    - - - - - - - - - - - - - - - - - - -
    123
    123
    123
    -

    Bordered without thead, with caption

    - - - - - - - - - - - - - - - - - - - -
    Table caption
    123
    123
    123
    -

    Bordered without thead, with colgroup

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    123
    123
    123
    369
    -

    Bordered with thead, with colgroup

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ABC
    123
    123
    123
    369
    -
    -
    -

    Bordered with thead and caption

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table caption
    123
    123
    123
    123
    369
    -

    Bordered with rowspan and colspan

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    123
    1 and 23
    123
    13
    2 and 3
    -
    -
    - - -

    Grid sizing

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    123
    1 and 23
    123
    13
    2 and 3
    -
    -
    - -

    Nesting and striping

    - - - - - - - - - - - -
    Test
    - - - - - - - - - - - - - - - - - - - - - -
    TestTest
    - test - - test -
    - test - - test -
    - test - - test -
    -
    - -

    Fluid grid sizing

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    123
    1 and 23
    123
    13
    2 and 3
    -
    -
    - - - - - - - -

    Buttons and button groups

    - - - - - - -

    Horizontal form errors

    -
    -
    - -
    - - Please correct the error -
    -
    -
    - -
    -
    -

    Prepend and append on inputs

    -
    -
    -
    - @ - -
    -
    -
    -
    - - @ -
    -
    -
    -
    - $ - - .00 -
    -
    -
    -
    -
    -

    Prepend and append with uneditable

    -
    -
    - $ - Some value here -
    -
    - Some value here - .00 -
    -
    - $ - Some value here - .00 -
    -
    -
    -
    -

    Prepend with type="submit"

    - -
    - - -
    -
    - - - -
    -
    -
    - -

    Fluid prepended and appended inputs

    -
    -
    -
    -
    -
    - @ -
    -
    -
    -
    - @ -
    -
    -
    -
    - $.00 -
    -
    -
    -
    -
    - -

    Fixed row with inputs

    -

    Inputs should not extend past the light red background, set on their parent, a .span* column.

    - -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -

    Fluid row with inputs

    -

    Inputs should not extend past the light red background, set on their parent, a .span* column.

    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    - -
    - -

    Inline form in fluid row

    - -
    -
    -
    - - - - -
    -
    -
    - - -
    - - -

    Fluid textarea at .span12

    -
    -
    - -
    -
    - - -
    - - -

    Selects

    -
    - -
    - - -
    - - - - - - - - -

    Dropdown link with hash URL

    - - -

    Dropdown link with custom URL and data-target

    - - -

    Dropdown on a button

    - - -
    - - - - - - -

    Default thumbnails (no grid sizing)

    -
      -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    - - - -

    Standard grid sizing

    - - -

    Fluid thumbnails

    -
    -
    - -
    -
    - - - - - - - -
    - -
    -
    -

    I'm in Section 1.

    - -
    - -
    -
    -

    I'm in Section 1.1.

    -
    -
    -

    I'm in Section 1.2.

    -
    -
    -

    I'm in Section 1.3.

    -
    -
    -
    -
    -
    -

    Howdy, I'm in Section 2.

    -
    -
    -

    What up girl, this is Section 3.

    -
    -
    -
    - -
    - - - - - - -
    -
    -

    Inline label

    -

    Cras justo odio, dapibus ac facilisis in, egestas eget quam. Maecenas sed diam Label name eget risus varius blandit sit amet non magna. Fusce .class-name dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

    -
    -
    -
    - - Hey! Read this. -
    -
    -
    - - -
    -
    - -
    - - - - - - - - - - - - - -
    - Maecenas faucibus mollis interdum. Nulla vitae elit libero, a pharetra augue. Donec ullamcorper nulla non metus auctor fringilla. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. - -
    - - - - -
    -
    - -

    Mini buttons: text and icon

    -
    - - -
    - -
    - - - - - - - -

    Visible on...

    -
      -
    • Phone✔ Phone
    • -
    • Tablet✔ Tablet
    • -
    • Desktop✔ Desktop
    • -
    -
      -
    • Phone + Tablet✔ Phone + Tablet
    • -
    • Tablet + Desktop✔ Tablet + Desktop
    • -
    • All✔ All
    • -
    - -

    Hidden on...

    -
      -
    • Phone✔ Phone
    • -
    • Tablet✔ Tablet
    • -
    • Desktop✔ Desktop
    • -
    -
      -
    • Phone + Tablet✔ Phone + Tablet
    • -
    • Tablet + Desktop✔ Tablet + Desktop
    • -
    • All✔ All
    • -
    - - - - - - - -

    Horizontal

    -
    - -

    Vertical

    -
    - -

    Directional

    -
    - -

    Three colors

    -
    - -

    Radial

    -
    - -

    Striped

    -
    - -

    Horizontal three colors

    -
    - - - - - -

    Alert default

    -
    - - Alert! Best check yourself, you're not looking too good. -
    -
    - -

    Alert! Best check yourself, you're not looking too good.

    -
    - -

    Success

    -
    - - Success! Best check yourself, you're not looking too good. -
    -
    - -

    Success! Best check yourself, you're not looking too good.

    -
    - -

    Info

    -
    - - Info! Best check yourself, you're not looking too good. -
    -
    - -

    Info! Best check yourself, you're not looking too good.

    -
    - -

    Warning

    -
    - - Warning! Best check yourself, you're not looking too good. -
    -
    - -

    Warning! Best check yourself, you're not looking too good.

    -
    - -

    Error

    -
    - - Error! Best check yourself, you're not looking too good. -
    -
    - -

    Error! Best check yourself, you're not looking too good.

    -
    - - -
    - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/tests/forms-responsive.html b/ckan/public-bs2/base/vendor/bootstrap/less/tests/forms-responsive.html deleted file mode 100755 index c3e208d0215..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/tests/forms-responsive.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Bootstrap, from Twitter - - - - - - - - - - - - - - - - - - - - - - -
    - - - -

    Vertical alignment

    - - - span1 - -

    Width across elements

    -
    - -
    -
    - -
    -
    - span2 -
    - - - - -
    - - - span1 -
    - -
    - - - diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/tests/forms.html b/ckan/public-bs2/base/vendor/bootstrap/less/tests/forms.html deleted file mode 100755 index a63d728a008..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/tests/forms.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - Bootstrap, from Twitter - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    - - - - -
    -
    - -
    - - - diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar-fixed-top.html b/ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar-fixed-top.html deleted file mode 100755 index 6f4be2dfc63..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar-fixed-top.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - Bootstrap, from Twitter - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -

    Navbar example

    -

    This example is a quick exercise to illustrate how the default, static navbar and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.

    -

    - View navbar docs » -

    -
    - -
    - - - - - - - - - - - - - - - - - - - diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar-static-top.html b/ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar-static-top.html deleted file mode 100755 index 1881e131ae3..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar-static-top.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - Bootstrap, from Twitter - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -

    Navbar example

    -

    This example is a quick exercise to illustrate how the default, static navbar and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.

    -

    - View navbar docs » -

    -
    - -
    - - - - - - - - - - - - - - - - - - - diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar.html b/ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar.html deleted file mode 100755 index 79c302f6222..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/tests/navbar.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - Bootstrap, from Twitter - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - -
    -

    Navbar example

    -

    This example is a quick exercise to illustrate how the default, static navbar and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.

    -

    - View navbar docs » -

    -
    - -
    - - - - - - - - - - - - - - - - - - - diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/thumbnails.less b/ckan/public-bs2/base/vendor/bootstrap/less/thumbnails.less deleted file mode 100755 index 4fd07d25337..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/thumbnails.less +++ /dev/null @@ -1,53 +0,0 @@ -// -// Thumbnails -// -------------------------------------------------- - - -// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files - -// Make wrapper ul behave like the grid -.thumbnails { - margin-left: -@gridGutterWidth; - list-style: none; - .clearfix(); -} -// Fluid rows have no left margin -.row-fluid .thumbnails { - margin-left: 0; -} - -// Float li to make thumbnails appear in a row -.thumbnails > li { - float: left; // Explicity set the float since we don't require .span* classes - margin-bottom: @baseLineHeight; - margin-left: @gridGutterWidth; -} - -// The actual thumbnail (can be `a` or `div`) -.thumbnail { - display: block; - padding: 4px; - line-height: @baseLineHeight; - border: 1px solid #ddd; - .border-radius(@baseBorderRadius); - .box-shadow(0 1px 3px rgba(0,0,0,.055)); - .transition(all .2s ease-in-out); -} -// Add a hover/focus state for linked versions only -a.thumbnail:hover, -a.thumbnail:focus { - border-color: @linkColor; - .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; -} -.thumbnail .caption { - padding: 9px; - color: @gray; -} diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/tooltip.less b/ckan/public-bs2/base/vendor/bootstrap/less/tooltip.less deleted file mode 100755 index 83d5f2bd765..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/tooltip.less +++ /dev/null @@ -1,70 +0,0 @@ -// -// Tooltips -// -------------------------------------------------- - - -// Base class -.tooltip { - position: absolute; - z-index: @zindexTooltip; - display: block; - visibility: visible; - font-size: 11px; - line-height: 1.4; - .opacity(0); - &.in { .opacity(80); } - &.top { margin-top: -3px; padding: 5px 0; } - &.right { margin-left: 3px; padding: 0 5px; } - &.bottom { margin-top: 3px; padding: 5px 0; } - &.left { margin-left: -3px; padding: 0 5px; } -} - -// Wrapper for the tooltip content -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: @tooltipColor; - text-align: center; - text-decoration: none; - background-color: @tooltipBackground; - .border-radius(@baseBorderRadius); -} - -// 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: -@tooltipArrowWidth; - border-width: @tooltipArrowWidth @tooltipArrowWidth 0; - border-top-color: @tooltipArrowColor; - } - &.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -@tooltipArrowWidth; - border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0; - border-right-color: @tooltipArrowColor; - } - &.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -@tooltipArrowWidth; - border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth; - border-left-color: @tooltipArrowColor; - } - &.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -@tooltipArrowWidth; - border-width: 0 @tooltipArrowWidth @tooltipArrowWidth; - border-bottom-color: @tooltipArrowColor; - } -} diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/type.less b/ckan/public-bs2/base/vendor/bootstrap/less/type.less deleted file mode 100755 index 337138ac8ef..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/type.less +++ /dev/null @@ -1,247 +0,0 @@ -// -// Typography -// -------------------------------------------------- - - -// Body text -// ------------------------- - -p { - margin: 0 0 @baseLineHeight / 2; -} -.lead { - margin-bottom: @baseLineHeight; - font-size: @baseFontSize * 1.5; - font-weight: 200; - line-height: @baseLineHeight * 1.5; -} - - -// Emphasis & misc -// ------------------------- - -// Ex: 14px base font * 85% = about 12px -small { font-size: 85%; } - -strong { font-weight: bold; } -em { font-style: italic; } -cite { font-style: normal; } - -// Utility classes -.muted { color: @grayLight; } -a.muted:hover, -a.muted:focus { color: darken(@grayLight, 10%); } - -.text-warning { color: @warningText; } -a.text-warning:hover, -a.text-warning:focus { color: darken(@warningText, 10%); } - -.text-error { color: @errorText; } -a.text-error:hover, -a.text-error:focus { color: darken(@errorText, 10%); } - -.text-info { color: @infoText; } -a.text-info:hover, -a.text-info:focus { color: darken(@infoText, 10%); } - -.text-success { color: @successText; } -a.text-success:hover, -a.text-success:focus { color: darken(@successText, 10%); } - -.text-left { text-align: left; } -.text-right { text-align: right; } -.text-center { text-align: center; } - - -// Headings -// ------------------------- - -h1, h2, h3, h4, h5, h6 { - margin: (@baseLineHeight / 2) 0; - font-family: @headingsFontFamily; - font-weight: @headingsFontWeight; - line-height: @baseLineHeight; - color: @headingsColor; - text-rendering: optimizelegibility; // Fix the character spacing for headings - small { - font-weight: normal; - line-height: 1; - color: @grayLight; - } -} - -h1, -h2, -h3 { line-height: @baseLineHeight * 2; } - -h1 { font-size: @baseFontSize * 2.75; } // ~38px -h2 { font-size: @baseFontSize * 2.25; } // ~32px -h3 { font-size: @baseFontSize * 1.75; } // ~24px -h4 { font-size: @baseFontSize * 1.25; } // ~18px -h5 { font-size: @baseFontSize; } -h6 { font-size: @baseFontSize * 0.85; } // ~12px - -h1 small { font-size: @baseFontSize * 1.75; } // ~24px -h2 small { font-size: @baseFontSize * 1.25; } // ~18px -h3 small { font-size: @baseFontSize; } -h4 small { font-size: @baseFontSize; } - - -// Page header -// ------------------------- - -.page-header { - padding-bottom: (@baseLineHeight / 2) - 1; - margin: @baseLineHeight 0 (@baseLineHeight * 1.5); - border-bottom: 1px solid @grayLighter; -} - - - -// 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; -} -li { - line-height: @baseLineHeight; -} - -// Remove default list styles -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -// Single-line list items -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; - > li { - display: inline-block; - .ie7-inline-block(); - padding-left: 5px; - padding-right: 5px; - } -} - -// Description Lists -dl { - margin-bottom: @baseLineHeight; -} -dt, -dd { - line-height: @baseLineHeight; -} -dt { - font-weight: bold; -} -dd { - margin-left: @baseLineHeight / 2; -} -// Horizontal layout (like forms) -.dl-horizontal { - .clearfix(); // Ensure dl clears floats if empty dd elements present - dt { - float: left; - width: @horizontalComponentOffset - 20; - clear: left; - text-align: right; - .text-overflow(); - } - dd { - margin-left: @horizontalComponentOffset; - } -} - -// MISC -// ---- - -// Horizontal rules -hr { - margin: @baseLineHeight 0; - border: 0; - border-top: 1px solid @hrBorder; - border-bottom: 1px solid @white; -} - -// Abbreviations and acronyms -abbr[title], -// Added data-* attribute to help out our tooltip plugin, per https://github.com/twitter/bootstrap/issues/5257 -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted @grayLight; -} -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -// Blockquotes -blockquote { - padding: 0 0 0 15px; - margin: 0 0 @baseLineHeight; - border-left: 5px solid @grayLighter; - p { - margin-bottom: 0; - font-size: @baseFontSize * 1.25; - font-weight: 300; - line-height: 1.25; - } - small { - display: block; - line-height: @baseLineHeight; - color: @grayLight; - &:before { - content: '\2014 \00A0'; - } - } - - // Float right with text-align: right - &.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid @grayLighter; - border-left: 0; - p, - small { - text-align: right; - } - small { - &:before { - content: ''; - } - &:after { - content: '\00A0 \2014'; - } - } - } -} - -// Quotes -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -// Addresses -address { - display: block; - margin-bottom: @baseLineHeight; - font-style: normal; - line-height: @baseLineHeight; -} diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/utilities.less b/ckan/public-bs2/base/vendor/bootstrap/less/utilities.less deleted file mode 100755 index 314b4ffdb45..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/utilities.less +++ /dev/null @@ -1,30 +0,0 @@ -// -// Utility classes -// -------------------------------------------------- - - -// Quick floats -.pull-right { - float: right; -} -.pull-left { - float: left; -} - -// Toggling content -.hide { - display: none; -} -.show { - display: block; -} - -// Visibility -.invisible { - visibility: hidden; -} - -// For Affix plugin -.affix { - position: fixed; -} diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/variables.less b/ckan/public-bs2/base/vendor/bootstrap/less/variables.less deleted file mode 100755 index 31c131b1e23..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/variables.less +++ /dev/null @@ -1,301 +0,0 @@ -// -// Variables -// -------------------------------------------------- - - -// Global values -// -------------------------------------------------- - - -// Grays -// ------------------------- -@black: #000; -@grayDarker: #222; -@grayDark: #333; -@gray: #555; -@grayLight: #999; -@grayLighter: #eee; -@white: #fff; - - -// Accent colors -// ------------------------- -@blue: #049cdb; -@blueDark: #0064cd; -@green: #46a546; -@red: #9d261d; -@yellow: #ffc40d; -@orange: #f89406; -@pink: #c3325f; -@purple: #7a43b6; - - -// Scaffolding -// ------------------------- -@bodyBackground: @white; -@textColor: @grayDark; - - -// Links -// ------------------------- -@linkColor: #08c; -@linkColorHover: darken(@linkColor, 15%); - - -// Typography -// ------------------------- -@sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif; -@serifFontFamily: Georgia, "Times New Roman", Times, serif; -@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace; - -@baseFontSize: 14px; -@baseFontFamily: @sansFontFamily; -@baseLineHeight: 20px; -@altFontFamily: @serifFontFamily; - -@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily -@headingsFontWeight: bold; // instead of browser default, bold -@headingsColor: inherit; // empty to use BS default, @textColor - - -// Component sizing -// ------------------------- -// Based on 14px font-size and 20px line-height - -@fontSizeLarge: @baseFontSize * 1.25; // ~18px -@fontSizeSmall: @baseFontSize * 0.85; // ~12px -@fontSizeMini: @baseFontSize * 0.75; // ~11px - -@paddingLarge: 11px 19px; // 44px -@paddingSmall: 2px 10px; // 26px -@paddingMini: 0 6px; // 22px - -@baseBorderRadius: 4px; -@borderRadiusLarge: 6px; -@borderRadiusSmall: 3px; - - -// Tables -// ------------------------- -@tableBackground: transparent; // overall background-color -@tableBackgroundAccent: #f9f9f9; // for striping -@tableBackgroundHover: #f5f5f5; // for hover -@tableBorder: #ddd; // table and cell border - -// Buttons -// ------------------------- -@btnBackground: @white; -@btnBackgroundHighlight: darken(@white, 10%); -@btnBorder: #ccc; - -@btnPrimaryBackground: @linkColor; -@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 20%); - -@btnInfoBackground: #5bc0de; -@btnInfoBackgroundHighlight: #2f96b4; - -@btnSuccessBackground: #62c462; -@btnSuccessBackgroundHighlight: #51a351; - -@btnWarningBackground: lighten(@orange, 15%); -@btnWarningBackgroundHighlight: @orange; - -@btnDangerBackground: #ee5f5b; -@btnDangerBackgroundHighlight: #bd362f; - -@btnInverseBackground: #444; -@btnInverseBackgroundHighlight: @grayDarker; - - -// Forms -// ------------------------- -@inputBackground: @white; -@inputBorder: #ccc; -@inputBorderRadius: @baseBorderRadius; -@inputDisabledBackground: @grayLighter; -@formActionsBackground: #f5f5f5; -@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border - - -// Dropdowns -// ------------------------- -@dropdownBackground: @white; -@dropdownBorder: rgba(0,0,0,.2); -@dropdownDividerTop: #e5e5e5; -@dropdownDividerBottom: @white; - -@dropdownLinkColor: @grayDark; -@dropdownLinkColorHover: @white; -@dropdownLinkColorActive: @white; - -@dropdownLinkBackgroundActive: @linkColor; -@dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive; - - - -// COMPONENT VARIABLES -// -------------------------------------------------- - - -// 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: 1030; -@zindexFixedNavbar: 1030; -@zindexModalBackdrop: 1040; -@zindexModal: 1050; - - -// Sprite icons path -// ------------------------- -@iconSpritePath: "../img/glyphicons-halflings.png"; -@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png"; - - -// Input placeholder text color -// ------------------------- -@placeholderText: @grayLight; - - -// Hr border color -// ------------------------- -@hrBorder: @grayLighter; - - -// Horizontal forms & lists -// ------------------------- -@horizontalComponentOffset: 180px; - - -// Wells -// ------------------------- -@wellBackground: #f5f5f5; - - -// Navbar -// ------------------------- -@navbarCollapseWidth: 979px; -@navbarCollapseDesktopWidth: @navbarCollapseWidth + 1; - -@navbarHeight: 40px; -@navbarBackgroundHighlight: #ffffff; -@navbarBackground: darken(@navbarBackgroundHighlight, 5%); -@navbarBorder: darken(@navbarBackground, 12%); - -@navbarText: #777; -@navbarLinkColor: #777; -@navbarLinkColorHover: @grayDark; -@navbarLinkColorActive: @gray; -@navbarLinkBackgroundHover: transparent; -@navbarLinkBackgroundActive: darken(@navbarBackground, 5%); - -@navbarBrandColor: @navbarLinkColor; - -// Inverted navbar -@navbarInverseBackground: #111111; -@navbarInverseBackgroundHighlight: #222222; -@navbarInverseBorder: #252525; - -@navbarInverseText: @grayLight; -@navbarInverseLinkColor: @grayLight; -@navbarInverseLinkColorHover: @white; -@navbarInverseLinkColorActive: @navbarInverseLinkColorHover; -@navbarInverseLinkBackgroundHover: transparent; -@navbarInverseLinkBackgroundActive: @navbarInverseBackground; - -@navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%); -@navbarInverseSearchBackgroundFocus: @white; -@navbarInverseSearchBorder: @navbarInverseBackground; -@navbarInverseSearchPlaceholderColor: #ccc; - -@navbarInverseBrandColor: @navbarInverseLinkColor; - - -// Pagination -// ------------------------- -@paginationBackground: #fff; -@paginationBorder: #ddd; -@paginationActiveBackground: #f5f5f5; - - -// Hero unit -// ------------------------- -@heroUnitBackground: @grayLighter; -@heroUnitHeadingColor: inherit; -@heroUnitLeadColor: inherit; - - -// Form states and alerts -// ------------------------- -@warningText: #c09853; -@warningBackground: #fcf8e3; -@warningBorder: darken(spin(@warningBackground, -10), 3%); - -@errorText: #b94a48; -@errorBackground: #f2dede; -@errorBorder: darken(spin(@errorBackground, -10), 3%); - -@successText: #468847; -@successBackground: #dff0d8; -@successBorder: darken(spin(@successBackground, -10), 5%); - -@infoText: #3a87ad; -@infoBackground: #d9edf7; -@infoBorder: darken(spin(@infoBackground, -10), 7%); - - -// Tooltips and popovers -// ------------------------- -@tooltipColor: #fff; -@tooltipBackground: #000; -@tooltipArrowWidth: 5px; -@tooltipArrowColor: @tooltipBackground; - -@popoverBackground: #fff; -@popoverArrowWidth: 10px; -@popoverArrowColor: #fff; -@popoverTitleBackground: darken(@popoverBackground, 3%); - -// Special enhancement for popovers -@popoverArrowOuterWidth: @popoverArrowWidth + 1; -@popoverArrowOuterColor: rgba(0,0,0,.25); - - - -// GRID -// -------------------------------------------------- - - -// Default 940px grid -// ------------------------- -@gridColumns: 12; -@gridColumnWidth: 60px; -@gridGutterWidth: 20px; -@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1)); - -// 1200px min -@gridColumnWidth1200: 70px; -@gridGutterWidth1200: 30px; -@gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1)); - -// 768px-979px -@gridColumnWidth768: 42px; -@gridGutterWidth768: 20px; -@gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1)); - - -// Fluid grid -// ------------------------- -@fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth); -@fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth); - -// 1200px min -@fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200); -@fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200); - -// 768px-979px -@fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768); -@fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768); diff --git a/ckan/public-bs2/base/vendor/bootstrap/less/wells.less b/ckan/public-bs2/base/vendor/bootstrap/less/wells.less deleted file mode 100755 index 84a744b1c5c..00000000000 --- a/ckan/public-bs2/base/vendor/bootstrap/less/wells.less +++ /dev/null @@ -1,29 +0,0 @@ -// -// Wells -// -------------------------------------------------- - - -// Base class -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: @wellBackground; - border: 1px solid darken(@wellBackground, 7%); - .border-radius(@baseBorderRadius); - .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); - blockquote { - border-color: #ddd; - border-color: rgba(0,0,0,.15); - } -} - -// Sizes -.well-large { - padding: 24px; - .border-radius(@borderRadiusLarge); -} -.well-small { - padding: 9px; - .border-radius(@borderRadiusSmall); -} diff --git a/ckan/public-bs2/base/vendor/font-awesome/css/font-awesome.css b/ckan/public-bs2/base/vendor/font-awesome/css/font-awesome.css deleted file mode 100644 index 048cff97398..00000000000 --- a/ckan/public-bs2/base/vendor/font-awesome/css/font-awesome.css +++ /dev/null @@ -1,1338 +0,0 @@ -/*! - * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ -/* FONT PATH - * -------------------------- */ -@font-face { - font-family: 'FontAwesome'; - src: url('../fonts/fontawesome-webfont.eot?v=4.0.3'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); - font-weight: normal; - font-style: normal; -} -.fa { - display: inline-block; - font-family: FontAwesome; - font-style: normal; - font-weight: normal; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -/* makes the font 33% larger relative to the icon container */ -.fa-lg { - font-size: 1.3333333333333333em; - line-height: 0.75em; - vertical-align: -15%; -} -.fa-2x { - font-size: 2em; -} -.fa-3x { - font-size: 3em; -} -.fa-4x { - font-size: 4em; -} -.fa-5x { - font-size: 5em; -} -.fa-fw { - width: 1.2857142857142858em; - text-align: center; -} -.fa-ul { - padding-left: 0; - margin-left: 2.142857142857143em; - list-style-type: none; -} -.fa-ul > li { - position: relative; -} -.fa-li { - position: absolute; - left: -2.142857142857143em; - width: 2.142857142857143em; - top: 0.14285714285714285em; - text-align: center; -} -.fa-li.fa-lg { - left: -1.8571428571428572em; -} -.fa-border { - padding: .2em .25em .15em; - border: solid 0.08em #eeeeee; - border-radius: .1em; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.fa.pull-left { - margin-right: .3em; -} -.fa.pull-right { - margin-left: .3em; -} -.fa-spin { - -webkit-animation: spin 2s infinite linear; - -moz-animation: spin 2s infinite linear; - -o-animation: spin 2s infinite linear; - animation: spin 2s infinite linear; -} -@-moz-keyframes spin { - 0% { - -moz-transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(359deg); - } -} -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - } -} -@-o-keyframes spin { - 0% { - -o-transform: rotate(0deg); - } - 100% { - -o-transform: rotate(359deg); - } -} -@-ms-keyframes spin { - 0% { - -ms-transform: rotate(0deg); - } - 100% { - -ms-transform: rotate(359deg); - } -} -@keyframes spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(359deg); - } -} -.fa-rotate-90 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); - -webkit-transform: rotate(90deg); - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -o-transform: rotate(90deg); - transform: rotate(90deg); -} -.fa-rotate-180 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); - -webkit-transform: rotate(180deg); - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -o-transform: rotate(180deg); - transform: rotate(180deg); -} -.fa-rotate-270 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); - -webkit-transform: rotate(270deg); - -moz-transform: rotate(270deg); - -ms-transform: rotate(270deg); - -o-transform: rotate(270deg); - transform: rotate(270deg); -} -.fa-flip-horizontal { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); - -webkit-transform: scale(-1, 1); - -moz-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - -o-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.fa-flip-vertical { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); - -webkit-transform: scale(1, -1); - -moz-transform: scale(1, -1); - -ms-transform: scale(1, -1); - -o-transform: scale(1, -1); - transform: scale(1, -1); -} -.fa-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.fa-stack-1x, -.fa-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.fa-stack-1x { - line-height: inherit; -} -.fa-stack-2x { - font-size: 2em; -} -.fa-inverse { - color: #ffffff; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.fa-glass:before { - content: "\f000"; -} -.fa-music:before { - content: "\f001"; -} -.fa-search:before { - content: "\f002"; -} -.fa-envelope-o:before { - content: "\f003"; -} -.fa-heart:before { - content: "\f004"; -} -.fa-star:before { - content: "\f005"; -} -.fa-star-o:before { - content: "\f006"; -} -.fa-user:before { - content: "\f007"; -} -.fa-film:before { - content: "\f008"; -} -.fa-th-large:before { - content: "\f009"; -} -.fa-th:before { - content: "\f00a"; -} -.fa-th-list:before { - content: "\f00b"; -} -.fa-check:before { - content: "\f00c"; -} -.fa-times:before { - content: "\f00d"; -} -.fa-search-plus:before { - content: "\f00e"; -} -.fa-search-minus:before { - content: "\f010"; -} -.fa-power-off:before { - content: "\f011"; -} -.fa-signal:before { - content: "\f012"; -} -.fa-gear:before, -.fa-cog:before { - content: "\f013"; -} -.fa-trash-o:before { - content: "\f014"; -} -.fa-home:before { - content: "\f015"; -} -.fa-file-o:before { - content: "\f016"; -} -.fa-clock-o:before { - content: "\f017"; -} -.fa-road:before { - content: "\f018"; -} -.fa-download:before { - content: "\f019"; -} -.fa-arrow-circle-o-down:before { - content: "\f01a"; -} -.fa-arrow-circle-o-up:before { - content: "\f01b"; -} -.fa-inbox:before { - content: "\f01c"; -} -.fa-play-circle-o:before { - content: "\f01d"; -} -.fa-rotate-right:before, -.fa-repeat:before { - content: "\f01e"; -} -.fa-refresh:before { - content: "\f021"; -} -.fa-list-alt:before { - content: "\f022"; -} -.fa-lock:before { - content: "\f023"; -} -.fa-flag:before { - content: "\f024"; -} -.fa-headphones:before { - content: "\f025"; -} -.fa-volume-off:before { - content: "\f026"; -} -.fa-volume-down:before { - content: "\f027"; -} -.fa-volume-up:before { - content: "\f028"; -} -.fa-qrcode:before { - content: "\f029"; -} -.fa-barcode:before { - content: "\f02a"; -} -.fa-tag:before { - content: "\f02b"; -} -.fa-tags:before { - content: "\f02c"; -} -.fa-book:before { - content: "\f02d"; -} -.fa-bookmark:before { - content: "\f02e"; -} -.fa-print:before { - content: "\f02f"; -} -.fa-camera:before { - content: "\f030"; -} -.fa-font:before { - content: "\f031"; -} -.fa-bold:before { - content: "\f032"; -} -.fa-italic:before { - content: "\f033"; -} -.fa-text-height:before { - content: "\f034"; -} -.fa-text-width:before { - content: "\f035"; -} -.fa-align-left:before { - content: "\f036"; -} -.fa-align-center:before { - content: "\f037"; -} -.fa-align-right:before { - content: "\f038"; -} -.fa-align-justify:before { - content: "\f039"; -} -.fa-list:before { - content: "\f03a"; -} -.fa-dedent:before, -.fa-outdent:before { - content: "\f03b"; -} -.fa-indent:before { - content: "\f03c"; -} -.fa-video-camera:before { - content: "\f03d"; -} -.fa-picture-o:before { - content: "\f03e"; -} -.fa-pencil:before { - content: "\f040"; -} -.fa-map-marker:before { - content: "\f041"; -} -.fa-adjust:before { - content: "\f042"; -} -.fa-tint:before { - content: "\f043"; -} -.fa-edit:before, -.fa-pencil-square-o:before { - content: "\f044"; -} -.fa-share-square-o:before { - content: "\f045"; -} -.fa-check-square-o:before { - content: "\f046"; -} -.fa-arrows:before { - content: "\f047"; -} -.fa-step-backward:before { - content: "\f048"; -} -.fa-fast-backward:before { - content: "\f049"; -} -.fa-backward:before { - content: "\f04a"; -} -.fa-play:before { - content: "\f04b"; -} -.fa-pause:before { - content: "\f04c"; -} -.fa-stop:before { - content: "\f04d"; -} -.fa-forward:before { - content: "\f04e"; -} -.fa-fast-forward:before { - content: "\f050"; -} -.fa-step-forward:before { - content: "\f051"; -} -.fa-eject:before { - content: "\f052"; -} -.fa-chevron-left:before { - content: "\f053"; -} -.fa-chevron-right:before { - content: "\f054"; -} -.fa-plus-circle:before { - content: "\f055"; -} -.fa-minus-circle:before { - content: "\f056"; -} -.fa-times-circle:before { - content: "\f057"; -} -.fa-check-circle:before { - content: "\f058"; -} -.fa-question-circle:before { - content: "\f059"; -} -.fa-info-circle:before { - content: "\f05a"; -} -.fa-crosshairs:before { - content: "\f05b"; -} -.fa-times-circle-o:before { - content: "\f05c"; -} -.fa-check-circle-o:before { - content: "\f05d"; -} -.fa-ban:before { - content: "\f05e"; -} -.fa-arrow-left:before { - content: "\f060"; -} -.fa-arrow-right:before { - content: "\f061"; -} -.fa-arrow-up:before { - content: "\f062"; -} -.fa-arrow-down:before { - content: "\f063"; -} -.fa-mail-forward:before, -.fa-share:before { - content: "\f064"; -} -.fa-expand:before { - content: "\f065"; -} -.fa-compress:before { - content: "\f066"; -} -.fa-plus:before { - content: "\f067"; -} -.fa-minus:before { - content: "\f068"; -} -.fa-asterisk:before { - content: "\f069"; -} -.fa-exclamation-circle:before { - content: "\f06a"; -} -.fa-gift:before { - content: "\f06b"; -} -.fa-leaf:before { - content: "\f06c"; -} -.fa-fire:before { - content: "\f06d"; -} -.fa-eye:before { - content: "\f06e"; -} -.fa-eye-slash:before { - content: "\f070"; -} -.fa-warning:before, -.fa-exclamation-triangle:before { - content: "\f071"; -} -.fa-plane:before { - content: "\f072"; -} -.fa-calendar:before { - content: "\f073"; -} -.fa-random:before { - content: "\f074"; -} -.fa-comment:before { - content: "\f075"; -} -.fa-magnet:before { - content: "\f076"; -} -.fa-chevron-up:before { - content: "\f077"; -} -.fa-chevron-down:before { - content: "\f078"; -} -.fa-retweet:before { - content: "\f079"; -} -.fa-shopping-cart:before { - content: "\f07a"; -} -.fa-folder:before { - content: "\f07b"; -} -.fa-folder-open:before { - content: "\f07c"; -} -.fa-arrows-v:before { - content: "\f07d"; -} -.fa-arrows-h:before { - content: "\f07e"; -} -.fa-bar-chart-o:before { - content: "\f080"; -} -.fa-twitter-square:before { - content: "\f081"; -} -.fa-facebook-square:before { - content: "\f082"; -} -.fa-camera-retro:before { - content: "\f083"; -} -.fa-key:before { - content: "\f084"; -} -.fa-gears:before, -.fa-cogs:before { - content: "\f085"; -} -.fa-comments:before { - content: "\f086"; -} -.fa-thumbs-o-up:before { - content: "\f087"; -} -.fa-thumbs-o-down:before { - content: "\f088"; -} -.fa-star-half:before { - content: "\f089"; -} -.fa-heart-o:before { - content: "\f08a"; -} -.fa-sign-out:before { - content: "\f08b"; -} -.fa-linkedin-square:before { - content: "\f08c"; -} -.fa-thumb-tack:before { - content: "\f08d"; -} -.fa-external-link:before { - content: "\f08e"; -} -.fa-sign-in:before { - content: "\f090"; -} -.fa-trophy:before { - content: "\f091"; -} -.fa-github-square:before { - content: "\f092"; -} -.fa-upload:before { - content: "\f093"; -} -.fa-lemon-o:before { - content: "\f094"; -} -.fa-phone:before { - content: "\f095"; -} -.fa-square-o:before { - content: "\f096"; -} -.fa-bookmark-o:before { - content: "\f097"; -} -.fa-phone-square:before { - content: "\f098"; -} -.fa-twitter:before { - content: "\f099"; -} -.fa-facebook:before { - content: "\f09a"; -} -.fa-github:before { - content: "\f09b"; -} -.fa-unlock:before { - content: "\f09c"; -} -.fa-credit-card:before { - content: "\f09d"; -} -.fa-rss:before { - content: "\f09e"; -} -.fa-hdd-o:before { - content: "\f0a0"; -} -.fa-bullhorn:before { - content: "\f0a1"; -} -.fa-bell:before { - content: "\f0f3"; -} -.fa-certificate:before { - content: "\f0a3"; -} -.fa-hand-o-right:before { - content: "\f0a4"; -} -.fa-hand-o-left:before { - content: "\f0a5"; -} -.fa-hand-o-up:before { - content: "\f0a6"; -} -.fa-hand-o-down:before { - content: "\f0a7"; -} -.fa-arrow-circle-left:before { - content: "\f0a8"; -} -.fa-arrow-circle-right:before { - content: "\f0a9"; -} -.fa-arrow-circle-up:before { - content: "\f0aa"; -} -.fa-arrow-circle-down:before { - content: "\f0ab"; -} -.fa-globe:before { - content: "\f0ac"; -} -.fa-wrench:before { - content: "\f0ad"; -} -.fa-tasks:before { - content: "\f0ae"; -} -.fa-filter:before { - content: "\f0b0"; -} -.fa-briefcase:before { - content: "\f0b1"; -} -.fa-arrows-alt:before { - content: "\f0b2"; -} -.fa-group:before, -.fa-users:before { - content: "\f0c0"; -} -.fa-chain:before, -.fa-link:before { - content: "\f0c1"; -} -.fa-cloud:before { - content: "\f0c2"; -} -.fa-flask:before { - content: "\f0c3"; -} -.fa-cut:before, -.fa-scissors:before { - content: "\f0c4"; -} -.fa-copy:before, -.fa-files-o:before { - content: "\f0c5"; -} -.fa-paperclip:before { - content: "\f0c6"; -} -.fa-save:before, -.fa-floppy-o:before { - content: "\f0c7"; -} -.fa-square:before { - content: "\f0c8"; -} -.fa-bars:before { - content: "\f0c9"; -} -.fa-list-ul:before { - content: "\f0ca"; -} -.fa-list-ol:before { - content: "\f0cb"; -} -.fa-strikethrough:before { - content: "\f0cc"; -} -.fa-underline:before { - content: "\f0cd"; -} -.fa-table:before { - content: "\f0ce"; -} -.fa-magic:before { - content: "\f0d0"; -} -.fa-truck:before { - content: "\f0d1"; -} -.fa-pinterest:before { - content: "\f0d2"; -} -.fa-pinterest-square:before { - content: "\f0d3"; -} -.fa-google-plus-square:before { - content: "\f0d4"; -} -.fa-google-plus:before { - content: "\f0d5"; -} -.fa-money:before { - content: "\f0d6"; -} -.fa-caret-down:before { - content: "\f0d7"; -} -.fa-caret-up:before { - content: "\f0d8"; -} -.fa-caret-left:before { - content: "\f0d9"; -} -.fa-caret-right:before { - content: "\f0da"; -} -.fa-columns:before { - content: "\f0db"; -} -.fa-unsorted:before, -.fa-sort:before { - content: "\f0dc"; -} -.fa-sort-down:before, -.fa-sort-asc:before { - content: "\f0dd"; -} -.fa-sort-up:before, -.fa-sort-desc:before { - content: "\f0de"; -} -.fa-envelope:before { - content: "\f0e0"; -} -.fa-linkedin:before { - content: "\f0e1"; -} -.fa-rotate-left:before, -.fa-undo:before { - content: "\f0e2"; -} -.fa-legal:before, -.fa-gavel:before { - content: "\f0e3"; -} -.fa-dashboard:before, -.fa-tachometer:before { - content: "\f0e4"; -} -.fa-comment-o:before { - content: "\f0e5"; -} -.fa-comments-o:before { - content: "\f0e6"; -} -.fa-flash:before, -.fa-bolt:before { - content: "\f0e7"; -} -.fa-sitemap:before { - content: "\f0e8"; -} -.fa-umbrella:before { - content: "\f0e9"; -} -.fa-paste:before, -.fa-clipboard:before { - content: "\f0ea"; -} -.fa-lightbulb-o:before { - content: "\f0eb"; -} -.fa-exchange:before { - content: "\f0ec"; -} -.fa-cloud-download:before { - content: "\f0ed"; -} -.fa-cloud-upload:before { - content: "\f0ee"; -} -.fa-user-md:before { - content: "\f0f0"; -} -.fa-stethoscope:before { - content: "\f0f1"; -} -.fa-suitcase:before { - content: "\f0f2"; -} -.fa-bell-o:before { - content: "\f0a2"; -} -.fa-coffee:before { - content: "\f0f4"; -} -.fa-cutlery:before { - content: "\f0f5"; -} -.fa-file-text-o:before { - content: "\f0f6"; -} -.fa-building-o:before { - content: "\f0f7"; -} -.fa-hospital-o:before { - content: "\f0f8"; -} -.fa-ambulance:before { - content: "\f0f9"; -} -.fa-medkit:before { - content: "\f0fa"; -} -.fa-fighter-jet:before { - content: "\f0fb"; -} -.fa-beer:before { - content: "\f0fc"; -} -.fa-h-square:before { - content: "\f0fd"; -} -.fa-plus-square:before { - content: "\f0fe"; -} -.fa-angle-double-left:before { - content: "\f100"; -} -.fa-angle-double-right:before { - content: "\f101"; -} -.fa-angle-double-up:before { - content: "\f102"; -} -.fa-angle-double-down:before { - content: "\f103"; -} -.fa-angle-left:before { - content: "\f104"; -} -.fa-angle-right:before { - content: "\f105"; -} -.fa-angle-up:before { - content: "\f106"; -} -.fa-angle-down:before { - content: "\f107"; -} -.fa-desktop:before { - content: "\f108"; -} -.fa-laptop:before { - content: "\f109"; -} -.fa-tablet:before { - content: "\f10a"; -} -.fa-mobile-phone:before, -.fa-mobile:before { - content: "\f10b"; -} -.fa-circle-o:before { - content: "\f10c"; -} -.fa-quote-left:before { - content: "\f10d"; -} -.fa-quote-right:before { - content: "\f10e"; -} -.fa-spinner:before { - content: "\f110"; -} -.fa-circle:before { - content: "\f111"; -} -.fa-mail-reply:before, -.fa-reply:before { - content: "\f112"; -} -.fa-github-alt:before { - content: "\f113"; -} -.fa-folder-o:before { - content: "\f114"; -} -.fa-folder-open-o:before { - content: "\f115"; -} -.fa-smile-o:before { - content: "\f118"; -} -.fa-frown-o:before { - content: "\f119"; -} -.fa-meh-o:before { - content: "\f11a"; -} -.fa-gamepad:before { - content: "\f11b"; -} -.fa-keyboard-o:before { - content: "\f11c"; -} -.fa-flag-o:before { - content: "\f11d"; -} -.fa-flag-checkered:before { - content: "\f11e"; -} -.fa-terminal:before { - content: "\f120"; -} -.fa-code:before { - content: "\f121"; -} -.fa-reply-all:before { - content: "\f122"; -} -.fa-mail-reply-all:before { - content: "\f122"; -} -.fa-star-half-empty:before, -.fa-star-half-full:before, -.fa-star-half-o:before { - content: "\f123"; -} -.fa-location-arrow:before { - content: "\f124"; -} -.fa-crop:before { - content: "\f125"; -} -.fa-code-fork:before { - content: "\f126"; -} -.fa-unlink:before, -.fa-chain-broken:before { - content: "\f127"; -} -.fa-question:before { - content: "\f128"; -} -.fa-info:before { - content: "\f129"; -} -.fa-exclamation:before { - content: "\f12a"; -} -.fa-superscript:before { - content: "\f12b"; -} -.fa-subscript:before { - content: "\f12c"; -} -.fa-eraser:before { - content: "\f12d"; -} -.fa-puzzle-piece:before { - content: "\f12e"; -} -.fa-microphone:before { - content: "\f130"; -} -.fa-microphone-slash:before { - content: "\f131"; -} -.fa-shield:before { - content: "\f132"; -} -.fa-calendar-o:before { - content: "\f133"; -} -.fa-fire-extinguisher:before { - content: "\f134"; -} -.fa-rocket:before { - content: "\f135"; -} -.fa-maxcdn:before { - content: "\f136"; -} -.fa-chevron-circle-left:before { - content: "\f137"; -} -.fa-chevron-circle-right:before { - content: "\f138"; -} -.fa-chevron-circle-up:before { - content: "\f139"; -} -.fa-chevron-circle-down:before { - content: "\f13a"; -} -.fa-html5:before { - content: "\f13b"; -} -.fa-css3:before { - content: "\f13c"; -} -.fa-anchor:before { - content: "\f13d"; -} -.fa-unlock-alt:before { - content: "\f13e"; -} -.fa-bullseye:before { - content: "\f140"; -} -.fa-ellipsis-h:before { - content: "\f141"; -} -.fa-ellipsis-v:before { - content: "\f142"; -} -.fa-rss-square:before { - content: "\f143"; -} -.fa-play-circle:before { - content: "\f144"; -} -.fa-ticket:before { - content: "\f145"; -} -.fa-minus-square:before { - content: "\f146"; -} -.fa-minus-square-o:before { - content: "\f147"; -} -.fa-level-up:before { - content: "\f148"; -} -.fa-level-down:before { - content: "\f149"; -} -.fa-check-square:before { - content: "\f14a"; -} -.fa-pencil-square:before { - content: "\f14b"; -} -.fa-external-link-square:before { - content: "\f14c"; -} -.fa-share-square:before { - content: "\f14d"; -} -.fa-compass:before { - content: "\f14e"; -} -.fa-toggle-down:before, -.fa-caret-square-o-down:before { - content: "\f150"; -} -.fa-toggle-up:before, -.fa-caret-square-o-up:before { - content: "\f151"; -} -.fa-toggle-right:before, -.fa-caret-square-o-right:before { - content: "\f152"; -} -.fa-euro:before, -.fa-eur:before { - content: "\f153"; -} -.fa-gbp:before { - content: "\f154"; -} -.fa-dollar:before, -.fa-usd:before { - content: "\f155"; -} -.fa-rupee:before, -.fa-inr:before { - content: "\f156"; -} -.fa-cny:before, -.fa-rmb:before, -.fa-yen:before, -.fa-jpy:before { - content: "\f157"; -} -.fa-ruble:before, -.fa-rouble:before, -.fa-rub:before { - content: "\f158"; -} -.fa-won:before, -.fa-krw:before { - content: "\f159"; -} -.fa-bitcoin:before, -.fa-btc:before { - content: "\f15a"; -} -.fa-file:before { - content: "\f15b"; -} -.fa-file-text:before { - content: "\f15c"; -} -.fa-sort-alpha-asc:before { - content: "\f15d"; -} -.fa-sort-alpha-desc:before { - content: "\f15e"; -} -.fa-sort-amount-asc:before { - content: "\f160"; -} -.fa-sort-amount-desc:before { - content: "\f161"; -} -.fa-sort-numeric-asc:before { - content: "\f162"; -} -.fa-sort-numeric-desc:before { - content: "\f163"; -} -.fa-thumbs-up:before { - content: "\f164"; -} -.fa-thumbs-down:before { - content: "\f165"; -} -.fa-youtube-square:before { - content: "\f166"; -} -.fa-youtube:before { - content: "\f167"; -} -.fa-xing:before { - content: "\f168"; -} -.fa-xing-square:before { - content: "\f169"; -} -.fa-youtube-play:before { - content: "\f16a"; -} -.fa-dropbox:before { - content: "\f16b"; -} -.fa-stack-overflow:before { - content: "\f16c"; -} -.fa-instagram:before { - content: "\f16d"; -} -.fa-flickr:before { - content: "\f16e"; -} -.fa-adn:before { - content: "\f170"; -} -.fa-bitbucket:before { - content: "\f171"; -} -.fa-bitbucket-square:before { - content: "\f172"; -} -.fa-tumblr:before { - content: "\f173"; -} -.fa-tumblr-square:before { - content: "\f174"; -} -.fa-long-arrow-down:before { - content: "\f175"; -} -.fa-long-arrow-up:before { - content: "\f176"; -} -.fa-long-arrow-left:before { - content: "\f177"; -} -.fa-long-arrow-right:before { - content: "\f178"; -} -.fa-apple:before { - content: "\f179"; -} -.fa-windows:before { - content: "\f17a"; -} -.fa-android:before { - content: "\f17b"; -} -.fa-linux:before { - content: "\f17c"; -} -.fa-dribbble:before { - content: "\f17d"; -} -.fa-skype:before { - content: "\f17e"; -} -.fa-foursquare:before { - content: "\f180"; -} -.fa-trello:before { - content: "\f181"; -} -.fa-female:before { - content: "\f182"; -} -.fa-male:before { - content: "\f183"; -} -.fa-gittip:before { - content: "\f184"; -} -.fa-sun-o:before { - content: "\f185"; -} -.fa-moon-o:before { - content: "\f186"; -} -.fa-archive:before { - content: "\f187"; -} -.fa-bug:before { - content: "\f188"; -} -.fa-vk:before { - content: "\f189"; -} -.fa-weibo:before { - content: "\f18a"; -} -.fa-renren:before { - content: "\f18b"; -} -.fa-pagelines:before { - content: "\f18c"; -} -.fa-stack-exchange:before { - content: "\f18d"; -} -.fa-arrow-circle-o-right:before { - content: "\f18e"; -} -.fa-arrow-circle-o-left:before { - content: "\f190"; -} -.fa-toggle-left:before, -.fa-caret-square-o-left:before { - content: "\f191"; -} -.fa-dot-circle-o:before { - content: "\f192"; -} -.fa-wheelchair:before { - content: "\f193"; -} -.fa-vimeo-square:before { - content: "\f194"; -} -.fa-turkish-lira:before, -.fa-try:before { - content: "\f195"; -} -.fa-plus-square-o:before { - content: "\f196"; -} diff --git a/ckan/public-bs2/base/vendor/font-awesome/css/font-awesome.min.css b/ckan/public-bs2/base/vendor/font-awesome/css/font-awesome.min.css deleted file mode 100644 index 449d6ac551a..00000000000 --- a/ckan/public-bs2/base/vendor/font-awesome/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.0.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"} \ No newline at end of file diff --git a/ckan/public-bs2/base/vendor/font-awesome/fonts/FontAwesome.otf b/ckan/public-bs2/base/vendor/font-awesome/fonts/FontAwesome.otf deleted file mode 100644 index 8b0f54e47e1d356dcf1496942a50e228e0f1ee14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62856 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 oMn#JeYGU{pbzL1U=O}QIp<2eKYy*8l(j diff --git a/ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.eot b/ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.eot deleted file mode 100755 index 7c79c6a6bc9a128a2a8eaffbe49a4338625fdbc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38205 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 E0QL`y%>V!Z diff --git a/ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.svg b/ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.svg deleted file mode 100755 index 45fdf338301..00000000000 --- a/ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,414 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/ckan/public-bs2/base/vendor/font-awesome/fonts/fontawesome-webfont.ttf deleted file mode 100755 index e89738de5eaf8fca33a2f2cdc5cb4929caa62b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80652 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 qx{Kk=rVu5YQ9XR<GPS>b$X_& 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 z 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
      V$fDV|Iw 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 li { position: relative; } -} -.@{fa-css-prefix}-li { - position: absolute; - left: -@fa-li-width; - width: @fa-li-width; - top: (2em / 14); - text-align: center; - &.@{fa-css-prefix}-lg { - left: -@fa-li-width + (4em / 14); - } -} diff --git a/ckan/public-bs2/base/vendor/font-awesome/less/mixins.less b/ckan/public-bs2/base/vendor/font-awesome/less/mixins.less deleted file mode 100644 index 19e5a6457b6..00000000000 --- a/ckan/public-bs2/base/vendor/font-awesome/less/mixins.less +++ /dev/null @@ -1,20 +0,0 @@ -// Mixins -// -------------------------- - -.fa-icon-rotate(@degrees, @rotation) { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); - -webkit-transform: rotate(@degrees); - -moz-transform: rotate(@degrees); - -ms-transform: rotate(@degrees); - -o-transform: rotate(@degrees); - transform: rotate(@degrees); -} - -.fa-icon-flip(@horiz, @vert, @rotation) { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); - -webkit-transform: scale(@horiz, @vert); - -moz-transform: scale(@horiz, @vert); - -ms-transform: scale(@horiz, @vert); - -o-transform: scale(@horiz, @vert); - transform: scale(@horiz, @vert); -} diff --git a/ckan/public-bs2/base/vendor/font-awesome/less/path.less b/ckan/public-bs2/base/vendor/font-awesome/less/path.less deleted file mode 100644 index c5a691246d6..00000000000 --- a/ckan/public-bs2/base/vendor/font-awesome/less/path.less +++ /dev/null @@ -1,14 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); - src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), - url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), - url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), - url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); -// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; -} diff --git a/ckan/public-bs2/base/vendor/font-awesome/less/rotated-flipped.less b/ckan/public-bs2/base/vendor/font-awesome/less/rotated-flipped.less deleted file mode 100644 index 8fff3a6c417..00000000000 --- a/ckan/public-bs2/base/vendor/font-awesome/less/rotated-flipped.less +++ /dev/null @@ -1,9 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } -.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } -.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } - -.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } -.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } diff --git a/ckan/public-bs2/base/vendor/font-awesome/less/spinning.less b/ckan/public-bs2/base/vendor/font-awesome/less/spinning.less deleted file mode 100644 index 60828fe5c0b..00000000000 --- a/ckan/public-bs2/base/vendor/font-awesome/less/spinning.less +++ /dev/null @@ -1,30 +0,0 @@ -// Spinning Icons -// -------------------------- - -.@{fa-css-prefix}-spin { - -webkit-animation: spin 2s infinite linear; - -moz-animation: spin 2s infinite linear; - -o-animation: spin 2s infinite linear; - animation: spin 2s infinite linear; -} - -@-moz-keyframes spin { - 0% { -moz-transform: rotate(0deg); } - 100% { -moz-transform: rotate(359deg); } -} -@-webkit-keyframes spin { - 0% { -webkit-transform: rotate(0deg); } - 100% { -webkit-transform: rotate(359deg); } -} -@-o-keyframes spin { - 0% { -o-transform: rotate(0deg); } - 100% { -o-transform: rotate(359deg); } -} -@-ms-keyframes spin { - 0% { -ms-transform: rotate(0deg); } - 100% { -ms-transform: rotate(359deg); } -} -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(359deg); } -} diff --git a/ckan/public-bs2/base/vendor/font-awesome/less/stacked.less b/ckan/public-bs2/base/vendor/font-awesome/less/stacked.less deleted file mode 100644 index fc53fb0e7ab..00000000000 --- a/ckan/public-bs2/base/vendor/font-awesome/less/stacked.less +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.@{fa-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.@{fa-css-prefix}-stack-1x { line-height: inherit; } -.@{fa-css-prefix}-stack-2x { font-size: 2em; } -.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/ckan/public-bs2/base/vendor/font-awesome/less/variables.less b/ckan/public-bs2/base/vendor/font-awesome/less/variables.less deleted file mode 100644 index f40a555f09f..00000000000 --- a/ckan/public-bs2/base/vendor/font-awesome/less/variables.less +++ /dev/null @@ -1,381 +0,0 @@ -// Variables -// -------------------------- - -@fa-font-path: "../fonts"; -//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.0.3/fonts"; // for referencing Bootstrap CDN font files directly -@fa-css-prefix: fa; -@fa-version: "4.0.3"; -@fa-border-color: #eee; -@fa-inverse: #fff; -@fa-li-width: (30em / 14); - -@fa-var-glass: "\f000"; -@fa-var-music: "\f001"; -@fa-var-search: "\f002"; -@fa-var-envelope-o: "\f003"; -@fa-var-heart: "\f004"; -@fa-var-star: "\f005"; -@fa-var-star-o: "\f006"; -@fa-var-user: "\f007"; -@fa-var-film: "\f008"; -@fa-var-th-large: "\f009"; -@fa-var-th: "\f00a"; -@fa-var-th-list: "\f00b"; -@fa-var-check: "\f00c"; -@fa-var-times: "\f00d"; -@fa-var-search-plus: "\f00e"; -@fa-var-search-minus: "\f010"; -@fa-var-power-off: "\f011"; -@fa-var-signal: "\f012"; -@fa-var-cog: "\f013"; -@fa-var-trash-o: "\f014"; -@fa-var-home: "\f015"; -@fa-var-file-o: "\f016"; -@fa-var-clock-o: "\f017"; -@fa-var-road: "\f018"; -@fa-var-download: "\f019"; -@fa-var-arrow-circle-o-down: "\f01a"; -@fa-var-arrow-circle-o-up: "\f01b"; -@fa-var-inbox: "\f01c"; -@fa-var-play-circle-o: "\f01d"; -@fa-var-repeat: "\f01e"; -@fa-var-refresh: "\f021"; -@fa-var-list-alt: "\f022"; -@fa-var-lock: "\f023"; -@fa-var-flag: "\f024"; -@fa-var-headphones: "\f025"; -@fa-var-volume-off: "\f026"; -@fa-var-volume-down: "\f027"; -@fa-var-volume-up: "\f028"; -@fa-var-qrcode: "\f029"; -@fa-var-barcode: "\f02a"; -@fa-var-tag: "\f02b"; -@fa-var-tags: "\f02c"; -@fa-var-book: "\f02d"; -@fa-var-bookmark: "\f02e"; -@fa-var-print: "\f02f"; -@fa-var-camera: "\f030"; -@fa-var-font: "\f031"; -@fa-var-bold: "\f032"; -@fa-var-italic: "\f033"; -@fa-var-text-height: "\f034"; -@fa-var-text-width: "\f035"; -@fa-var-align-left: "\f036"; -@fa-var-align-center: "\f037"; -@fa-var-align-right: "\f038"; -@fa-var-align-justify: "\f039"; -@fa-var-list: "\f03a"; -@fa-var-outdent: "\f03b"; -@fa-var-indent: "\f03c"; -@fa-var-video-camera: "\f03d"; -@fa-var-picture-o: "\f03e"; -@fa-var-pencil: "\f040"; -@fa-var-map-marker: "\f041"; -@fa-var-adjust: "\f042"; -@fa-var-tint: "\f043"; -@fa-var-pencil-square-o: "\f044"; -@fa-var-share-square-o: "\f045"; -@fa-var-check-square-o: "\f046"; -@fa-var-arrows: "\f047"; -@fa-var-step-backward: "\f048"; -@fa-var-fast-backward: "\f049"; -@fa-var-backward: "\f04a"; -@fa-var-play: "\f04b"; -@fa-var-pause: "\f04c"; -@fa-var-stop: "\f04d"; -@fa-var-forward: "\f04e"; -@fa-var-fast-forward: "\f050"; -@fa-var-step-forward: "\f051"; -@fa-var-eject: "\f052"; -@fa-var-chevron-left: "\f053"; -@fa-var-chevron-right: "\f054"; -@fa-var-plus-circle: "\f055"; -@fa-var-minus-circle: "\f056"; -@fa-var-times-circle: "\f057"; -@fa-var-check-circle: "\f058"; -@fa-var-question-circle: "\f059"; -@fa-var-info-circle: "\f05a"; -@fa-var-crosshairs: "\f05b"; -@fa-var-times-circle-o: "\f05c"; -@fa-var-check-circle-o: "\f05d"; -@fa-var-ban: "\f05e"; -@fa-var-arrow-left: "\f060"; -@fa-var-arrow-right: "\f061"; -@fa-var-arrow-up: "\f062"; -@fa-var-arrow-down: "\f063"; -@fa-var-share: "\f064"; -@fa-var-expand: "\f065"; -@fa-var-compress: "\f066"; -@fa-var-plus: "\f067"; -@fa-var-minus: "\f068"; -@fa-var-asterisk: "\f069"; -@fa-var-exclamation-circle: "\f06a"; -@fa-var-gift: "\f06b"; -@fa-var-leaf: "\f06c"; -@fa-var-fire: "\f06d"; -@fa-var-eye: "\f06e"; -@fa-var-eye-slash: "\f070"; -@fa-var-exclamation-triangle: "\f071"; -@fa-var-plane: "\f072"; -@fa-var-calendar: "\f073"; -@fa-var-random: "\f074"; -@fa-var-comment: "\f075"; -@fa-var-magnet: "\f076"; -@fa-var-chevron-up: "\f077"; -@fa-var-chevron-down: "\f078"; -@fa-var-retweet: "\f079"; -@fa-var-shopping-cart: "\f07a"; -@fa-var-folder: "\f07b"; -@fa-var-folder-open: "\f07c"; -@fa-var-arrows-v: "\f07d"; -@fa-var-arrows-h: "\f07e"; -@fa-var-bar-chart-o: "\f080"; -@fa-var-twitter-square: "\f081"; -@fa-var-facebook-square: "\f082"; -@fa-var-camera-retro: "\f083"; -@fa-var-key: "\f084"; -@fa-var-cogs: "\f085"; -@fa-var-comments: "\f086"; -@fa-var-thumbs-o-up: "\f087"; -@fa-var-thumbs-o-down: "\f088"; -@fa-var-star-half: "\f089"; -@fa-var-heart-o: "\f08a"; -@fa-var-sign-out: "\f08b"; -@fa-var-linkedin-square: "\f08c"; -@fa-var-thumb-tack: "\f08d"; -@fa-var-external-link: "\f08e"; -@fa-var-sign-in: "\f090"; -@fa-var-trophy: "\f091"; -@fa-var-github-square: "\f092"; -@fa-var-upload: "\f093"; -@fa-var-lemon-o: "\f094"; -@fa-var-phone: "\f095"; -@fa-var-square-o: "\f096"; -@fa-var-bookmark-o: "\f097"; -@fa-var-phone-square: "\f098"; -@fa-var-twitter: "\f099"; -@fa-var-facebook: "\f09a"; -@fa-var-github: "\f09b"; -@fa-var-unlock: "\f09c"; -@fa-var-credit-card: "\f09d"; -@fa-var-rss: "\f09e"; -@fa-var-hdd-o: "\f0a0"; -@fa-var-bullhorn: "\f0a1"; -@fa-var-bell: "\f0f3"; -@fa-var-certificate: "\f0a3"; -@fa-var-hand-o-right: "\f0a4"; -@fa-var-hand-o-left: "\f0a5"; -@fa-var-hand-o-up: "\f0a6"; -@fa-var-hand-o-down: "\f0a7"; -@fa-var-arrow-circle-left: "\f0a8"; -@fa-var-arrow-circle-right: "\f0a9"; -@fa-var-arrow-circle-up: "\f0aa"; -@fa-var-arrow-circle-down: "\f0ab"; -@fa-var-globe: "\f0ac"; -@fa-var-wrench: "\f0ad"; -@fa-var-tasks: "\f0ae"; -@fa-var-filter: "\f0b0"; -@fa-var-briefcase: "\f0b1"; -@fa-var-arrows-alt: "\f0b2"; -@fa-var-users: "\f0c0"; -@fa-var-link: "\f0c1"; -@fa-var-cloud: "\f0c2"; -@fa-var-flask: "\f0c3"; -@fa-var-scissors: "\f0c4"; -@fa-var-files-o: "\f0c5"; -@fa-var-paperclip: "\f0c6"; -@fa-var-floppy-o: "\f0c7"; -@fa-var-square: "\f0c8"; -@fa-var-bars: "\f0c9"; -@fa-var-list-ul: "\f0ca"; -@fa-var-list-ol: "\f0cb"; -@fa-var-strikethrough: "\f0cc"; -@fa-var-underline: "\f0cd"; -@fa-var-table: "\f0ce"; -@fa-var-magic: "\f0d0"; -@fa-var-truck: "\f0d1"; -@fa-var-pinterest: "\f0d2"; -@fa-var-pinterest-square: "\f0d3"; -@fa-var-google-plus-square: "\f0d4"; -@fa-var-google-plus: "\f0d5"; -@fa-var-money: "\f0d6"; -@fa-var-caret-down: "\f0d7"; -@fa-var-caret-up: "\f0d8"; -@fa-var-caret-left: "\f0d9"; -@fa-var-caret-right: "\f0da"; -@fa-var-columns: "\f0db"; -@fa-var-sort: "\f0dc"; -@fa-var-sort-asc: "\f0dd"; -@fa-var-sort-desc: "\f0de"; -@fa-var-envelope: "\f0e0"; -@fa-var-linkedin: "\f0e1"; -@fa-var-undo: "\f0e2"; -@fa-var-gavel: "\f0e3"; -@fa-var-tachometer: "\f0e4"; -@fa-var-comment-o: "\f0e5"; -@fa-var-comments-o: "\f0e6"; -@fa-var-bolt: "\f0e7"; -@fa-var-sitemap: "\f0e8"; -@fa-var-umbrella: "\f0e9"; -@fa-var-clipboard: "\f0ea"; -@fa-var-lightbulb-o: "\f0eb"; -@fa-var-exchange: "\f0ec"; -@fa-var-cloud-download: "\f0ed"; -@fa-var-cloud-upload: "\f0ee"; -@fa-var-user-md: "\f0f0"; -@fa-var-stethoscope: "\f0f1"; -@fa-var-suitcase: "\f0f2"; -@fa-var-bell-o: "\f0a2"; -@fa-var-coffee: "\f0f4"; -@fa-var-cutlery: "\f0f5"; -@fa-var-file-text-o: "\f0f6"; -@fa-var-building-o: "\f0f7"; -@fa-var-hospital-o: "\f0f8"; -@fa-var-ambulance: "\f0f9"; -@fa-var-medkit: "\f0fa"; -@fa-var-fighter-jet: "\f0fb"; -@fa-var-beer: "\f0fc"; -@fa-var-h-square: "\f0fd"; -@fa-var-plus-square: "\f0fe"; -@fa-var-angle-double-left: "\f100"; -@fa-var-angle-double-right: "\f101"; -@fa-var-angle-double-up: "\f102"; -@fa-var-angle-double-down: "\f103"; -@fa-var-angle-left: "\f104"; -@fa-var-angle-right: "\f105"; -@fa-var-angle-up: "\f106"; -@fa-var-angle-down: "\f107"; -@fa-var-desktop: "\f108"; -@fa-var-laptop: "\f109"; -@fa-var-tablet: "\f10a"; -@fa-var-mobile: "\f10b"; -@fa-var-circle-o: "\f10c"; -@fa-var-quote-left: "\f10d"; -@fa-var-quote-right: "\f10e"; -@fa-var-spinner: "\f110"; -@fa-var-circle: "\f111"; -@fa-var-reply: "\f112"; -@fa-var-github-alt: "\f113"; -@fa-var-folder-o: "\f114"; -@fa-var-folder-open-o: "\f115"; -@fa-var-smile-o: "\f118"; -@fa-var-frown-o: "\f119"; -@fa-var-meh-o: "\f11a"; -@fa-var-gamepad: "\f11b"; -@fa-var-keyboard-o: "\f11c"; -@fa-var-flag-o: "\f11d"; -@fa-var-flag-checkered: "\f11e"; -@fa-var-terminal: "\f120"; -@fa-var-code: "\f121"; -@fa-var-reply-all: "\f122"; -@fa-var-mail-reply-all: "\f122"; -@fa-var-star-half-o: "\f123"; -@fa-var-location-arrow: "\f124"; -@fa-var-crop: "\f125"; -@fa-var-code-fork: "\f126"; -@fa-var-chain-broken: "\f127"; -@fa-var-question: "\f128"; -@fa-var-info: "\f129"; -@fa-var-exclamation: "\f12a"; -@fa-var-superscript: "\f12b"; -@fa-var-subscript: "\f12c"; -@fa-var-eraser: "\f12d"; -@fa-var-puzzle-piece: "\f12e"; -@fa-var-microphone: "\f130"; -@fa-var-microphone-slash: "\f131"; -@fa-var-shield: "\f132"; -@fa-var-calendar-o: "\f133"; -@fa-var-fire-extinguisher: "\f134"; -@fa-var-rocket: "\f135"; -@fa-var-maxcdn: "\f136"; -@fa-var-chevron-circle-left: "\f137"; -@fa-var-chevron-circle-right: "\f138"; -@fa-var-chevron-circle-up: "\f139"; -@fa-var-chevron-circle-down: "\f13a"; -@fa-var-html5: "\f13b"; -@fa-var-css3: "\f13c"; -@fa-var-anchor: "\f13d"; -@fa-var-unlock-alt: "\f13e"; -@fa-var-bullseye: "\f140"; -@fa-var-ellipsis-h: "\f141"; -@fa-var-ellipsis-v: "\f142"; -@fa-var-rss-square: "\f143"; -@fa-var-play-circle: "\f144"; -@fa-var-ticket: "\f145"; -@fa-var-minus-square: "\f146"; -@fa-var-minus-square-o: "\f147"; -@fa-var-level-up: "\f148"; -@fa-var-level-down: "\f149"; -@fa-var-check-square: "\f14a"; -@fa-var-pencil-square: "\f14b"; -@fa-var-external-link-square: "\f14c"; -@fa-var-share-square: "\f14d"; -@fa-var-compass: "\f14e"; -@fa-var-caret-square-o-down: "\f150"; -@fa-var-caret-square-o-up: "\f151"; -@fa-var-caret-square-o-right: "\f152"; -@fa-var-eur: "\f153"; -@fa-var-gbp: "\f154"; -@fa-var-usd: "\f155"; -@fa-var-inr: "\f156"; -@fa-var-jpy: "\f157"; -@fa-var-rub: "\f158"; -@fa-var-krw: "\f159"; -@fa-var-btc: "\f15a"; -@fa-var-file: "\f15b"; -@fa-var-file-text: "\f15c"; -@fa-var-sort-alpha-asc: "\f15d"; -@fa-var-sort-alpha-desc: "\f15e"; -@fa-var-sort-amount-asc: "\f160"; -@fa-var-sort-amount-desc: "\f161"; -@fa-var-sort-numeric-asc: "\f162"; -@fa-var-sort-numeric-desc: "\f163"; -@fa-var-thumbs-up: "\f164"; -@fa-var-thumbs-down: "\f165"; -@fa-var-youtube-square: "\f166"; -@fa-var-youtube: "\f167"; -@fa-var-xing: "\f168"; -@fa-var-xing-square: "\f169"; -@fa-var-youtube-play: "\f16a"; -@fa-var-dropbox: "\f16b"; -@fa-var-stack-overflow: "\f16c"; -@fa-var-instagram: "\f16d"; -@fa-var-flickr: "\f16e"; -@fa-var-adn: "\f170"; -@fa-var-bitbucket: "\f171"; -@fa-var-bitbucket-square: "\f172"; -@fa-var-tumblr: "\f173"; -@fa-var-tumblr-square: "\f174"; -@fa-var-long-arrow-down: "\f175"; -@fa-var-long-arrow-up: "\f176"; -@fa-var-long-arrow-left: "\f177"; -@fa-var-long-arrow-right: "\f178"; -@fa-var-apple: "\f179"; -@fa-var-windows: "\f17a"; -@fa-var-android: "\f17b"; -@fa-var-linux: "\f17c"; -@fa-var-dribbble: "\f17d"; -@fa-var-skype: "\f17e"; -@fa-var-foursquare: "\f180"; -@fa-var-trello: "\f181"; -@fa-var-female: "\f182"; -@fa-var-male: "\f183"; -@fa-var-gittip: "\f184"; -@fa-var-sun-o: "\f185"; -@fa-var-moon-o: "\f186"; -@fa-var-archive: "\f187"; -@fa-var-bug: "\f188"; -@fa-var-vk: "\f189"; -@fa-var-weibo: "\f18a"; -@fa-var-renren: "\f18b"; -@fa-var-pagelines: "\f18c"; -@fa-var-stack-exchange: "\f18d"; -@fa-var-arrow-circle-o-right: "\f18e"; -@fa-var-arrow-circle-o-left: "\f190"; -@fa-var-caret-square-o-left: "\f191"; -@fa-var-dot-circle-o: "\f192"; -@fa-var-wheelchair: "\f193"; -@fa-var-vimeo-square: "\f194"; -@fa-var-try: "\f195"; -@fa-var-plus-square-o: "\f196"; - diff --git a/ckan/public-bs2/base/vendor/html5.js b/ckan/public-bs2/base/vendor/html5.js deleted file mode 100644 index 7656f7a019c..00000000000 --- a/ckan/public-bs2/base/vendor/html5.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! HTML5 Shiv v3.6RC1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed - Uncompressed source: https://github.com/aFarkas/html5shiv */ -(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); -a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; -c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a"); -var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a, -b){a||(a=f);if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;darticle,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}";c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d= val_list.length ) { - res = [ null, singular_key, plural_key ]; - return res[ getPluralFormFunc()( val ) + 1 ]; - } - - res = val_list[ val_idx ]; - - // This includes empty strings on purpose - if ( ! res ) { - res = [ null, singular_key, plural_key ]; - return res[ getPluralFormFunc()( val ) + 1 ]; - } - return res; - } - }); - - - // We add in sprintf capabilities for post translation value interolation - // This is not internally used, so you can remove it if you have this - // available somewhere else, or want to use a different system. - - // We _slightly_ modify the normal sprintf behavior to more gracefully handle - // undefined values. - - /** - sprintf() for JavaScript 0.7-beta1 - http://www.diveintojavascript.com/projects/javascript-sprintf - - Copyright (c) Alexandru Marasteanu - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of sprintf() for JavaScript nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - var sprintf = (function() { - function get_type(variable) { - return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); - } - function str_repeat(input, multiplier) { - for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */} - return output.join(''); - } - - var str_format = function() { - if (!str_format.cache.hasOwnProperty(arguments[0])) { - str_format.cache[arguments[0]] = str_format.parse(arguments[0]); - } - return str_format.format.call(null, str_format.cache[arguments[0]], arguments); - }; - - str_format.format = function(parse_tree, argv) { - var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; - for (i = 0; i < tree_length; i++) { - node_type = get_type(parse_tree[i]); - if (node_type === 'string') { - output.push(parse_tree[i]); - } - else if (node_type === 'array') { - match = parse_tree[i]; // convenience purposes only - if (match[2]) { // keyword argument - arg = argv[cursor]; - for (k = 0; k < match[2].length; k++) { - if (!arg.hasOwnProperty(match[2][k])) { - throw(sprintf('[sprintf] property "%s" does not exist', match[2][k])); - } - arg = arg[match[2][k]]; - } - } - else if (match[1]) { // positional argument (explicit) - arg = argv[match[1]]; - } - else { // positional argument (implicit) - arg = argv[cursor++]; - } - - if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) { - throw(sprintf('[sprintf] expecting number but found %s', get_type(arg))); - } - - // Jed EDIT - if ( typeof arg == 'undefined' || arg === null ) { - arg = ''; - } - // Jed EDIT - - switch (match[8]) { - case 'b': arg = arg.toString(2); break; - case 'c': arg = String.fromCharCode(arg); break; - case 'd': arg = parseInt(arg, 10); break; - case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; - case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; - case 'o': arg = arg.toString(8); break; - case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; - case 'u': arg = Math.abs(arg); break; - case 'x': arg = arg.toString(16); break; - case 'X': arg = arg.toString(16).toUpperCase(); break; - } - arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); - pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; - pad_length = match[6] - String(arg).length; - pad = match[6] ? str_repeat(pad_character, pad_length) : ''; - output.push(match[5] ? arg + pad : pad + arg); - } - } - return output.join(''); - }; - - str_format.cache = {}; - - str_format.parse = function(fmt) { - var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; - while (_fmt) { - if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { - parse_tree.push(match[0]); - } - else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { - parse_tree.push('%'); - } - else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) { - if (match[2]) { - arg_names |= 1; - var field_list = [], replacement_field = match[2], field_match = []; - if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { - if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - } - else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - } - else { - throw('[sprintf] huh?'); - } - } - } - else { - throw('[sprintf] huh?'); - } - match[2] = field_list; - } - else { - arg_names |= 2; - } - if (arg_names === 3) { - throw('[sprintf] mixing positional and named placeholders is not (yet) supported'); - } - parse_tree.push(match); - } - else { - throw('[sprintf] huh?'); - } - _fmt = _fmt.substring(match[0].length); - } - return parse_tree; - }; - - return str_format; - })(); - - var vsprintf = function(fmt, argv) { - argv.unshift(fmt); - return sprintf.apply(null, argv); - }; - - Jed.parse_plural = function ( plural_forms, n ) { - plural_forms = plural_forms.replace(/n/g, n); - return Jed.parse_expression(plural_forms); - }; - - Jed.sprintf = function ( fmt, args ) { - if ( {}.toString.call( args ) == '[object Array]' ) { - return vsprintf( fmt, [].slice.call(args) ); - } - return sprintf.apply(this, [].slice.call(arguments) ); - }; - - Jed.prototype.sprintf = function () { - return Jed.sprintf.apply(this, arguments); - }; - // END sprintf Implementation - - // Start the Plural forms section - // This is a full plural form expression parser. It is used to avoid - // running 'eval' or 'new Function' directly against the plural - // forms. - // - // This can be important if you get translations done through a 3rd - // party vendor. I encourage you to use this instead, however, I - // also will provide a 'precompiler' that you can use at build time - // to output valid/safe function representations of the plural form - // expressions. This means you can build this code out for the most - // part. - Jed.PF = {}; - - Jed.PF.parse = function ( p ) { - var plural_str = Jed.PF.extractPluralExpr( p ); - return Jed.PF.parser.parse.call(Jed.PF.parser, plural_str); - }; - - Jed.PF.compile = function ( p ) { - // Handle trues and falses as 0 and 1 - function imply( val ) { - return (val === true ? 1 : val ? val : 0); - } - - var ast = Jed.PF.parse( p ); - return function ( n ) { - return imply( Jed.PF.interpreter( ast )( n ) ); - }; - }; - - Jed.PF.interpreter = function ( ast ) { - return function ( n ) { - var res; - switch ( ast.type ) { - case 'GROUP': - return Jed.PF.interpreter( ast.expr )( n ); - case 'TERNARY': - if ( Jed.PF.interpreter( ast.expr )( n ) ) { - return Jed.PF.interpreter( ast.truthy )( n ); - } - return Jed.PF.interpreter( ast.falsey )( n ); - case 'OR': - return Jed.PF.interpreter( ast.left )( n ) || Jed.PF.interpreter( ast.right )( n ); - case 'AND': - return Jed.PF.interpreter( ast.left )( n ) && Jed.PF.interpreter( ast.right )( n ); - case 'LT': - return Jed.PF.interpreter( ast.left )( n ) < Jed.PF.interpreter( ast.right )( n ); - case 'GT': - return Jed.PF.interpreter( ast.left )( n ) > Jed.PF.interpreter( ast.right )( n ); - case 'LTE': - return Jed.PF.interpreter( ast.left )( n ) <= Jed.PF.interpreter( ast.right )( n ); - case 'GTE': - return Jed.PF.interpreter( ast.left )( n ) >= Jed.PF.interpreter( ast.right )( n ); - case 'EQ': - return Jed.PF.interpreter( ast.left )( n ) == Jed.PF.interpreter( ast.right )( n ); - case 'NEQ': - return Jed.PF.interpreter( ast.left )( n ) != Jed.PF.interpreter( ast.right )( n ); - case 'MOD': - return Jed.PF.interpreter( ast.left )( n ) % Jed.PF.interpreter( ast.right )( n ); - case 'VAR': - return n; - case 'NUM': - return ast.val; - default: - throw new Error("Invalid Token found."); - } - }; - }; - - Jed.PF.extractPluralExpr = function ( p ) { - // trim first - p = p.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); - - if (! /;\s*$/.test(p)) { - p = p.concat(';'); - } - - var nplurals_re = /nplurals\=(\d+);/, - plural_re = /plural\=(.*);/, - nplurals_matches = p.match( nplurals_re ), - res = {}, - plural_matches; - - // Find the nplurals number - if ( nplurals_matches.length > 1 ) { - res.nplurals = nplurals_matches[1]; - } - else { - throw new Error('nplurals not found in plural_forms string: ' + p ); - } - - // remove that data to get to the formula - p = p.replace( nplurals_re, "" ); - plural_matches = p.match( plural_re ); - - if (!( plural_matches && plural_matches.length > 1 ) ) { - throw new Error('`plural` expression not found: ' + p); - } - return plural_matches[ 1 ]; - }; - - /* Jison generated parser */ - Jed.PF.parser = (function(){ - -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"expressions":3,"e":4,"EOF":5,"?":6,":":7,"||":8,"&&":9,"<":10,"<=":11,">":12,">=":13,"!=":14,"==":15,"%":16,"(":17,")":18,"n":19,"NUMBER":20,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOF",6:"?",7:":",8:"||",9:"&&",10:"<",11:"<=",12:">",13:">=",14:"!=",15:"==",16:"%",17:"(",18:")",19:"n",20:"NUMBER"}, -productions_: [0,[3,2],[4,5],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,1],[4,1]], -performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { - -var $0 = $$.length - 1; -switch (yystate) { -case 1: return { type : 'GROUP', expr: $$[$0-1] }; -break; -case 2:this.$ = { type: 'TERNARY', expr: $$[$0-4], truthy : $$[$0-2], falsey: $$[$0] }; -break; -case 3:this.$ = { type: "OR", left: $$[$0-2], right: $$[$0] }; -break; -case 4:this.$ = { type: "AND", left: $$[$0-2], right: $$[$0] }; -break; -case 5:this.$ = { type: 'LT', left: $$[$0-2], right: $$[$0] }; -break; -case 6:this.$ = { type: 'LTE', left: $$[$0-2], right: $$[$0] }; -break; -case 7:this.$ = { type: 'GT', left: $$[$0-2], right: $$[$0] }; -break; -case 8:this.$ = { type: 'GTE', left: $$[$0-2], right: $$[$0] }; -break; -case 9:this.$ = { type: 'NEQ', left: $$[$0-2], right: $$[$0] }; -break; -case 10:this.$ = { type: 'EQ', left: $$[$0-2], right: $$[$0] }; -break; -case 11:this.$ = { type: 'MOD', left: $$[$0-2], right: $$[$0] }; -break; -case 12:this.$ = { type: 'GROUP', expr: $$[$0-1] }; -break; -case 13:this.$ = { type: 'VAR' }; -break; -case 14:this.$ = { type: 'NUM', val: Number(yytext) }; -break; -} -}, -table: [{3:1,4:2,17:[1,3],19:[1,4],20:[1,5]},{1:[3]},{5:[1,6],6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{4:17,17:[1,3],19:[1,4],20:[1,5]},{5:[2,13],6:[2,13],7:[2,13],8:[2,13],9:[2,13],10:[2,13],11:[2,13],12:[2,13],13:[2,13],14:[2,13],15:[2,13],16:[2,13],18:[2,13]},{5:[2,14],6:[2,14],7:[2,14],8:[2,14],9:[2,14],10:[2,14],11:[2,14],12:[2,14],13:[2,14],14:[2,14],15:[2,14],16:[2,14],18:[2,14]},{1:[2,1]},{4:18,17:[1,3],19:[1,4],20:[1,5]},{4:19,17:[1,3],19:[1,4],20:[1,5]},{4:20,17:[1,3],19:[1,4],20:[1,5]},{4:21,17:[1,3],19:[1,4],20:[1,5]},{4:22,17:[1,3],19:[1,4],20:[1,5]},{4:23,17:[1,3],19:[1,4],20:[1,5]},{4:24,17:[1,3],19:[1,4],20:[1,5]},{4:25,17:[1,3],19:[1,4],20:[1,5]},{4:26,17:[1,3],19:[1,4],20:[1,5]},{4:27,17:[1,3],19:[1,4],20:[1,5]},{6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[1,28]},{6:[1,7],7:[1,29],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{5:[2,3],6:[2,3],7:[2,3],8:[2,3],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[2,4],9:[2,4],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[2,5],11:[2,5],12:[2,5],13:[2,5],14:[2,5],15:[2,5],16:[1,16],18:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[2,6],11:[2,6],12:[2,6],13:[2,6],14:[2,6],15:[2,6],16:[1,16],18:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[2,7],11:[2,7],12:[2,7],13:[2,7],14:[2,7],15:[2,7],16:[1,16],18:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[2,8],11:[2,8],12:[2,8],13:[2,8],14:[2,8],15:[2,8],16:[1,16],18:[2,8]},{5:[2,9],6:[2,9],7:[2,9],8:[2,9],9:[2,9],10:[2,9],11:[2,9],12:[2,9],13:[2,9],14:[2,9],15:[2,9],16:[1,16],18:[2,9]},{5:[2,10],6:[2,10],7:[2,10],8:[2,10],9:[2,10],10:[2,10],11:[2,10],12:[2,10],13:[2,10],14:[2,10],15:[2,10],16:[1,16],18:[2,10]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[2,11],11:[2,11],12:[2,11],13:[2,11],14:[2,11],15:[2,11],16:[2,11],18:[2,11]},{5:[2,12],6:[2,12],7:[2,12],8:[2,12],9:[2,12],10:[2,12],11:[2,12],12:[2,12],13:[2,12],14:[2,12],15:[2,12],16:[2,12],18:[2,12]},{4:30,17:[1,3],19:[1,4],20:[1,5]},{5:[2,2],6:[1,7],7:[2,2],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,2]}], -defaultActions: {6:[2,1]}, -parseError: function parseError(str, hash) { - throw new Error(str); -}, -parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], // semantic value stack - lstack = [], // location stack - table = this.table, - yytext = '', - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - - //this.reductionCount = this.shiftCount = 0; - - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - if (typeof this.lexer.yylloc == 'undefined') - this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - - if (typeof this.yy.parseError === 'function') - this.parseError = this.yy.parseError; - - function popStack (n) { - stack.length = stack.length - 2*n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - - function lex() { - var token; - token = self.lexer.lex() || 1; // $end = 1 - // if token isn't its numeric value, convert - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - } - - var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected; - while (true) { - // retreive state number from top of stack - state = stack[stack.length-1]; - - // use default actions if available - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol == null) - symbol = lex(); - // read action for current state and first input - action = table[state] && table[state][symbol]; - } - - // handle parse error - _handle_error: - if (typeof action === 'undefined' || !action.length || !action[0]) { - - if (!recovering) { - // Report error - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'"+this.terminals_[p]+"'"); - } - var errStr = ''; - if (this.lexer.showPosition) { - errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'"; - } else { - errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " + - (symbol == 1 /*EOF*/ ? "end of input" : - ("'"+(this.terminals_[symbol] || symbol)+"'")); - } - this.parseError(errStr, - {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - - // just recovered from another error - if (recovering == 3) { - if (symbol == EOF) { - throw new Error(errStr || 'Parsing halted.'); - } - - // discard current lookahead and grab another - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - symbol = lex(); - } - - // try to recover from error - while (1) { - // check for error recovery rule in this state - if ((TERROR.toString()) in table[state]) { - break; - } - if (state == 0) { - throw new Error(errStr || 'Parsing halted.'); - } - popStack(1); - state = stack[stack.length-1]; - } - - preErrorSymbol = symbol; // save the lookahead token - symbol = TERROR; // insert generic error symbol as new lookahead - state = stack[stack.length-1]; - action = table[state] && table[state][TERROR]; - recovering = 3; // allow 3 real symbols to be shifted before reporting a new error - } - - // this shouldn't happen, unless resolve defaults are off - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol); - } - - switch (action[0]) { - - case 1: // shift - //this.shiftCount++; - - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); // push state - symbol = null; - if (!preErrorSymbol) { // normal execution/no error - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { // error just occurred, resume old lookahead f/ before error - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - - case 2: // reduce - //this.reductionCount++; - - len = this.productions_[action[1]][1]; - - // perform semantic action - yyval.$ = vstack[vstack.length-len]; // default to $$ = $1 - // default location, uses first token for firsts, last for lasts - yyval._$ = { - first_line: lstack[lstack.length-(len||1)].first_line, - last_line: lstack[lstack.length-1].last_line, - first_column: lstack[lstack.length-(len||1)].first_column, - last_column: lstack[lstack.length-1].last_column - }; - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - - if (typeof r !== 'undefined') { - return r; - } - - // pop off stack - if (len) { - stack = stack.slice(0,-1*len*2); - vstack = vstack.slice(0, -1*len); - lstack = lstack.slice(0, -1*len); - } - - stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce) - vstack.push(yyval.$); - lstack.push(yyval._$); - // goto new state = table[STATE][NONTERMINAL] - newState = table[stack[stack.length-2]][stack[stack.length-1]]; - stack.push(newState); - break; - - case 3: // accept - return true; - } - - } - - return true; -}};/* Jison generated lexer */ -var lexer = (function(){ - -var lexer = ({EOF:1, -parseError:function parseError(str, hash) { - if (this.yy.parseError) { - this.yy.parseError(str, hash); - } else { - throw new Error(str); - } - }, -setInput:function (input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; - return this; - }, -input:function () { - var ch = this._input[0]; - this.yytext+=ch; - this.yyleng++; - this.match+=ch; - this.matched+=ch; - var lines = ch.match(/\n/); - if (lines) this.yylineno++; - this._input = this._input.slice(1); - return ch; - }, -unput:function (ch) { - this._input = ch + this._input; - return this; - }, -more:function () { - this._more = true; - return this; - }, -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); - }, -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c+"^"; - }, -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, - match, - col, - lines; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i=0;i < rules.length; i++) { - match = this._input.match(this.rules[rules[i]]); - if (match) { - lines = match[0].match(/\n.*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = {first_line: this.yylloc.last_line, - last_line: this.yylineno+1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length} - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[i],this.conditionStack[this.conditionStack.length-1]); - if (token) return token; - else return; - } - } - if (this._input === "") { - return this.EOF; - } else { - this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), - {text: "", token: null, line: this.yylineno}); - } - }, -lex:function lex() { - var r = this.next(); - if (typeof r !== 'undefined') { - return r; - } else { - return this.lex(); - } - }, -begin:function begin(condition) { - this.conditionStack.push(condition); - }, -popState:function popState() { - return this.conditionStack.pop(); - }, -_currentRules:function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; - }, -topState:function () { - return this.conditionStack[this.conditionStack.length-2]; - }, -pushState:function begin(condition) { - this.begin(condition); - }}); -lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { - -var YYSTATE=YY_START -switch($avoiding_name_collisions) { -case 0:/* skip whitespace */ -break; -case 1:return 20 -break; -case 2:return 19 -break; -case 3:return 8 -break; -case 4:return 9 -break; -case 5:return 6 -break; -case 6:return 7 -break; -case 7:return 11 -break; -case 8:return 13 -break; -case 9:return 10 -break; -case 10:return 12 -break; -case 11:return 14 -break; -case 12:return 15 -break; -case 13:return 16 -break; -case 14:return 17 -break; -case 15:return 18 -break; -case 16:return 5 -break; -case 17:return 'INVALID' -break; -} -}; -lexer.rules = [/^\s+/,/^[0-9]+(\.[0-9]+)?\b/,/^n\b/,/^\|\|/,/^&&/,/^\?/,/^:/,/^<=/,/^>=/,/^/,/^!=/,/^==/,/^%/,/^\(/,/^\)/,/^$/,/^./]; -lexer.conditions = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"inclusive":true}};return lexer;})() -parser.lexer = lexer; -return parser; -})(); -// End parser - - // Handle node, amd, and global systems - if (typeof exports !== 'undefined') { - if (typeof module !== 'undefined' && module.exports) { - exports = module.exports = Jed; - } - exports.Jed = Jed; - } - else { - if (typeof define === 'function' && define.amd) { - define('jed', function() { - return Jed; - }); - } - // Leak a global regardless of module system - root['Jed'] = Jed; - } - -})(this); diff --git a/ckan/public-bs2/base/vendor/jed.min.js b/ckan/public-bs2/base/vendor/jed.min.js deleted file mode 100644 index ede388f2783..00000000000 --- a/ckan/public-bs2/base/vendor/jed.min.js +++ /dev/null @@ -1,101 +0,0 @@ -(function(root,undef){var ArrayProto=Array.prototype,ObjProto=Object.prototype,slice=ArrayProto.slice,hasOwnProp=ObjProto.hasOwnProperty,nativeForEach=ArrayProto.forEach,breaker={};var _={forEach:function(obj,iterator,context){var i,l,key;if(obj===null){return;} -if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context);} -else if(obj.length===+obj.length){for(i=0,l=obj.length;i=val_list.length){res=[null,singular_key,plural_key];return res[getPluralFormFunc()(val)+1];} -res=val_list[val_idx];if(!res){res=[null,singular_key,plural_key];return res[getPluralFormFunc()(val)+1];} -return res;}});var sprintf=(function(){function get_type(variable){return Object.prototype.toString.call(variable).slice(8,-1).toLowerCase();} -function str_repeat(input,multiplier){for(var output=[];multiplier>0;output[--multiplier]=input){} -return output.join('');} -var str_format=function(){if(!str_format.cache.hasOwnProperty(arguments[0])){str_format.cache[arguments[0]]=str_format.parse(arguments[0]);} -return str_format.format.call(null,str_format.cache[arguments[0]],arguments);};str_format.format=function(parse_tree,argv){var cursor=1,tree_length=parse_tree.length,node_type='',arg,output=[],i,k,match,pad,pad_character,pad_length;for(i=0;i=0?'+'+arg:arg);pad_character=match[4]?match[4]=='0'?'0':match[4].charAt(1):' ';pad_length=match[6]-String(arg).length;pad=match[6]?str_repeat(pad_character,pad_length):'';output.push(match[5]?arg+pad:pad+arg);}} -return output.join('');};str_format.cache={};str_format.parse=function(fmt){var _fmt=fmt,match=[],parse_tree=[],arg_names=0;while(_fmt){if((match=/^[^\x25]+/.exec(_fmt))!==null){parse_tree.push(match[0]);} -else if((match=/^\x25{2}/.exec(_fmt))!==null){parse_tree.push('%');} -else if((match=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt))!==null){if(match[2]){arg_names|=1;var field_list=[],replacement_field=match[2],field_match=[];if((field_match=/^([a-z_][a-z_\d]*)/i.exec(replacement_field))!==null){field_list.push(field_match[1]);while((replacement_field=replacement_field.substring(field_match[0].length))!==''){if((field_match=/^\.([a-z_][a-z_\d]*)/i.exec(replacement_field))!==null){field_list.push(field_match[1]);} -else if((field_match=/^\[(\d+)\]/.exec(replacement_field))!==null){field_list.push(field_match[1]);} -else{throw('[sprintf] huh?');}}} -else{throw('[sprintf] huh?');} -match[2]=field_list;} -else{arg_names|=2;} -if(arg_names===3){throw('[sprintf] mixing positional and named placeholders is not (yet) supported');} -parse_tree.push(match);} -else{throw('[sprintf] huh?');} -_fmt=_fmt.substring(match[0].length);} -return parse_tree;};return str_format;})();var vsprintf=function(fmt,argv){argv.unshift(fmt);return sprintf.apply(null,argv);};Jed.parse_plural=function(plural_forms,n){plural_forms=plural_forms.replace(/n/g,n);return Jed.parse_expression(plural_forms);};Jed.sprintf=function(fmt,args){if({}.toString.call(args)=='[object Array]'){return vsprintf(fmt,[].slice.call(args));} -return sprintf.apply(this,[].slice.call(arguments));};Jed.prototype.sprintf=function(){return Jed.sprintf.apply(this,arguments);};Jed.PF={};Jed.PF.parse=function(p){var plural_str=Jed.PF.extractPluralExpr(p);return Jed.PF.parser.parse.call(Jed.PF.parser,plural_str);};Jed.PF.compile=function(p){function imply(val){return(val===true?1:val?val:0);} -var ast=Jed.PF.parse(p);return function(n){return imply(Jed.PF.interpreter(ast)(n));};};Jed.PF.interpreter=function(ast){return function(n){var res;switch(ast.type){case'GROUP':return Jed.PF.interpreter(ast.expr)(n);case'TERNARY':if(Jed.PF.interpreter(ast.expr)(n)){return Jed.PF.interpreter(ast.truthy)(n);} -return Jed.PF.interpreter(ast.falsey)(n);case'OR':return Jed.PF.interpreter(ast.left)(n)||Jed.PF.interpreter(ast.right)(n);case'AND':return Jed.PF.interpreter(ast.left)(n)&&Jed.PF.interpreter(ast.right)(n);case'LT':return Jed.PF.interpreter(ast.left)(n)Jed.PF.interpreter(ast.right)(n);case'LTE':return Jed.PF.interpreter(ast.left)(n)<=Jed.PF.interpreter(ast.right)(n);case'GTE':return Jed.PF.interpreter(ast.left)(n)>=Jed.PF.interpreter(ast.right)(n);case'EQ':return Jed.PF.interpreter(ast.left)(n)==Jed.PF.interpreter(ast.right)(n);case'NEQ':return Jed.PF.interpreter(ast.left)(n)!=Jed.PF.interpreter(ast.right)(n);case'MOD':return Jed.PF.interpreter(ast.left)(n)%Jed.PF.interpreter(ast.right)(n);case'VAR':return n;case'NUM':return ast.val;default:throw new Error("Invalid Token found.");}};};Jed.PF.extractPluralExpr=function(p){p=p.replace(/^\s\s*/,'').replace(/\s\s*$/,'');if(!/;\s*$/.test(p)){p=p.concat(';');} -var nplurals_re=/nplurals\=(\d+);/,plural_re=/plural\=(.*);/,nplurals_matches=p.match(nplurals_re),res={},plural_matches;if(nplurals_matches.length>1){res.nplurals=nplurals_matches[1];} -else{throw new Error('nplurals not found in plural_forms string: '+p);} -p=p.replace(nplurals_re,"");plural_matches=p.match(plural_re);if(!(plural_matches&&plural_matches.length>1)){throw new Error('`plural` expression not found: '+p);} -return plural_matches[1];};Jed.PF.parser=(function(){var parser={trace:function trace(){},yy:{},symbols_:{"error":2,"expressions":3,"e":4,"EOF":5,"?":6,":":7,"||":8,"&&":9,"<":10,"<=":11,">":12,">=":13,"!=":14,"==":15,"%":16,"(":17,")":18,"n":19,"NUMBER":20,"$accept":0,"$end":1},terminals_:{2:"error",5:"EOF",6:"?",7:":",8:"||",9:"&&",10:"<",11:"<=",12:">",13:">=",14:"!=",15:"==",16:"%",17:"(",18:")",19:"n",20:"NUMBER"},productions_:[0,[3,2],[4,5],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,1],[4,1]],performAction:function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$){var $0=$$.length-1;switch(yystate){case 1:return{type:'GROUP',expr:$$[$0-1]};break;case 2:this.$={type:'TERNARY',expr:$$[$0-4],truthy:$$[$0-2],falsey:$$[$0]};break;case 3:this.$={type:"OR",left:$$[$0-2],right:$$[$0]};break;case 4:this.$={type:"AND",left:$$[$0-2],right:$$[$0]};break;case 5:this.$={type:'LT',left:$$[$0-2],right:$$[$0]};break;case 6:this.$={type:'LTE',left:$$[$0-2],right:$$[$0]};break;case 7:this.$={type:'GT',left:$$[$0-2],right:$$[$0]};break;case 8:this.$={type:'GTE',left:$$[$0-2],right:$$[$0]};break;case 9:this.$={type:'NEQ',left:$$[$0-2],right:$$[$0]};break;case 10:this.$={type:'EQ',left:$$[$0-2],right:$$[$0]};break;case 11:this.$={type:'MOD',left:$$[$0-2],right:$$[$0]};break;case 12:this.$={type:'GROUP',expr:$$[$0-1]};break;case 13:this.$={type:'VAR'};break;case 14:this.$={type:'NUM',val:Number(yytext)};break;}},table:[{3:1,4:2,17:[1,3],19:[1,4],20:[1,5]},{1:[3]},{5:[1,6],6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{4:17,17:[1,3],19:[1,4],20:[1,5]},{5:[2,13],6:[2,13],7:[2,13],8:[2,13],9:[2,13],10:[2,13],11:[2,13],12:[2,13],13:[2,13],14:[2,13],15:[2,13],16:[2,13],18:[2,13]},{5:[2,14],6:[2,14],7:[2,14],8:[2,14],9:[2,14],10:[2,14],11:[2,14],12:[2,14],13:[2,14],14:[2,14],15:[2,14],16:[2,14],18:[2,14]},{1:[2,1]},{4:18,17:[1,3],19:[1,4],20:[1,5]},{4:19,17:[1,3],19:[1,4],20:[1,5]},{4:20,17:[1,3],19:[1,4],20:[1,5]},{4:21,17:[1,3],19:[1,4],20:[1,5]},{4:22,17:[1,3],19:[1,4],20:[1,5]},{4:23,17:[1,3],19:[1,4],20:[1,5]},{4:24,17:[1,3],19:[1,4],20:[1,5]},{4:25,17:[1,3],19:[1,4],20:[1,5]},{4:26,17:[1,3],19:[1,4],20:[1,5]},{4:27,17:[1,3],19:[1,4],20:[1,5]},{6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[1,28]},{6:[1,7],7:[1,29],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{5:[2,3],6:[2,3],7:[2,3],8:[2,3],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[2,4],9:[2,4],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[2,5],11:[2,5],12:[2,5],13:[2,5],14:[2,5],15:[2,5],16:[1,16],18:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[2,6],11:[2,6],12:[2,6],13:[2,6],14:[2,6],15:[2,6],16:[1,16],18:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[2,7],11:[2,7],12:[2,7],13:[2,7],14:[2,7],15:[2,7],16:[1,16],18:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[2,8],11:[2,8],12:[2,8],13:[2,8],14:[2,8],15:[2,8],16:[1,16],18:[2,8]},{5:[2,9],6:[2,9],7:[2,9],8:[2,9],9:[2,9],10:[2,9],11:[2,9],12:[2,9],13:[2,9],14:[2,9],15:[2,9],16:[1,16],18:[2,9]},{5:[2,10],6:[2,10],7:[2,10],8:[2,10],9:[2,10],10:[2,10],11:[2,10],12:[2,10],13:[2,10],14:[2,10],15:[2,10],16:[1,16],18:[2,10]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[2,11],11:[2,11],12:[2,11],13:[2,11],14:[2,11],15:[2,11],16:[2,11],18:[2,11]},{5:[2,12],6:[2,12],7:[2,12],8:[2,12],9:[2,12],10:[2,12],11:[2,12],12:[2,12],13:[2,12],14:[2,12],15:[2,12],16:[2,12],18:[2,12]},{4:30,17:[1,3],19:[1,4],20:[1,5]},{5:[2,2],6:[1,7],7:[2,2],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,2]}],defaultActions:{6:[2,1]},parseError:function parseError(str,hash){throw new Error(str);},parse:function parse(input){var self=this,stack=[0],vstack=[null],lstack=[],table=this.table,yytext='',yylineno=0,yyleng=0,recovering=0,TERROR=2,EOF=1;this.lexer.setInput(input);this.lexer.yy=this.yy;this.yy.lexer=this.lexer;if(typeof this.lexer.yylloc=='undefined') -this.lexer.yylloc={};var yyloc=this.lexer.yylloc;lstack.push(yyloc);if(typeof this.yy.parseError==='function') -this.parseError=this.yy.parseError;function popStack(n){stack.length=stack.length-2*n;vstack.length=vstack.length-n;lstack.length=lstack.length-n;} -function lex(){var token;token=self.lexer.lex()||1;if(typeof token!=='number'){token=self.symbols_[token]||token;} -return token;} -var symbol,preErrorSymbol,state,action,a,r,yyval={},p,len,newState,expected;while(true){state=stack[stack.length-1];if(this.defaultActions[state]){action=this.defaultActions[state];}else{if(symbol==null) -symbol=lex();action=table[state]&&table[state][symbol];} -_handle_error:if(typeof action==='undefined'||!action.length||!action[0]){if(!recovering){expected=[];for(p in table[state])if(this.terminals_[p]&&p>2){expected.push("'"+this.terminals_[p]+"'");} -var errStr='';if(this.lexer.showPosition){errStr='Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ')+", got '"+this.terminals_[symbol]+"'";}else{errStr='Parse error on line '+(yylineno+1)+": Unexpected "+ -(symbol==1?"end of input":("'"+(this.terminals_[symbol]||symbol)+"'"));} -this.parseError(errStr,{text:this.lexer.match,token:this.terminals_[symbol]||symbol,line:this.lexer.yylineno,loc:yyloc,expected:expected});} -if(recovering==3){if(symbol==EOF){throw new Error(errStr||'Parsing halted.');} -yyleng=this.lexer.yyleng;yytext=this.lexer.yytext;yylineno=this.lexer.yylineno;yyloc=this.lexer.yylloc;symbol=lex();} -while(1){if((TERROR.toString())in table[state]){break;} -if(state==0){throw new Error(errStr||'Parsing halted.');} -popStack(1);state=stack[stack.length-1];} -preErrorSymbol=symbol;symbol=TERROR;state=stack[stack.length-1];action=table[state]&&table[state][TERROR];recovering=3;} -if(action[0]instanceof Array&&action.length>1){throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);} -switch(action[0]){case 1:stack.push(symbol);vstack.push(this.lexer.yytext);lstack.push(this.lexer.yylloc);stack.push(action[1]);symbol=null;if(!preErrorSymbol){yyleng=this.lexer.yyleng;yytext=this.lexer.yytext;yylineno=this.lexer.yylineno;yyloc=this.lexer.yylloc;if(recovering>0) -recovering--;}else{symbol=preErrorSymbol;preErrorSymbol=null;} -break;case 2:len=this.productions_[action[1]][1];yyval.$=vstack[vstack.length-len];yyval._$={first_line:lstack[lstack.length-(len||1)].first_line,last_line:lstack[lstack.length-1].last_line,first_column:lstack[lstack.length-(len||1)].first_column,last_column:lstack[lstack.length-1].last_column};r=this.performAction.call(yyval,yytext,yyleng,yylineno,this.yy,action[1],vstack,lstack);if(typeof r!=='undefined'){return r;} -if(len){stack=stack.slice(0,-1*len*2);vstack=vstack.slice(0,-1*len);lstack=lstack.slice(0,-1*len);} -stack.push(this.productions_[action[1]][0]);vstack.push(yyval.$);lstack.push(yyval._$);newState=table[stack[stack.length-2]][stack[stack.length-1]];stack.push(newState);break;case 3:return true;}} -return true;}};var lexer=(function(){var lexer=({EOF:1,parseError:function parseError(str,hash){if(this.yy.parseError){this.yy.parseError(str,hash);}else{throw new Error(str);}},setInput:function(input){this._input=input;this._more=this._less=this.done=false;this.yylineno=this.yyleng=0;this.yytext=this.matched=this.match='';this.conditionStack=['INITIAL'];this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0};return this;},input:function(){var ch=this._input[0];this.yytext+=ch;this.yyleng++;this.match+=ch;this.matched+=ch;var lines=ch.match(/\n/);if(lines)this.yylineno++;this._input=this._input.slice(1);return ch;},unput:function(ch){this._input=ch+this._input;return this;},more:function(){this._more=true;return this;},pastInput:function(){var past=this.matched.substr(0,this.matched.length-this.match.length);return(past.length>20?'...':'')+past.substr(-20).replace(/\n/g,"");},upcomingInput:function(){var next=this.match;if(next.length<20){next+=this._input.substr(0,20-next.length);} -return(next.substr(0,20)+(next.length>20?'...':'')).replace(/\n/g,"");},showPosition:function(){var pre=this.pastInput();var c=new Array(pre.length+1).join("-");return pre+this.upcomingInput()+"\n"+c+"^";},next:function(){if(this.done){return this.EOF;} -if(!this._input)this.done=true;var token,match,col,lines;if(!this._more){this.yytext='';this.match='';} -var rules=this._currentRules();for(var i=0;i=/,/^/,/^!=/,/^==/,/^%/,/^\(/,/^\)/,/^$/,/^./];lexer.conditions={"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"inclusive":true}};return lexer;})() -parser.lexer=lexer;return parser;})();if(typeof exports!=='undefined'){if(typeof module!=='undefined'&&module.exports){exports=module.exports=Jed;} -exports.Jed=Jed;} -else{if(typeof define==='function'&&define.amd){define('jed',function(){return Jed;});} -root['Jed']=Jed;}})(this); \ No newline at end of file diff --git a/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload-ui.js b/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload-ui.js deleted file mode 100644 index e330fe16a36..00000000000 --- a/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload-ui.js +++ /dev/null @@ -1,702 +0,0 @@ -/* - * jQuery File Upload User Interface Plugin 6.9.1 - * https://github.com/blueimp/jQuery-File-Upload - * - * Copyright 2010, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * http://www.opensource.org/licenses/MIT - */ - -/*jslint nomen: true, unparam: true, regexp: true */ -/*global define, window, document, URL, webkitURL, FileReader */ - -(function (factory) { - 'use strict'; - if (typeof define === 'function' && define.amd) { - // Register as an anonymous AMD module: - define([ - 'jquery', - 'tmpl', - 'load-image', - './jquery.fileupload-fp' - ], factory); - } else { - // Browser globals: - factory( - window.jQuery, - window.tmpl, - window.loadImage - ); - } -}(function ($, tmpl, loadImage) { - 'use strict'; - - // The UI version extends the FP (file processing) version or the basic - // file upload widget and adds complete user interface interaction: - var parentWidget = ($.blueimpFP || $.blueimp).fileupload; - $.widget('blueimpUI.fileupload', parentWidget, { - - options: { - // By default, files added to the widget are uploaded as soon - // as the user clicks on the start buttons. To enable automatic - // uploads, set the following option to true: - autoUpload: false, - // The following option limits the number of files that are - // allowed to be uploaded using this widget: - maxNumberOfFiles: undefined, - // The maximum allowed file size: - maxFileSize: undefined, - // The minimum allowed file size: - minFileSize: undefined, - // The regular expression for allowed file types, matches - // against either file type or file name: - acceptFileTypes: /.+$/i, - // The regular expression to define for which files a preview - // image is shown, matched against the file type: - previewSourceFileTypes: /^image\/(gif|jpeg|png)$/, - // The maximum file size of images that are to be displayed as preview: - previewSourceMaxFileSize: 5000000, // 5MB - // The maximum width of the preview images: - previewMaxWidth: 80, - // The maximum height of the preview images: - previewMaxHeight: 80, - // By default, preview images are displayed as canvas elements - // if supported by the browser. Set the following option to false - // to always display preview images as img elements: - previewAsCanvas: true, - // The ID of the upload template: - uploadTemplateId: 'template-upload', - // The ID of the download template: - downloadTemplateId: 'template-download', - // The container for the list of files. If undefined, it is set to - // an element with class "files" inside of the widget element: - filesContainer: undefined, - // By default, files are appended to the files container. - // Set the following option to true, to prepend files instead: - prependFiles: false, - // The expected data type of the upload response, sets the dataType - // option of the $.ajax upload requests: - dataType: 'json', - - // The add callback is invoked as soon as files are added to the fileupload - // widget (via file input selection, drag & drop or add API call). - // See the basic file upload widget for more information: - add: function (e, data) { - var that = $(this).data('fileupload'), - options = that.options, - files = data.files; - $(this).fileupload('process', data).done(function () { - that._adjustMaxNumberOfFiles(-files.length); - data.isAdjusted = true; - data.files.valid = data.isValidated = that._validate(files); - data.context = that._renderUpload(files).data('data', data); - options.filesContainer[ - options.prependFiles ? 'prepend' : 'append' - ](data.context); - that._renderPreviews(files, data.context); - that._forceReflow(data.context); - that._transition(data.context).done( - function () { - if ((that._trigger('added', e, data) !== false) && - (options.autoUpload || data.autoUpload) && - data.autoUpload !== false && data.isValidated) { - data.submit(); - } - } - ); - }); - }, - // Callback for the start of each file upload request: - send: function (e, data) { - var that = $(this).data('fileupload'); - if (!data.isValidated) { - if (!data.isAdjusted) { - that._adjustMaxNumberOfFiles(-data.files.length); - } - if (!that._validate(data.files)) { - return false; - } - } - if (data.context && data.dataType && - data.dataType.substr(0, 6) === 'iframe') { - // Iframe Transport does not support progress events. - // In lack of an indeterminate progress bar, we set - // the progress to 100%, showing the full animated bar: - data.context - .find('.progress').addClass( - !$.support.transition && 'progress-animated' - ) - .attr('aria-valuenow', 100) - .find('.bar').css( - 'width', - '100%' - ); - } - return that._trigger('sent', e, data); - }, - // Callback for successful uploads: - done: function (e, data) { - var that = $(this).data('fileupload'), - template; - if (data.context) { - data.context.each(function (index) { - var file = ($.isArray(data.result) && - data.result[index]) || {error: 'emptyResult'}; - if (file.error) { - that._adjustMaxNumberOfFiles(1); - } - that._transition($(this)).done( - function () { - var node = $(this); - template = that._renderDownload([file]) - .css('height', node.height()) - .replaceAll(node); - that._forceReflow(template); - that._transition(template).done( - function () { - data.context = $(this); - that._trigger('completed', e, data); - } - ); - } - ); - }); - } else { - template = that._renderDownload(data.result) - .appendTo(that.options.filesContainer); - that._forceReflow(template); - that._transition(template).done( - function () { - data.context = $(this); - that._trigger('completed', e, data); - } - ); - } - }, - // Callback for failed (abort or error) uploads: - fail: function (e, data) { - var that = $(this).data('fileupload'), - template; - that._adjustMaxNumberOfFiles(data.files.length); - if (data.context) { - data.context.each(function (index) { - if (data.errorThrown !== 'abort') { - var file = data.files[index]; - file.error = file.error || data.errorThrown || - true; - that._transition($(this)).done( - function () { - var node = $(this); - template = that._renderDownload([file]) - .replaceAll(node); - that._forceReflow(template); - that._transition(template).done( - function () { - data.context = $(this); - that._trigger('failed', e, data); - } - ); - } - ); - } else { - that._transition($(this)).done( - function () { - $(this).remove(); - that._trigger('failed', e, data); - } - ); - } - }); - } else if (data.errorThrown !== 'abort') { - that._adjustMaxNumberOfFiles(-data.files.length); - data.context = that._renderUpload(data.files) - .appendTo(that.options.filesContainer) - .data('data', data); - that._forceReflow(data.context); - that._transition(data.context).done( - function () { - data.context = $(this); - that._trigger('failed', e, data); - } - ); - } else { - that._trigger('failed', e, data); - } - }, - // Callback for upload progress events: - progress: function (e, data) { - if (data.context) { - var progress = parseInt(data.loaded / data.total * 100, 10); - data.context.find('.progress') - .attr('aria-valuenow', progress) - .find('.bar').css( - 'width', - progress + '%' - ); - } - }, - // Callback for global upload progress events: - progressall: function (e, data) { - var $this = $(this), - progress = parseInt(data.loaded / data.total * 100, 10), - globalProgressNode = $this.find('.fileupload-progress'), - extendedProgressNode = globalProgressNode - .find('.progress-extended'); - if (extendedProgressNode.length) { - extendedProgressNode.html( - $this.data('fileupload')._renderExtendedProgress(data) - ); - } - globalProgressNode - .find('.progress') - .attr('aria-valuenow', progress) - .find('.bar').css( - 'width', - progress + '%' - ); - }, - // Callback for uploads start, equivalent to the global ajaxStart event: - start: function (e) { - var that = $(this).data('fileupload'); - that._transition($(this).find('.fileupload-progress')).done( - function () { - that._trigger('started', e); - } - ); - }, - // Callback for uploads stop, equivalent to the global ajaxStop event: - stop: function (e) { - var that = $(this).data('fileupload'); - that._transition($(this).find('.fileupload-progress')).done( - function () { - $(this).find('.progress') - .attr('aria-valuenow', '0') - .find('.bar').css('width', '0%'); - $(this).find('.progress-extended').html(' '); - that._trigger('stopped', e); - } - ); - }, - // Callback for file deletion: - destroy: function (e, data) { - var that = $(this).data('fileupload'); - if (data.url) { - $.ajax(data); - that._adjustMaxNumberOfFiles(1); - } - that._transition(data.context).done( - function () { - $(this).remove(); - that._trigger('destroyed', e, data); - } - ); - } - }, - - // Link handler, that allows to download files - // by drag & drop of the links to the desktop: - _enableDragToDesktop: function () { - var link = $(this), - url = link.prop('href'), - name = link.prop('download'), - type = 'application/octet-stream'; - link.bind('dragstart', function (e) { - try { - e.originalEvent.dataTransfer.setData( - 'DownloadURL', - [type, name, url].join(':') - ); - } catch (err) {} - }); - }, - - _adjustMaxNumberOfFiles: function (operand) { - if (typeof this.options.maxNumberOfFiles === 'number') { - this.options.maxNumberOfFiles += operand; - if (this.options.maxNumberOfFiles < 1) { - this._disableFileInputButton(); - } else { - this._enableFileInputButton(); - } - } - }, - - _formatFileSize: function (bytes) { - if (typeof bytes !== 'number') { - return ''; - } - if (bytes >= 1000000000) { - return (bytes / 1000000000).toFixed(2) + ' GB'; - } - if (bytes >= 1000000) { - return (bytes / 1000000).toFixed(2) + ' MB'; - } - return (bytes / 1000).toFixed(2) + ' KB'; - }, - - _formatBitrate: function (bits) { - if (typeof bits !== 'number') { - return ''; - } - if (bits >= 1000000000) { - return (bits / 1000000000).toFixed(2) + ' Gbit/s'; - } - if (bits >= 1000000) { - return (bits / 1000000).toFixed(2) + ' Mbit/s'; - } - if (bits >= 1000) { - return (bits / 1000).toFixed(2) + ' kbit/s'; - } - return bits + ' bit/s'; - }, - - _formatTime: function (seconds) { - var date = new Date(seconds * 1000), - days = parseInt(seconds / 86400, 10); - days = days ? days + 'd ' : ''; - return days + - ('0' + date.getUTCHours()).slice(-2) + ':' + - ('0' + date.getUTCMinutes()).slice(-2) + ':' + - ('0' + date.getUTCSeconds()).slice(-2); - }, - - _formatPercentage: function (floatValue) { - return (floatValue * 100).toFixed(2) + ' %'; - }, - - _renderExtendedProgress: function (data) { - return this._formatBitrate(data.bitrate) + ' | ' + - this._formatTime( - (data.total - data.loaded) * 8 / data.bitrate - ) + ' | ' + - this._formatPercentage( - data.loaded / data.total - ) + ' | ' + - this._formatFileSize(data.loaded) + ' / ' + - this._formatFileSize(data.total); - }, - - _hasError: function (file) { - if (file.error) { - return file.error; - } - // The number of added files is subtracted from - // maxNumberOfFiles before validation, so we check if - // maxNumberOfFiles is below 0 (instead of below 1): - if (this.options.maxNumberOfFiles < 0) { - return 'maxNumberOfFiles'; - } - // Files are accepted if either the file type or the file name - // matches against the acceptFileTypes regular expression, as - // only browsers with support for the File API report the type: - if (!(this.options.acceptFileTypes.test(file.type) || - this.options.acceptFileTypes.test(file.name))) { - return 'acceptFileTypes'; - } - if (this.options.maxFileSize && - file.size > this.options.maxFileSize) { - return 'maxFileSize'; - } - if (typeof file.size === 'number' && - file.size < this.options.minFileSize) { - return 'minFileSize'; - } - return null; - }, - - _validate: function (files) { - var that = this, - valid = !!files.length; - $.each(files, function (index, file) { - file.error = that._hasError(file); - if (file.error) { - valid = false; - } - }); - return valid; - }, - - _renderTemplate: function (func, files) { - if (!func) { - return $(); - } - var result = func({ - files: files, - formatFileSize: this._formatFileSize, - options: this.options - }); - if (result instanceof $) { - return result; - } - return $(this.options.templatesContainer).html(result).children(); - }, - - _renderPreview: function (file, node) { - var that = this, - options = this.options, - dfd = $.Deferred(); - return ((loadImage && loadImage( - file, - function (img) { - node.append(img); - that._forceReflow(node); - that._transition(node).done(function () { - dfd.resolveWith(node); - }); - if (!$.contains(document.body, node[0])) { - // If the element is not part of the DOM, - // transition events are not triggered, - // so we have to resolve manually: - dfd.resolveWith(node); - } - }, - { - maxWidth: options.previewMaxWidth, - maxHeight: options.previewMaxHeight, - canvas: options.previewAsCanvas - } - )) || dfd.resolveWith(node)) && dfd; - }, - - _renderPreviews: function (files, nodes) { - var that = this, - options = this.options; - nodes.find('.preview span').each(function (index, element) { - var file = files[index]; - if (options.previewSourceFileTypes.test(file.type) && - ($.type(options.previewSourceMaxFileSize) !== 'number' || - file.size < options.previewSourceMaxFileSize)) { - that._processingQueue = that._processingQueue.pipe(function () { - var dfd = $.Deferred(); - that._renderPreview(file, $(element)).done( - function () { - dfd.resolveWith(that); - } - ); - return dfd.promise(); - }); - } - }); - return this._processingQueue; - }, - - _renderUpload: function (files) { - return this._renderTemplate( - this.options.uploadTemplate, - files - ); - }, - - _renderDownload: function (files) { - return this._renderTemplate( - this.options.downloadTemplate, - files - ).find('a[download]').each(this._enableDragToDesktop).end(); - }, - - _startHandler: function (e) { - e.preventDefault(); - var button = $(this), - template = button.closest('.template-upload'), - data = template.data('data'); - if (data && data.submit && !data.jqXHR && data.submit()) { - button.prop('disabled', true); - } - }, - - _cancelHandler: function (e) { - e.preventDefault(); - var template = $(this).closest('.template-upload'), - data = template.data('data') || {}; - if (!data.jqXHR) { - data.errorThrown = 'abort'; - e.data.fileupload._trigger('fail', e, data); - } else { - data.jqXHR.abort(); - } - }, - - _deleteHandler: function (e) { - e.preventDefault(); - var button = $(this); - e.data.fileupload._trigger('destroy', e, { - context: button.closest('.template-download'), - url: button.attr('data-url'), - type: button.attr('data-type') || 'DELETE', - dataType: e.data.fileupload.options.dataType - }); - }, - - _forceReflow: function (node) { - return $.support.transition && node.length && - node[0].offsetWidth; - }, - - _transition: function (node) { - var dfd = $.Deferred(); - if ($.support.transition && node.hasClass('fade')) { - node.bind( - $.support.transition.end, - function (e) { - // Make sure we don't respond to other transitions events - // in the container element, e.g. from button elements: - if (e.target === node[0]) { - node.unbind($.support.transition.end); - dfd.resolveWith(node); - } - } - ).toggleClass('in'); - } else { - node.toggleClass('in'); - dfd.resolveWith(node); - } - return dfd; - }, - - _initButtonBarEventHandlers: function () { - var fileUploadButtonBar = this.element.find('.fileupload-buttonbar'), - filesList = this.options.filesContainer, - ns = this.options.namespace; - fileUploadButtonBar.find('.start') - .bind('click.' + ns, function (e) { - e.preventDefault(); - filesList.find('.start button').click(); - }); - fileUploadButtonBar.find('.cancel') - .bind('click.' + ns, function (e) { - e.preventDefault(); - filesList.find('.cancel button').click(); - }); - fileUploadButtonBar.find('.delete') - .bind('click.' + ns, function (e) { - e.preventDefault(); - filesList.find('.delete input:checked') - .siblings('button').click(); - fileUploadButtonBar.find('.toggle') - .prop('checked', false); - }); - fileUploadButtonBar.find('.toggle') - .bind('change.' + ns, function (e) { - filesList.find('.delete input').prop( - 'checked', - $(this).is(':checked') - ); - }); - }, - - _destroyButtonBarEventHandlers: function () { - this.element.find('.fileupload-buttonbar button') - .unbind('click.' + this.options.namespace); - this.element.find('.fileupload-buttonbar .toggle') - .unbind('change.' + this.options.namespace); - }, - - _initEventHandlers: function () { - parentWidget.prototype._initEventHandlers.call(this); - var eventData = {fileupload: this}; - this.options.filesContainer - .delegate( - '.start button', - 'click.' + this.options.namespace, - eventData, - this._startHandler - ) - .delegate( - '.cancel button', - 'click.' + this.options.namespace, - eventData, - this._cancelHandler - ) - .delegate( - '.delete button', - 'click.' + this.options.namespace, - eventData, - this._deleteHandler - ); - this._initButtonBarEventHandlers(); - }, - - _destroyEventHandlers: function () { - var options = this.options; - this._destroyButtonBarEventHandlers(); - options.filesContainer - .undelegate('.start button', 'click.' + options.namespace) - .undelegate('.cancel button', 'click.' + options.namespace) - .undelegate('.delete button', 'click.' + options.namespace); - parentWidget.prototype._destroyEventHandlers.call(this); - }, - - _enableFileInputButton: function () { - this.element.find('.fileinput-button input') - .prop('disabled', false) - .parent().removeClass('disabled'); - }, - - _disableFileInputButton: function () { - this.element.find('.fileinput-button input') - .prop('disabled', true) - .parent().addClass('disabled'); - }, - - _initTemplates: function () { - var options = this.options; - options.templatesContainer = document.createElement( - options.filesContainer.prop('nodeName') - ); - if (tmpl) { - if (options.uploadTemplateId) { - options.uploadTemplate = tmpl(options.uploadTemplateId); - } - if (options.downloadTemplateId) { - options.downloadTemplate = tmpl(options.downloadTemplateId); - } - } - }, - - _initFilesContainer: function () { - var options = this.options; - if (options.filesContainer === undefined) { - options.filesContainer = this.element.find('.files'); - } else if (!(options.filesContainer instanceof $)) { - options.filesContainer = $(options.filesContainer); - } - }, - - _initSpecialOptions: function () { - parentWidget.prototype._initSpecialOptions.call(this); - this._initFilesContainer(); - this._initTemplates(); - }, - - _create: function () { - parentWidget.prototype._create.call(this); - this._refreshOptionsList.push( - 'filesContainer', - 'uploadTemplateId', - 'downloadTemplateId' - ); - if (!$.blueimpFP) { - this._processingQueue = $.Deferred().resolveWith(this).promise(); - this.process = function () { - return this._processingQueue; - }; - } - }, - - enable: function () { - parentWidget.prototype.enable.call(this); - this.element.find('input, button').prop('disabled', false); - this._enableFileInputButton(); - }, - - disable: function () { - this.element.find('input, button').prop('disabled', true); - this._disableFileInputButton(); - parentWidget.prototype.disable.call(this); - } - - }); - -})); diff --git a/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload-ui.min.js b/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload-ui.min.js deleted file mode 100644 index 72406a0081d..00000000000 --- a/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload-ui.min.js +++ /dev/null @@ -1,30 +0,0 @@ -(function(factory){'use strict';if(typeof define==='function'&&define.amd){define(['jquery','tmpl','load-image','./jquery.fileupload-fp'],factory);}else{factory(window.jQuery,window.tmpl,window.loadImage);}}(function($,tmpl,loadImage){'use strict';var parentWidget=($.blueimpFP||$.blueimp).fileupload;$.widget('blueimpUI.fileupload',parentWidget,{options:{autoUpload:false,maxNumberOfFiles:undefined,maxFileSize:undefined,minFileSize:undefined,acceptFileTypes:/.+$/i,previewSourceFileTypes:/^image\/(gif|jpeg|png)$/,previewSourceMaxFileSize:5000000,previewMaxWidth:80,previewMaxHeight:80,previewAsCanvas:true,uploadTemplateId:'template-upload',downloadTemplateId:'template-download',filesContainer:undefined,prependFiles:false,dataType:'json',add:function(e,data){var that=$(this).data('fileupload'),options=that.options,files=data.files;$(this).fileupload('process',data).done(function(){that._adjustMaxNumberOfFiles(-files.length);data.isAdjusted=true;data.files.valid=data.isValidated=that._validate(files);data.context=that._renderUpload(files).data('data',data);options.filesContainer[options.prependFiles?'prepend':'append'](data.context);that._renderPreviews(files,data.context);that._forceReflow(data.context);that._transition(data.context).done(function(){if((that._trigger('added',e,data)!==false)&&(options.autoUpload||data.autoUpload)&&data.autoUpload!==false&&data.isValidated){data.submit();}});});},send:function(e,data){var that=$(this).data('fileupload');if(!data.isValidated){if(!data.isAdjusted){that._adjustMaxNumberOfFiles(-data.files.length);} -if(!that._validate(data.files)){return false;}} -if(data.context&&data.dataType&&data.dataType.substr(0,6)==='iframe'){data.context.find('.progress').addClass(!$.support.transition&&'progress-animated').attr('aria-valuenow',100).find('.bar').css('width','100%');} -return that._trigger('sent',e,data);},done:function(e,data){var that=$(this).data('fileupload'),template;if(data.context){data.context.each(function(index){var file=($.isArray(data.result)&&data.result[index])||{error:'emptyResult'};if(file.error){that._adjustMaxNumberOfFiles(1);} -that._transition($(this)).done(function(){var node=$(this);template=that._renderDownload([file]).css('height',node.height()).replaceAll(node);that._forceReflow(template);that._transition(template).done(function(){data.context=$(this);that._trigger('completed',e,data);});});});}else{template=that._renderDownload(data.result).appendTo(that.options.filesContainer);that._forceReflow(template);that._transition(template).done(function(){data.context=$(this);that._trigger('completed',e,data);});}},fail:function(e,data){var that=$(this).data('fileupload'),template;that._adjustMaxNumberOfFiles(data.files.length);if(data.context){data.context.each(function(index){if(data.errorThrown!=='abort'){var file=data.files[index];file.error=file.error||data.errorThrown||true;that._transition($(this)).done(function(){var node=$(this);template=that._renderDownload([file]).replaceAll(node);that._forceReflow(template);that._transition(template).done(function(){data.context=$(this);that._trigger('failed',e,data);});});}else{that._transition($(this)).done(function(){$(this).remove();that._trigger('failed',e,data);});}});}else if(data.errorThrown!=='abort'){that._adjustMaxNumberOfFiles(-data.files.length);data.context=that._renderUpload(data.files).appendTo(that.options.filesContainer).data('data',data);that._forceReflow(data.context);that._transition(data.context).done(function(){data.context=$(this);that._trigger('failed',e,data);});}else{that._trigger('failed',e,data);}},progress:function(e,data){if(data.context){var progress=parseInt(data.loaded/data.total*100,10);data.context.find('.progress').attr('aria-valuenow',progress).find('.bar').css('width',progress+'%');}},progressall:function(e,data){var $this=$(this),progress=parseInt(data.loaded/data.total*100,10),globalProgressNode=$this.find('.fileupload-progress'),extendedProgressNode=globalProgressNode.find('.progress-extended');if(extendedProgressNode.length){extendedProgressNode.html($this.data('fileupload')._renderExtendedProgress(data));} -globalProgressNode.find('.progress').attr('aria-valuenow',progress).find('.bar').css('width',progress+'%');},start:function(e){var that=$(this).data('fileupload');that._transition($(this).find('.fileupload-progress')).done(function(){that._trigger('started',e);});},stop:function(e){var that=$(this).data('fileupload');that._transition($(this).find('.fileupload-progress')).done(function(){$(this).find('.progress').attr('aria-valuenow','0').find('.bar').css('width','0%');$(this).find('.progress-extended').html(' ');that._trigger('stopped',e);});},destroy:function(e,data){var that=$(this).data('fileupload');if(data.url){$.ajax(data);that._adjustMaxNumberOfFiles(1);} -that._transition(data.context).done(function(){$(this).remove();that._trigger('destroyed',e,data);});}},_enableDragToDesktop:function(){var link=$(this),url=link.prop('href'),name=link.prop('download'),type='application/octet-stream';link.bind('dragstart',function(e){try{e.originalEvent.dataTransfer.setData('DownloadURL',[type,name,url].join(':'));}catch(err){}});},_adjustMaxNumberOfFiles:function(operand){if(typeof this.options.maxNumberOfFiles==='number'){this.options.maxNumberOfFiles+=operand;if(this.options.maxNumberOfFiles<1){this._disableFileInputButton();}else{this._enableFileInputButton();}}},_formatFileSize:function(bytes){if(typeof bytes!=='number'){return'';} -if(bytes>=1000000000){return(bytes/1000000000).toFixed(2)+' GB';} -if(bytes>=1000000){return(bytes/1000000).toFixed(2)+' MB';} -return(bytes/1000).toFixed(2)+' KB';},_formatBitrate:function(bits){if(typeof bits!=='number'){return'';} -if(bits>=1000000000){return(bits/1000000000).toFixed(2)+' Gbit/s';} -if(bits>=1000000){return(bits/1000000).toFixed(2)+' Mbit/s';} -if(bits>=1000){return(bits/1000).toFixed(2)+' kbit/s';} -return bits+' bit/s';},_formatTime:function(seconds){var date=new Date(seconds*1000),days=parseInt(seconds/86400,10);days=days?days+'d ':'';return days+ -('0'+date.getUTCHours()).slice(-2)+':'+ -('0'+date.getUTCMinutes()).slice(-2)+':'+ -('0'+date.getUTCSeconds()).slice(-2);},_formatPercentage:function(floatValue){return(floatValue*100).toFixed(2)+' %';},_renderExtendedProgress:function(data){return this._formatBitrate(data.bitrate)+' | '+ -this._formatTime((data.total-data.loaded)*8/data.bitrate)+' | '+ -this._formatPercentage(data.loaded/data.total)+' | '+ -this._formatFileSize(data.loaded)+' / '+ -this._formatFileSize(data.total);},_hasError:function(file){if(file.error){return file.error;} -if(this.options.maxNumberOfFiles<0){return'maxNumberOfFiles';} -if(!(this.options.acceptFileTypes.test(file.type)||this.options.acceptFileTypes.test(file.name))){return'acceptFileTypes';} -if(this.options.maxFileSize&&file.size>this.options.maxFileSize){return'maxFileSize';} -if(typeof file.size==='number'&&file.size interval) { - this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8; - this.loaded = loaded; - this.timestamp = now; - } - return this.bitrate; - }; - }, - - _isXHRUpload: function (options) { - return !options.forceIframeTransport && - ((!options.multipart && $.support.xhrFileUpload) || - $.support.xhrFormDataFileUpload); - }, - - _getFormData: function (options) { - var formData; - if (typeof options.formData === 'function') { - return options.formData(options.form); - } - if ($.isArray(options.formData)) { - return options.formData; - } - if (options.formData) { - formData = []; - $.each(options.formData, function (name, value) { - formData.push({name: name, value: value}); - }); - return formData; - } - return []; - }, - - _getTotal: function (files) { - var total = 0; - $.each(files, function (index, file) { - total += file.size || 1; - }); - return total; - }, - - _onProgress: function (e, data) { - if (e.lengthComputable) { - var now = +(new Date()), - total, - loaded; - if (data._time && data.progressInterval && - (now - data._time < data.progressInterval) && - e.loaded !== e.total) { - return; - } - data._time = now; - total = data.total || this._getTotal(data.files); - loaded = parseInt( - e.loaded / e.total * (data.chunkSize || total), - 10 - ) + (data.uploadedBytes || 0); - this._loaded += loaded - (data.loaded || data.uploadedBytes || 0); - data.lengthComputable = true; - data.loaded = loaded; - data.total = total; - data.bitrate = data._bitrateTimer.getBitrate( - now, - loaded, - data.bitrateInterval - ); - // Trigger a custom progress event with a total data property set - // to the file size(s) of the current upload and a loaded data - // property calculated accordingly: - this._trigger('progress', e, data); - // Trigger a global progress event for all current file uploads, - // including ajax calls queued for sequential file uploads: - this._trigger('progressall', e, { - lengthComputable: true, - loaded: this._loaded, - total: this._total, - bitrate: this._bitrateTimer.getBitrate( - now, - this._loaded, - data.bitrateInterval - ) - }); - } - }, - - _initProgressListener: function (options) { - var that = this, - xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr(); - // Accesss to the native XHR object is required to add event listeners - // for the upload progress event: - if (xhr.upload) { - $(xhr.upload).bind('progress', function (e) { - var oe = e.originalEvent; - // Make sure the progress event properties get copied over: - e.lengthComputable = oe.lengthComputable; - e.loaded = oe.loaded; - e.total = oe.total; - that._onProgress(e, options); - }); - options.xhr = function () { - return xhr; - }; - } - }, - - _initXHRData: function (options) { - var formData, - file = options.files[0], - // Ignore non-multipart setting if not supported: - multipart = options.multipart || !$.support.xhrFileUpload, - paramName = options.paramName[0]; - if (!multipart || options.blob) { - // For non-multipart uploads and chunked uploads, - // file meta data is not part of the request body, - // so we transmit this data as part of the HTTP headers. - // For cross domain requests, these headers must be allowed - // via Access-Control-Allow-Headers or removed using - // the beforeSend callback: - options.headers = $.extend(options.headers, { - 'X-File-Name': file.name, - 'X-File-Type': file.type, - 'X-File-Size': file.size - }); - if (!options.blob) { - // Non-chunked non-multipart upload: - options.contentType = file.type; - options.data = file; - } else if (!multipart) { - // Chunked non-multipart upload: - options.contentType = 'application/octet-stream'; - options.data = options.blob; - } - } - if (multipart && $.support.xhrFormDataFileUpload) { - if (options.postMessage) { - // window.postMessage does not allow sending FormData - // objects, so we just add the File/Blob objects to - // the formData array and let the postMessage window - // create the FormData object out of this array: - formData = this._getFormData(options); - if (options.blob) { - formData.push({ - name: paramName, - value: options.blob - }); - } else { - $.each(options.files, function (index, file) { - formData.push({ - name: options.paramName[index] || paramName, - value: file - }); - }); - } - } else { - if (options.formData instanceof FormData) { - formData = options.formData; - } else { - formData = new FormData(); - $.each(this._getFormData(options), function (index, field) { - formData.append(field.name, field.value); - }); - } - if (options.blob) { - formData.append(paramName, options.blob, file.name); - } else { - $.each(options.files, function (index, file) { - // File objects are also Blob instances. - // This check allows the tests to run with - // dummy objects: - if (file instanceof Blob) { - formData.append( - options.paramName[index] || paramName, - file, - file.name - ); - } - }); - } - } - options.data = formData; - } - // Blob reference is not needed anymore, free memory: - options.blob = null; - }, - - _initIframeSettings: function (options) { - // Setting the dataType to iframe enables the iframe transport: - options.dataType = 'iframe ' + (options.dataType || ''); - // The iframe transport accepts a serialized array as form data: - options.formData = this._getFormData(options); - // Add redirect url to form data on cross-domain uploads: - if (options.redirect && $('
      ').prop('href', options.url) - .prop('host') !== location.host) { - options.formData.push({ - name: options.redirectParamName || 'redirect', - value: options.redirect - }); - } - }, - - _initDataSettings: function (options) { - if (this._isXHRUpload(options)) { - if (!this._chunkedUpload(options, true)) { - if (!options.data) { - this._initXHRData(options); - } - this._initProgressListener(options); - } - if (options.postMessage) { - // Setting the dataType to postmessage enables the - // postMessage transport: - options.dataType = 'postmessage ' + (options.dataType || ''); - } - } else { - this._initIframeSettings(options, 'iframe'); - } - }, - - _getParamName: function (options) { - var fileInput = $(options.fileInput), - paramName = options.paramName; - if (!paramName) { - paramName = []; - fileInput.each(function () { - var input = $(this), - name = input.prop('name') || 'files[]', - i = (input.prop('files') || [1]).length; - while (i) { - paramName.push(name); - i -= 1; - } - }); - if (!paramName.length) { - paramName = [fileInput.prop('name') || 'files[]']; - } - } else if (!$.isArray(paramName)) { - paramName = [paramName]; - } - return paramName; - }, - - _initFormSettings: function (options) { - // Retrieve missing options from the input field and the - // associated form, if available: - if (!options.form || !options.form.length) { - options.form = $(options.fileInput.prop('form')); - } - options.paramName = this._getParamName(options); - if (!options.url) { - options.url = options.form.prop('action') || location.href; - } - // The HTTP request method must be "POST" or "PUT": - options.type = (options.type || options.form.prop('method') || '') - .toUpperCase(); - if (options.type !== 'POST' && options.type !== 'PUT') { - options.type = 'POST'; - } - }, - - _getAJAXSettings: function (data) { - var options = $.extend({}, this.options, data); - this._initFormSettings(options); - this._initDataSettings(options); - return options; - }, - - // Maps jqXHR callbacks to the equivalent - // methods of the given Promise object: - _enhancePromise: function (promise) { - promise.success = promise.done; - promise.error = promise.fail; - promise.complete = promise.always; - return promise; - }, - - // Creates and returns a Promise object enhanced with - // the jqXHR methods abort, success, error and complete: - _getXHRPromise: function (resolveOrReject, context, args) { - var dfd = $.Deferred(), - promise = dfd.promise(); - context = context || this.options.context || promise; - if (resolveOrReject === true) { - dfd.resolveWith(context, args); - } else if (resolveOrReject === false) { - dfd.rejectWith(context, args); - } - promise.abort = dfd.promise; - return this._enhancePromise(promise); - }, - - // Uploads a file in multiple, sequential requests - // by splitting the file up in multiple blob chunks. - // If the second parameter is true, only tests if the file - // should be uploaded in chunks, but does not invoke any - // upload requests: - _chunkedUpload: function (options, testOnly) { - var that = this, - file = options.files[0], - fs = file.size, - ub = options.uploadedBytes = options.uploadedBytes || 0, - mcs = options.maxChunkSize || fs, - // Use the Blob methods with the slice implementation - // according to the W3C Blob API specification: - slice = file.webkitSlice || file.mozSlice || file.slice, - upload, - n, - jqXHR, - pipe; - if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) || - options.data) { - return false; - } - if (testOnly) { - return true; - } - if (ub >= fs) { - file.error = 'uploadedBytes'; - return this._getXHRPromise( - false, - options.context, - [null, 'error', file.error] - ); - } - // n is the number of blobs to upload, - // calculated via filesize, uploaded bytes and max chunk size: - n = Math.ceil((fs - ub) / mcs); - // The chunk upload method accepting the chunk number as parameter: - upload = function (i) { - if (!i) { - return that._getXHRPromise(true, options.context); - } - // Upload the blobs in sequential order: - return upload(i -= 1).pipe(function () { - // Clone the options object for each chunk upload: - var o = $.extend({}, options); - o.blob = slice.call( - file, - ub + i * mcs, - ub + (i + 1) * mcs - ); - // Store the current chunk size, as the blob itself - // will be dereferenced after data processing: - o.chunkSize = o.blob.size; - // Process the upload data (the blob and potential form data): - that._initXHRData(o); - // Add progress listeners for this chunk upload: - that._initProgressListener(o); - jqXHR = ($.ajax(o) || that._getXHRPromise(false, o.context)) - .done(function () { - // Create a progress event if upload is done and - // no progress event has been invoked for this chunk: - if (!o.loaded) { - that._onProgress($.Event('progress', { - lengthComputable: true, - loaded: o.chunkSize, - total: o.chunkSize - }), o); - } - options.uploadedBytes = o.uploadedBytes += - o.chunkSize; - }); - return jqXHR; - }); - }; - // Return the piped Promise object, enhanced with an abort method, - // which is delegated to the jqXHR object of the current upload, - // and jqXHR callbacks mapped to the equivalent Promise methods: - pipe = upload(n); - pipe.abort = function () { - return jqXHR.abort(); - }; - return this._enhancePromise(pipe); - }, - - _beforeSend: function (e, data) { - if (this._active === 0) { - // the start callback is triggered when an upload starts - // and no other uploads are currently running, - // equivalent to the global ajaxStart event: - this._trigger('start'); - // Set timer for global bitrate progress calculation: - this._bitrateTimer = new this._BitrateTimer(); - } - this._active += 1; - // Initialize the global progress values: - this._loaded += data.uploadedBytes || 0; - this._total += this._getTotal(data.files); - }, - - _onDone: function (result, textStatus, jqXHR, options) { - if (!this._isXHRUpload(options)) { - // Create a progress event for each iframe load: - this._onProgress($.Event('progress', { - lengthComputable: true, - loaded: 1, - total: 1 - }), options); - } - options.result = result; - options.textStatus = textStatus; - options.jqXHR = jqXHR; - this._trigger('done', null, options); - }, - - _onFail: function (jqXHR, textStatus, errorThrown, options) { - options.jqXHR = jqXHR; - options.textStatus = textStatus; - options.errorThrown = errorThrown; - this._trigger('fail', null, options); - if (options.recalculateProgress) { - // Remove the failed (error or abort) file upload from - // the global progress calculation: - this._loaded -= options.loaded || options.uploadedBytes || 0; - this._total -= options.total || this._getTotal(options.files); - } - }, - - _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) { - this._active -= 1; - options.textStatus = textStatus; - if (jqXHRorError && jqXHRorError.always) { - options.jqXHR = jqXHRorError; - options.result = jqXHRorResult; - } else { - options.jqXHR = jqXHRorResult; - options.errorThrown = jqXHRorError; - } - this._trigger('always', null, options); - if (this._active === 0) { - // The stop callback is triggered when all uploads have - // been completed, equivalent to the global ajaxStop event: - this._trigger('stop'); - // Reset the global progress values: - this._loaded = this._total = 0; - this._bitrateTimer = null; - } - }, - - _onSend: function (e, data) { - var that = this, - jqXHR, - slot, - pipe, - options = that._getAJAXSettings(data), - send = function (resolve, args) { - that._sending += 1; - // Set timer for bitrate progress calculation: - options._bitrateTimer = new that._BitrateTimer(); - jqXHR = jqXHR || ( - (resolve !== false && - that._trigger('send', e, options) !== false && - (that._chunkedUpload(options) || $.ajax(options))) || - that._getXHRPromise(false, options.context, args) - ).done(function (result, textStatus, jqXHR) { - that._onDone(result, textStatus, jqXHR, options); - }).fail(function (jqXHR, textStatus, errorThrown) { - that._onFail(jqXHR, textStatus, errorThrown, options); - }).always(function (jqXHRorResult, textStatus, jqXHRorError) { - that._sending -= 1; - that._onAlways( - jqXHRorResult, - textStatus, - jqXHRorError, - options - ); - if (options.limitConcurrentUploads && - options.limitConcurrentUploads > that._sending) { - // Start the next queued upload, - // that has not been aborted: - var nextSlot = that._slots.shift(); - while (nextSlot) { - if (!nextSlot.isRejected()) { - nextSlot.resolve(); - break; - } - nextSlot = that._slots.shift(); - } - } - }); - return jqXHR; - }; - this._beforeSend(e, options); - if (this.options.sequentialUploads || - (this.options.limitConcurrentUploads && - this.options.limitConcurrentUploads <= this._sending)) { - if (this.options.limitConcurrentUploads > 1) { - slot = $.Deferred(); - this._slots.push(slot); - pipe = slot.pipe(send); - } else { - pipe = (this._sequence = this._sequence.pipe(send, send)); - } - // Return the piped Promise object, enhanced with an abort method, - // which is delegated to the jqXHR object of the current upload, - // and jqXHR callbacks mapped to the equivalent Promise methods: - pipe.abort = function () { - var args = [undefined, 'abort', 'abort']; - if (!jqXHR) { - if (slot) { - slot.rejectWith(args); - } - return send(false, args); - } - return jqXHR.abort(); - }; - return this._enhancePromise(pipe); - } - return send(); - }, - - _onAdd: function (e, data) { - var that = this, - result = true, - options = $.extend({}, this.options, data), - limit = options.limitMultiFileUploads, - paramName = this._getParamName(options), - paramNameSet, - paramNameSlice, - fileSet, - i; - if (!(options.singleFileUploads || limit) || - !this._isXHRUpload(options)) { - fileSet = [data.files]; - paramNameSet = [paramName]; - } else if (!options.singleFileUploads && limit) { - fileSet = []; - paramNameSet = []; - for (i = 0; i < data.files.length; i += limit) { - fileSet.push(data.files.slice(i, i + limit)); - paramNameSlice = paramName.slice(i, i + limit); - if (!paramNameSlice.length) { - paramNameSlice = paramName; - } - paramNameSet.push(paramNameSlice); - } - } else { - paramNameSet = paramName; - } - data.originalFiles = data.files; - $.each(fileSet || data.files, function (index, element) { - var newData = $.extend({}, data); - newData.files = fileSet ? element : [element]; - newData.paramName = paramNameSet[index]; - newData.submit = function () { - newData.jqXHR = this.jqXHR = - (that._trigger('submit', e, this) !== false) && - that._onSend(e, this); - return this.jqXHR; - }; - return (result = that._trigger('add', e, newData)); - }); - return result; - }, - - // File Normalization for Gecko 1.9.1 (Firefox 3.5) support: - _normalizeFile: function (index, file) { - if (file.name === undefined && file.size === undefined) { - file.name = file.fileName; - file.size = file.fileSize; - } - }, - - _replaceFileInput: function (input) { - var inputClone = input.clone(true); - $('
      ').append(inputClone)[0].reset(); - // Detaching allows to insert the fileInput on another form - // without loosing the file input value: - input.after(inputClone).detach(); - // Avoid memory leaks with the detached file input: - $.cleanData(input.unbind('remove')); - // Replace the original file input element in the fileInput - // collection with the clone, which has been copied including - // event handlers: - this.options.fileInput = this.options.fileInput.map(function (i, el) { - if (el === input[0]) { - return inputClone[0]; - } - return el; - }); - // If the widget has been initialized on the file input itself, - // override this.element with the file input clone: - if (input[0] === this.element[0]) { - this.element = inputClone; - } - }, - - _getFileInputFiles: function (fileInput) { - fileInput = $(fileInput); - var files = $.each($.makeArray(fileInput.prop('files')), this._normalizeFile), - value; - if (!files.length) { - value = fileInput.prop('value'); - if (!value) { - return []; - } - // If the files property is not available, the browser does not - // support the File API and we add a pseudo File object with - // the input value as name with path information removed: - files = [{name: value.replace(/^.*\\/, '')}]; - } - return files; - }, - - _onChange: function (e) { - var that = e.data.fileupload, - data = { - fileInput: $(e.target), - form: $(e.target.form) - }; - data.files = that._getFileInputFiles(data.fileInput); - if (that.options.replaceFileInput) { - that._replaceFileInput(data.fileInput); - } - if (that._trigger('change', e, data) === false || - that._onAdd(e, data) === false) { - return false; - } - }, - - _onPaste: function (e) { - var that = e.data.fileupload, - cbd = e.originalEvent.clipboardData, - items = (cbd && cbd.items) || [], - data = {files: []}; - $.each(items, function (index, item) { - var file = item.getAsFile && item.getAsFile(); - if (file) { - data.files.push(file); - } - }); - if (that._trigger('paste', e, data) === false || - that._onAdd(e, data) === false) { - return false; - } - }, - - _onDrop: function (e) { - var that = e.data.fileupload, - dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer, - data = { - files: $.each( - $.makeArray(dataTransfer && dataTransfer.files), - that._normalizeFile - ) - }; - if (that._trigger('drop', e, data) === false || - that._onAdd(e, data) === false) { - return false; - } - e.preventDefault(); - }, - - _onDragOver: function (e) { - var that = e.data.fileupload, - dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer; - if (that._trigger('dragover', e) === false) { - return false; - } - if (dataTransfer) { - dataTransfer.dropEffect = 'copy'; - } - e.preventDefault(); - }, - - _initEventHandlers: function () { - var ns = this.options.namespace; - if (this._isXHRUpload(this.options)) { - this.options.dropZone - .bind('dragover.' + ns, {fileupload: this}, this._onDragOver) - .bind('drop.' + ns, {fileupload: this}, this._onDrop) - .bind('paste.' + ns, {fileupload: this}, this._onPaste); - } - this.options.fileInput - .bind('change.' + ns, {fileupload: this}, this._onChange); - }, - - _destroyEventHandlers: function () { - var ns = this.options.namespace; - this.options.dropZone - .unbind('dragover.' + ns, this._onDragOver) - .unbind('drop.' + ns, this._onDrop) - .unbind('paste.' + ns, this._onPaste); - this.options.fileInput - .unbind('change.' + ns, this._onChange); - }, - - _setOption: function (key, value) { - var refresh = $.inArray(key, this._refreshOptionsList) !== -1; - if (refresh) { - this._destroyEventHandlers(); - } - $.Widget.prototype._setOption.call(this, key, value); - if (refresh) { - this._initSpecialOptions(); - this._initEventHandlers(); - } - }, - - _initSpecialOptions: function () { - var options = this.options; - if (options.fileInput === undefined) { - options.fileInput = this.element.is('input:file') ? - this.element : this.element.find('input:file'); - } else if (!(options.fileInput instanceof $)) { - options.fileInput = $(options.fileInput); - } - if (!(options.dropZone instanceof $)) { - options.dropZone = $(options.dropZone); - } - }, - - _create: function () { - var options = this.options; - // Initialize options set via HTML5 data-attributes: - $.extend(options, $(this.element[0].cloneNode(false)).data()); - options.namespace = options.namespace || this.widgetName; - this._initSpecialOptions(); - this._slots = []; - this._sequence = this._getXHRPromise(true); - this._sending = this._active = this._loaded = this._total = 0; - this._initEventHandlers(); - }, - - destroy: function () { - this._destroyEventHandlers(); - $.Widget.prototype.destroy.call(this); - }, - - enable: function () { - $.Widget.prototype.enable.call(this); - this._initEventHandlers(); - }, - - disable: function () { - this._destroyEventHandlers(); - $.Widget.prototype.disable.call(this); - }, - - // This method is exposed to the widget API and allows adding files - // using the fileupload API. The data parameter accepts an object which - // must have a files property and can contain additional options: - // .fileupload('add', {files: filesList}); - add: function (data) { - if (!data || this.options.disabled) { - return; - } - if (data.fileInput && !data.files) { - data.files = this._getFileInputFiles(data.fileInput); - } else { - data.files = $.each($.makeArray(data.files), this._normalizeFile); - } - this._onAdd(null, data); - }, - - // This method is exposed to the widget API and allows sending files - // using the fileupload API. The data parameter accepts an object which - // must have a files property and can contain additional options: - // .fileupload('send', {files: filesList}); - // The method returns a Promise object for the file upload call. - send: function (data) { - if (data && !this.options.disabled) { - if (data.fileInput && !data.files) { - data.files = this._getFileInputFiles(data.fileInput); - } else { - data.files = $.each($.makeArray(data.files), this._normalizeFile); - } - if (data.files.length) { - return this._onSend(null, data); - } - } - return this._getXHRPromise(false, data && data.context); - } - - }); - -})); diff --git a/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload.min.js b/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload.min.js deleted file mode 100644 index b8666ad7e8c..00000000000 --- a/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.fileupload.min.js +++ /dev/null @@ -1,45 +0,0 @@ -(function(factory){'use strict';if(typeof define==='function'&&define.amd){define(['jquery','jquery.ui.widget'],factory);}else{factory(window.jQuery);}}(function($){'use strict';$.support.xhrFileUpload=!!(window.XMLHttpRequestUpload&&window.FileReader);$.support.xhrFormDataFileUpload=!!window.FormData;$.widget('blueimp.fileupload',{options:{namespace:undefined,dropZone:$(document),fileInput:undefined,replaceFileInput:true,paramName:undefined,singleFileUploads:true,limitMultiFileUploads:undefined,sequentialUploads:false,limitConcurrentUploads:undefined,forceIframeTransport:false,redirect:undefined,redirectParamName:undefined,postMessage:undefined,multipart:true,maxChunkSize:undefined,uploadedBytes:undefined,recalculateProgress:true,progressInterval:100,bitrateInterval:500,formData:function(form){return form.serializeArray();},add:function(e,data){data.submit();},processData:false,contentType:false,cache:false},_refreshOptionsList:['namespace','dropZone','fileInput','multipart','forceIframeTransport'],_BitrateTimer:function(){this.timestamp=+(new Date());this.loaded=0;this.bitrate=0;this.getBitrate=function(now,loaded,interval){var timeDiff=now-this.timestamp;if(!this.bitrate||!interval||timeDiff>interval){this.bitrate=(loaded-this.loaded)*(1000/timeDiff)*8;this.loaded=loaded;this.timestamp=now;} -return this.bitrate;};},_isXHRUpload:function(options){return!options.forceIframeTransport&&((!options.multipart&&$.support.xhrFileUpload)||$.support.xhrFormDataFileUpload);},_getFormData:function(options){var formData;if(typeof options.formData==='function'){return options.formData(options.form);} -if($.isArray(options.formData)){return options.formData;} -if(options.formData){formData=[];$.each(options.formData,function(name,value){formData.push({name:name,value:value});});return formData;} -return[];},_getTotal:function(files){var total=0;$.each(files,function(index,file){total+=file.size||1;});return total;},_onProgress:function(e,data){if(e.lengthComputable){var now=+(new Date()),total,loaded;if(data._time&&data.progressInterval&&(now-data._time').prop('href',options.url).prop('host')!==location.host){options.formData.push({name:options.redirectParamName||'redirect',value:options.redirect});}},_initDataSettings:function(options){if(this._isXHRUpload(options)){if(!this._chunkedUpload(options,true)){if(!options.data){this._initXHRData(options);} -this._initProgressListener(options);} -if(options.postMessage){options.dataType='postmessage '+(options.dataType||'');}}else{this._initIframeSettings(options,'iframe');}},_getParamName:function(options){var fileInput=$(options.fileInput),paramName=options.paramName;if(!paramName){paramName=[];fileInput.each(function(){var input=$(this),name=input.prop('name')||'files[]',i=(input.prop('files')||[1]).length;while(i){paramName.push(name);i-=1;}});if(!paramName.length){paramName=[fileInput.prop('name')||'files[]'];}}else if(!$.isArray(paramName)){paramName=[paramName];} -return paramName;},_initFormSettings:function(options){if(!options.form||!options.form.length){options.form=$(options.fileInput.prop('form'));} -options.paramName=this._getParamName(options);if(!options.url){options.url=options.form.prop('action')||location.href;} -options.type=(options.type||options.form.prop('method')||'').toUpperCase();if(options.type!=='POST'&&options.type!=='PUT'){options.type='POST';}},_getAJAXSettings:function(data){var options=$.extend({},this.options,data);this._initFormSettings(options);this._initDataSettings(options);return options;},_enhancePromise:function(promise){promise.success=promise.done;promise.error=promise.fail;promise.complete=promise.always;return promise;},_getXHRPromise:function(resolveOrReject,context,args){var dfd=$.Deferred(),promise=dfd.promise();context=context||this.options.context||promise;if(resolveOrReject===true){dfd.resolveWith(context,args);}else if(resolveOrReject===false){dfd.rejectWith(context,args);} -promise.abort=dfd.promise;return this._enhancePromise(promise);},_chunkedUpload:function(options,testOnly){var that=this,file=options.files[0],fs=file.size,ub=options.uploadedBytes=options.uploadedBytes||0,mcs=options.maxChunkSize||fs,slice=file.webkitSlice||file.mozSlice||file.slice,upload,n,jqXHR,pipe;if(!(this._isXHRUpload(options)&&slice&&(ub||mcs=fs){file.error='uploadedBytes';return this._getXHRPromise(false,options.context,[null,'error',file.error]);} -n=Math.ceil((fs-ub)/mcs);upload=function(i){if(!i){return that._getXHRPromise(true,options.context);} -return upload(i-=1).pipe(function(){var o=$.extend({},options);o.blob=slice.call(file,ub+i*mcs,ub+(i+1)*mcs);o.chunkSize=o.blob.size;that._initXHRData(o);that._initProgressListener(o);jqXHR=($.ajax(o)||that._getXHRPromise(false,o.context)).done(function(){if(!o.loaded){that._onProgress($.Event('progress',{lengthComputable:true,loaded:o.chunkSize,total:o.chunkSize}),o);} -options.uploadedBytes=o.uploadedBytes+=o.chunkSize;});return jqXHR;});};pipe=upload(n);pipe.abort=function(){return jqXHR.abort();};return this._enhancePromise(pipe);},_beforeSend:function(e,data){if(this._active===0){this._trigger('start');this._bitrateTimer=new this._BitrateTimer();} -this._active+=1;this._loaded+=data.uploadedBytes||0;this._total+=this._getTotal(data.files);},_onDone:function(result,textStatus,jqXHR,options){if(!this._isXHRUpload(options)){this._onProgress($.Event('progress',{lengthComputable:true,loaded:1,total:1}),options);} -options.result=result;options.textStatus=textStatus;options.jqXHR=jqXHR;this._trigger('done',null,options);},_onFail:function(jqXHR,textStatus,errorThrown,options){options.jqXHR=jqXHR;options.textStatus=textStatus;options.errorThrown=errorThrown;this._trigger('fail',null,options);if(options.recalculateProgress){this._loaded-=options.loaded||options.uploadedBytes||0;this._total-=options.total||this._getTotal(options.files);}},_onAlways:function(jqXHRorResult,textStatus,jqXHRorError,options){this._active-=1;options.textStatus=textStatus;if(jqXHRorError&&jqXHRorError.always){options.jqXHR=jqXHRorError;options.result=jqXHRorResult;}else{options.jqXHR=jqXHRorResult;options.errorThrown=jqXHRorError;} -this._trigger('always',null,options);if(this._active===0){this._trigger('stop');this._loaded=this._total=0;this._bitrateTimer=null;}},_onSend:function(e,data){var that=this,jqXHR,slot,pipe,options=that._getAJAXSettings(data),send=function(resolve,args){that._sending+=1;options._bitrateTimer=new that._BitrateTimer();jqXHR=jqXHR||((resolve!==false&&that._trigger('send',e,options)!==false&&(that._chunkedUpload(options)||$.ajax(options)))||that._getXHRPromise(false,options.context,args)).done(function(result,textStatus,jqXHR){that._onDone(result,textStatus,jqXHR,options);}).fail(function(jqXHR,textStatus,errorThrown){that._onFail(jqXHR,textStatus,errorThrown,options);}).always(function(jqXHRorResult,textStatus,jqXHRorError){that._sending-=1;that._onAlways(jqXHRorResult,textStatus,jqXHRorError,options);if(options.limitConcurrentUploads&&options.limitConcurrentUploads>that._sending){var nextSlot=that._slots.shift();while(nextSlot){if(!nextSlot.isRejected()){nextSlot.resolve();break;} -nextSlot=that._slots.shift();}}});return jqXHR;};this._beforeSend(e,options);if(this.options.sequentialUploads||(this.options.limitConcurrentUploads&&this.options.limitConcurrentUploads<=this._sending)){if(this.options.limitConcurrentUploads>1){slot=$.Deferred();this._slots.push(slot);pipe=slot.pipe(send);}else{pipe=(this._sequence=this._sequence.pipe(send,send));} -pipe.abort=function(){var args=[undefined,'abort','abort'];if(!jqXHR){if(slot){slot.rejectWith(args);} -return send(false,args);} -return jqXHR.abort();};return this._enhancePromise(pipe);} -return send();},_onAdd:function(e,data){var that=this,result=true,options=$.extend({},this.options,data),limit=options.limitMultiFileUploads,paramName=this._getParamName(options),paramNameSet,paramNameSlice,fileSet,i;if(!(options.singleFileUploads||limit)||!this._isXHRUpload(options)){fileSet=[data.files];paramNameSet=[paramName];}else if(!options.singleFileUploads&&limit){fileSet=[];paramNameSet=[];for(i=0;i').append(inputClone)[0].reset();input.after(inputClone).detach();$.cleanData(input.unbind('remove'));this.options.fileInput=this.options.fileInput.map(function(i,el){if(el===input[0]){return inputClone[0];} -return el;});if(input[0]===this.element[0]){this.element=inputClone;}},_getFileInputFiles:function(fileInput){fileInput=$(fileInput);var files=$.each($.makeArray(fileInput.prop('files')),this._normalizeFile),value;if(!files.length){value=fileInput.prop('value');if(!value){return[];} -files=[{name:value.replace(/^.*\\/,'')}];} -return files;},_onChange:function(e){var that=e.data.fileupload,data={fileInput:$(e.target),form:$(e.target.form)};data.files=that._getFileInputFiles(data.fileInput);if(that.options.replaceFileInput){that._replaceFileInput(data.fileInput);} -if(that._trigger('change',e,data)===false||that._onAdd(e,data)===false){return false;}},_onPaste:function(e){var that=e.data.fileupload,cbd=e.originalEvent.clipboardData,items=(cbd&&cbd.items)||[],data={files:[]};$.each(items,function(index,item){var file=item.getAsFile&&item.getAsFile();if(file){data.files.push(file);}});if(that._trigger('paste',e,data)===false||that._onAdd(e,data)===false){return false;}},_onDrop:function(e){var that=e.data.fileupload,dataTransfer=e.dataTransfer=e.originalEvent.dataTransfer,data={files:$.each($.makeArray(dataTransfer&&dataTransfer.files),that._normalizeFile)};if(that._trigger('drop',e,data)===false||that._onAdd(e,data)===false){return false;} -e.preventDefault();},_onDragOver:function(e){var that=e.data.fileupload,dataTransfer=e.dataTransfer=e.originalEvent.dataTransfer;if(that._trigger('dragover',e)===false){return false;} -if(dataTransfer){dataTransfer.dropEffect='copy';} -e.preventDefault();},_initEventHandlers:function(){var ns=this.options.namespace;if(this._isXHRUpload(this.options)){this.options.dropZone.bind('dragover.'+ns,{fileupload:this},this._onDragOver).bind('drop.'+ns,{fileupload:this},this._onDrop).bind('paste.'+ns,{fileupload:this},this._onPaste);} -this.options.fileInput.bind('change.'+ns,{fileupload:this},this._onChange);},_destroyEventHandlers:function(){var ns=this.options.namespace;this.options.dropZone.unbind('dragover.'+ns,this._onDragOver).unbind('drop.'+ns,this._onDrop).unbind('paste.'+ns,this._onPaste);this.options.fileInput.unbind('change.'+ns,this._onChange);},_setOption:function(key,value){var refresh=$.inArray(key,this._refreshOptionsList)!==-1;if(refresh){this._destroyEventHandlers();} -$.Widget.prototype._setOption.call(this,key,value);if(refresh){this._initSpecialOptions();this._initEventHandlers();}},_initSpecialOptions:function(){var options=this.options;if(options.fileInput===undefined){options.fileInput=this.element.is('input:file')?this.element:this.element.find('input:file');}else if(!(options.fileInput instanceof $)){options.fileInput=$(options.fileInput);} -if(!(options.dropZone instanceof $)){options.dropZone=$(options.dropZone);}},_create:function(){var options=this.options;$.extend(options,$(this.element[0].cloneNode(false)).data());options.namespace=options.namespace||this.widgetName;this._initSpecialOptions();this._slots=[];this._sequence=this._getXHRPromise(true);this._sending=this._active=this._loaded=this._total=0;this._initEventHandlers();},destroy:function(){this._destroyEventHandlers();$.Widget.prototype.destroy.call(this);},enable:function(){$.Widget.prototype.enable.call(this);this._initEventHandlers();},disable:function(){this._destroyEventHandlers();$.Widget.prototype.disable.call(this);},add:function(data){if(!data||this.options.disabled){return;} -if(data.fileInput&&!data.files){data.files=this._getFileInputFiles(data.fileInput);}else{data.files=$.each($.makeArray(data.files),this._normalizeFile);} -this._onAdd(null,data);},send:function(data){if(data&&!this.options.disabled){if(data.fileInput&&!data.files){data.files=this._getFileInputFiles(data.fileInput);}else{data.files=$.each($.makeArray(data.files),this._normalizeFile);} -if(data.files.length){return this._onSend(null,data);}} -return this._getXHRPromise(false,data&&data.context);}});})); \ No newline at end of file diff --git a/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.iframe-transport.js b/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.iframe-transport.js deleted file mode 100644 index 04a56623085..00000000000 --- a/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.iframe-transport.js +++ /dev/null @@ -1,171 +0,0 @@ -/* - * jQuery Iframe Transport Plugin 1.4 - * https://github.com/blueimp/jQuery-File-Upload - * - * Copyright 2011, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * http://www.opensource.org/licenses/MIT - */ - -/*jslint unparam: true, nomen: true */ -/*global define, window, document */ - -(function (factory) { - 'use strict'; - if (typeof define === 'function' && define.amd) { - // Register as an anonymous AMD module: - define(['jquery'], factory); - } else { - // Browser globals: - factory(window.jQuery); - } -}(function ($) { - 'use strict'; - - // Helper variable to create unique names for the transport iframes: - var counter = 0; - - // The iframe transport accepts three additional options: - // options.fileInput: a jQuery collection of file input fields - // options.paramName: the parameter name for the file form data, - // overrides the name property of the file input field(s), - // can be a string or an array of strings. - // options.formData: an array of objects with name and value properties, - // equivalent to the return data of .serializeArray(), e.g.: - // [{name: 'a', value: 1}, {name: 'b', value: 2}] - $.ajaxTransport('iframe', function (options) { - if (options.async && (options.type === 'POST' || options.type === 'GET')) { - var form, - iframe; - return { - send: function (_, completeCallback) { - form = $('
      '); - // javascript:false as initial iframe src - // prevents warning popups on HTTPS in IE6. - // IE versions below IE8 cannot set the name property of - // elements that have already been added to the DOM, - // so we set the name along with the iframe HTML markup: - iframe = $( - '' - ).bind('load', function () { - var fileInputClones, - paramNames = $.isArray(options.paramName) ? - options.paramName : [options.paramName]; - iframe - .unbind('load') - .bind('load', function () { - var response; - // Wrap in a try/catch block to catch exceptions thrown - // when trying to access cross-domain iframe contents: - try { - response = iframe.contents(); - // Google Chrome and Firefox do not throw an - // exception when calling iframe.contents() on - // cross-domain requests, so we unify the response: - if (!response.length || !response[0].firstChild) { - throw new Error(); - } - } catch (e) { - response = undefined; - } - // The complete callback returns the - // iframe content document as response object: - completeCallback( - 200, - 'success', - {'iframe': response} - ); - // Fix for IE endless progress bar activity bug - // (happens on form submits to iframe targets): - $('') - .appendTo(form); - form.remove(); - }); - form - .prop('target', iframe.prop('name')) - .prop('action', options.url) - .prop('method', options.type); - if (options.formData) { - $.each(options.formData, function (index, field) { - $('') - .prop('name', field.name) - .val(field.value) - .appendTo(form); - }); - } - if (options.fileInput && options.fileInput.length && - options.type === 'POST') { - fileInputClones = options.fileInput.clone(); - // Insert a clone for each file input field: - options.fileInput.after(function (index) { - return fileInputClones[index]; - }); - if (options.paramName) { - options.fileInput.each(function (index) { - $(this).prop( - 'name', - paramNames[index] || options.paramName - ); - }); - } - // Appending the file input fields to the hidden form - // removes them from their original location: - form - .append(options.fileInput) - .prop('enctype', 'multipart/form-data') - // enctype must be set as encoding for IE: - .prop('encoding', 'multipart/form-data'); - } - form.submit(); - // Insert the file input fields at their original location - // by replacing the clones with the originals: - if (fileInputClones && fileInputClones.length) { - options.fileInput.each(function (index, input) { - var clone = $(fileInputClones[index]); - $(input).prop('name', clone.prop('name')); - clone.replaceWith(input); - }); - } - }); - form.append(iframe).appendTo(document.body); - }, - abort: function () { - if (iframe) { - // javascript:false as iframe src aborts the request - // and prevents warning popups on HTTPS in IE6. - // concat is used to avoid the "Script URL" JSLint error: - iframe - .unbind('load') - .prop('src', 'javascript'.concat(':false;')); - } - if (form) { - form.remove(); - } - } - }; - } - }); - - // The iframe transport returns the iframe content document as response. - // The following adds converters from iframe to text, json, html, and script: - $.ajaxSetup({ - converters: { - 'iframe text': function (iframe) { - return $(iframe[0].body).text(); - }, - 'iframe json': function (iframe) { - return $.parseJSON($(iframe[0].body).text()); - }, - 'iframe html': function (iframe) { - return $(iframe[0].body).html(); - }, - 'iframe script': function (iframe) { - return $.globalEval($(iframe[0].body).text()); - } - } - }); - -})); diff --git a/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.iframe-transport.min.js b/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.iframe-transport.min.js deleted file mode 100644 index a6a9c6cd5c8..00000000000 --- a/ckan/public-bs2/base/vendor/jquery-fileupload/jquery.iframe-transport.min.js +++ /dev/null @@ -1,7 +0,0 @@ -(function(factory){'use strict';if(typeof define==='function'&&define.amd){define(['jquery'],factory);}else{factory(window.jQuery);}}(function($){'use strict';var counter=0;$.ajaxTransport('iframe',function(options){if(options.async&&(options.type==='POST'||options.type==='GET')){var form,iframe;return{send:function(_,completeCallback){form=$('
      ');iframe=$('').bind('load',function(){var fileInputClones,paramNames=$.isArray(options.paramName)?options.paramName:[options.paramName];iframe.unbind('load').bind('load',function(){var response;try{response=iframe.contents();if(!response.length||!response[0].firstChild){throw new Error();}}catch(e){response=undefined;} -completeCallback(200,'success',{'iframe':response});$('').appendTo(form);form.remove();});form.prop('target',iframe.prop('name')).prop('action',options.url).prop('method',options.type);if(options.formData){$.each(options.formData,function(index,field){$('').prop('name',field.name).val(field.value).appendTo(form);});} -if(options.fileInput&&options.fileInput.length&&options.type==='POST'){fileInputClones=options.fileInput.clone();options.fileInput.after(function(index){return fileInputClones[index];});if(options.paramName){options.fileInput.each(function(index){$(this).prop('name',paramNames[index]||options.paramName);});} -form.append(options.fileInput).prop('enctype','multipart/form-data').prop('encoding','multipart/form-data');} -form.submit();if(fileInputClones&&fileInputClones.length){options.fileInput.each(function(index,input){var clone=$(fileInputClones[index]);$(input).prop('name',clone.prop('name'));clone.replaceWith(input);});}});form.append(iframe).appendTo(document.body);},abort:function(){if(iframe){iframe.unbind('load').prop('src','javascript'.concat(':false;'));} -if(form){form.remove();}}};}});$.ajaxSetup({converters:{'iframe text':function(iframe){return $(iframe[0].body).text();},'iframe json':function(iframe){return $.parseJSON($(iframe[0].body).text());},'iframe html':function(iframe){return $(iframe[0].body).html();},'iframe script':function(iframe){return $.globalEval($(iframe[0].body).text());}}});})); \ No newline at end of file diff --git a/ckan/public-bs2/base/vendor/jquery.js b/ckan/public-bs2/base/vendor/jquery.js deleted file mode 100644 index 4cdf2c83944..00000000000 --- a/ckan/public-bs2/base/vendor/jquery.js +++ /dev/null @@ -1,10253 +0,0 @@ -/*! - * jQuery JavaScript Library v3.2.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2017-03-20T18:59Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - - // Pass this if window is not defined yet - } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - - // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 - // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode - // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common - // enough that all such attempts are guarded in a try block. - "use strict"; - - var arr = []; - - var document = window.document; - - var getProto = Object.getPrototypeOf; - - var slice = arr.slice; - - var concat = arr.concat; - - var push = arr.push; - - var indexOf = arr.indexOf; - - var class2type = {}; - - var toString = class2type.toString; - - var hasOwn = class2type.hasOwnProperty; - - var fnToString = hasOwn.toString; - - var ObjectFunctionString = fnToString.call( Object ); - - var support = {}; - - - - function DOMEval( code, doc ) { - doc = doc || document; - - var script = doc.createElement( "script" ); - - script.text = code; - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - /* global Symbol */ - // Defining this global in .eslintrc.json would create a danger of using the global - // unguarded in another place, it seems safer to define global only for this module - - - - var - version = "3.2.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - - jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice - }; - - jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; - }; - - jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support - } ); - - if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; - } - - // Populate the class2type map - jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), - function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); - } ); - - function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; - } - var Sizzle = - /*! - * Sizzle CSS Selector Engine v2.3.3 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-08-08 - */ - (function( window ) { - - var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); - }, - { dir: "parentNode", next: "legend" } - ); - - // Optimize for push.apply( _, NodeList ) - try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; - } catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; - } - - function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); - } - - /** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ - function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; - } - - /** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ - function markFunction( fn ) { - fn[ expando ] = true; - return fn; - } - - /** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ - function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } - } - - /** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ - function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } - } - - /** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ - function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; - } - - /** - * Returns a function to use in pseudos for input types - * @param {String} type - */ - function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; - } - - /** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ - function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; - } - - /** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ - function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; - } - - /** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ - function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); - } - - /** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ - function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; - } - - // Expose support vars for convenience - support = Sizzle.support = {}; - - /** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ - isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; - }; - - /** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ - setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( el ) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID filter and find - if ( support.getById ) { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( el ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; - }; - - Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); - }; - - Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; - }; - - Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); - }; - - Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; - }; - - Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); - }; - - Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); - }; - - /** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ - Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; - }; - - /** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ - getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; - }; - - Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } - }; - - Expr.pseudos["nth"] = Expr.pseudos["eq"]; - - // Add button/input type pseudos - for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); - } - for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); - } - - // Easy API for creating new setFilters - function setFilters() {} - setFilters.prototype = Expr.filters = Expr.pseudos; - Expr.setFilters = new setFilters(); - - tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); - }; - - function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; - } - - function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; - } - - function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; - } - - function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; - } - - function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; - } - - function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); - } - - function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); - } - - function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; - } - - compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; - }; - - /** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ - select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; - }; - - // One-time assignments - - // Sort stability - support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - - // Support: Chrome 14-35+ - // Always assume duplicates if they aren't passed to the comparison function - support.detectDuplicates = !!hasDuplicate; - - // Initialize against the default document - setDocument(); - - // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) - // Detached nodes confoundingly follow *each other* - support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; - }); - - // Support: IE<8 - // Prevent attribute/property "interpolation" - // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx - if ( !assert(function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; - }) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); - } - - // Support: IE<9 - // Use defaultValue in place of getAttribute("value") - if ( !support.attributes || !assert(function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; - }) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); - } - - // Support: IE<9 - // Use getAttributeNode to fetch booleans when getAttribute lies - if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; - }) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); - } - - return Sizzle; - - })( window ); - - - - jQuery.find = Sizzle; - jQuery.expr = Sizzle.selectors; - - // Deprecated - jQuery.expr[ ":" ] = jQuery.expr.pseudos; - jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; - jQuery.text = Sizzle.getText; - jQuery.isXMLDoc = Sizzle.isXML; - jQuery.contains = Sizzle.contains; - jQuery.escapeSelector = Sizzle.escape; - - - - - var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }; - - - var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - }; - - - var rneedsContext = jQuery.expr.match.needsContext; - - - - function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - - }; - var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - - var risSimple = /^.[^:#\[\.,]*$/; - - // Implement the identical functionality for filter and not - function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Simple selector that can be filtered directly, removing non-Elements - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - // Complex selector, compare the two sets, removing non-Elements - qualifier = jQuery.filter( qualifier, elements ); - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; - } ); - } - - jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); - }; - - jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } - } ); - - - // Initialize a jQuery object - - - // A central reference to the root jQuery(document) - var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - - // Give the init function the jQuery prototype for later instantiation - init.prototype = jQuery.fn; - - // Initialize central reference - rootjQuery = jQuery( document ); - - - var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - - jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } - } ); - - function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; - } - - jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( nodeName( elem, "iframe" ) ) { - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } - }, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; - } ); - var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - - // Convert String-formatted options into Object-formatted ones - function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; - } - - /* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ - jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; - }; - - - function Identity( v ) { - return v; - } - function Thrower( ex ) { - throw ex; - } - - function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } - } - - jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( jQuery.isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } - } ); - - - // These usually indicate a programmer mistake during development, - // warn about them ASAP rather than swallowing them by default. - var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - - jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } - }; - - - - - jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); - }; - - - - - // The deferred used on DOM ready - var readyList = jQuery.Deferred(); - - jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; - }; - - jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } - } ); - - jQuery.ready.then = readyList.then; - - // The ready event handler and self cleanup method - function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); - } - - // Catch cases where $(document).ready() is called - // after the browser event has already occurred. - // Support: IE <=9 - 10 only - // Older IE sometimes signals "interactive" too soon - if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); - } - - - - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; - }; - var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); - }; - - - - - function Data() { - this.expando = jQuery.expando + Data.uid++; - } - - Data.uid = 1; - - Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ jQuery.camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ jQuery.camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( jQuery.camelCase ); - } else { - key = jQuery.camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } - }; - var dataPriv = new Data(); - - var dataUser = new Data(); - - - - // Implementation Summary - // - // 1. Enforce API surface and semantic compatibility with 1.9.x branch - // 2. Improve the module's maintainability by reducing the storage - // paths to a single mechanism. - // 3. Use the same single mechanism to support "private" and "user" data. - // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) - // 5. Avoid exposing implementation details on user objects (eg. expando properties) - // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - - var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - - function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; - } - - function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; - } - - jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } - } ); - - jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } - } ); - - - jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } - } ); - - jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } - } ); - var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - - var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - - var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - - var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - jQuery.contains( elem.ownerDocument, elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - }; - - - - - function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; - } - - - var defaultDisplayMap = {}; - - function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; - } - - function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; - } - - jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } - } ); - var rcheckableType = ( /^(?:checkbox|radio)$/i ); - - var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); - - var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - - - - // We have to close these tags to support XHTML (#13200) - var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
      " ], - col: [ 2, "", "
      " ], - tr: [ 2, "", "
      " ], - td: [ 3, "", "
      " ], - - _default: [ 0, "", "" ] - }; - - // Support: IE <=9 only - wrapMap.optgroup = wrapMap.option; - - wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; - wrapMap.th = wrapMap.td; - - - function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; - } - - - // Mark scripts as having already been evaluated - function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } - } - - - var rhtml = /<|&#?\w+;/; - - function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - } - - - ( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - } )(); - var documentElement = document.documentElement; - - - - var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - - function returnTrue() { - return true; - } - - function returnFalse() { - return false; - } - - // Support: IE <=9 only - // See #13393 for more info - function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } - } - - function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); - } - - /* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ - jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: jQuery.isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } - }; - - jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } - }; - - jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; - }; - - // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding - // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html - jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } - }; - - // Includes all common event props including KeyEvent and MouseEvent specific props - jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } - }, jQuery.event.addProp ); - - // Create mouseenter/leave events using mouseover/out and event-time checks - // so that event delegation works in jQuery. - // Do the same for pointerenter/pointerleave and pointerover/pointerout - // - // Support: Safari 7 only - // Safari sends mouseenter too often; see: - // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 - // for the description of the bug (it existed in older Chrome versions as well). - jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" - }, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; - } ); - - jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } - } ); - - - var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - - // Prefer a tbody over its parent table for containing new rows - function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( ">tbody", elem )[ 0 ] || elem; - } - - return elem; - } - - // Replace/restore the type attribute of script elements for safe DOM manipulation - function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; - } - function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - - return elem; - } - - function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } - } - - // Fix IE bugs, see support tests - function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } - } - - function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); - } - } - } - } - } - } - - return collection; - } - - function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; - } - - jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } - } ); - - jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } - } ); - - jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" - }, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; - } ); - var rmargin = ( /^margin/ ); - - var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - - var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - - - - ( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - div.style.cssText = - "box-sizing:border-box;" + - "position:relative;display:block;" + - "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - div.innerHTML = ""; - documentElement.appendChild( container ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = divStyle.marginLeft === "2px"; - boxSizingReliableVal = divStyle.width === "4px"; - - // Support: Android 4.0 - 4.3 only - // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = divStyle.marginRight === "4px"; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - container.appendChild( div ); - - jQuery.extend( support, { - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelMarginRight: function() { - computeStyleTests(); - return pixelMarginRightVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - } - } ); - } )(); - - - function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; - } - - - function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; - } - - - var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - - // Return a css property mapped to a potentially vendor prefixed property - function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } - } - - // Return a property mapped along what jQuery.cssProps suggests or to - // a vendor prefixed property. - function finalPropName( name ) { - var ret = jQuery.cssProps[ name ]; - if ( !ret ) { - ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; - } - return ret; - } - - function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; - } - - function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i, - val = 0; - - // If we already have the right measurement, avoid augmentation - if ( extra === ( isBorderBox ? "border" : "content" ) ) { - i = 4; - - // Otherwise initialize for horizontal or vertical properties - } else { - i = name === "width" ? 1 : 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // At this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - - // At this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // At this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; - } - - function getWidthOrHeight( elem, name, extra ) { - - // Start with computed style - var valueIsBorderBox, - styles = getStyles( elem ), - val = curCSS( elem, name, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test( val ) ) { - return val; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); - - // Fall back to offsetWidth/Height when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - if ( val === "auto" ) { - val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; - } - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - - // Use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; - } - - jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } - } ); - - jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); - } ) : - getWidthOrHeight( elem, name, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = extra && getStyles( elem ), - subtract = extra && augmentWidthOrHeight( - elem, - name, - extra, - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - styles - ); - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ name ] = value; - value = jQuery.css( elem, name ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; - } ); - - jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } - ); - - // These hooks are used by animate to expand properties - jQuery.each( { - margin: "", - padding: "", - border: "Width" - }, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( !rmargin.test( prefix ) ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } - } ); - - jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } - } ); - - - function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); - } - jQuery.Tween = Tween; - - Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } - }; - - Tween.prototype.init.prototype = Tween.prototype; - - Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } - }; - - // Support: IE <=9 only - // Panic based approach to setting things on disconnected nodes - Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } - }; - - jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" - }; - - jQuery.fx = Tween.prototype.init; - - // Back compat <1.8 extension point - jQuery.fx.step = {}; - - - - - var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - - function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } - } - - // Animations created synchronously will run synchronously - function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = jQuery.now() ); - } - - // Generate parameters to create a standard animation - function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; - } - - function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } - } - - function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 13 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } - } - - function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = jQuery.camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } - } - - function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( jQuery.isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; - } - - jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } - } ); - - jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; - }; - - jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } - } ); - - jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; - } ); - - // Generate shortcuts for custom animations - jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } - }, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; - } ); - - jQuery.timers = []; - jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = jQuery.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; - }; - - jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); - }; - - jQuery.fx.interval = 13; - jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); - }; - - jQuery.fx.stop = function() { - inProgress = null; - }; - - jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 - }; - - - // Based off of the plugin by Clint Helfers, with permission. - // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ - jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); - }; - - - ( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; - } )(); - - - var boolHook, - attrHandle = jQuery.expr.attrHandle; - - jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } - } ); - - jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } - } ); - - // Hooks for boolean attributes - boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } - }; - - jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; - } ); - - - - - var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - - jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } - } ); - - jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } - } ); - - // Support: IE <=11 only - // Accessing the selectedIndex property - // forces the browser to respect setting selected - // on the option - // The getter ensures a default option is selected - // when in an optgroup - // eslint rule "no-unused-expressions" is disabled for this code - // since it considers such accessions noop - if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; - } - - jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" - ], function() { - jQuery.propFix[ this.toLowerCase() ] = this; - } ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - - function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; - } - - jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( type === "string" ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = value.match( rnothtmlwhite ) || []; - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } - } ); - - - - - var rreturn = /\r/g; - - jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, isFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } - } ); - - jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } - } ); - - // Radios and checkboxes getter/setter - jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } - } ); - - - - - // Return jQuery for attributes-only inclusion - - - var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; - - jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - - } ); - - jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } - } ); - - - jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; - } ); - - jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } - } ); - - - - - support.focusin = "onfocusin" in window; - - - // Support: Firefox <=44 - // Firefox doesn't have focus(in | out) events - // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 - // - // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 - // focus(in | out) events fire after focus & blur events, - // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order - // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 - if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); - } - var location = window.location; - - var nonce = jQuery.now(); - - var rquery = ( /\?/ ); - - - - // Cross-browser xml parsing - jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }; - - - var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - - function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && jQuery.type( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } - } - - // Serialize an array of form elements or a set of - // key/values into a query string - jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = jQuery.isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); - }; - - jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } - } ); - - - var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - - // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport - function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( jQuery.isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; - } - - // Base inspection function for prefilters and transports - function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); - } - - // A special extend for ajax options - // that takes "flat" options (not to be deep extended) - // Fixes #9887 - function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; - } - - /* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ - function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } - } - - /* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ - function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; - } - - jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 13 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available, append data to url - if ( s.data ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } - } ); - - jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; - } ); - - - jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); - }; - - - jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( jQuery.isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } - } ); - - - jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); - }; - jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); - }; - - - - - jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} - }; - - var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - - support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); - support.ajax = xhrSupported = !!xhrSupported; - - jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } - } ); - - - - - // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) - jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } - } ); - - // Install script dataType - jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } - } ); - - // Handle cache's special case and crossDomain - jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } - } ); - - // Bind script tag hack transport - jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " -{% endblock %} - -{# remove any ckan styles #} -{% block styles %}{% endblock %} - -{% block custom_styles %}{% endblock %} diff --git a/ckan/templates-bs2/dataviewer/snippets/data_preview.html b/ckan/templates-bs2/dataviewer/snippets/data_preview.html deleted file mode 100644 index d33a6fd8f94..00000000000 --- a/ckan/templates-bs2/dataviewer/snippets/data_preview.html +++ /dev/null @@ -1,26 +0,0 @@ -
      - {% if embed %} - {# images can be embedded directly #} - - {% else %} -
      -

      - - {{ _('This resource can not be previewed at the moment.') }} - - {{ _('Click here for more information.') }} - -

      -

      -

      - - - {{ _('Download resource') }} - -

      -
      - - {% endif %} -
      diff --git a/ckan/templates-bs2/dataviewer/snippets/no_preview.html b/ckan/templates-bs2/dataviewer/snippets/no_preview.html deleted file mode 100644 index 0a0e46975fc..00000000000 --- a/ckan/templates-bs2/dataviewer/snippets/no_preview.html +++ /dev/null @@ -1,16 +0,0 @@ -
      -
      - {{ _('No preview available.') }} - -
      - {% if reason %} - {{ reason }} - {% else %} - {% set t = ''|safe + resource_type + ''|safe %} - {{ gettext('No handler defined for data type: %(type)s.', type=t) }} - {% endif %} -
      -
      -
      diff --git a/ckan/templates-bs2/development/primer.html b/ckan/templates-bs2/development/primer.html deleted file mode 100644 index 9ae39586ca0..00000000000 --- a/ckan/templates-bs2/development/primer.html +++ /dev/null @@ -1,95 +0,0 @@ -{% extends "page.html" %} - -{% block toolbar %} - {% snippet 'development/snippets/breadcrumb.html', stage=1 %} - {% snippet 'development/snippets/breadcrumb.html', stage=2 %} - {% snippet 'development/snippets/breadcrumb.html', stage=3 %} -{% endblock %} - -{% block actions_content %} - {% snippet 'development/snippets/actions.html' %} -{% endblock %} - -{% block secondary_content %} - {% snippet 'development/snippets/context.html' %} - -
      -

      Helper text

      -
      {{ lipsum(1) }}
      -
      - - {% snippet 'development/snippets/nav.html', heading='Navigation' %} - {% snippet 'development/snippets/nav.html', heading='Active Navigation', show_active=true %} - {% snippet 'development/snippets/nav.html', heading='Icon Navigation', show_icons=true %} - {% snippet 'development/snippets/facet.html', heading='Facet List', show_icons=true %} -{% endblock %} - -{% block primary_content %} - {% snippet 'development/snippets/page_header.html' %} - -
      - - - - -
      - -
      -

      Top level heading (h1)

      -

      Some Rendered Markdown (h2)

      -
      -

      Heading 1

      - {{ lipsum(1) }} -

      Heading 2

      - {{ lipsum(1) }} -

      Heading 3

      - {{ lipsum(1) }} -
      -
      - -
      -
      -

      Forms

      -
      - {% snippet 'development/snippets/form.html' %} - {% snippet 'development/snippets/form.html', error=['This field has an error'] %} - -
      -
      -

      Form stages

      -
      - {% snippet 'development/snippets/form_stages.html' %} - - -
      -

      Datasets

      -
      - {% snippet 'snippets/package_list.html', packages=[ - {'name': "test", 'title': 'Dataset #1', 'notes': lipsum(1), 'tracking_summary':{'recent': 10}}, - {'name': "test", 'title': 'Dataset #2', 'notes': lipsum(0), 'tracking_summary':{'recent': 5}}, - {'name': "test", 'title': 'Dataset #3', 'notes': lipsum(1), 'tracking_summary':{'recent': 10}}, - {'name': "test", 'title': 'Dataset #4', 'notes': lipsum(1), 'tracking_summary':{'recent': 10}} - ] %} -
      - -
      -
      -

      Media Grid

      -
      - {% snippet 'development/snippets/media_grid.html', groups=[ - {'name': "test", 'display_name': 'Group #1', 'type': 'group', 'description': lipsum(0), 'packages': 0}, - {'name': "test", 'display_name': 'Group #2', 'type': 'group', 'description': lipsum(1), 'packages': 1}, - {'name': "test", 'display_name': 'Group #3', 'type': 'group', 'description': lipsum(1), 'packages': 10}, - {'name': "test", 'display_name': 'Group #4', 'type': 'group', 'description': lipsum(1), 'packages': 200}, - {'name': "test", 'display_name': 'Group #5', 'type': 'group', 'description': lipsum(1), 'packages': 10}, - {'name': "test", 'display_name': 'Group #6', 'type': 'group', 'description': lipsum(0), 'packages': 5} - ] %} - -
      -

      Pagination

      -
      - {% snippet 'development/snippets/pagination.html', total=5, current=1 %} - {% snippet 'development/snippets/pagination.html', total=5, current=3 %} - {% snippet 'development/snippets/pagination.html', total=5, current=5 %} - -{% endblock %} diff --git a/ckan/templates-bs2/development/snippets/actions.html b/ckan/templates-bs2/development/snippets/actions.html deleted file mode 100644 index 20a6962f7bb..00000000000 --- a/ckan/templates-bs2/development/snippets/actions.html +++ /dev/null @@ -1,2 +0,0 @@ -
    • Button
    • -
    • Primary Button
    • diff --git a/ckan/templates-bs2/development/snippets/breadcrumb.html b/ckan/templates-bs2/development/snippets/breadcrumb.html deleted file mode 100644 index 9a1e371bb83..00000000000 --- a/ckan/templates-bs2/development/snippets/breadcrumb.html +++ /dev/null @@ -1,7 +0,0 @@ -
      - -
      diff --git a/ckan/templates-bs2/development/snippets/context.html b/ckan/templates-bs2/development/snippets/context.html deleted file mode 100644 index bc0dfefad09..00000000000 --- a/ckan/templates-bs2/development/snippets/context.html +++ /dev/null @@ -1,24 +0,0 @@ -
      -
      -
      - - - -
      -

      {{ title }}

      -

      - {{ h.markdown_extract(lipsum(1), 160) }} - read more -

      -
      -
      -
      Stat #1
      -
      {{ h.SI_number_span(11111) }}
      -
      -
      -
      Stat #2
      -
      {{ h.SI_number_span(111) }}
      -
      -
      -
      -
      diff --git a/ckan/templates-bs2/development/snippets/facet.html b/ckan/templates-bs2/development/snippets/facet.html deleted file mode 100644 index 188d0269cd4..00000000000 --- a/ckan/templates-bs2/development/snippets/facet.html +++ /dev/null @@ -1,15 +0,0 @@ -
      - {% with items=(("First", true), ("Second", false), ("Third", true), ("Fourth", false), ("Last", false)) %} -

      Facet List

      - - - {% endwith %} -
      diff --git a/ckan/templates-bs2/development/snippets/form.html b/ckan/templates-bs2/development/snippets/form.html deleted file mode 100644 index c3e6fb7baf6..00000000000 --- a/ckan/templates-bs2/development/snippets/form.html +++ /dev/null @@ -1,27 +0,0 @@ -{% import 'macros/form.html' as form %} - -
      -
      - {{ form.input('standard', label=_('Standard'), placeholder=_('Standard Input'), value='', error=error, classes=[]) }} - {{ form.input('standard', label=_('Medium'), placeholder=_('Medium Width Input'), value='', error=error, classes=['control-medium']) }} - {{ form.input('standard', label=_('Full'), placeholder=_('Full Width Input'), value='', error=error, classes=['control-full']) }} - {{ form.input('standard', label=_('Large'), placeholder=_('Large Input'), value='', error=error, classes=['control-full', 'control-large']) }} - {{ form.prepend('slug', label=_('Prepend'), prepend='prefix', placeholder=_('Prepend Input'), value='', error=error, classes=[]) }} - {{ form.custom( - names=('custom_key', 'custom_value', 'custom_deleted'), - id='field-custom', - label=_('Custom Field (empty)'), - values=(), - error=error ) }} - {{ form.custom( - names=('custom_key', 'custom_value', 'custom_deleted'), - id='field-custom', - label=_('Custom Field'), - values=('key', 'value', true), - error=error ) }} - {{ form.markdown('desc', id='field-description', label=_('Markdown'), placeholder='Some nice placeholder text', error=error) }} - {{ form.textarea('desc', id='field-description', label=_('Textarea'), placeholder='Some nice placeholder text', error=error) }} - {{ form.select('year', label=_('Select'), options=[{'value': 2010}, {'value': 2011}], selected=2011, error=error) }} - {{ form.checkbox('remember', label="This is my checkbox", checked=true, error=error) }} -
      -
      diff --git a/ckan/templates-bs2/development/snippets/form_stages.html b/ckan/templates-bs2/development/snippets/form_stages.html deleted file mode 100644 index 409f0f5f4b9..00000000000 --- a/ckan/templates-bs2/development/snippets/form_stages.html +++ /dev/null @@ -1,30 +0,0 @@ -
      -
      - {% snippet 'package/snippets/stages.html', stages=['active'] %} -
      -
      -
      -
      - {% snippet 'package/snippets/stages.html', stages=['complete', 'active'] %} -
      -
      -
      -
      - {% snippet 'package/snippets/stages.html', stages=['complete', 'complete', 'active'] %} -
      -
      -
      -
      - {% snippet 'package/snippets/stages.html', stages=['complete', 'active', 'complete'] %} -
      -
      -
      -
      - {% snippet 'package/snippets/stages.html', stages=['active', 'complete', 'complete'] %} -
      -
      -
      -
      - {% snippet 'package/snippets/stages.html', stages=['active', 'complete'] %} -
      -
      diff --git a/ckan/templates-bs2/development/snippets/list.html b/ckan/templates-bs2/development/snippets/list.html deleted file mode 100644 index 5b2f6ace326..00000000000 --- a/ckan/templates-bs2/development/snippets/list.html +++ /dev/null @@ -1,14 +0,0 @@ -
      - {% with items=(("First", false), ("Second", true), ("Third", true), ("Fourth", false), ("Last", false)) %} -

      {{ heading }}

      - - {% endwith %} -
      diff --git a/ckan/templates-bs2/development/snippets/media_grid.html b/ckan/templates-bs2/development/snippets/media_grid.html deleted file mode 100644 index 0ef561fd7f6..00000000000 --- a/ckan/templates-bs2/development/snippets/media_grid.html +++ /dev/null @@ -1,5 +0,0 @@ -
      -
      - {% snippet 'group/snippets/group_list.html', groups=groups %} -
      -
      diff --git a/ckan/templates-bs2/development/snippets/module.html b/ckan/templates-bs2/development/snippets/module.html deleted file mode 100644 index 5e6ce8a18e1..00000000000 --- a/ckan/templates-bs2/development/snippets/module.html +++ /dev/null @@ -1,21 +0,0 @@ -{% with classes = classes or [], hn = heading_level or 1 %} -
      - {% if heading_link %} - {{ heading }} - {% elif heading_action %} - {{ heading }} - {% elif heading_icon %} - {{ heading }} - {% else %} - {{ heading }} - {% endif %} -
      - {{ lipsum(1) }} -
      - {% if footer %} - - {% endif %} -
      -{% endwith %} diff --git a/ckan/templates-bs2/development/snippets/nav.html b/ckan/templates-bs2/development/snippets/nav.html deleted file mode 100644 index 26731b7a3e5..00000000000 --- a/ckan/templates-bs2/development/snippets/nav.html +++ /dev/null @@ -1,14 +0,0 @@ -
      - {% with items=(("First", true), ("Second", false), ("Third", true), ("Fourth", false), ("Last", false)) %} -

      {{ heading }}

      - - {% endwith %} -
      diff --git a/ckan/templates-bs2/development/snippets/page_header.html b/ckan/templates-bs2/development/snippets/page_header.html deleted file mode 100644 index cfc49c9c800..00000000000 --- a/ckan/templates-bs2/development/snippets/page_header.html +++ /dev/null @@ -1,11 +0,0 @@ -{% with items=(("First", true), ("Second", false), ("Third", false)) %} - -{% endwith %} diff --git a/ckan/templates-bs2/development/snippets/pagination.html b/ckan/templates-bs2/development/snippets/pagination.html deleted file mode 100644 index 652857462f3..00000000000 --- a/ckan/templates-bs2/development/snippets/pagination.html +++ /dev/null @@ -1,11 +0,0 @@ -
      - -
      diff --git a/ckan/templates-bs2/development/snippets/simple-input.html b/ckan/templates-bs2/development/snippets/simple-input.html deleted file mode 100644 index 6ca1087dcb6..00000000000 --- a/ckan/templates-bs2/development/snippets/simple-input.html +++ /dev/null @@ -1,4 +0,0 @@ -
      -

      Module Narrow Input

      -
      -
      diff --git a/ckan/templates-bs2/emails/invite_user.txt b/ckan/templates-bs2/emails/invite_user.txt deleted file mode 100644 index 7fefc0c8c1a..00000000000 --- a/ckan/templates-bs2/emails/invite_user.txt +++ /dev/null @@ -1,17 +0,0 @@ -Dear {{ user_name }}, - -You have been invited to {{ site_title }}. - -A user has already been created for you with the username {{ user_name }}. You can change it later. - -You have been added to the {{ group_type }} {{ group_title }} with the following role: {{ role_name }}. - -To accept this invite, please reset your password at: - - {{ reset_link }} - - -Have a nice day. - --- -Message sent by {{ site_title }} ({{ site_url }}) diff --git a/ckan/templates-bs2/emails/invite_user_subject.txt b/ckan/templates-bs2/emails/invite_user_subject.txt deleted file mode 100644 index 6aa3184abf6..00000000000 --- a/ckan/templates-bs2/emails/invite_user_subject.txt +++ /dev/null @@ -1 +0,0 @@ -Invite for {{ site_title }} diff --git a/ckan/templates-bs2/emails/reset_password.txt b/ckan/templates-bs2/emails/reset_password.txt deleted file mode 100644 index 803913e2ad6..00000000000 --- a/ckan/templates-bs2/emails/reset_password.txt +++ /dev/null @@ -1,12 +0,0 @@ -Dear {{ user_name }}, - -You have requested your password on {{ site_title }} to be reset. - -Please click the following link to confirm this request: - - {{ reset_link }} - -Have a nice day. - --- -Message sent by {{ site_title }} ({{ site_url }}) diff --git a/ckan/templates-bs2/emails/reset_password_subject.txt b/ckan/templates-bs2/emails/reset_password_subject.txt deleted file mode 100644 index 828b8dc7c93..00000000000 --- a/ckan/templates-bs2/emails/reset_password_subject.txt +++ /dev/null @@ -1 +0,0 @@ -Reset your password - {{ site_title }} diff --git a/ckan/templates-bs2/error_document_template.html b/ckan/templates-bs2/error_document_template.html deleted file mode 100644 index 0baecba15bf..00000000000 --- a/ckan/templates-bs2/error_document_template.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "page.html" %} - -{% block subtitle %}{{ gettext('Error %(error_code)s', error_code=code[0]) }}{% endblock %} - -{% block primary %} -
      -
      - {{ content}} -
      -
      -{% endblock %} - -{% block breadcrumb %} -{% endblock %} - -{% block flash %} - {# eat the flash messages caused by the 404 #} - {% set flash_messages = h.flash.pop_messages() %} -{% endblock %} - -{% block secondary %}{% endblock %} diff --git a/ckan/templates-bs2/footer.html b/ckan/templates-bs2/footer.html deleted file mode 100644 index cb66585c54e..00000000000 --- a/ckan/templates-bs2/footer.html +++ /dev/null @@ -1,39 +0,0 @@ -
      -
      - {% block footer_content %} -
      - -
      - {% block footer_attribution %} -

      {% trans %}Powered by {% endtrans %}

      - {% endblock %} - {% block footer_lang %} - {% snippet "snippets/language_selector.html" %} - {% endblock %} -
      -
      - {% endblock %} -
      - - {% block footer_debug %} - {% if g.debug %} - {% include 'snippets/debug.html' %} - {% endif %} - {% endblock %} -
      diff --git a/ckan/templates-bs2/group/about.html b/ckan/templates-bs2/group/about.html deleted file mode 100644 index 905a922a24f..00000000000 --- a/ckan/templates-bs2/group/about.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends "group/read_base.html" %} - -{% block subtitle %}{{ _('About') }} {{ g.template_title_delimiter }} {{ super() }}{% endblock %} - -{% block primary_content_inner %} -

      - {% block page_heading %} - {{ h.get_translated(group_dict, 'title') or group_dict.display_name }} - {% endblock %} -

      - {% block group_description %} - {% if h.get_translated(group_dict, 'description') %} - {{ h.render_markdown(h.get_translated(group_dict, 'description')) }} - {% endif %} - {% endblock %} - - {% block group_extras %} - {% snippet 'snippets/additional_info.html', extras = h.sorted_extras(group_dict.extras) %} - {% endblock %} -{% endblock %} diff --git a/ckan/templates-bs2/group/activity_stream.html b/ckan/templates-bs2/group/activity_stream.html deleted file mode 100644 index 051d0654573..00000000000 --- a/ckan/templates-bs2/group/activity_stream.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "group/read_base.html" %} - -{% block subtitle %}{{ _('Activity Stream') }} {{ g.template_title_delimiter }} {{ super() }}{% endblock %} - -{% block primary_content_inner %} -

      - {% block page_heading -%} - {{ _('Activity Stream') }} - {%- endblock %} -

      - {% snippet 'snippets/activity_stream.html', activity_stream=activity_stream, id=id, object_type='group' %} -{% endblock %} diff --git a/ckan/templates-bs2/group/admins.html b/ckan/templates-bs2/group/admins.html deleted file mode 100644 index ee98a8a5f55..00000000000 --- a/ckan/templates-bs2/group/admins.html +++ /dev/null @@ -1,10 +0,0 @@ -{% extends "group/read_base.html" %} - -{% block subtitle %}{{ _('Administrators') }} {{ g.template_title_delimiter }} {{ group_dict.title or group_dict.name }}{% endblock %} - -{% block primary_content_inner %} -

      {% block page_heading %}{{ _('Administrators') }}{% endblock %}

      - {% block admins_list %} - {% snippet "user/snippets/followers.html", followers=admins %} - {% endblock %} -{% endblock %} diff --git a/ckan/templates-bs2/group/base_form_page.html b/ckan/templates-bs2/group/base_form_page.html deleted file mode 100644 index 17571fc2a81..00000000000 --- a/ckan/templates-bs2/group/base_form_page.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "group/edit_base.html" %} - -{% block page_primary_action %}{% endblock %} - -{% block breadcrumb_content %} -
    • {{ h.nav_link(_('Groups'), named_route=group_type+'.index') }}
    • -
    • {% block breadcrumb_link %}{{ h.nav_link(_('Add a Group'), named_route=group_type+'.new') }}{% endblock %}
    • -{% endblock %} - -{% block primary_content_inner %} -

      {% block page_heading %}{{ _('Group Form') }}{% endblock %}

      - {% block form %} - {{ form | safe }} - {% endblock %} -{% endblock %} diff --git a/ckan/templates-bs2/group/confirm_delete.html b/ckan/templates-bs2/group/confirm_delete.html deleted file mode 100644 index 155f5790690..00000000000 --- a/ckan/templates-bs2/group/confirm_delete.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "page.html" %} - -{% block subtitle %}{{ _("Confirm Delete") }}{% endblock %} - -{% block maintag %}
      {% endblock %} - -{% block main_content %} -
      -
      - {% block form %} -

      {{ _('Are you sure you want to delete group - {name}?').format(name=group_dict.name) }}

      -

      -

      - - -
      -

      - {% endblock %} -
      -
      -{% endblock %} diff --git a/ckan/templates-bs2/group/confirm_delete_member.html b/ckan/templates-bs2/group/confirm_delete_member.html deleted file mode 100644 index 7bfaf369d6d..00000000000 --- a/ckan/templates-bs2/group/confirm_delete_member.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "page.html" %} - -{% block subtitle %}{{ _("Confirm Delete") }}{% endblock %} - -{% block maintag %}
      {% endblock %} - -{% block main_content %} -
      -
      - {% block form %} -

      {{ _('Are you sure you want to delete member - {name}?').format(name=user_dict.name) }}

      -

      -

      - - - -
      -

      - {% endblock %} -
      -
      -{% endblock %} diff --git a/ckan/templates-bs2/group/edit.html b/ckan/templates-bs2/group/edit.html deleted file mode 100644 index 3bcf125b683..00000000000 --- a/ckan/templates-bs2/group/edit.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "group/base_form_page.html" %} - -{% block breadcrumb_content %} -
    • {% link_for _('Groups'), named_route=group_type+'.index' %}
    • - {% block breadcrumb_content_inner %} -
    • {% link_for h.get_translated(group, 'title') or group.display_name |truncate(35), named_route=group_type+'.read', id=group.name %}
    • -
    • {% link_for _('Manage'), named_route=group_type+'.edit', id=group.name %}
    • - {% endblock %} -{% endblock %} - -{% block page_heading_class %}hide-heading{% endblock %} -{% block page_heading %}{{ _('Edit Group') }}{% endblock %} diff --git a/ckan/templates-bs2/group/edit_base.html b/ckan/templates-bs2/group/edit_base.html deleted file mode 100644 index a53adf17a00..00000000000 --- a/ckan/templates-bs2/group/edit_base.html +++ /dev/null @@ -1,28 +0,0 @@ -{% extends "page.html" %} - -{% block subtitle %} - {{ _('Manage') }} - {{ h.get_translated(group_dict, 'title') or group_dict.display_name }} - {{ _('Groups') }} -{% endblock %} - -{% set group = group_dict %} - -{% block breadcrumb_content %} -
    • {% link_for _('Groups'), named_route=group_type+'.index' %}
    • - {% block breadcrumb_content_inner %} -
    • {% link_for h.get_translated(group, 'title') or group.display_name |truncate(35), named_route=group_type+'.read', id=group.name %}
    • -
    • {% link_for _('Manage'), named_route=group_type+'.edit', id=group.name, named_route=group_type + '_edit' %}
    • - {% endblock %} -{% endblock %} - -{% block content_action %} - {% link_for _('View'), named_route=group_type+'.read', id=group_dict.name, class_='btn', icon='eye' %} -{% endblock %} - -{% block content_primary_nav %} - {{ h.build_nav_icon(group_type + '.edit', _('Edit'), id=group_dict.name) }} - {{ h.build_nav_icon(group_type + '.members', _('Members'), id=group_dict.name) }} -{% endblock %} - -{% block secondary_content %} - {% snippet "group/snippets/info.html", group=group_dict, show_nums=false %} -{% endblock %} diff --git a/ckan/templates-bs2/group/followers.html b/ckan/templates-bs2/group/followers.html deleted file mode 100644 index c51255c2550..00000000000 --- a/ckan/templates-bs2/group/followers.html +++ /dev/null @@ -1,10 +0,0 @@ -{% extends "group/read_base.html" %} - -{% block subtitle %}{{ _('Followers') }} {{ g.template_title_delimiter }} {{ group_dict.title or group_dict.name }}{% endblock %} - -{% block primary_content_inner %} -

      {% block page_heading %}{{ _('Followers') }}{% endblock %}

      - {% block followers_list %} - {% snippet "user/snippets/followers.html", followers=followers %} - {% endblock %} -{% endblock %} diff --git a/ckan/templates-bs2/group/index.html b/ckan/templates-bs2/group/index.html deleted file mode 100644 index 3c20e9d50c4..00000000000 --- a/ckan/templates-bs2/group/index.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "page.html" %} - -{% block subtitle %}{{ _('Groups') }}{% endblock %} - -{% block breadcrumb_content %} -
    • {% link_for _('Groups'), named_route=group_type+'.index' %}
    • -{% endblock %} - -{% block page_header %}{% endblock %} - -{% block page_primary_action %} - {% if h.check_access('group_create') %} - {% link_for _('Add Group'), named_route=group_type+'.new', class_='btn btn-primary', icon='plus-square' %} - {% endif %} -{% endblock %} - -{% block primary_content_inner %} -

      {{ _('Groups') }}

      - {% block groups_search_form %} - {% snippet 'snippets/search_form.html', form_id='group-search-form', type='group', query=q, sorting_selected=sort_by_selected, count=page.item_count, placeholder=_('Search groups...'), show_empty=request.params, no_bottom_border=true if page.items, sorting = [(_('Name Ascending'), 'title asc'), (_('Name Descending'), 'title desc')] %} - {% endblock %} - {% block groups_list %} - {% if page.items or request.params %} - {% if page.items %} - {% snippet "group/snippets/group_list.html", groups=page.items %} - {% endif %} - {% else %} -

      - {{ _('There are currently no groups for this site') }}. - {% if h.check_access('group_create') %} - {% link_for _('How about creating one?'), named_route=group_type+'.new' %}. - {% endif %} -

      - {% endif %} - {% endblock %} - {% block page_pagination %} - {{ page.pager(q=q or '', sort=sort_by_selected or '') }} - {% endblock %} -{% endblock %} - -{% block secondary_content %} - {% snippet "group/snippets/helper.html" %} -{% endblock %} diff --git a/ckan/templates-bs2/group/member_new.html b/ckan/templates-bs2/group/member_new.html deleted file mode 100644 index 28e303546ec..00000000000 --- a/ckan/templates-bs2/group/member_new.html +++ /dev/null @@ -1,87 +0,0 @@ -{% extends "group/edit_base.html" %} - -{% import 'macros/form.html' as form %} - -{% set user = user_dict %} - -{% block primary_content_inner %} - {% link_for _('Back to all members'), named_route=group_type+'.members', id=group.name, class_='btn pull-right', icon='arrow-left' %} -

      - {% block page_heading %}{{ _('Edit Member') if user else _('Add Member') }}{% endblock %} -

      - {% block form %} -
      -
      -
      - {% if not user %} - - - {{ _('If you wish to add an existing user, search for their username below.') }} - - {% endif %} -
      - {% if user %} - - - {% else %} - - {% endif %} -
      -
      - {% if not user %} -
      - {{ _('or') }} -
      -
      - - - {{ _('If you wish to invite a new user, enter their email address.') }} - -
      - -
      -
      - {% endif %} -
      - - {% set format_attrs = {'data-module': 'autocomplete'} %} - {{ form.select('role', label=_('Role'), options=roles, selected=user_role, error='', attrs=format_attrs) }} -
      - {% if user %} - {{ _('Delete') }} - - {% else %} - - {% endif %} -
      -
      - {% endblock %} -{% endblock %} - -{% block secondary_content %} - {{ super() }} -
      -

      - - {{ _('What are roles?') }} -

      -
      - {% trans %} -

      Admin: Can edit group information, as well as - manage organization members.

      -

      Member: Can add/remove datasets from groups

      - {% endtrans %} -
      -
      -{% endblock %} diff --git a/ckan/templates-bs2/group/members.html b/ckan/templates-bs2/group/members.html deleted file mode 100644 index 12bc60487aa..00000000000 --- a/ckan/templates-bs2/group/members.html +++ /dev/null @@ -1,38 +0,0 @@ -{% extends "group/edit_base.html" %} - -{% block subtitle %}{{ _('Members') }} {{ g.template_title_delimiter }} {{ group_dict.display_name }} {{ g.template_title_delimiter }} {{ _('Groups') }}{% endblock %} - -{% block page_primary_action %} - {% link_for _('Add Member'), named_route=group_type+'.member_new', id=group_dict.id, class_='btn btn-primary', icon='plus-square' %} -{% endblock %} - -{% block primary_content_inner %} -

      {{ _('{0} members'.format(members|length)) }}

      - - - - - - - - - - {% for user_id, user, role in members %} - - - - - - {% endfor %} - -
      {{ _('User') }}{{ _('Role') }}
      - {{ h.linked_user(user_id, maxlength=20) }} - {{ role }} - -
      -{% endblock %} diff --git a/ckan/templates-bs2/group/new.html b/ckan/templates-bs2/group/new.html deleted file mode 100644 index 75fad5ef460..00000000000 --- a/ckan/templates-bs2/group/new.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "group/base_form_page.html" %} - -{% block subtitle %}{{ _('Create a Group') }}{% endblock %} - -{% block breadcrumb_link %}{{ h.nav_link(_('Create a Group'), named_route=group_type+'.new') }}{% endblock %} - -{% block page_heading %}{{ _('Create a Group') }}{% endblock %} - -{% block page_header %}{% endblock %} - -{% block secondary_content %} - {% snippet "group/snippets/helper.html" %} -{% endblock %} diff --git a/ckan/templates-bs2/group/new_group_form.html b/ckan/templates-bs2/group/new_group_form.html deleted file mode 100644 index a330c973967..00000000000 --- a/ckan/templates-bs2/group/new_group_form.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "group/snippets/group_form.html" %} - -{# -As the form is rendered as a seperate page we take advantage of this by -overriding the form blocks depending on the current context -#} -{% block dataset_fields %} - {% if action == "edit" %}{{ super() }}{% endif %} -{% endblock %} - -{% block custom_fields %} - {% if action == "edit" %}{{ super() }}{% endif %} -{% endblock %} - -{% block save_text %} - {%- if action == "edit" -%} - {{ _('Update Group') }} - {%- else -%} - {{ _('Create Group') }} - {%- endif -%} -{% endblock %} - -{% block delete_button %} - {% if action == "edit" %}{{ super() }}{% endif %} -{% endblock %} diff --git a/ckan/templates-bs2/group/read.html b/ckan/templates-bs2/group/read.html deleted file mode 100644 index db9f3744009..00000000000 --- a/ckan/templates-bs2/group/read.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "group/read_base.html" %} - -{% block subtitle %}{{ h.get_translated(group_dict, 'title') or group_dict.display_name }}{% endblock %} - -{% block primary_content_inner %} - {% block groups_search_form %} - {% set facets = { - 'fields': fields_grouped, - 'search': search_facets, - 'titles': facet_titles, - 'translated_fields': translated_fields, - 'remove_field': remove_field } - %} - {% set sorting = [ - (_('Relevance'), 'score desc, metadata_modified desc'), - (_('Name Ascending'), 'title_string asc'), - (_('Name Descending'), 'title_string desc'), - (_('Last Modified'), 'metadata_modified desc'), - (_('Popular'), 'views_recent desc') if g.tracking_enabled else (false, false) ] - %} - {% snippet 'snippets/search_form.html', form_id='group-datasets-search-form', type='dataset', query=q, sorting=sorting, sorting_selected=sort_by_selected, count=page.item_count, facets=facets, placeholder=_('Search datasets...'), show_empty=request.params, fields=fields %} - {% endblock %} - {% block packages_list %} - {% if page.items %} - {{ h.snippet('snippets/package_list.html', packages=page.items) }} - {% endif %} - {% endblock %} - {% block page_pagination %} - {{ page.pager(q=q) }} - {% endblock %} -{% endblock %} - -{% block secondary_content %} - {{ super() }} -
      -
      - {% for facet in facet_titles %} - {{ h.snippet('snippets/facet_list.html', title=facet_titles[facet], name=facet, extras={'id':group_dict.id}) }} - {% endfor %} -
      - close -
      -{% endblock %} diff --git a/ckan/templates-bs2/group/read_base.html b/ckan/templates-bs2/group/read_base.html deleted file mode 100644 index 368b7b0d291..00000000000 --- a/ckan/templates-bs2/group/read_base.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends "page.html" %} - -{% block subtitle %}{{ h.get_translated(group_dict, 'title') or group_dict.display_name }} {{ g.template_title_delimiter }} {{ _('Groups') }}{% endblock %} - -{% block breadcrumb_content %} -
    • {% link_for _('Groups'), named_route=group_type+'.index' %}
    • -
    • {% link_for h.get_translated(group_dict, 'title') or group_dict.display_name |truncate(35), named_route=group_type+'.read', id=group_dict.name %}
    • -{% endblock %} - -{% block content_action %} - {% if h.check_access('group_update', {'id': group_dict.id}) %} - {% link_for _('Manage'), named_route=group_type+'.edit', id=group_dict.name, class_='btn', icon='wrench' %} - {% endif %} -{% endblock %} - -{% block content_primary_nav %} - {{ h.build_nav_icon(group_type + '.read', _('Datasets'), id=group_dict.name) }} - {{ h.build_nav_icon(group_type + '.activity', _('Activity Stream'), id=group_dict.name, offset=0) }} - {{ h.build_nav_icon(group_type + '.about', _('About'), id=group_dict.name) }} -{% endblock %} - -{% block secondary_content %} - {% snippet "group/snippets/info.html", group=group_dict, show_nums=true %} -{% endblock %} - -{% block links %} - {{ super() }} - {% include "group/snippets/feeds.html" %} -{% endblock %} diff --git a/ckan/templates-bs2/group/snippets/feeds.html b/ckan/templates-bs2/group/snippets/feeds.html deleted file mode 100644 index c60eadcd6c4..00000000000 --- a/ckan/templates-bs2/group/snippets/feeds.html +++ /dev/null @@ -1,4 +0,0 @@ -{%- set dataset_feed = h.url_for('feeds.group', id=group_dict.name) -%} -{%- set history_feed = h.url_for(controller='revision', action='list', format='atom', days=1) -%} - - diff --git a/ckan/templates-bs2/group/snippets/group_form.html b/ckan/templates-bs2/group/snippets/group_form.html deleted file mode 100644 index 058f4d2e50a..00000000000 --- a/ckan/templates-bs2/group/snippets/group_form.html +++ /dev/null @@ -1,43 +0,0 @@ -{% import 'macros/form.html' as form %} - -
      - {% block error_summary %} - {{ form.errors(error_summary) }} - {% endblock %} - - {% block basic_fields %} - {% set attrs = {'data-module': 'slug-preview-target'} %} - {{ form.input('title', label=_('Name'), id='field-name', placeholder=_('My Group'), value=data.title, error=errors.title, classes=['control-full'], attrs=attrs) }} - - {# Perhaps these should be moved into the controller? #} - {% set prefix = h.url_for(group_type + '.read', id='') %} - {% set domain = h.url_for(group_type + '.read', id='', qualified=true) %} - {% set domain = domain|replace("http://", "")|replace("https://", "") %} - {% set attrs = {'data-module': 'slug-preview-slug', 'data-module-prefix': domain, 'data-module-placeholder': '<' + group_type + '>'} %} - - {{ form.prepend('name', label=_('URL'), prepend=prefix, id='field-url', placeholder=_('my-' + group_type), value=data.name, error=errors.name, attrs=attrs, is_required=true) }} - - {{ form.markdown('description', label=_('Description'), id='field-description', placeholder=_('A little information about my group...'), value=data.description, error=errors.description) }} - - {% set is_upload = data.image_url and not data.image_url.startswith('http') %} - {% set is_url = data.image_url and data.image_url.startswith('http') %} - - {{ form.image_upload(data, errors, is_upload_enabled=h.uploads_enabled(), is_url=is_url, is_upload=is_upload) }} - - {% endblock %} - - {% block custom_fields %} - {% snippet 'snippets/custom_form_fields.html', extras=data.extras, errors=errors, limit=3 %} - {% endblock %} - - {{ form.required_message() }} - -
      - {% block delete_button %} - {% if h.check_access('group_delete', {'id': data.id}) %} - {% block delete_button_text %}{{ _('Delete') }}{% endblock %} - {% endif %} - {% endblock %} - -
      -
      diff --git a/ckan/templates-bs2/group/snippets/group_item.html b/ckan/templates-bs2/group/snippets/group_item.html deleted file mode 100644 index cc6021201ce..00000000000 --- a/ckan/templates-bs2/group/snippets/group_item.html +++ /dev/null @@ -1,50 +0,0 @@ -{# -Renders a media item for a group. This should be used in a list. - -group - A group dict. - -Example: - -
        - {% for group in groups %} - {% snippet "group/snippets/group_item.html", group=group %} - {% endfor %} -
      -#} -{% set type = group.type or 'group' %} -{% set url = h.url_for(type ~ '.read', id=group.name) %} -{% block item %} -
    • - {% block item_inner %} - {% block image %} - {{ group.name }} - {% endblock %} - {% block title %} -

      {{ h.get_translated(group, 'title') or group.display_name }}

      - {% endblock %} - {% block description %} - {% if h.get_translated(group, 'description') %} -

      {{ h.markdown_extract(h.get_translated(group, 'description'), extract_length=80) }}

      - {% endif %} - {% endblock %} - {% block datasets %} - {% if group.package_count %} - {{ ungettext('{num} Dataset', '{num} Datasets', group.package_count).format(num=group.package_count) }} - {% elif group.package_count == 0 %} - {{ _('0 Datasets') }} - {% endif %} - {% endblock %} - {% block link %} - - {{ _('View {name}').format(name=h.get_translated(group, 'title') or group.display_name) }} - - {% endblock %} - {% if group.user_member %} - - {% endif %} - {% endblock %} -
    • -{% endblock %} -{% if position is divisibleby 3 %} -
    • -{% endif %} diff --git a/ckan/templates-bs2/group/snippets/group_list.html b/ckan/templates-bs2/group/snippets/group_list.html deleted file mode 100644 index d171296d09d..00000000000 --- a/ckan/templates-bs2/group/snippets/group_list.html +++ /dev/null @@ -1,19 +0,0 @@ -{# -Display a grid of group items. - -groups - A list of groups. - -Example: - - {% snippet "group/snippets/group_list.html" %} - -#} -{% block group_list %} -
        - {% block group_list_inner %} - {% for group in groups %} - {% snippet "group/snippets/group_item.html", group=group, position=loop.index %} - {% endfor %} - {% endblock %} -
      -{% endblock %} diff --git a/ckan/templates-bs2/group/snippets/helper.html b/ckan/templates-bs2/group/snippets/helper.html deleted file mode 100644 index 08257bc135a..00000000000 --- a/ckan/templates-bs2/group/snippets/helper.html +++ /dev/null @@ -1,16 +0,0 @@ -
      -

      - - {{ _('What are Groups?') }} -

      -
      -

      - {% trans %} - You can use CKAN Groups to create and manage collections of datasets. - This could be to catalogue datasets for a particular project or team, - or on a particular theme, or as a very simple way to help people find - and search your own published datasets. - {% endtrans %} -

      -
      -
      \ No newline at end of file diff --git a/ckan/templates-bs2/group/snippets/info.html b/ckan/templates-bs2/group/snippets/info.html deleted file mode 100644 index a62ff8cce5c..00000000000 --- a/ckan/templates-bs2/group/snippets/info.html +++ /dev/null @@ -1,50 +0,0 @@ -{% block info %} -
      -
      - {% block inner %} - {% block image %} -
      - - {{ group.name }} - -
      - {% endblock %} - {% block heading %} -

      - {{ h.get_translated(group, 'title') or group.display_name }} - {% if group.state == 'deleted' %} - [{{ _('Deleted') }}] - {% endif %} -

      - {% endblock %} - {% block description %} - {% if h.get_translated(group, 'description') %} -

      - {{ h.markdown_extract(h.get_translated(group, 'description'), 180) }} - {% link_for _('read more'), named_route=group_type+'.about', id=group.name %} -

      - {% endif %} - {% endblock %} - {% if show_nums %} - {% block nums %} -
      -
      -
      {{ _('Followers') }}
      -
      {{ h.SI_number_span(group.num_followers) }}
      -
      -
      -
      {{ _('Datasets') }}
      -
      {{ h.SI_number_span(group.package_count) }}
      -
      -
      - {% endblock %} - {% block follow %} - - {% endblock %} - {% endif %} - {% endblock %} -
      -
      -{% endblock %} diff --git a/ckan/templates-bs2/header.html b/ckan/templates-bs2/header.html deleted file mode 100644 index f54463bb6e8..00000000000 --- a/ckan/templates-bs2/header.html +++ /dev/null @@ -1,124 +0,0 @@ -{% block header_wrapper %} -{% block header_account %} - -{% endblock %} - -{% endblock %} diff --git a/ckan/templates-bs2/home/about.html b/ckan/templates-bs2/home/about.html deleted file mode 100644 index 98a3c03e69b..00000000000 --- a/ckan/templates-bs2/home/about.html +++ /dev/null @@ -1,24 +0,0 @@ -{% extends "page.html" %} - -{% block subtitle %}{{ _('About') }}{% endblock %} - -{% block breadcrumb_content %} -
    • {% link_for _('About'), controller='home', action='about' %}
    • -{% endblock %} - -{% block primary %} -
      -
      - {% block about %} - {% if g.site_about %} - {{ h.render_markdown(g.site_about) }} - {% else %} -

      {{ _('About') }}

      - {% snippet 'home/snippets/about_text.html' %} - {% endif %} - {% endblock %} -
      -
      -{% endblock %} - -{% block secondary %}{% endblock %} diff --git a/ckan/templates-bs2/home/index.html b/ckan/templates-bs2/home/index.html deleted file mode 100644 index b28ac82c05d..00000000000 --- a/ckan/templates-bs2/home/index.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "page.html" %} -{% set homepage_style = ( g.homepage_style or '1' ) %} - -{% block subtitle %}{{ _("Welcome") }}{% endblock %} - -{% block maintag %}{% endblock %} -{% block toolbar %}{% endblock %} - -{% block content %} -
      -
      - {{ self.flash() }} -
      - {% block primary_content %} - {% snippet "home/layout{0}.html".format(homepage_style) %} - {% endblock %} -
      -{% endblock %} diff --git a/ckan/templates-bs2/home/layout1.html b/ckan/templates-bs2/home/layout1.html deleted file mode 100644 index 41e6c2024c9..00000000000 --- a/ckan/templates-bs2/home/layout1.html +++ /dev/null @@ -1,37 +0,0 @@ -
      -
      -
      -
      - {% block promoted %} - {% snippet 'home/snippets/promoted.html' %} - {% endblock %} -
      -
      - {% block search %} - {% snippet 'home/snippets/search.html' %} - {% endblock %} -
      -
      -
      -
      -
      -
      -
      -
      - {# Note: this featured_group block is used as an example in the theming - tutorial in the docs! If you change this code, be sure to check - whether you need to update the docs. #} - {# Start template block example. #} - {% block featured_group %} - {% snippet 'home/snippets/featured_group.html' %} - {% endblock %} - {# End template block example. #} -
      -
      - {% block featured_organization %} - {% snippet 'home/snippets/featured_organization.html' %} - {% endblock %} -
      -
      -
      -
      diff --git a/ckan/templates-bs2/home/layout2.html b/ckan/templates-bs2/home/layout2.html deleted file mode 100644 index bab42f388b1..00000000000 --- a/ckan/templates-bs2/home/layout2.html +++ /dev/null @@ -1,35 +0,0 @@ -
      -
      -
      -
      - {% block search %} - {% snippet 'home/snippets/search.html' %} - {% endblock %} - {% block stats %} - {% snippet 'home/snippets/stats.html' %} - {% endblock %} -
      -
      - {% block promoted %} - {% snippet 'home/snippets/promoted.html' %} - {% endblock %} -
      -
      -
      -
      -
      -
      -
      -
      - {% block featured_organization %} - {% snippet 'home/snippets/featured_organization.html' %} - {% endblock %} -
      -
      - {% block featured_group %} - {% snippet 'home/snippets/featured_group.html' %} - {% endblock %} -
      -
      -
      -
      diff --git a/ckan/templates-bs2/home/layout3.html b/ckan/templates-bs2/home/layout3.html deleted file mode 100644 index dc80b32581d..00000000000 --- a/ckan/templates-bs2/home/layout3.html +++ /dev/null @@ -1,23 +0,0 @@ -
      -
      - {% block search %} - {% snippet 'home/snippets/search.html' %} - {% endblock %} -
      -
      -
      -
      -
      -
      - {% block promoted %} - {% snippet 'home/snippets/promoted.html' %} - {% endblock %} -
      -
      - {% block stats %} - {% snippet 'home/snippets/stats.html' %} - {% endblock %} -
      -
      -
      -
      diff --git a/ckan/templates-bs2/home/snippets/about_text.html b/ckan/templates-bs2/home/snippets/about_text.html deleted file mode 100644 index dc096fa072f..00000000000 --- a/ckan/templates-bs2/home/snippets/about_text.html +++ /dev/null @@ -1,20 +0,0 @@ -{% trans %} -

      CKAN is the world’s leading open-source data portal platform.

      - -

      CKAN is a complete out-of-the-box software solution that makes data -accessible and usable – by providing tools to streamline publishing, sharing, -finding and using data (including storage of data and provision of robust data -APIs). CKAN is aimed at data publishers (national and regional governments, -companies and organizations) wanting to make their data open and available.

      - -

      CKAN is used by governments and user groups worldwide and powers a variety -of official and community data portals including portals for local, national -and international government, such as the UK’s data.gov.uk and the -European Union’s publicdata.eu, the Brazilian dados.gov.br, Dutch and -Netherland government portals, as well as city and municipal sites in the US, -UK, Argentina, Finland and elsewhere.

      - -

      CKAN: http://ckan.org/
      -CKAN Tour: http://ckan.org/tour/
      -Features overview: http://ckan.org/features/

      -{% endtrans %} diff --git a/ckan/templates-bs2/home/snippets/featured_group.html b/ckan/templates-bs2/home/snippets/featured_group.html deleted file mode 100644 index d4069faf618..00000000000 --- a/ckan/templates-bs2/home/snippets/featured_group.html +++ /dev/null @@ -1,7 +0,0 @@ -{% set groups = h.get_featured_groups() %} - -{% for group in groups %} -
      - {% snippet 'snippets/group_item.html', group=group, truncate=50, truncate_title=35 %} -
      -{% endfor %} diff --git a/ckan/templates-bs2/home/snippets/featured_organization.html b/ckan/templates-bs2/home/snippets/featured_organization.html deleted file mode 100644 index 7cf9ddb7482..00000000000 --- a/ckan/templates-bs2/home/snippets/featured_organization.html +++ /dev/null @@ -1,7 +0,0 @@ -{% set organizations = h.get_featured_organizations() %} - -{% for organization in organizations %} -
      - {% snippet 'snippets/organization_item.html', organization=organization, truncate=50, truncate_title=35 %} -
      -{% endfor %} diff --git a/ckan/templates-bs2/home/snippets/promoted.html b/ckan/templates-bs2/home/snippets/promoted.html deleted file mode 100644 index ff8a10c3cfa..00000000000 --- a/ckan/templates-bs2/home/snippets/promoted.html +++ /dev/null @@ -1,27 +0,0 @@ -{% set intro = g.site_intro_text %} - -
      -
      - {% if intro %} - {{ h.render_markdown(intro) }} - {% else %} -

      {{ _("Welcome to CKAN") }}

      -

      - {% trans %}This is a nice introductory paragraph about CKAN or the site - in general. We don't have any copy to go here yet but soon we will - {% endtrans %} -

      - {% endif %} -
      - - {% block home_image %} - - {% endblock %} -
      diff --git a/ckan/templates-bs2/home/snippets/search.html b/ckan/templates-bs2/home/snippets/search.html deleted file mode 100644 index 72b74d4cdcd..00000000000 --- a/ckan/templates-bs2/home/snippets/search.html +++ /dev/null @@ -1,22 +0,0 @@ -{% set tags = h.get_facet_items_dict('tags', c.search_facets, limit=3) %} -{% set placeholder = _('E.g. environment') %} - - diff --git a/ckan/templates-bs2/home/snippets/stats.html b/ckan/templates-bs2/home/snippets/stats.html deleted file mode 100644 index 4643456922a..00000000000 --- a/ckan/templates-bs2/home/snippets/stats.html +++ /dev/null @@ -1,29 +0,0 @@ -{% set stats = h.get_site_statistics() %} - - diff --git a/ckan/templates-bs2/macros/autoform.html b/ckan/templates-bs2/macros/autoform.html deleted file mode 100644 index 7a769508b64..00000000000 --- a/ckan/templates-bs2/macros/autoform.html +++ /dev/null @@ -1,70 +0,0 @@ -{# -Builds a form from the supplied form_info list/tuple. All form info dicts -can also contain an "extra_info" key which will add some help text after the -input element. - -form_info - A list of dicts describing the form field to build. -data - The form data object. -errors - The form errors object. -error_summary - A list of errors to display above the fields. - -Example - - {% set form_info = [ - {'name': 'ckan.site_title', 'control': 'input', 'label': _('Site Title'), 'placeholder': ''}, - {'name': 'ckan.main_css', 'control': 'select', 'options': styles, 'label': _('Style'), 'placeholder': ''}, - {'name': 'ckan.site_description', 'control': 'input', 'label': _('Site Tag Line'), 'placeholder': ''}, - {'name': 'ckan.site_logo', 'control': 'input', 'label': _('Site Tag Logo'), 'placeholder': ''}, - {'name': 'ckan.site_about', 'control': 'markdown', 'label': _('About'), 'placeholder': _('About page text')}, - {'name': 'ckan.site_intro_text', 'control': 'markdown', 'label': _('Intro Text'), 'placeholder': _('Text on home page')}, - {'name': 'ckan.site_custom_css', 'control': 'textarea', 'label': _('Custom CSS'), 'placeholder': _('Customisable css inserted into the page header')}, - ] %} - - {% import 'macros/autoform.html' as autoform %} - {{ autoform.generate(form_info, data, errors) }} - -#} -{% import 'macros/form.html' as form %} -{%- macro generate(form_info=[], data={}, errors={}, error_summary=[]) -%} - {{ form.errors(error_summary) if error_summary }} - - {% for item in form_info %} - {% set name = item.name %} - {% set value = data.get(name) %} - {% set error = errors.get(name) %} - {% set id = 'field-%s' % (name|lower|replace('_', '-')|replace('.', '-')) %} - - {% set control = item.control or 'input' %} - {% set label = item.label %} - {% set placeholder = item.placeholder %} - - {% set classes = item.classes or [] %} - {% set classes = ['control-medium'] if not classes and control == 'input' %} - - {% if control == 'select' %} - {% call form.select(name, id=id, label=label, options=item.options, selected=value, error=error) %} - {% if item.extra_info %}{{ form.info(item.extra_info) }}{% endif %} - {% endcall %} - {% elif control == 'html' %} -
      -
      - {{ item.html }} -
      -
      - {% elif control == 'image_upload' %} - {% set field_url = item.field_url or 'image_url' %} - {% set is_upload = data[field_url] and not data[field_url].startswith('http') %} - {% set is_url = data[field_url] and data[field_url].startswith('http') %} - - {% set field_upload = item.field_upload or 'image_upload' %} - {% set field_clear = item.field_clear or 'clear_upload' %} - - {{ form.image_upload(data, errors, is_upload_enabled=item.upload_enabled, is_url=is_url, is_upload=is_upload, upload_label = _('Site logo'), url_label=_('Site logo'), - field_url=field_url, field_upload=field_upload, field_clear=field_clear)}} - {% else %} - {% call form[control](name, id=id, label=label, placeholder=placeholder, value=value, error=error, classes=classes) %} - {% if item.extra_info %}{{ form.info(item.extra_info) }}{% endif %} - {% endcall %} - {% endif %} - {% endfor %} -{%- endmacro -%} diff --git a/ckan/templates-bs2/macros/form.html b/ckan/templates-bs2/macros/form.html deleted file mode 100644 index ba8d60c9532..00000000000 --- a/ckan/templates-bs2/macros/form.html +++ /dev/null @@ -1,430 +0,0 @@ -{# -Creates all the markup required for an input element. Handles matching labels to -inputs, error messages and other useful elements. - -name - The name of the form parameter. -id - The id to use on the input and label. Convention is to prefix with 'field-'. -label - The human readable label. -value - The value of the input. -placeholder - Some placeholder text. -type - The type of input eg. email, url, date (default: text). -error - A list of error strings for the field or just true to highlight the field. -classes - An array of classes to apply to the control-group. -is_required - Boolean of whether this input is requred for the form to validate - -Examples: - - {% import 'macros/form.html' as form %} - {{ form.input('title', label=_('Title'), value=data.title, error=errors.title) }} - -#} -{% macro input(name, id='', label='', value='', placeholder='', type='text', error="", classes=[], attrs={}, is_required=false) %} - {%- set extra_html = caller() if caller -%} - - {% call input_block(id or name, label or name, error, classes, extra_html=extra_html, is_required=is_required) %} - - {% endcall %} -{% endmacro %} - -{# -Builds a single checkbox input. - -name - The name of the form parameter. -id - The id to use on the input and label. Convention is to prefix with 'field-'. -label - The human readable label. -value - The value of the input. -checked - If true the checkbox will be checked -error - An error string for the field or just true to highlight the field. -classes - An array of classes to apply to the control-group. -is_required - Boolean of whether this input is requred for the form to validate - -Example: - - {% import 'macros/form.html' as form %} - {{ form.checkbox('remember', checked=true) }} - -#} -{% macro checkbox(name, id='', label='', value='', checked=false, placeholder='', error="", classes=[], attrs={}, is_required=false) %} - {%- set extra_html = caller() if caller -%} -
      -
      - - {{ extra_html }} -
      -
      -{% endmacro %} - -{# -Creates all the markup required for an select element. Handles matching labels to -inputs and error messages. - -A field should be a dict with a "value" key and an optional "text" key which -will be displayed to the user. We use a dict to easily allow extension in -future should extra options be required. - -name - The name of the form parameter. -id - The id to use on the input and label. Convention is to prefix with 'field-'. -label - The human readable label. -options - A list/tuple of fields to be used as . -selected - The value of the selected