From 51b47bc4e1c262e7330c011649ddb56be226f3cc Mon Sep 17 00:00:00 2001 From: Kevin Cristiano <kcristiano@kcristiano.com> Date: Thu, 5 Dec 2024 08:38:25 -0500 Subject: [PATCH] civicrm release-5.80.0 --- civicrm.php | 4 +- civicrm/CRM/Activity/BAO/Activity.php | 6 - civicrm/CRM/Admin/Page/Job.php | 26 +- civicrm/CRM/Batch/Form/Entry.php | 2 +- civicrm/CRM/Campaign/Form/Campaign.php | 3 +- .../CRM/Campaign/Page/Petition/Confirm.php | 2 +- civicrm/CRM/Contact/BAO/Contact/Utils.php | 2 +- civicrm/CRM/Contact/BAO/Query.php | 2 +- civicrm/CRM/Contact/Form/Contact.php | 6 +- civicrm/CRM/Contact/Form/Edit/Individual.php | 6 +- civicrm/CRM/Contact/Form/Search.php | 2 +- civicrm/CRM/Contact/Form/Search/Criteria.php | 2 +- civicrm/CRM/Contact/Form/Task/Map/Event.php | 2 +- civicrm/CRM/Contact/Page/View/Log.php | 11 +- civicrm/CRM/Contact/Page/View/Tag.php | 6 + civicrm/CRM/Contact/Page/View/Vcard.php | 2 +- civicrm/CRM/Contribute/BAO/Contribution.php | 13 +- civicrm/CRM/Contribute/BAO/Product.php | 77 +- .../Contribute/Form/Contribution/Confirm.php | 133 +- .../CRM/Contribute/Form/ManagePremiums.php | 36 +- civicrm/CRM/Core/BAO/Address.php | 3 +- civicrm/CRM/Core/BAO/ConfigSetting.php | 9 +- civicrm/CRM/Core/BAO/CustomField.php | 3 + civicrm/CRM/Core/Config.php | 3 - civicrm/CRM/Core/Error.php | 2 +- civicrm/CRM/Core/Form/Search.php | 2 +- civicrm/CRM/Core/JobManager.php | 69 +- civicrm/CRM/Core/Permission/Standalone.php | 6 +- civicrm/CRM/Core/Resources.php | 4 +- .../CRM/Core/WorkflowMessage/ProfileTrait.php | 214 + civicrm/CRM/Custom/Form/CustomDataTrait.php | 21 +- civicrm/CRM/Dedupe/Merger.php | 42 +- civicrm/CRM/Event/BAO/Event.php | 58 +- civicrm/CRM/Event/Form/Registration.php | 6 + civicrm/CRM/Event/Page/EventInfo.php | 2 +- .../WorkflowMessage/EventOfflineReceipt.php | 2 +- .../WorkflowMessage/ParticipantTrait.php | 24 +- civicrm/CRM/Export/Form/Select.php | 18 + civicrm/CRM/Extension/Container/Basic.php | 2 +- civicrm/CRM/Group/Form/Edit.php | 18 +- civicrm/CRM/Mailing/BAO/Mailing.php | 42 +- civicrm/CRM/Mailing/Form/Optout.php | 4 +- civicrm/CRM/Mailing/Form/Unsubscribe.php | 2 +- civicrm/CRM/Mailing/Page/Confirm.php | 2 +- civicrm/CRM/Mailing/Selector/Browse.php | 2 +- civicrm/CRM/Member/BAO/MembershipType.php | 2 +- civicrm/CRM/Member/Page/UserDashboard.php | 46 + civicrm/CRM/Price/Form/Field.php | 4 +- civicrm/CRM/Report/Form.php | 8 +- civicrm/CRM/Report/Form/Instance.php | 1 + civicrm/CRM/Upgrade/Incremental/Base.php | 24 + .../Upgrade/Incremental/php/FiveEighty.php | 62 + .../Incremental/sql/5.80.alpha1.mysql.tpl | 1 + civicrm/CRM/Utils/EnglishNumber.php | 47 +- civicrm/CRM/Utils/Mail.php | 2 +- civicrm/CRM/Utils/System.php | 13 +- civicrm/CRM/Utils/System/Base.php | 68 +- civicrm/CRM/Utils/System/Joomla.php | 3 +- civicrm/CRM/Utils/System/Standalone.php | 404 +- civicrm/CRM/Utils/System/WordPress.php | 3 +- civicrm/CRM/Utils/Time.php | 34 + .../Action/LocBlock/LocBlockSaveTrait.php | 5 +- .../HierarchicalEntitySubscriber.php | 31 +- .../Civi/Api4/Generic/DAOGetFieldsAction.php | 11 +- .../Traits/SavedSearchInspectorTrait.php | 10 + .../DAOFieldsCallbackAdapterSpecProvider.php | 22 +- .../HierarchicalEntitySpecProvider.php | 20 +- .../Civi/Api4/Service/Spec/SpecFormatter.php | 2 +- civicrm/Civi/Api4/Utils/FormattingUtil.php | 16 +- civicrm/Civi/Core/SettingsManager.php | 15 +- .../Civi/Schema/LegacySqlEntityMetadata.php | 3 + civicrm/Civi/Test/Api4TestTrait.php | 19 + civicrm/Civi/Test/EventTestTrait.php | 33 +- civicrm/Civi/Test/MinkBase.php | 3 +- civicrm/Civi/Token/TokenRow.php | 32 +- civicrm/ang/api4Explorer/Explorer.js | 1 + civicrm/api/api.php | 11 + civicrm/api/v3/Setting.php | 18 +- civicrm/civicrm-version.php | 2 +- civicrm/composer.json | 2 +- civicrm/composer.lock | 14 +- civicrm/css/civicrm.css | 10 +- civicrm/css/searchForm.css | 11 +- civicrm/deleted-files-list.json | 29 +- .../afGuiEditor/afGuiEditOptions.component.js | 18 +- .../Api4/Action/Afform/AbstractProcessor.php | 14 +- .../core/Civi/Api4/Action/Afform/Submit.php | 4 +- .../afform/core/ang/af/afButton.directive.js | 38 + .../afform/core/ang/af/afField.component.js | 28 +- .../afform/core/ang/af/afForm.component.js | 5 + .../api/v4/Afform/AfformEventUsageTest.php | 123 +- civicrm/ext/authx/authx.php | 4 + .../managed/SavedSearch_ACL_Roles.mgd.php | 1 + ...nister_Assigned_Financial_Accounts.mgd.php | 1 + ...vedSearch_Administer_Contact_Types.mgd.php | 1 + ...vedSearch_Administer_Custom_Fields.mgd.php | 1 + ...vedSearch_Administer_Custom_Groups.mgd.php | 1 + ...arch_Administer_Financial_Accounts.mgd.php | 1 + ...dSearch_Administer_Financial_Types.mgd.php | 1 + ...edSearch_Administer_Location_Types.mgd.php | 1 + ...avedSearch_Administer_Manage_Group.mgd.php | 2 + ...arch_Administer_Payment_Processors.mgd.php | 1 + ...vedSearch_Administer_ProfileFields.mgd.php | 1 + .../SavedSearch_Administer_Profiles.mgd.php | 1 + ...arch_Administer_Relationship_Types.mgd.php | 1 + ...ers_Footers_and_Automated_Messages.mgd.php | 1 + ...SavedSearch_Import_Export_Mappings.mgd.php | 1 + .../managed/SavedSearch_Label_Formats.mgd.php | 1 + ...edSearch_Manage_Contribution_Pages.mgd.php | 1 + .../SavedSearch_Manage_Mail_Accounts.mgd.php | 1 + .../SavedSearch_Manage_Premiums.mgd.php | 1 + .../SavedSearch_Manage_Scheduled_Jobs.mgd.php | 1 + ...SavedSearch_Print_Page_PDF_Formats.mgd.php | 1 + .../managed/SavedSearch_Queues.mgd.php | 1 + .../managed/SavedSearch_SMS_Provider.mgd.php | 1 + .../SavedSearch_Scheduled_Jobs_Log.mgd.php | 1 + ...edSearch_Settings_Date_Preferences.mgd.php | 1 + .../ang/afsearchFindContributions.aff.html | 2 +- .../ang/afsearchFindMemberships.aff.html | 2 +- civicrm/ext/greenwich/dist/bootstrap3.css | 6 + civicrm/ext/greenwich/dist/bootstrap3.min.css | 2 +- civicrm/ext/greenwich/scss/_tweaks.scss | 6 + civicrm/ext/oauth-client/info.xml | 1 + civicrm/ext/riverlea/.gitignore | 2 + civicrm/ext/riverlea/CHANGELOG.md | 544 +++ .../ext/riverlea/Civi/riverlea/DynamicCss.php | 114 + civicrm/ext/riverlea/LICENSE.txt | 667 +++ civicrm/ext/riverlea/README.md | 151 + civicrm/ext/riverlea/composer.json | 5 + .../ext/riverlea/core/ang/crmStatusPage.css | 91 + .../core/civi_mail-ang/crmMailing.css | 62 + civicrm/ext/riverlea/core/css/_base.css | 436 ++ civicrm/ext/riverlea/core/css/_bootstrap.css | 3886 +++++++++++++++++ civicrm/ext/riverlea/core/css/_cms.css | 211 + civicrm/ext/riverlea/core/css/_core.css | 8 + civicrm/ext/riverlea/core/css/_fixes.css | 888 ++++ civicrm/ext/riverlea/core/css/_variables.css | 430 ++ civicrm/ext/riverlea/core/css/admin.css | 103 + .../ext/riverlea/core/css/api4-explorer.css | 179 + civicrm/ext/riverlea/core/css/civicrm.css | 4 + .../core/css/components/_accordion.css | 155 + .../riverlea/core/css/components/_alerts.css | 109 + .../riverlea/core/css/components/_buttons.css | 593 +++ .../core/css/components/_components.css | 643 +++ .../riverlea/core/css/components/_dialogs.css | 225 + .../core/css/components/_dropdowns.css | 459 ++ .../riverlea/core/css/components/_form.css | 834 ++++ .../riverlea/core/css/components/_front.css | 219 + .../riverlea/core/css/components/_icons.css | 351 ++ .../ext/riverlea/core/css/components/_nav.css | 62 + .../riverlea/core/css/components/_page.css | 216 + .../riverlea/core/css/components/_tables.css | 508 +++ .../riverlea/core/css/components/_tabs.css | 179 + .../ext/riverlea/core/css/contactSummary.css | 412 ++ civicrm/ext/riverlea/core/css/crm-i.css | 44 + .../ext/riverlea/core/css/crm-iconPicker.css | 27 + civicrm/ext/riverlea/core/css/dashboard.css | 203 + civicrm/ext/riverlea/core/css/joomla.css | 72 + .../ext/riverlea/core/css/rename-css-var.php | 89 + civicrm/ext/riverlea/core/css/searchForm.css | 45 + .../core/org.civicrm.afform-ang/afCore.css | 101 + .../afGuiEditor.css | 696 +++ .../crmSearchAdmin.css | 421 ++ .../crmSearchDisplay.css | 77 + .../crmSearchDisplayGrid.css | 23 + .../crmSearchDisplayTable.css | 54 + .../crmSearchTasks.css | 21 + .../riverlea/fonts/inter-v18-latin-600.woff2 | Bin 0 -> 24304 bytes .../fonts/inter-v18-latin-italic.woff2 | Bin 0 -> 25080 bytes .../fonts/inter-v18-latin-regular.woff2 | Bin 0 -> 23692 bytes .../riverlea/fonts/lato-v24-latin-700.woff2 | Bin 0 -> 23040 bytes .../fonts/lato-v24-latin-700italic.woff2 | Bin 0 -> 24448 bytes .../fonts/lato-v24-latin-italic.woff2 | Bin 0 -> 24408 bytes .../fonts/lato-v24-latin-regular.woff2 | Bin 0 -> 23580 bytes civicrm/ext/riverlea/info.xml | 35 + .../riverlea/managed/navigationmenu.mgd.php | 27 + civicrm/ext/riverlea/riverlea.civix.php | 200 + civicrm/ext/riverlea/riverlea.php | 101 + .../riverlea/settings/riverlea.setting.php | 50 + .../ext/riverlea/streams/empty/css/_dark.css | 63 + .../riverlea/streams/empty/css/_variables.css | 431 ++ .../streams/hackneybrook/css/_dark.css | 70 + .../streams/hackneybrook/css/_variables.css | 140 + .../riverlea/streams/minetta/css/_dark.css | 63 + .../streams/minetta/css/_variables.css | 9 + .../ext/riverlea/streams/thames/css/_dark.css | 123 + .../streams/thames/css/_variables.css | 492 +++ .../riverlea/streams/thames/css/civicrm.css | 609 +++ .../riverlea/streams/walbrook/css/_dark.css | 68 + .../streams/walbrook/css/_variables.css | 218 + .../riverlea/streams/walbrook/css/civicrm.css | 28 + .../Civi/Api4/Action/SKEntity/Refresh.php | 16 +- .../SearchDisplay/AbstractRunAction.php | 28 +- .../Api4/Action/SearchDisplay/Download.php | 4 +- .../Action/SearchDisplay/GetSearchTasks.php | 16 + .../Event/Subscriber/SKEntitySubscriber.php | 11 +- .../SearchSegmentExtraFieldProvider.php | 7 +- civicrm/ext/search_kit/Civi/Search/Admin.php | 41 +- .../searchAdminTasksConfig.component.js | 9 + .../common/searchAdminTasksConfig.html | 4 + .../displays/searchAdminDisplayTable.html | 5 + .../crmSearchAdminResultsTable.html | 2 +- .../traits/searchDisplayBaseTrait.service.js | 77 +- .../crmSearchDisplayTable.html | 2 +- .../crmSearchDisplayTableBody.html | 3 +- ...rmSearchDisplayToggleCollapse.component.js | 63 + .../crmSearchDisplayToggleCollapse.html | 4 + .../search_kit/ang/crmSearchPage.module.js | 25 +- .../crmSearchInput.component.js | 11 +- .../crmSearchInput/crmSearchInput.html | 7 +- .../crmSearchInputVal.component.js | 3 +- .../crmSearchTasks/crmSearchInput/date.html | 6 +- .../crmSearchTasks/crmSearchInput/email.html | 4 +- .../crmSearchTasks/crmSearchInput/float.html | 4 +- .../crmSearchInput/integer.html | 4 +- .../crmSearchTasks/crmSearchInput/text.html | 4 +- .../crmSearchTaskApiBatch.ctrl.js | 23 +- .../crmSearchTasks/crmSearchTaskApiBatch.html | 7 +- .../crmSearchTaskUpdate.ctrl.js | 4 +- .../crmSearchTasks/crmSearchTaskUpdate.html | 2 +- .../crmSearchTasks-buttons.html | 8 + .../crmSearchTasks/crmSearchTasks-menu.html | 18 + .../crmSearchTasksMenu.component.js | 3 +- .../crmSearchTasks/crmSearchTasksMenu.html | 20 - .../traits/searchDisplayTasksTrait.service.js | 5 + .../search_kit/css/crmSearchDisplayTable.css | 17 + .../CRM/Search/Help/DisplayTypeEntity.hlp | 2 +- .../tests/phpunit/Civi/Search/AdminTest.php | 30 + .../v4/SearchDisplay/EntityDisplayTest.php | 27 +- .../api/v4/SearchDisplay/SearchRunTest.php | 112 +- .../CRM/Standaloneusers/BAO/User.php | 24 +- .../CRM/Standaloneusers/Page/Login.php | 6 +- .../Civi/Api4/Action/User/Login.php | 13 +- .../Civi/Api4/Action/User/PasswordReset.php | 3 +- .../Civi/Api4/Action/User/WriteTrait.php | 9 +- .../standaloneusers/Civi/Authx/Standalone.php | 31 +- .../Civi/Standalone/Security.php | 249 +- .../ang/afformEditUserAccount.aff.html | 2 +- .../ext/standaloneusers/css/standalone.css | 2 +- .../CRM/Standaloneusers/Page/Login.tpl | 5 +- .../phpunit/Civi/Api4/Action/UserTest.php | 37 +- .../phpunit/Civi/Standalone/SecurityTest.php | 19 +- civicrm/js/crm.ajax.js | 2 +- civicrm/js/version.json | 2 +- .../SavedSearch_Contact_Summary_Notes.mgd.php | 2 + ...arch_Contact_Summary_Relationships.mgd.php | 4 + civicrm/release-notes.md | 9 - civicrm/release-notes/5.79.1.md | 48 - civicrm/release-notes/5.80.0.md | 491 +++ .../schema/Activity/Activity.entityType.php | 2 +- .../schema/Contribute/Product.entityType.php | 2 +- civicrm/schema/Core/Website.entityType.php | 2 +- .../ParticipantStatusType.entityType.php | 2 +- .../Financial/FinancialAccount.entityType.php | 2 +- .../Financial/FinancialType.entityType.php | 2 +- ...boot.setting.php => Core.boot.setting.php} | 18 +- civicrm/settings/Url.boot.setting.php | 16 + .../init/StandaloneUsers.civi-setup.php | 45 +- civicrm/setup/res/htaccess.txt | 5 +- civicrm/sql/civicrm_generated.mysql | 2 +- .../Contact/Form/Search/AdvancedCriteria.tpl | 26 +- .../Contact/Form/Search/Criteria/Basic.tpl | 5 + .../Form/Search/Criteria/DisplaySettings.tpl | 21 - .../Form/Search/Criteria/SearchSettings.tpl | 37 +- .../Contribute/Form/Contribution/Confirm.tpl | 303 +- .../Form/Contribution/MembershipBlock.tpl | 28 +- .../Contribute/Form/Contribution/ThankYou.tpl | 247 +- .../CRM/Contribute/Form/ManagePremiums.tpl | 3 +- .../CRM/Event/Form/ManageEvent/Location.tpl | 2 +- .../templates/CRM/Event/Page/DashBoard.tpl | 10 +- civicrm/templates/CRM/Mailing/Page/Report.tpl | 37 +- .../CRM/Member/Page/UserDashboard.tpl | 17 +- civicrm/templates/CRM/Price/Form/Field.tpl | 20 +- .../CRM/Report/Form/Tabs/Filters.tpl | 7 +- .../CRM/UF/Page/ProfileTemplates.tpl | 16 +- civicrm/vendor/autoload.php | 2 +- civicrm/vendor/composer/autoload_real.php | 14 +- civicrm/vendor/composer/autoload_static.php | 12 +- civicrm/vendor/composer/installed.json | 14 +- civicrm/vendor/composer/installed.php | 18 +- .../phpoffice/phpspreadsheet/CHANGELOG.md | 14 + .../Calculation/MathTrig/Round.php | 53 +- .../Calculation/MathTrig/Trunc.php | 41 +- .../src/PhpSpreadsheet/Reader/Csv.php | 85 +- .../src/PhpSpreadsheet/Reader/Html.php | 2 +- .../Reader/Security/XmlScanner.php | 54 +- .../src/PhpSpreadsheet/Reader/Xml.php | 15 +- .../src/PhpSpreadsheet/Worksheet/Drawing.php | 2 +- .../PhpSpreadsheet/Writer/Xlsx/Worksheet.php | 6 +- civicrm/xml/templates/joomla.tpl | 1 - civicrm/xml/version.xml | 4 +- wp-rest/Autoloader.php | 2 +- 292 files changed, 20607 insertions(+), 1775 deletions(-) create mode 100644 civicrm/CRM/Core/WorkflowMessage/ProfileTrait.php create mode 100644 civicrm/CRM/Upgrade/Incremental/php/FiveEighty.php create mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.80.alpha1.mysql.tpl create mode 100644 civicrm/ext/afform/core/ang/af/afButton.directive.js create mode 100644 civicrm/ext/riverlea/.gitignore create mode 100644 civicrm/ext/riverlea/CHANGELOG.md create mode 100644 civicrm/ext/riverlea/Civi/riverlea/DynamicCss.php create mode 100755 civicrm/ext/riverlea/LICENSE.txt create mode 100755 civicrm/ext/riverlea/README.md create mode 100644 civicrm/ext/riverlea/composer.json create mode 100644 civicrm/ext/riverlea/core/ang/crmStatusPage.css create mode 100644 civicrm/ext/riverlea/core/civi_mail-ang/crmMailing.css create mode 100755 civicrm/ext/riverlea/core/css/_base.css create mode 100644 civicrm/ext/riverlea/core/css/_bootstrap.css create mode 100755 civicrm/ext/riverlea/core/css/_cms.css create mode 100755 civicrm/ext/riverlea/core/css/_core.css create mode 100755 civicrm/ext/riverlea/core/css/_fixes.css create mode 100644 civicrm/ext/riverlea/core/css/_variables.css create mode 100644 civicrm/ext/riverlea/core/css/admin.css create mode 100644 civicrm/ext/riverlea/core/css/api4-explorer.css create mode 100644 civicrm/ext/riverlea/core/css/civicrm.css create mode 100644 civicrm/ext/riverlea/core/css/components/_accordion.css create mode 100644 civicrm/ext/riverlea/core/css/components/_alerts.css create mode 100644 civicrm/ext/riverlea/core/css/components/_buttons.css create mode 100644 civicrm/ext/riverlea/core/css/components/_components.css create mode 100644 civicrm/ext/riverlea/core/css/components/_dialogs.css create mode 100644 civicrm/ext/riverlea/core/css/components/_dropdowns.css create mode 100644 civicrm/ext/riverlea/core/css/components/_form.css create mode 100644 civicrm/ext/riverlea/core/css/components/_front.css create mode 100644 civicrm/ext/riverlea/core/css/components/_icons.css create mode 100644 civicrm/ext/riverlea/core/css/components/_nav.css create mode 100644 civicrm/ext/riverlea/core/css/components/_page.css create mode 100644 civicrm/ext/riverlea/core/css/components/_tables.css create mode 100644 civicrm/ext/riverlea/core/css/components/_tabs.css create mode 100644 civicrm/ext/riverlea/core/css/contactSummary.css create mode 100644 civicrm/ext/riverlea/core/css/crm-i.css create mode 100644 civicrm/ext/riverlea/core/css/crm-iconPicker.css create mode 100644 civicrm/ext/riverlea/core/css/dashboard.css create mode 100644 civicrm/ext/riverlea/core/css/joomla.css create mode 100644 civicrm/ext/riverlea/core/css/rename-css-var.php create mode 100644 civicrm/ext/riverlea/core/css/searchForm.css create mode 100644 civicrm/ext/riverlea/core/org.civicrm.afform-ang/afCore.css create mode 100644 civicrm/ext/riverlea/core/org.civicrm.afform_admin-ang/afGuiEditor.css create mode 100644 civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchAdmin.css create mode 100644 civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplay.css create mode 100644 civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayGrid.css create mode 100644 civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayTable.css create mode 100644 civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchTasks.css create mode 100644 civicrm/ext/riverlea/fonts/inter-v18-latin-600.woff2 create mode 100644 civicrm/ext/riverlea/fonts/inter-v18-latin-italic.woff2 create mode 100644 civicrm/ext/riverlea/fonts/inter-v18-latin-regular.woff2 create mode 100644 civicrm/ext/riverlea/fonts/lato-v24-latin-700.woff2 create mode 100644 civicrm/ext/riverlea/fonts/lato-v24-latin-700italic.woff2 create mode 100644 civicrm/ext/riverlea/fonts/lato-v24-latin-italic.woff2 create mode 100644 civicrm/ext/riverlea/fonts/lato-v24-latin-regular.woff2 create mode 100755 civicrm/ext/riverlea/info.xml create mode 100644 civicrm/ext/riverlea/managed/navigationmenu.mgd.php create mode 100755 civicrm/ext/riverlea/riverlea.civix.php create mode 100755 civicrm/ext/riverlea/riverlea.php create mode 100644 civicrm/ext/riverlea/settings/riverlea.setting.php create mode 100644 civicrm/ext/riverlea/streams/empty/css/_dark.css create mode 100644 civicrm/ext/riverlea/streams/empty/css/_variables.css create mode 100644 civicrm/ext/riverlea/streams/hackneybrook/css/_dark.css create mode 100644 civicrm/ext/riverlea/streams/hackneybrook/css/_variables.css create mode 100644 civicrm/ext/riverlea/streams/minetta/css/_dark.css create mode 100644 civicrm/ext/riverlea/streams/minetta/css/_variables.css create mode 100644 civicrm/ext/riverlea/streams/thames/css/_dark.css create mode 100644 civicrm/ext/riverlea/streams/thames/css/_variables.css create mode 100755 civicrm/ext/riverlea/streams/thames/css/civicrm.css create mode 100755 civicrm/ext/riverlea/streams/walbrook/css/_dark.css create mode 100755 civicrm/ext/riverlea/streams/walbrook/css/_variables.css create mode 100644 civicrm/ext/riverlea/streams/walbrook/css/civicrm.css create mode 100644 civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.component.js create mode 100644 civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.html create mode 100644 civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-buttons.html create mode 100644 civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-menu.html delete mode 100644 civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.html delete mode 100644 civicrm/release-notes/5.79.1.md create mode 100644 civicrm/release-notes/5.80.0.md rename civicrm/settings/{System.boot.setting.php => Core.boot.setting.php} (80%) delete mode 100644 civicrm/templates/CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl diff --git a/civicrm.php b/civicrm.php index 0ee13e852f..8595224444 100644 --- a/civicrm.php +++ b/civicrm.php @@ -2,7 +2,7 @@ /** * Plugin Name: CiviCRM * Description: CiviCRM - Growing and Sustaining Relationships - * Version: 5.79.1 + * Version: 5.80.0 * Requires at least: 4.9 * Requires PHP: 7.4 * Author: CiviCRM LLC @@ -36,7 +36,7 @@ if (!defined('ABSPATH')) { } // Set version here: changing it forces Javascript and CSS to reload. -define('CIVICRM_PLUGIN_VERSION', '5.79.1'); +define('CIVICRM_PLUGIN_VERSION', '5.80.0'); // Store reference to this file. if (!defined('CIVICRM_PLUGIN_FILE')) { diff --git a/civicrm/CRM/Activity/BAO/Activity.php b/civicrm/CRM/Activity/BAO/Activity.php index dca36f4021..436104a617 100644 --- a/civicrm/CRM/Activity/BAO/Activity.php +++ b/civicrm/CRM/Activity/BAO/Activity.php @@ -723,12 +723,6 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity { } } } - // if deleted, wrap in <del> - if (!empty($activity['source_contact_id']) && - CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $activity['source_contact_id'], 'is_deleted') - ) { - $activities[$id]['source_contact_name'] = sprintf("<del>%s<del>", htmlentities($activity['source_contact_name'])); - } $activities[$id]['is_recurring_activity'] = CRM_Core_BAO_RecurringEntity::getParentFor($id, 'civicrm_activity'); } diff --git a/civicrm/CRM/Admin/Page/Job.php b/civicrm/CRM/Admin/Page/Job.php index a6595c617a..9af42aee4f 100644 --- a/civicrm/CRM/Admin/Page/Job.php +++ b/civicrm/CRM/Admin/Page/Job.php @@ -162,9 +162,8 @@ class CRM_Admin_Page_Job extends CRM_Core_Page_Basic { } } - $sj = new CRM_Core_JobManager(); $rows = []; - foreach ($sj->jobs as $job) { + foreach ($this->getJobs() as $job) { $action = array_sum(array_keys($this->links())); // update enable/disable links. @@ -193,6 +192,29 @@ class CRM_Admin_Page_Job extends CRM_Core_Page_Basic { $this->assign('rows', $rows); } + /** + * Retrieves the list of jobs from the database, + * populates class param. + * + * @fixme: Copied from JobManager. We should replace with API + * + * @return array + * ($id => CRM_Core_ScheduledJob) + */ + private function getJobs(): array { + $jobs = []; + $dao = new CRM_Core_DAO_Job(); + $dao->orderBy('name'); + $dao->domain_id = CRM_Core_Config::domainID(); + $dao->find(); + while ($dao->fetch()) { + $temp = ['class' => NULL, 'parameters' => NULL, 'last_run' => NULL]; + CRM_Core_DAO::storeValues($dao, $temp); + $jobs[$dao->id] = new CRM_Core_ScheduledJob($temp); + } + return $jobs; + } + /** * Get name of edit form. * diff --git a/civicrm/CRM/Batch/Form/Entry.php b/civicrm/CRM/Batch/Form/Entry.php index 3326f428c5..5e528f8bf8 100644 --- a/civicrm/CRM/Batch/Form/Entry.php +++ b/civicrm/CRM/Batch/Form/Entry.php @@ -248,7 +248,7 @@ class CRM_Batch_Form_Entry extends CRM_Core_Form { foreach ($this->_fields as $name => $field) { //fix to reduce size as we are using this field in grid - if (is_array($field['attributes']) && $this->_fields[$name]['attributes']['size'] > 19) { + if (is_array($field['attributes']) && ($this->_fields[$name]['attributes']['size'] ?? 0) > 19) { //shrink class to "form-text-medium" $this->_fields[$name]['attributes']['size'] = 19; } diff --git a/civicrm/CRM/Campaign/Form/Campaign.php b/civicrm/CRM/Campaign/Form/Campaign.php index 4a154492bc..562f1f563a 100644 --- a/civicrm/CRM/Campaign/Form/Campaign.php +++ b/civicrm/CRM/Campaign/Form/Campaign.php @@ -124,9 +124,10 @@ class CRM_Campaign_Form_Campaign extends CRM_Core_Form { 'title' => ['name' => 'title'], 'description' => ['name' => 'description'], 'start_date' => ['name' => 'start_date', 'default' => date('Y-m-d H:i:s')], - 'end_date' => ['name' => 'start_date'], + 'end_date' => ['name' => 'end_date'], 'campaign_type_id' => ['name' => 'campaign_type_id'], 'status_id' => ['name' => 'status_id'], + 'parent_id' => ['name' => 'parent_id'], 'goal_general' => ['name' => 'goal_general'], 'goal_revenue' => ['name' => 'goal_revenue'], 'external_identifier' => ['name' => 'external_identifier'], diff --git a/civicrm/CRM/Campaign/Page/Petition/Confirm.php b/civicrm/CRM/Campaign/Page/Petition/Confirm.php index 77d7d1d9c2..9c7e2a21c8 100644 --- a/civicrm/CRM/Campaign/Page/Petition/Confirm.php +++ b/civicrm/CRM/Campaign/Page/Petition/Confirm.php @@ -21,7 +21,7 @@ class CRM_Campaign_Page_Petition_Confirm extends CRM_Core_Page { * @throws Exception */ public function run() { - CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">'); + CRM_Utils_System::setNoRobotsFlag(); $contact_id = CRM_Utils_Request::retrieve('cid', 'Integer'); $subscribe_id = CRM_Utils_Request::retrieve('sid', 'Integer'); diff --git a/civicrm/CRM/Contact/BAO/Contact/Utils.php b/civicrm/CRM/Contact/BAO/Contact/Utils.php index d845a19249..45200ff0ac 100644 --- a/civicrm/CRM/Contact/BAO/Contact/Utils.php +++ b/civicrm/CRM/Contact/BAO/Contact/Utils.php @@ -88,7 +88,7 @@ class CRM_Contact_BAO_Contact_Utils { "reset=1&gid={$summaryOverlayProfileId}&id={$contactId}&snippet=4&is_show_email_task=1" ); - $imageInfo['summary-link'] = '<a href="' . $contactURL . '" data-tooltip-url="' . $profileURL . '" class="crm-summary-link">' . $imageInfo['image'] . '</a>'; + $imageInfo['summary-link'] = '<a href="' . $contactURL . '" data-tooltip-url="' . $profileURL . '" class="crm-summary-link" aria-labelledby="crm-contactname-content">' . $imageInfo['image'] . '</a>'; } else { $imageInfo['summary-link'] = $imageInfo['image']; diff --git a/civicrm/CRM/Contact/BAO/Query.php b/civicrm/CRM/Contact/BAO/Query.php index c02a15b4f6..25e968a127 100644 --- a/civicrm/CRM/Contact/BAO/Query.php +++ b/civicrm/CRM/Contact/BAO/Query.php @@ -2829,7 +2829,7 @@ class CRM_Contact_BAO_Query { [$_, $_, $value, $grouping, $_] = $values; if ($value) { // *prepend* to the relevant grouping as this is quite an important factor - array_unshift($this->_qill[$grouping], ts('Search in Trash')); + array_unshift($this->_qill[$grouping], ts('Search Deleted Contacts')); } } diff --git a/civicrm/CRM/Contact/Form/Contact.php b/civicrm/CRM/Contact/Form/Contact.php index 7aba82999d..f227ccd82f 100644 --- a/civicrm/CRM/Contact/Form/Contact.php +++ b/civicrm/CRM/Contact/Form/Contact.php @@ -1122,9 +1122,11 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form { // here we replace the user context with the url to view this contact $buttonName = $this->controller->getButtonName(); if ($buttonName == $this->getButtonName('upload', 'new')) { - $contactSubTypes = array_filter(explode(CRM_Core_DAO::VALUE_SEPARATOR, $this->_contactSubType)); $resetStr = "reset=1&ct={$contact->contact_type}"; - $resetStr .= (count($contactSubTypes) == 1) ? "&cst=" . array_pop($contactSubTypes) : ''; + if (is_string($this->_contactSubType)) { + $contactSubTypes = array_filter(explode(CRM_Core_DAO::VALUE_SEPARATOR, $this->_contactSubType)); + $resetStr .= (count($contactSubTypes) == 1) ? "&cst=" . array_pop($contactSubTypes) : ''; + } $session->replaceUserContext(CRM_Utils_System::url('civicrm/contact/add', $resetStr)); } else { diff --git a/civicrm/CRM/Contact/Form/Edit/Individual.php b/civicrm/CRM/Contact/Form/Edit/Individual.php index 30bb35f67d..b2fdd7827e 100644 --- a/civicrm/CRM/Contact/Form/Edit/Individual.php +++ b/civicrm/CRM/Contact/Form/Edit/Individual.php @@ -97,7 +97,7 @@ class CRM_Contact_Form_Edit_Individual { * The uploaded files if any. * @param int $contactID * - * @return bool + * @return bool|array * TRUE if no errors, else array of errors. */ public static function formRule($fields, $files, $contactID = NULL) { @@ -105,8 +105,8 @@ class CRM_Contact_Form_Edit_Individual { $primaryID = CRM_Contact_Form_Contact::formRule($fields, $errors, $contactID, 'Individual'); // make sure that firstName and lastName or a primary OpenID is set - if (!$primaryID && (empty($fields['first_name']) || empty($fields['last_name']))) { - $errors['_qf_default'] = ts('First Name and Last Name OR an email OR an OpenID in the Primary Location should be set.'); + if (!$primaryID && (empty($fields['first_name']) && empty($fields['last_name']))) { + $errors['_qf_default'] = ts('Please enter a First Name, Last Name or Email (Primary).'); } return empty($errors) ? TRUE : $errors; diff --git a/civicrm/CRM/Contact/Form/Search.php b/civicrm/CRM/Contact/Form/Search.php index 1bdfcbac9e..182d9bc1f8 100644 --- a/civicrm/CRM/Contact/Form/Search.php +++ b/civicrm/CRM/Contact/Form/Search.php @@ -766,7 +766,7 @@ class CRM_Contact_Form_Search extends CRM_Core_Form_Search { //get the button name $buttonName = $this->controller->getButtonName(); - $this->_formValues['uf_group_id'] ??= $this->get('uf_group_id'); + $this->_formValues['uf_group_id'] ??= $this->get('uf_group_id') ?: CRM_Core_Config::singleton()->defaultSearchProfileID; if (isset($this->_componentMode) && empty($this->_formValues['component_mode'])) { $this->_formValues['component_mode'] = $this->_componentMode; diff --git a/civicrm/CRM/Contact/Form/Search/Criteria.php b/civicrm/CRM/Contact/Form/Search/Criteria.php index 29cd537fb4..7711c727e8 100644 --- a/civicrm/CRM/Contact/Form/Search/Criteria.php +++ b/civicrm/CRM/Contact/Form/Search/Criteria.php @@ -105,7 +105,7 @@ class CRM_Contact_Form_Search_Criteria { $form->addElement('text', 'external_identifier', ts('External ID'), CRM_Core_DAO::getAttribute('CRM_Contact_DAO_Contact', 'external_identifier')); if (CRM_Core_Permission::check('access deleted contacts') and Civi::settings()->get('contact_undelete')) { - $form->add('checkbox', 'deleted_contacts', ts('Search in Trash') . '<br />' . ts('(deleted contacts)')); + $form->add('checkbox', 'deleted_contacts', ts('Search Deleted Contacts')); } // add checkbox for cms users only diff --git a/civicrm/CRM/Contact/Form/Task/Map/Event.php b/civicrm/CRM/Contact/Form/Task/Map/Event.php index b42e897d92..e5b05d0540 100644 --- a/civicrm/CRM/Contact/Form/Task/Map/Event.php +++ b/civicrm/CRM/Contact/Form/Task/Map/Event.php @@ -38,7 +38,7 @@ class CRM_Contact_Form_Task_Map_Event extends CRM_Contact_Form_Task_Map { $this->assign('skipLocationType', TRUE); $is_public = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event', $ids, 'is_public'); if ($is_public == 0) { - CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">'); + CRM_Utils_System::setNoRobotsFlag(); } } diff --git a/civicrm/CRM/Contact/Page/View/Log.php b/civicrm/CRM/Contact/Page/View/Log.php index 2d141e891f..633cef4935 100644 --- a/civicrm/CRM/Contact/Page/View/Log.php +++ b/civicrm/CRM/Contact/Page/View/Log.php @@ -39,6 +39,7 @@ class CRM_Contact_Page_View_Log extends CRM_Core_Page { } $log = new CRM_Core_DAO_Log(); + $modifiers = []; $log->entity_table = 'civicrm_contact'; $log->entity_id = $this->_contactId; @@ -47,11 +48,15 @@ class CRM_Contact_Page_View_Log extends CRM_Core_Page { $logEntries = []; while ($log->fetch()) { - [$displayName, $contactImage] = CRM_Contact_BAO_Contact::getDisplayAndImage($log->modified_id); + if ($log->modified_id && !isset($modifiers[$log->modified_id])) { + $displayInfo = CRM_Contact_BAO_Contact::getDisplayAndImage($log->modified_id); + $modifiers[$log->modified_id] = ['name' => $displayInfo[0] ?? '', 'image' => $displayInfo[1] ?? '']; + } + $logEntries[] = [ 'id' => $log->modified_id, - 'name' => $displayName, - 'image' => $contactImage, + 'name' => $modifiers[$log->modified_id]['name'] ?? '', + 'image' => $modifiers[$log->modified_id]['image'] ?? '', 'date' => $log->modified_date, ]; } diff --git a/civicrm/CRM/Contact/Page/View/Tag.php b/civicrm/CRM/Contact/Page/View/Tag.php index ec3c022970..745b2fb07a 100644 --- a/civicrm/CRM/Contact/Page/View/Tag.php +++ b/civicrm/CRM/Contact/Page/View/Tag.php @@ -16,6 +16,12 @@ */ class CRM_Contact_Page_View_Tag extends CRM_Core_Page { + /** + * @var int + * @internal + */ + public $_contactId; + /** * Called when action is browse. */ diff --git a/civicrm/CRM/Contact/Page/View/Vcard.php b/civicrm/CRM/Contact/Page/View/Vcard.php index b9f42e6260..85d0b0bcef 100644 --- a/civicrm/CRM/Contact/Page/View/Vcard.php +++ b/civicrm/CRM/Contact/Page/View/Vcard.php @@ -36,7 +36,7 @@ class CRM_Contact_Page_View_Vcard extends CRM_Contact_Page_View { $ids = []; $params['id'] = $params['contact_id'] = $this->_contactId; - $contact = CRM_Contact_BAO_Contact::retrieve($params, $defaults, $ids); + CRM_Contact_BAO_Contact::retrieve($params, $defaults, $ids); // now that we have the contact's data - let's build the vCard // TODO: non-US-ASCII support (requires changes to the Contact_Vcard_Build class) diff --git a/civicrm/CRM/Contribute/BAO/Contribution.php b/civicrm/CRM/Contribute/BAO/Contribution.php index c20f01e182..023efc0c50 100644 --- a/civicrm/CRM/Contribute/BAO/Contribution.php +++ b/civicrm/CRM/Contribute/BAO/Contribution.php @@ -19,6 +19,7 @@ use Civi\Api4\LineItem; use Civi\Api4\ContributionSoft; use Civi\Api4\MembershipLog; use Civi\Api4\PaymentProcessor; +use Civi\Api4\UFJoin; use Civi\Core\Event\PostEvent; /** @@ -2404,16 +2405,6 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac ]; $values['location'] = CRM_Core_BAO_Location::getValues($locationParams); - $ufJoinParams = [ - 'entity_table' => 'civicrm_event', - 'entity_id' => $eventID, - 'module' => 'CiviEvent', - ]; - - [$custom_pre_id, $custom_post_ids] = CRM_Core_BAO_UFJoin::getUFGroupIds($ufJoinParams); - - $values['custom_pre_id'] = $custom_pre_id; - $values['custom_post_id'] = $custom_post_ids; //for tasks 'Change Participant Status' and 'Update multiple Contributions' case //and cases involving status updation through ipn // whatever that means! @@ -2657,7 +2648,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac if (!empty($values['id'])) { $values['honor'] = [ 'honor_profile_values' => [], - 'honor_profile_id' => CRM_Core_DAO::getFieldValue('CRM_Core_DAO_UFJoin', $values['id'], 'uf_group_id', 'entity_id'), + 'honor_profile_id' => UFJoin::get(FALSE)->addWhere('entity_id', '=', $values['id'])->addWhere('entity_table', '=', 'civicrm_contribution_page')->addWhere('module', '=', 'soft_credit')->execute()->first()['uf_group_id'] ?? 0, 'honor_id' => $softRecord['soft_credit'][1]['contact_id'], ]; diff --git a/civicrm/CRM/Contribute/BAO/Product.php b/civicrm/CRM/Contribute/BAO/Product.php index 24ba30d8aa..b992ad1a27 100644 --- a/civicrm/CRM/Contribute/BAO/Product.php +++ b/civicrm/CRM/Contribute/BAO/Product.php @@ -14,13 +14,7 @@ * @package CRM * @copyright CiviCRM LLC https://civicrm.org/licensing */ -class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product { - - /** - * Static holder for the default LT. - * @var int - */ - public static $_defaultContributionType = NULL; +class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product implements Civi\Core\HookInterface { /** * @deprecated @@ -36,72 +30,35 @@ class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product { return $premium; } - /** - * @deprecated - this bypasses hooks. - * @param int $id - * @param bool $is_active - * @return bool - */ - public static function setIsActive($id, $is_active) { - CRM_Core_Error::deprecatedFunctionWarning('writeRecord'); - if (!$is_active) { - $dao = new CRM_Contribute_DAO_PremiumsProduct(); - $dao->product_id = $id; - $dao->delete(); - } - return CRM_Core_DAO::setFieldValue('CRM_Contribute_DAO_Product', $id, 'is_active', $is_active); - } - /** * Add a premium product to the database, and return it. * + * @deprecated * @param array $params * Update parameters. * * @return CRM_Contribute_DAO_Product */ public static function create($params) { - $id = $params['id'] ?? NULL; - $op = !empty($id) ? 'edit' : 'create'; - if (empty($id)) { - $defaultParams = [ - 'id' => $id, - 'image' => '', - 'thumbnail' => '', - 'is_active' => 0, - 'is_deductible' => FALSE, - 'currency' => CRM_Core_Config::singleton()->defaultCurrency, - ]; - $params = array_merge($defaultParams, $params); - } - CRM_Utils_Hook::pre($op, 'Product', $id, $params); - // Modify the submitted values for 'image' and 'thumbnail' so that we use - // local URLs for these images when possible. - if (isset($params['image'])) { - $params['image'] = CRM_Utils_String::simplifyURL($params['image'], TRUE); - } - if (isset($params['thumbnail'])) { - $params['thumbnail'] = CRM_Utils_String::simplifyURL($params['thumbnail'], TRUE); - } - - // Save and return - $premium = new CRM_Contribute_DAO_Product(); - $premium->copyValues($params); - $premium->save(); - CRM_Utils_Hook::post($op, 'Product', $id, $premium); - return $premium; + CRM_Core_Error::deprecatedFunctionWarning('writeRecord'); + return self::writeRecord($params); } /** - * Delete premium Types. - * - * @param int $productID - * @deprecated - * @throws \CRM_Core_Exception + * Event fired before modifying a Product. + * @param \Civi\Core\Event\PreEvent $event */ - public static function del($productID) { - CRM_Core_Error::deprecatedFunctionWarning('deleteRecord'); - static::deleteRecord(['id' => $productID]); + public static function self_hook_civicrm_pre(\Civi\Core\Event\PreEvent $event) { + if (in_array($event->action, ['create', 'edit'])) { + // Modify the submitted values for 'image' and 'thumbnail' so that we use + // local URLs for these images when possible. + if (isset($event->params['image'])) { + $event->params['image'] = CRM_Utils_String::simplifyURL($event->params['image'], TRUE); + } + if (isset($event->params['thumbnail'])) { + $event->params['thumbnail'] = CRM_Utils_String::simplifyURL($event->params['thumbnail'], TRUE); + } + } } } diff --git a/civicrm/CRM/Contribute/Form/Contribution/Confirm.php b/civicrm/CRM/Contribute/Form/Contribution/Confirm.php index e5695e1ffb..0f60c16136 100644 --- a/civicrm/CRM/Contribute/Form/Contribution/Confirm.php +++ b/civicrm/CRM/Contribute/Form/Contribution/Confirm.php @@ -798,10 +798,12 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr $result = $this->processFormSubmission($contactID); } catch (CRM_Core_Exception $e) { + \Civi::log()->error('CRM_Contribute_Form_Contribution_Confirm::PostProcess processFormSubmissionException: ' . $e->getMessage()); $this->bounceOnError($e->getMessage()); } if (is_array($result) && !empty($result['is_payment_failure'])) { + \Civi::log()->error('CRM_Contribute_Form_Contribution_Confirm::PostProcess is_payment_failure: ' . $result['error']->getMessage()); $this->bounceOnError($result['error']->getMessage()); } // Presumably this is for hooks to access? Not quite clear & perhaps not required. @@ -2398,45 +2400,6 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr } } - /** - * Complete transaction if payment has been processed. - * - * Check the result for a success outcome & if paid then complete the transaction. - * - * Completing will trigger update of related entities and emails. - * - * @deprecated - * - * @param array $result - * @param int $contributionID - * - * @throws \CRM_Core_Exception - * @throws \Exception - */ - protected function completeTransaction($result, $contributionID) { - CRM_Core_Error::deprecatedWarning('Use API3 Payment.create'); - if (($result['payment_status_id'] ?? NULL) == 1) { - try { - civicrm_api3('contribution', 'completetransaction', [ - 'id' => $contributionID, - 'trxn_id' => $result['trxn_id'] ?? NULL, - 'payment_processor_id' => $result['payment_processor_id'] ?? $this->_paymentProcessor['id'], - 'is_transactional' => FALSE, - 'fee_amount' => $result['fee_amount'] ?? NULL, - 'receive_date' => $result['receive_date'] ?? NULL, - 'card_type_id' => $result['card_type_id'] ?? NULL, - 'pan_truncation' => $result['pan_truncation'] ?? NULL, - ]); - } - catch (CRM_Core_Exception $e) { - if ($e->getErrorCode() != 'contribution_completed') { - \Civi::log()->error('CRM_Contribute_Form_Contribution_Confirm::completeTransaction CRM_Core_Exception: ' . $e->getMessage()); - throw new CRM_Core_Exception('Failed to update contribution in database'); - } - } - } - } - /** * Bounce the user back to retry when an error occurs. * @@ -2444,8 +2407,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr */ protected function bounceOnError($message): void { CRM_Core_Session::singleton() - ->setStatus(ts('Payment Processor Error message :') . - $message); + ->setStatus(ts('Payment Processor Error message') . ': ' . $message); CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/contribute/transact', '_qf_Main_display=true&qfKey=' . ($this->_params['qfKey'] ?? NULL) )); @@ -2598,43 +2560,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr $form->_values['contribution_page_id'] = $contribution->contribution_page_id; if (!empty($form->_paymentProcessor)) { - try { - $payment = Civi\Payment\System::singleton()->getByProcessor($form->_paymentProcessor); - if ($contribution->contribution_recur_id && $this->getPaymentProcessorObject()->supports('noReturnForRecurring')) { - // We want to get rid of this & make it generic - eg. by making payment processing the last thing - // and always calling it first. - $form->postProcessHook(); - } - $paymentParams['currency'] = $this->getCurrency(); - $result = $payment->doPayment($paymentParams); - $form->_params = array_merge($form->_params, $result); - $form->assign('trxn_id', $result['trxn_id'] ?? ''); - $contribution->trxn_id = $result['trxn_id'] ?? $contribution->trxn_id ?? ''; - $contribution->payment_status_id = $result['payment_status_id']; - $result['contribution'] = $contribution; - if ($result['payment_status_id'] == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending') - && $payment->isSendReceiptForPending()) { - CRM_Contribute_BAO_ContributionPage::sendMail($contactID, - $form->_values, - $contribution->is_test - ); - } - return $result; - } - catch (\Civi\Payment\Exception\PaymentProcessorException $e) { - // Clean up DB as appropriate. - if (!empty($paymentParams['contributionID'])) { - CRM_Contribute_BAO_Contribution::failPayment($paymentParams['contributionID'], - $paymentParams['contactID'], $e->getMessage()); - } - if (!empty($paymentParams['contributionRecurID'])) { - CRM_Contribute_BAO_ContributionRecur::deleteRecurContribution($paymentParams['contributionRecurID']); - } - - $result['is_payment_failure'] = TRUE; - $result['error'] = $e; - return $result; - } + return $this->processConfirmPayment($contribution, $contactID, $paymentParams); } } @@ -2655,6 +2581,57 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr throw new CRM_Core_Exception('code is unreachable, exception is for clarity for refactoring'); } + /** + * This was extracted from processConfirm() as part of a refactoring process. + * Signature/params subject to change! + * This should probably throw the exception instead of catching it and putting it in an array + * @internal + * + * @param \CRM_Contribute_DAO_Contribution $contribution + * @param int $contactID + * @param array $paymentParams + * + * @return array + * @throws \CRM_Core_Exception + */ + private function processConfirmPayment(\CRM_Contribute_DAO_Contribution $contribution, int $contactID, array $paymentParams): array { + $form = $this; + try { + $payment = Civi\Payment\System::singleton()->getByProcessor($form->_paymentProcessor); + if ($contribution->contribution_recur_id && $this->getPaymentProcessorObject()->supports('noReturnForRecurring')) { + // We want to get rid of this & make it generic - eg. by making payment processing the last thing + // and always calling it first. + $form->postProcessHook(); + } + $paymentParams['currency'] = $this->getCurrency(); + $result = $payment->doPayment($paymentParams); + $form->_params = array_merge($form->_params, $result); + $form->assign('trxn_id', $result['trxn_id'] ?? ''); + $contribution->trxn_id = $result['trxn_id'] ?? $contribution->trxn_id ?? ''; + $contribution->payment_status_id = $result['payment_status_id']; + $result['contribution'] = $contribution; + if ($result['payment_status_id'] == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending') + && $payment->isSendReceiptForPending()) { + CRM_Contribute_BAO_ContributionPage::sendMail($contactID, $form->_values, $contribution->is_test); + } + return $result; + } + catch (\Civi\Payment\Exception\PaymentProcessorException $e) { + // Clean up DB as appropriate. + if (!empty($paymentParams['contributionID'])) { + CRM_Contribute_BAO_Contribution::failPayment($paymentParams['contributionID'], + $paymentParams['contactID'], $e->getMessage()); + } + if (!empty($paymentParams['contributionRecurID'])) { + CRM_Contribute_BAO_ContributionRecur::deleteRecurContribution($paymentParams['contributionRecurID']); + } + + $result['is_payment_failure'] = TRUE; + $result['error'] = $e; + return $result; + } + } + /** * Temporary function to allow unit tests to access function being refactored away. * diff --git a/civicrm/CRM/Contribute/Form/ManagePremiums.php b/civicrm/CRM/Contribute/Form/ManagePremiums.php index 85e25503d0..4273b2e9f4 100644 --- a/civicrm/CRM/Contribute/Form/ManagePremiums.php +++ b/civicrm/CRM/Contribute/Form/ManagePremiums.php @@ -21,6 +21,7 @@ use Civi\Api4\Product; * This class generates form components for Premiums. */ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form { + use CRM_Custom_Form_CustomDataTrait; /** * Classes extending CRM_Core_Form should implement this method. @@ -37,7 +38,7 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form { public function setDefaultValues() { $defaults = parent::setDefaultValues(); if ($this->_id) { - $tempDefaults = Product::get()->addWhere('id', '=', $this->_id)->execute()->first(); + $tempDefaults = Product::get()->addSelect('*', 'custom.*')->addWhere('id', '=', $this->_id)->execute()->first(); if (isset($tempDefaults['image']) && isset($tempDefaults['thumbnail'])) { $defaults['imageUrl'] = $tempDefaults['image']; $defaults['thumbnailUrl'] = $tempDefaults['thumbnail']; @@ -55,11 +56,40 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form { if (isset($tempDefaults['period_type'])) { $this->assign('showSubscriptions', TRUE); } + + // Convert api3 field names to custom_xx format + foreach ($tempDefaults as $name => $value) { + $short = CRM_Core_BAO_CustomField::getShortNameFromLongName($name); + if ($short) { + $tempDefaults[$short . '_' . $this->_id] = $value; + unset($tempDefaults[$name]); + } + } } return $defaults; } + /** + * Build the form object. + * + * @throws \CRM_Core_Exception + */ + public function preProcess() { + parent::preProcess(); + + // when custom data is included in this page + if ($this->isSubmitted()) { + // The custom data fields are added to the form by an ajax form. + // However, if they are not present in the element index they will + // not be available from `$this->getSubmittedValue()` in post process. + // We do not have to set defaults or otherwise render - just add to the element index. + $this->addCustomDataFieldsToForm('Product', array_filter([ + 'id' => $this->_id, + ])); + } + } + /** * Build the form object. * @@ -103,7 +133,7 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form { $this->addElement('text', 'imageUrl', ts('Image URL')); $this->addElement('text', 'thumbnailUrl', ts('Thumbnail URL')); - $this->add('file', 'uploadFile', ts('Image File Name'), ['onChange' => 'select_option();']); + $this->add('file', 'uploadFile', ts('Image File Name'), ['onChange' => 'CRM.$("input[name=imageOption][value=image]").prop("checked", true);']); $this->add('text', 'price', ts('Market Value'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'price'), TRUE); $this->addRule('price', ts('Please enter the Market Value for this product.'), 'money'); @@ -288,6 +318,8 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form { $this->_processImages($params); + $params += $this->getSubmittedCustomFieldsForApi4(); + // Save the premium product to database $premium = Product::save()->addRecord($params)->execute()->first(); diff --git a/civicrm/CRM/Core/BAO/Address.php b/civicrm/CRM/Core/BAO/Address.php index 68142c44a5..634ac3199d 100644 --- a/civicrm/CRM/Core/BAO/Address.php +++ b/civicrm/CRM/Core/BAO/Address.php @@ -994,7 +994,7 @@ SELECT is_primary, } while ($downstreamDao->fetch()) { - // call the function to update the relationship + $params['master_id'] = $addressId; if ($masterId) { // If we have a master_id AND we have downstream addresses, this is // untenable. Ensure we overwrite the downstream addresses so they have @@ -1002,6 +1002,7 @@ SELECT is_primary, $params['master_id'] = $masterId; } elseif ($createRelationship) { + // call the function to update the relationship self::processSharedAddressRelationship($addressId, $downstreamDao->contact_id); } diff --git a/civicrm/CRM/Core/BAO/ConfigSetting.php b/civicrm/CRM/Core/BAO/ConfigSetting.php index dfe5b8fe73..b06b235dfa 100644 --- a/civicrm/CRM/Core/BAO/ConfigSetting.php +++ b/civicrm/CRM/Core/BAO/ConfigSetting.php @@ -289,12 +289,15 @@ class CRM_Core_BAO_ConfigSetting { FALSE, FALSE ); - if ($config->userSystem->is_drupal && - $resetSessionTable - ) { + + if ($resetSessionTable && $config->userSystem->is_drupal) { db_query("DELETE FROM {sessions} WHERE 1"); $moveStatus .= ts('Drupal session table cleared.') . '<br />'; } + elseif (!$resetSessionTable && CIVICRM_UF === 'Standalone') { + // dont reset CRM sessions on Standalone unless explicitly requested + // as otherwise it will log you out + } else { $session = CRM_Core_Session::singleton(); $session->reset(2); diff --git a/civicrm/CRM/Core/BAO/CustomField.php b/civicrm/CRM/Core/BAO/CustomField.php index 3c237347f1..4a5fde416f 100644 --- a/civicrm/CRM/Core/BAO/CustomField.php +++ b/civicrm/CRM/Core/BAO/CustomField.php @@ -614,6 +614,9 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { */ public static function getShortNameFromLongName(string $longName): ?string { [$groupName, $fieldName] = explode('.', $longName); + if (empty($groupName) || empty($fieldName)) { + return NULL; + } foreach (CRM_Core_BAO_CustomGroup::getAll() as $customGroup) { if ($customGroup['name'] === $groupName) { foreach ($customGroup['fields'] as $id => $field) { diff --git a/civicrm/CRM/Core/Config.php b/civicrm/CRM/Core/Config.php index a8102b93af..d97d656784 100644 --- a/civicrm/CRM/Core/Config.php +++ b/civicrm/CRM/Core/Config.php @@ -103,9 +103,6 @@ class CRM_Core_Config extends CRM_Core_Config_MagicMerge { ]); self::$_singleton->authenticate(); - // Extreme backward compat: $config binds to active domain at moment of setup. - self::$_singleton->getSettings(); - self::$_singleton->handleFirstRun(); } } diff --git a/civicrm/CRM/Core/Error.php b/civicrm/CRM/Core/Error.php index cb51fd3615..cafc523320 100644 --- a/civicrm/CRM/Core/Error.php +++ b/civicrm/CRM/Core/Error.php @@ -123,7 +123,7 @@ class CRM_Core_Error extends PEAR_ErrorStack { public static function displaySessionError(&$error, $separator = '<br />') { $message = self::getMessages($error, $separator); if ($message) { - $status = ts("Payment Processor Error message") . "{$separator} $message"; + $status = ts('Payment Processor Error message') . "{$separator} $message"; $session = CRM_Core_Session::singleton(); $session->setStatus($status); } diff --git a/civicrm/CRM/Core/Form/Search.php b/civicrm/CRM/Core/Form/Search.php index 09d9d68280..1327758025 100644 --- a/civicrm/CRM/Core/Form/Search.php +++ b/civicrm/CRM/Core/Form/Search.php @@ -465,7 +465,7 @@ class CRM_Core_Form_Search extends CRM_Core_Form { $this->searchFieldMetadata['Contact']['contact_type'] = CRM_Contact_DAO_Contact::fields()['contact_type']; if (CRM_Core_Permission::check('access deleted contacts') && Civi::settings()->get('contact_undelete')) { - $this->addElement('checkbox', 'deleted_contacts', ts('Search in Trash') . '<br />' . ts('(deleted contacts)')); + $this->addElement('checkbox', 'deleted_contacts', ts('Search Deleted Contacts')); $this->searchFieldMetadata['Contact']['deleted_contacts'] = ['name' => 'deleted_contacts', 'type' => CRM_Utils_Type::T_INT, 'is_pseudofield' => TRUE, 'html' => ['type' => 'Checkbox']]; } diff --git a/civicrm/CRM/Core/JobManager.php b/civicrm/CRM/Core/JobManager.php index af96550a58..3d5ff0d829 100644 --- a/civicrm/CRM/Core/JobManager.php +++ b/civicrm/CRM/Core/JobManager.php @@ -9,6 +9,8 @@ +--------------------------------------------------------------------+ */ +use Civi\Api4\Job; + /** * This interface defines methods that need to be implemented * by every scheduled job (cron task) in CiviCRM. @@ -24,6 +26,7 @@ class CRM_Core_JobManager { * Format is ($id => CRM_Core_ScheduledJob). * * @var CRM_Core_ScheduledJob[] + * @deprecated */ public $jobs = NULL; @@ -46,13 +49,6 @@ class CRM_Core_JobManager { */ public $_source = NULL; - /** - * Class constructor. - */ - public function __construct() { - $this->jobs = $this->getJobs(); - } - /** * @param bool $auth */ @@ -67,13 +63,41 @@ class CRM_Core_JobManager { // it's not asynchronous at this stage CRM_Utils_Hook::cron($this); - foreach ($this->jobs as $job) { - if ($job->is_active) { - if ($job->needsRunning()) { - $this->executeJob($job); - } + + // Get a list of the jobs that have completed previously + $successfulJobs = Job::get(FALSE) + ->addWhere('is_active', '=', TRUE) + ->addClause('OR', ['last_run', 'IS NULL'], ['last_run', '<=', 'last_run_end', TRUE]) + ->addOrderBy('name', 'ASC') + ->execute() + ->indexBy('id') + ->getArrayCopy(); + + // Get a list of jobs that have not completed previously. + // This could be because they are a new job that has not yet run or a job that is fatally crashing (eg. OOM). + // If last_run is NULL the job has never run and will be selected above so exclude it here + // If last_run_end is NULL the job has never completed successfully. + // If last_run_end is < last_run job has completed successfully in the past but is now failing to complete. + $maybeUnsuccessfulJobs = Job::get(FALSE) + ->addWhere('is_active', '=', TRUE) + ->addWhere('last_run', 'IS NOT NULL') + ->addClause('OR', ['last_run_end', 'IS NULL'], ['last_run', '>', 'last_run_end', TRUE]) + ->addOrderBy('name', 'ASC') + ->execute() + ->indexBy('id') + ->getArrayCopy(); + + $jobs = array_merge($successfulJobs, $maybeUnsuccessfulJobs); + foreach ($jobs as $job) { + $temp = ['class' => NULL, 'parameters' => NULL, 'last_run' => NULL]; + $scheduledJobParams = array_merge($job, $temp); + $jobDAO = new CRM_Core_ScheduledJob($scheduledJobParams); + + if ($jobDAO->needsRunning()) { + $this->executeJob($jobDAO); } } + $this->logEntry('Finishing scheduled jobs execution.'); // Set last cron date for the status check @@ -146,27 +170,6 @@ class CRM_Core_JobManager { $job->saveLastRunEnd(); } - /** - * Retrieves the list of jobs from the database, - * populates class param. - * - * @return array - * ($id => CRM_Core_ScheduledJob) - */ - private function getJobs(): array { - $jobs = []; - $dao = new CRM_Core_DAO_Job(); - $dao->orderBy('name'); - $dao->domain_id = CRM_Core_Config::domainID(); - $dao->find(); - while ($dao->fetch()) { - $temp = ['class' => NULL, 'parameters' => NULL, 'last_run' => NULL]; - CRM_Core_DAO::storeValues($dao, $temp); - $jobs[$dao->id] = new CRM_Core_ScheduledJob($temp); - } - return $jobs; - } - /** * Retrieves specific job from the database by id. * and creates ScheduledJob object. diff --git a/civicrm/CRM/Core/Permission/Standalone.php b/civicrm/CRM/Core/Permission/Standalone.php index abcf952c46..86c3d1b980 100644 --- a/civicrm/CRM/Core/Permission/Standalone.php +++ b/civicrm/CRM/Core/Permission/Standalone.php @@ -52,15 +52,15 @@ class CRM_Core_Permission_Standalone extends CRM_Core_Permission_Base { * composite permissions (ORs etc), implied permission hierarchies, * and Contacts. * - * @param string $str + * @param string $permissionName * The permission to check. * @param int $userId * * @return bool * true if yes, else false */ - public function check($str, $userId = NULL) { - return \Civi\Standalone\Security::singleton()->checkPermission($str, $userId); + public function check($permissionName, $userId = NULL) { + return \Civi\Standalone\Security::singleton()->checkPermission($permissionName, $userId); } /** diff --git a/civicrm/CRM/Core/Resources.php b/civicrm/CRM/Core/Resources.php index b5e438b065..913d694da1 100644 --- a/civicrm/CRM/Core/Resources.php +++ b/civicrm/CRM/Core/Resources.php @@ -290,8 +290,8 @@ class CRM_Core_Resources implements CRM_Core_Resources_CollectionAdderInterface // TODO consider caching results $base = $this->paths->hasVariable($ext) ? $this->paths->getVariable($ext, 'url') - : ($this->extMapper->keyToUrl($ext) . '/'); - return $base . $file; + : $this->extMapper->keyToUrl($ext); + return rtrim($base, '/') . "/$file"; } /** diff --git a/civicrm/CRM/Core/WorkflowMessage/ProfileTrait.php b/civicrm/CRM/Core/WorkflowMessage/ProfileTrait.php new file mode 100644 index 0000000000..1a7367ba1e --- /dev/null +++ b/civicrm/CRM/Core/WorkflowMessage/ProfileTrait.php @@ -0,0 +1,214 @@ +<?php + +use Civi\Api4\UFGroup; +use Civi\Api4\UFJoin; + +/** + * Trait for participant workflow classes. + * + * @method string getNote() + */ +trait CRM_Core_WorkflowMessage_ProfileTrait { + + /** + * The profiles array is not currently assigned / used but might + * be saner than the ones that are. + * + * @var array + */ + protected $profiles; + + /** + * The note, if any, from the session. + * + * As multiple notes can be attached to a participant records we only want + * to render a note as part of the profile if the user entered it in the form submission. + * + * @var string + */ + protected string $note = ''; + + /** + * @var array + * + * @scope tplParams as customPre + */ + public $profilesPreForm; + + /** + * @var array + * + * @scope tplParams as customPost + */ + public $profilesPostForm; + + /** + * @var array + * + * @scope tplParams as customPre_grouptitle + */ + public $profileTitlesPreForm; + + /** + * @var array + * + * @scope tplParams as customPost_grouptitle + */ + public $profileTitlesPostForm; + + /** + * @var array + * + * @scope tplParams as customProfile + */ + public $profilesAdditionalParticipants; + + /** + * @throws \CRM_Core_Exception + */ + public function getProfiles(): array { + if (!isset($this->profiles)) { + if ($this->getEventID()) { + $joins = (array) UFJoin::get(FALSE) + ->addWhere('entity_table', '=', 'civicrm_event') + ->addWhere('entity_id', '=', $this->getEventID()) + ->addWhere('is_active', '=', TRUE) + ->addSelect('module', 'weight', 'uf_group_id') + ->addOrderBy('weight') + ->execute(); + $profiles = UFGroup::get(FALSE) + ->addWhere('id', 'IN', CRM_Utils_Array::collect('uf_group_id', $joins)) + ->execute()->indexBy('id'); + foreach ($joins as $join) { + // The thing we want to order by is on the join not the profile + // hence we iterate the joins. + $profile = $profiles[$join['uf_group_id']]; + $profile['placement'] = $join['weight'] === 1 ? 'pre' : 'post'; + $profile['is_additional_participant'] = $join['module'] === 'CiviEvent_Additional'; + if ($join['module'] === 'CiviEvent') { + $profile['participant_id'] = $this->getParticipantID(); + try { + $fields = CRM_Event_BAO_Event::getProfileDisplay([$profile['id']], + $this->getParticipant()['contact_id'] ?? 0, + $this->getParticipantID(), + $this->getNote(), + ); + } + catch (CRM_Core_Exception $e) { + // This could be false if the person does not have permission. This came up in + // the SelfSvcTransfer workflow via test testTransferAnonymous & it seems OK + // to not include profile data in this scenario ... probably. + $fields = []; + } + $profile['fields'] = $fields ? $fields[0] : []; + } + elseif ($profile['is_additional_participant']) { + foreach ($this->getParticipants() as $participant) { + // Only show the other participants for the primary participant. + if ($this->getIsPrimary() && !$participant['is_primary']) { + if (!isset($profile['fields'])) { + $profile['fields'] = []; + } + try { + $fields = CRM_Event_BAO_Event::getProfileDisplay([$profile['id']], + $participant['contact']['id'], + $participant['id'], + $this->getNote() + ); + } + catch (CRM_Core_Exception $e) { + // This could be false if the person does not have permission. This came up in + // the SelfSvcTransfer workflow via test testTransferAnonymous & it seems OK + // to not include profile data in this scenario ... probably. + $fields = []; + } + $profile['fields'][] = $fields ? $fields[0] : []; + + } + } + } + + $this->profiles[] = $profile; + } + } + } + return $this->profiles; + } + + /** + * @throws \CRM_Core_Exception + */ + public function getProfilesPreForm(): array { + $profiles = []; + foreach ($this->getProfilesByPlacement('pre') as $profile) { + $profiles[] = $profile['fields']; + } + return $profiles; + } + + /** + * @throws \CRM_Core_Exception + */ + public function getProfileTitlesPreForm(): array { + $titles = []; + foreach ($this->getProfilesByPlacement('pre') as $profile) { + $titles[] = $profile['frontend_title']; + } + return $titles; + } + + /** + * @throws \CRM_Core_Exception + */ + public function getProfileTitlesPostForm(): array { + $titles = []; + foreach ($this->getProfilesByPlacement('post') as $profile) { + $titles[] = $profile['frontend_title']; + } + return $titles; + } + + /** + * @throws \CRM_Core_Exception + */ + public function getProfilesPostForm(): array { + $profiles = []; + foreach ($this->getProfilesByPlacement('post') as $profile) { + $profiles[] = $profile['fields']; + } + return $profiles; + } + + public function getProfilesAdditionalParticipants(): array { + $profiles = []; + foreach ($this->getProfiles() as $profile) { + if ($profile['is_additional_participant'] && !empty($profile['fields'])) { + foreach ($profile['fields'] as $participantIndex => $fields) { + $profiles['profile'][$participantIndex][$profile['id']] = $profile['fields'][$participantIndex]; + } + $profiles['title'][$profile['id']] = $profile['title']; + } + } + return $profiles; + } + + /** + * @param string $placement + * pre or post. + * + * @return array + * @throws \CRM_Core_Exception + */ + private function getProfilesByPlacement(string $placement): array { + $profiles = []; + foreach ($this->getProfiles() as $profile) { + if (!empty($profile['participant_id']) && $profile['participant_id'] === $this->getParticipantID()) { + if ($profile['placement'] === $placement) { + $profiles[] = $profile; + } + } + } + return $profiles; + } + +} diff --git a/civicrm/CRM/Custom/Form/CustomDataTrait.php b/civicrm/CRM/Custom/Form/CustomDataTrait.php index 2d8838aeed..1ba74802b4 100644 --- a/civicrm/CRM/Custom/Form/CustomDataTrait.php +++ b/civicrm/CRM/Custom/Form/CustomDataTrait.php @@ -168,8 +168,8 @@ trait CRM_Custom_Form_CustomDataTrait { /** * Get the submitted custom fields. * - * This is returned apiv3 style but in future could take - * api version as a parameter. + * This is returned apiv3 style. + * @see getSubmittedCustomFieldsForApi4() * * @return array */ @@ -183,4 +183,21 @@ trait CRM_Custom_Form_CustomDataTrait { return $fields; } + /** + * Get the submitted custom fields in Api4 format. + * + * @return array + */ + protected function getSubmittedCustomFieldsForApi4(): array { + $fields = []; + foreach ($this->getSubmittedValues() as $label => $field) { + if (preg_match('/^custom_(\d+)_?(-?\d+)?$/', $label)) { + if ($new = CRM_Core_BAO_CustomField::getLongNameFromShortName($label)) { + $fields[$new] = $field; + } + } + } + return $fields; + } + } diff --git a/civicrm/CRM/Dedupe/Merger.php b/civicrm/CRM/Dedupe/Merger.php index ae34a26729..a02de39002 100644 --- a/civicrm/CRM/Dedupe/Merger.php +++ b/civicrm/CRM/Dedupe/Merger.php @@ -885,18 +885,7 @@ INNER JOIN civicrm_membership membership2 ON membership1.membership_type_id = m } } else { - if (substr($key, 0, 4) === 'url-') { - CRM_Core_Error::deprecatedWarning('code should be unreachable, slated for removal'); - $websiteField = explode('-', $key); - $data['website'][$websiteField[1]]['website_type_id'] = $websiteField[1]; - $data['website'][$websiteField[1]]['url'] = $value; - } - elseif (in_array($key, CRM_Contact_BAO_Contact::$_greetingTypes, TRUE)) { - CRM_Core_Error::deprecatedWarning('code should be unreachable, slated for removal'); - //save email/postal greeting and addressee values if any, CRM-4575 - $data[$key . '_id'] = $value; - } - elseif (($customFieldId = CRM_Core_BAO_CustomField::getKeyID($key))) { + if (($customFieldId = CRM_Core_BAO_CustomField::getKeyID($key))) { // for autocomplete transfer hidden value instead of label if ($params[$key] && isset($params[$key . '_id'])) { $value = $params[$key . '_id']; @@ -915,21 +904,6 @@ INNER JOIN civicrm_membership membership2 ON membership1.membership_type_id = m } $valueId = NULL; - if (!empty($params['customRecordValues'])) { - CRM_Core_Error::deprecatedWarning('code should be unreachable, slated for removal'); - if (is_array($params['customRecordValues']) && !empty($params['customRecordValues'])) { - foreach ($params['customRecordValues'] as $recId => $customFields) { - if (is_array($customFields) && !empty($customFields)) { - foreach ($customFields as $customFieldName) { - if ($customFieldName == $key) { - $valueId = $recId; - break; - } - } - } - } - } - } //CRM-13596 - check for contact_sub_type_hidden first $type = $data['contact_type']; @@ -949,21 +923,7 @@ INNER JOIN civicrm_membership membership2 ON membership1.membership_type_id = m $includeViewOnly, ); } - elseif ($key === 'edit') { - CRM_Core_Error::deprecatedWarning('code should be unreachable, slated for removal'); - continue; - } else { - if ($key === 'location') { - CRM_Core_Error::deprecatedWarning('code should be unreachable, slated for removal'); - foreach ($value as $locationTypeId => $field) { - foreach ($field as $block => $val) { - if ($block === 'address' && array_key_exists('address_name', $val)) { - $value[$locationTypeId][$block]['name'] = $value[$locationTypeId][$block]['address_name']; - } - } - } - } $data[$key] = $value; } } diff --git a/civicrm/CRM/Event/BAO/Event.php b/civicrm/CRM/Event/BAO/Event.php index 64adbb03f7..828ec08e03 100644 --- a/civicrm/CRM/Event/BAO/Event.php +++ b/civicrm/CRM/Event/BAO/Event.php @@ -1074,7 +1074,7 @@ WHERE civicrm_event.is_active = 1 ]; //get the params submitted by participant. - $participantParams = CRM_Utils_Array::value($participantId, $values['params'], []); + $participantParams = $values['params'][$participantId] ?? []; if (!$returnMessageText) { //send notification email if field values are set (CRM-1941) @@ -1115,55 +1115,10 @@ WHERE civicrm_event.is_active = 1 $notifyEmail = CRM_Utils_Array::valueByRegexKey('/^email-/', $participantParams) ?? $email; //send email only when email is present if (isset($notifyEmail) || $returnMessageText) { - $preProfileID = $values['custom_pre_id'] ?? NULL; - $postProfileID = $values['custom_post_id'] ?? NULL; - - if (!empty($values['params']['additionalParticipant'])) { - $preProfileID = CRM_Utils_Array::value('additional_custom_pre_id', $values, $preProfileID); - $postProfileID = CRM_Utils_Array::value('additional_custom_post_id', $values, $postProfileID); - } - - $profilePre = self::buildCustomDisplay($preProfileID, - 'customPre', - $contactID, - $template, - $participantId, - $isTest, - TRUE, - $participantParams - ); - - $profilePost = self::buildCustomDisplay($postProfileID, - 'customPost', - $contactID, - $template, - $participantId, - $isTest, - TRUE, - $participantParams - ); - - // @todo - the goal is that all params available to the message template are explicitly defined here rather than - // 'in a smattering of places'. Note that leakage can happen between mailings when not explicitly defined. - if ($postProfileID) { - $customPostTitles = empty($profilePost[1]) ? NULL : []; - foreach ($postProfileID as $offset => $id) { - $customPostTitles[$offset] = CRM_Core_BAO_UFGroup::getFrontEndTitle((int) $id); - } - } - else { - $customPostTitles = NULL; - } $tplParams = array_merge($values, $participantParams, [ 'email' => $notifyEmail, 'confirm_email_text' => $values['event']['confirm_email_text'] ?? NULL, 'isShowLocation' => $values['event']['is_show_location'] ?? NULL, - 'customPre' => $profilePre[0], - 'customPre_grouptitle' => empty($profilePre[1]) ? NULL : [CRM_Core_BAO_UFGroup::getFrontEndTitle((int) $preProfileID)], - 'customPost' => $profilePost[0], - 'customPost_grouptitle' => $customPostTitles, - 'participantID' => $participantId, - 'contactID' => $contactID, 'credit_card_number' => CRM_Utils_System::mungeCreditCard(CRM_Utils_Array::value('credit_card_number', $participantParams)), 'credit_card_exp_date' => CRM_Utils_Date::mysqlToIso(CRM_Utils_Date::format(CRM_Utils_Array::value('credit_card_exp_date', $participantParams))), 'selfcancelxfer_time' => abs($values['event']['selfcancelxfer_time']), @@ -1174,10 +1129,12 @@ WHERE civicrm_event.is_active = 1 // CRM-13890 : NOTE wait list condition need to be given so that // wait list message is shown properly in email i.e. WRT online event registration template if (empty($tplParams['participant_status']) && empty($values['params']['isOnWaitlist'])) { + // @todo - this is no longer used in the core template - deprecate & remove $statusId = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Participant', $participantId, 'status_id', 'id', TRUE); $tplParams['participant_status'] = CRM_Event_PseudoConstant::participantStatus($statusId, NULL, 'label'); } //CRM-15754 - if participant_status contains status ID + // @todo - this is no longer used in the core template - deprecate & remove elseif (!empty($tplParams['participant_status']) && CRM_Utils_Rule::integer($tplParams['participant_status'])) { $tplParams['participant_status'] = CRM_Event_PseudoConstant::participantStatus($tplParams['participant_status'], NULL, 'label'); } @@ -1191,6 +1148,7 @@ WHERE civicrm_event.is_active = 1 'participantID' => (int) $participantId, 'eventID' => (int) $values['event']['id'], 'contactID' => (int) $contactID, + 'note' => $participantParams['note'] ?? '', ], ]; @@ -1293,7 +1251,7 @@ WHERE civicrm_event.is_active = 1 $groups = $participantParams['group'] ?? NULL; $note = $participantParams['note'] ?? NULL; - $displayValues = self::getProfileDisplay($profileIds, $cid, $participantId, $isTest, $groups, $note); + $displayValues = self::getProfileDisplay($profileIds, $cid, $participantId, $note, $groups, $isTest); $groupTitles = UFGroup::get(FALSE) ->addWhere('id', 'IN', $profileIds) @@ -2312,7 +2270,7 @@ WHERE ce.loc_block_id = $locBlockId"; * @throws \CRM_Core_Exception * @throws \Civi\Core\Exception\DBQueryException */ - public static function getProfileDisplay(array $profileIds, int $cid, int $participantId, bool $isTest = FALSE, ?array $groups = NULL, ?string $note = NULL): ?array { + public static function getProfileDisplay(array $profileIds, int $cid, int $participantId, ?string $note = NULL, ?array $groups = NULL, bool $isTest = FALSE): ?array { foreach ($profileIds as $gid) { if (CRM_Core_BAO_UFGroup::filterUFGroups($gid, $cid)) { $values = []; @@ -2391,8 +2349,8 @@ WHERE ce.loc_block_id = $locBlockId"; //dev/event#10 //If the event profile includes a note field and the submitted value of //that field is "", then remove the old note returned by getValues. - if ($note === '') { - $noteKeyPos = array_search('note', array_keys($fields)); + if ($note === '' && array_key_exists('note', $fields)) { + $noteKeyPos = array_search('note', array_keys($fields), TRUE); $valuesKeys = array_keys($values); $values[$valuesKeys[$noteKeyPos]] = ""; } diff --git a/civicrm/CRM/Event/Form/Registration.php b/civicrm/CRM/Event/Form/Registration.php index df1f969fca..66f055b6ea 100644 --- a/civicrm/CRM/Event/Form/Registration.php +++ b/civicrm/CRM/Event/Form/Registration.php @@ -485,6 +485,12 @@ class CRM_Event_Form_Registration extends CRM_Core_Form { $this->_isBillingAddressRequiredForPayLater = $this->_values['event']['is_billing_required'] ?? NULL; $this->assign('isBillingAddressRequiredForPayLater', $this->_isBillingAddressRequiredForPayLater); } + + // set the noindex metatag for non-public events + if (!$this->getEventValue('is_public')) { + CRM_Utils_System::setNoRobotsFlag(); + } + } /** diff --git a/civicrm/CRM/Event/Page/EventInfo.php b/civicrm/CRM/Event/Page/EventInfo.php index ec2c2a2649..afbe657605 100644 --- a/civicrm/CRM/Event/Page/EventInfo.php +++ b/civicrm/CRM/Event/Page/EventInfo.php @@ -60,7 +60,7 @@ class CRM_Event_Page_EventInfo extends CRM_Core_Page { } if (!$values['event']['is_public']) { - CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">'); + CRM_Utils_System::setNoRobotsFlag(); } if (!empty($values['event']['is_template'])) { diff --git a/civicrm/CRM/Event/WorkflowMessage/EventOfflineReceipt.php b/civicrm/CRM/Event/WorkflowMessage/EventOfflineReceipt.php index 1fbec19de2..278fdb4cd7 100644 --- a/civicrm/CRM/Event/WorkflowMessage/EventOfflineReceipt.php +++ b/civicrm/CRM/Event/WorkflowMessage/EventOfflineReceipt.php @@ -80,7 +80,7 @@ class CRM_Event_WorkflowMessage_EventOfflineReceipt extends GenericWorkflowMessa * @throws \CRM_Core_Exception */ protected function getFieldsToLoadForParticipant(): array { - $fields = ['registered_by_id', 'role_id', 'event_id', 'event_id.event_type_id']; + $fields = ['registered_by_id', 'role_id', 'event_id', 'event_id.event_type_id', 'contact_id']; // Request the relevant custom fields. This list is // restricted by view-ability but we don't have the information // at this point to filter by the finer tuned entity extends information diff --git a/civicrm/CRM/Event/WorkflowMessage/ParticipantTrait.php b/civicrm/CRM/Event/WorkflowMessage/ParticipantTrait.php index be46e2c807..75b01dd41e 100644 --- a/civicrm/CRM/Event/WorkflowMessage/ParticipantTrait.php +++ b/civicrm/CRM/Event/WorkflowMessage/ParticipantTrait.php @@ -12,6 +12,8 @@ use Civi\Api4\Participant; trait CRM_Event_WorkflowMessage_ParticipantTrait { use CRM_Contribute_WorkflowMessage_ContributionTrait; + use CRM_Core_WorkflowMessage_ProfileTrait; + /** * @var int * @@ -247,7 +249,7 @@ trait CRM_Event_WorkflowMessage_ParticipantTrait { * Get the participant fields we need to load. */ protected function getFieldsToLoadForParticipant(): array { - return ['registered_by_id']; + return ['registered_by_id', 'contact_id']; } /** @@ -278,15 +280,12 @@ trait CRM_Event_WorkflowMessage_ParticipantTrait { */ public function getParticipants(): array { if (!$this->participants) { - if (!$this->getLineItems()) { - return []; - } // Initiate with the current participant to ensure they are first. $participants = [$this->participantID => ['id' => $this->participantID, 'tax_rate_breakdown' => []]]; - if ($this->isCiviContributeEnabled()) { + if ($this->getLineItems() && $this->isCiviContributeEnabled()) { foreach ($this->getLineItems() as $lineItem) { if ($lineItem['entity_table'] === 'civicrm_participant') { - $participantID = $lineItem['entity_id']; + $participantID = (int) $lineItem['entity_id']; } else { // It is not clear if this could ever be true - testing the CiviCRM event @@ -314,10 +313,16 @@ trait CRM_Event_WorkflowMessage_ParticipantTrait { $participants[$participantID]['tax_rate_breakdown'][$lineItem['tax_rate']]['amount'] += $lineItem['tax_amount']; } } - + elseif ($this->getIsPrimary()) { + $participants += (array) Participant::get(FALSE) + ->setSelect(['id']) + ->addWhere('registered_by_id', '=', $this->getPrimaryParticipantID()) + ->execute()->indexBy('id'); + } $count = 1; foreach ($participants as $participantID => &$participant) { $participant['id'] = $participantID; + $participant['is_primary'] = $this->getParticipantID() === $participantID; $participant['index'] = $count; $participant['contact'] = $this->getParticipantContact($participantID); foreach ($participant['tax_rate_breakdown'] ?? [] as $rate => $details) { @@ -325,10 +330,13 @@ trait CRM_Event_WorkflowMessage_ParticipantTrait { unset($participant['tax_rate_breakdown'][$rate]); } } - if (array_keys($participant['tax_rate_breakdown']) === [0]) { + if (array_keys($participant['tax_rate_breakdown'] ?? []) === [0]) { // If the only tax rate charged is 0% then no tax breakdown is returned. $participant['tax_rate_breakdown'] = []; } + if (!isset($participant['line_items'])) { + $participant['line_items'] = []; + } $count++; } $this->participants = $participants; diff --git a/civicrm/CRM/Export/Form/Select.php b/civicrm/CRM/Export/Form/Select.php index 69cb9f477f..81032b6d0a 100644 --- a/civicrm/CRM/Export/Form/Select.php +++ b/civicrm/CRM/Export/Form/Select.php @@ -52,6 +52,24 @@ class CRM_Export_Form_Select extends CRM_Core_Form_Task { public $_componentTable; + /** + * @var bool + * @internal + */ + public $_selectAll; + + /** + * @var bool + * @internal + */ + public $_matchingContacts; + + /** + * @var array + * @internal + */ + public $_greetingOptions; + /** * Use the form name to create the tpl file name. * diff --git a/civicrm/CRM/Extension/Container/Basic.php b/civicrm/CRM/Extension/Container/Basic.php index b99e855126..20d070b29d 100644 --- a/civicrm/CRM/Extension/Container/Basic.php +++ b/civicrm/CRM/Extension/Container/Basic.php @@ -98,7 +98,7 @@ class CRM_Extension_Container_Basic implements CRM_Extension_Container_Interface public function __construct($baseDir, $baseUrl, ?CRM_Utils_Cache_Interface $cache = NULL, $cacheKey = NULL, ?int $maxDepth = NULL) { $this->cache = $cache; $this->cacheKey = $cacheKey; - $this->baseDir = rtrim($baseDir, '/'); + $this->baseDir = rtrim($baseDir, '/' . DIRECTORY_SEPARATOR); $this->baseUrl = rtrim($baseUrl, '/'); $this->maxDepth = $maxDepth; } diff --git a/civicrm/CRM/Group/Form/Edit.php b/civicrm/CRM/Group/Form/Edit.php index e6b4f97c66..e0d261362b 100644 --- a/civicrm/CRM/Group/Form/Edit.php +++ b/civicrm/CRM/Group/Form/Edit.php @@ -30,13 +30,6 @@ class CRM_Group_Form_Edit extends CRM_Core_Form { */ protected $_group; - /** - * The title of the group being deleted - * - * @var string - */ - protected $_title; - /** * Store the group values * @@ -107,7 +100,6 @@ class CRM_Group_Form_Edit extends CRM_Core_Form { $this->_groupValues = []; $params = ['id' => $this->_id]; $this->_group = CRM_Contact_BAO_Group::retrieve($params, $this->_groupValues); - $this->_title = $this->_groupValues['title']; } $this->assign('action', $this->_action); @@ -115,8 +107,8 @@ class CRM_Group_Form_Edit extends CRM_Core_Form { if ($this->_action == CRM_Core_Action::DELETE) { if (isset($this->_id)) { - $this->assign('title', $this->_title); - if (!($this->_groupValues['saved_search_id'])) { + $this->assign('title', $this->_groupValues['title']); + if (empty($this->_groupValues['saved_search_id'])) { try { $count = CRM_Contact_BAO_Group::memberCount($this->_id); } @@ -139,7 +131,7 @@ class CRM_Group_Form_Edit extends CRM_Core_Form { if (isset($this->_id)) { $groupValues = [ 'id' => $this->_id, - 'title' => $this->_title, + 'title' => $this->_groupValues['title'], 'saved_search_id' => $this->_groupValues['saved_search_id'] ?? '', ]; $this->assign('editSmartGroupURL', isset($this->_groupValues['saved_search_id']) ? CRM_Contact_BAO_SavedSearch::getEditSearchUrl($this->_groupValues['saved_search_id']) : NULL); @@ -148,7 +140,7 @@ class CRM_Group_Form_Edit extends CRM_Core_Form { $this->assign('group', $groupValues); - $this->setTitle(ts('Group Settings: %1', [1 => $this->_title])); + $this->setTitle(ts('Group Settings: %1', [1 => $this->_groupValues['title']])); } $session = CRM_Core_Session::singleton(); $session->pushUserContext(CRM_Utils_System::url('civicrm/group', 'reset=1')); @@ -302,7 +294,7 @@ WHERE title = %1 $updateNestingCache = FALSE; if ($this->_action & CRM_Core_Action::DELETE) { CRM_Contact_BAO_Group::discard($this->_id); - CRM_Core_Session::setStatus(ts("The Group '%1' has been deleted.", [1 => $this->_title]), ts('Group Deleted'), 'success'); + CRM_Core_Session::setStatus(ts("The Group '%1' has been deleted.", [1 => $this->_groupValues['title']]), ts('Group Deleted'), 'success'); $updateNestingCache = TRUE; } else { diff --git a/civicrm/CRM/Mailing/BAO/Mailing.php b/civicrm/CRM/Mailing/BAO/Mailing.php index 2051a4fb4b..eebc7b81d1 100644 --- a/civicrm/CRM/Mailing/BAO/Mailing.php +++ b/civicrm/CRM/Mailing/BAO/Mailing.php @@ -1235,17 +1235,20 @@ ORDER BY civicrm_email.is_bulkmail DESC * The mailing id to report. * @param bool $skipDetails * Whether return all detailed report. - * * @param bool $isSMS + * Deprecated argument, will be removed. * * @return array * Associative array of reporting data */ - public static function &report($id, $skipDetails = FALSE, $isSMS = FALSE) { + public static function report($id, $skipDetails = FALSE, $isSMS = FALSE) { $mailing_id = CRM_Utils_Type::escape($id, 'Integer'); - $mailing = new CRM_Mailing_BAO_Mailing(); + if ($isSMS) { + CRM_Core_Error::deprecatedFunctionWarning("isSMS param is deprecated"); + } + $t = [ 'mailing' => self::getTableName(), 'mailing_group' => CRM_Mailing_DAO_MailingGroup::getTableName(), @@ -1264,31 +1267,21 @@ ORDER BY civicrm_email.is_bulkmail DESC 'spool' => CRM_Mailing_BAO_Spool::getTableName(), ]; - $report = []; - $additionalWhereClause = " AND "; - if (!$isSMS) { - $additionalWhereClause .= " {$t['mailing']}.sms_provider_id IS NULL "; - } - else { - $additionalWhereClause .= " {$t['mailing']}.sms_provider_id IS NOT NULL "; - } - - /* Get the mailing info */ - + // Get the mailing info $mailing->query(" SELECT {$t['mailing']}.* FROM {$t['mailing']} - WHERE {$t['mailing']}.id = $mailing_id {$additionalWhereClause}"); - + WHERE {$t['mailing']}.id = $mailing_id"); $mailing->fetch(); + $report = []; $report['mailing'] = []; foreach (array_keys(self::fields()) as $field) { $field = self::fields()[$field]['name']; $report['mailing'][$field] = $mailing->$field; } - //get the campaign + // Get the campaign $campaignId = $report['mailing']['campaign_id'] ?? NULL; if ($campaignId) { $campaigns = CRM_Campaign_BAO_Campaign::getCampaigns($campaignId); @@ -1301,8 +1294,7 @@ ORDER BY civicrm_email.is_bulkmail DESC return $report; } - /* Get the component info */ - + // Get the component info $query = []; $components = [ @@ -1335,8 +1327,7 @@ ORDER BY civicrm_email.is_bulkmail DESC ]; } - /* Get the recipient group info */ - + // Get the recipient group info $mailing->query(" SELECT {$t['mailing_group']}.group_type as group_type, {$t['group']}.id as group_id, @@ -1377,8 +1368,7 @@ ORDER BY civicrm_email.is_bulkmail DESC ); } - /* Rename hidden groups */ - + // Rename hidden groups if ($mailing->group_hidden == 1) { $row['name'] = "Search Results"; } @@ -1394,8 +1384,7 @@ ORDER BY civicrm_email.is_bulkmail DESC } } - /* Get the event totals, grouped by job (retries) */ - + // Get the event totals, grouped by job (retries) $mailing->query(" SELECT {$t['job']}.*, COUNT(DISTINCT {$t['queue']}.id) as queue, @@ -1534,8 +1523,7 @@ ORDER BY civicrm_email.is_bulkmail DESC $report['event_totals']['clickthrough_rate'] = 0; } - /* Get the click-through totals, grouped by URL */ - + // Get the click-through totals, grouped by URL $mailing->query(" SELECT {$t['url']}.url, {$t['url']}.id, diff --git a/civicrm/CRM/Mailing/Form/Optout.php b/civicrm/CRM/Mailing/Form/Optout.php index de8855b0bc..b54df1298c 100644 --- a/civicrm/CRM/Mailing/Form/Optout.php +++ b/civicrm/CRM/Mailing/Form/Optout.php @@ -63,7 +63,7 @@ class CRM_Mailing_Form_Optout extends CRM_Core_Form { ); } - list($displayName, $email) = CRM_Mailing_Event_BAO_MailingEventQueue::getContactInfo($queue_id); + [$displayName, $email] = CRM_Mailing_Event_BAO_MailingEventQueue::getContactInfo($queue_id); $this->assign('display_name', $displayName); $emailMasked = CRM_Utils_String::maskEmail($email); $this->assign('email_masked', $emailMasked); @@ -72,7 +72,7 @@ class CRM_Mailing_Form_Optout extends CRM_Core_Form { } public function buildQuickForm() { - CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">'); + CRM_Utils_System::setNoRobotsFlag(); $this->setTitle(ts('Opt Out Confirmation')); $buttons = [ diff --git a/civicrm/CRM/Mailing/Form/Unsubscribe.php b/civicrm/CRM/Mailing/Form/Unsubscribe.php index bfb2215ca0..09031ffb2e 100644 --- a/civicrm/CRM/Mailing/Form/Unsubscribe.php +++ b/civicrm/CRM/Mailing/Form/Unsubscribe.php @@ -95,7 +95,7 @@ class CRM_Mailing_Form_Unsubscribe extends CRM_Core_Form { } public function buildQuickForm() { - CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">'); + CRM_Utils_System::setNoRobotsFlag(); $this->setTitle(ts('Unsubscribe Confirmation')); $buttons = [ diff --git a/civicrm/CRM/Mailing/Page/Confirm.php b/civicrm/CRM/Mailing/Page/Confirm.php index ced43f2e26..dfa24b4c7f 100644 --- a/civicrm/CRM/Mailing/Page/Confirm.php +++ b/civicrm/CRM/Mailing/Page/Confirm.php @@ -21,7 +21,7 @@ class CRM_Mailing_Page_Confirm extends CRM_Core_Page { * @throws Exception */ public function run() { - CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">'); + CRM_Utils_System::setNoRobotsFlag(); $contact_id = CRM_Utils_Request::retrieve('cid', 'Integer'); $subscribe_id = CRM_Utils_Request::retrieve('sid', 'Integer'); diff --git a/civicrm/CRM/Mailing/Selector/Browse.php b/civicrm/CRM/Mailing/Selector/Browse.php index dd649d7543..4d73a73b0a 100644 --- a/civicrm/CRM/Mailing/Selector/Browse.php +++ b/civicrm/CRM/Mailing/Selector/Browse.php @@ -371,7 +371,7 @@ LEFT JOIN civicrm_contact scheduledContact ON ( $mailing.scheduled_id = schedul $actionLinks[CRM_Core_Action::UPDATE]['title'] = ts('Copy SMS'); $actionLinks[CRM_Core_Action::VIEW]['title'] = ts('View SMS Report'); } - if (!($row['status'] === 'Not scheduled') && !$row['sms_provider_id']) { + if ($row['status'] !== 'Not scheduled') { if ($allAccess || $showCreateLinks) { $actionMask = CRM_Core_Action::VIEW; } diff --git a/civicrm/CRM/Member/BAO/MembershipType.php b/civicrm/CRM/Member/BAO/MembershipType.php index b0d351b00a..15946e4489 100644 --- a/civicrm/CRM/Member/BAO/MembershipType.php +++ b/civicrm/CRM/Member/BAO/MembershipType.php @@ -162,7 +162,7 @@ class CRM_Member_BAO_MembershipType extends CRM_Member_DAO_MembershipType implem if (in_array('Membership', $status)) { $findMembersURL = CRM_Utils_System::url('civicrm/member/search', 'reset=1'); $deleteURL = CRM_Utils_System::url('civicrm/contact/search/advanced', 'reset=1'); - $message .= '<br/>' . ts('%3. There are some contacts who have this membership type assigned to them. Search for contacts with this membership type from <a href=\'%1\'>Find Members</a>. If you are still getting this message after deleting these memberships, there may be contacts in the Trash (deleted) with this membership type. Try using <a href="%2">Advanced Search</a> and checking "Search in Trash".', [ + $message .= '<br/>' . ts('%3. There are some contacts who have this membership type assigned to them. Search for contacts with this membership type from <a href=\'%1\'>Find Members</a>. If you are still getting this message after deleting these memberships, there may be contacts in the Trash (deleted) with this membership type. Try using <a href="%2">Advanced Search</a> and checking "Search Deleted Contacts".', [ 1 => $findMembersURL, 2 => $deleteURL, 3 => $cnt, diff --git a/civicrm/CRM/Member/Page/UserDashboard.php b/civicrm/CRM/Member/Page/UserDashboard.php index 5e427c40be..5646d93713 100644 --- a/civicrm/CRM/Member/Page/UserDashboard.php +++ b/civicrm/CRM/Member/Page/UserDashboard.php @@ -65,8 +65,54 @@ class CRM_Member_Page_UserDashboard extends CRM_Contact_Page_View_UserDashBoard $activeMembers = CRM_Member_BAO_Membership::activeMembers($membership); $inActiveMembers = CRM_Member_BAO_Membership::activeMembers($membership, 'inactive'); + // Add Recurring Links (if allowed) + $this->buildMemberLinks($activeMembers); + $this->buildMemberLinks($inActiveMembers); + $this->assign('activeMembers', $activeMembers); $this->assign('inActiveMembers', $inActiveMembers); + + } + + /** + * Helper function to build appropriate Member links + */ + public function buildMemberLinks(&$members) { + if (!empty($members)) { + foreach ($members as $id => &$member) { + if (empty($member['contribution_recur_id'])) { + continue; + } + + $paymentProcessor = NULL; + try { + $contributionRecur = \Civi\Api4\ContributionRecur::get(FALSE) + ->addSelect('payment_processor_id') + ->addWhere('id', '=', $member['contribution_recur_id']) + ->execute() + ->first(); + + if (!empty($contributionRecur['payment_processor_id'])) { + $paymentProcessor = \Civi\Api4\PaymentProcessor::get(FALSE) + ->addWhere('id', '=', $contributionRecur['payment_processor_id']) + ->execute() + ->first(); + } + } + catch (Exception $e) { + Civi::log()->warning('Member/UserDashboard: Unable to retrieve recur information ' . $e->getMessage()); + continue; + } + + if (!empty($paymentProcessor)) { + $paymentObject = Civi\Payment\System::singleton()->getByProcessor($paymentProcessor); + $member['cancelSubscriptionUrl'] = $paymentObject->subscriptionURL($member['membership_id'], 'membership', 'cancel'); + $member['updateSubscriptionBillingUrl'] = $paymentObject->subscriptionURL($member['membership_id'], 'membership', 'billing'); + $member['updateSubscriptionUrl'] = $paymentObject->subscriptionURL($member['membership_id'], 'membership', 'update'); + } + } + } + } /** diff --git a/civicrm/CRM/Price/Form/Field.php b/civicrm/CRM/Price/Form/Field.php index ea82196dcf..ec6f1f7975 100644 --- a/civicrm/CRM/Price/Form/Field.php +++ b/civicrm/CRM/Price/Form/Field.php @@ -215,12 +215,12 @@ class CRM_Price_Form_Field extends CRM_Core_Form { $this->assign('useForEvent', FALSE); } - $sel = $this->add('select', 'html_type', ts('Input Field Type'), + $sel = $this->add('select', 'html_type', ts('Field Type'), $htmlTypes, TRUE, $javascript ); // price (for text inputs) - $this->add('text', 'price', ts('Price')); + $this->add('text', 'price', ts('Unit Price')); $this->registerRule('price', 'callback', 'money', 'CRM_Utils_Rule'); $this->addRule('price', ts('must be a monetary value'), 'money'); diff --git a/civicrm/CRM/Report/Form.php b/civicrm/CRM/Report/Form.php index 823f874d92..5c48a1bd9e 100644 --- a/civicrm/CRM/Report/Form.php +++ b/civicrm/CRM/Report/Form.php @@ -1478,7 +1478,7 @@ class CRM_Report_Form extends CRM_Core_Form { default: // default type is string $this->addElement('select', "{$fieldName}_op", ts('Operator:'), $operations, - ['onchange' => "return showHideMaxMinVal( '$fieldName', this.value );"] + ['onchange' => "return showHideMaxMinVal( '$fieldName', this.value );", 'title' => ts('%1 Filter Operator', [1 => $field['title']])] ); // we need text box for value input $this->add('text', "{$fieldName}_value", NULL, ['class' => 'huge']); @@ -1695,8 +1695,8 @@ class CRM_Report_Form extends CRM_Core_Form { 'ASC' => ts('Ascending'), 'DESC' => ts('Descending'), ]); - $this->addElement('checkbox', "order_bys[{$i}][section]", ts('Order by Section'), FALSE, ['id' => "order_by_section_$i"]); - $this->addElement('checkbox', "order_bys[{$i}][pageBreak]", ts('Page Break'), FALSE, ['id' => "order_by_pagebreak_$i"]); + $this->addElement('checkbox', "order_bys[{$i}][section]", ts('Order by Section'), FALSE, ['id' => "order_by_section_$i", 'title' => ts('Order by Section %1', [1 => $i])]); + $this->addElement('checkbox', "order_bys[{$i}][pageBreak]", ts('Page Break'), FALSE, ['id' => "order_by_pagebreak_$i", 'title' => ts('Page Break %1', [1 => $i])]); } } } @@ -1723,7 +1723,7 @@ class CRM_Report_Form extends CRM_Core_Form { $this->addElement('select', 'groups', ts('Group'), ['' => ts('Add Contacts to Group')] + CRM_Core_PseudoConstant::nestedGroup(), - ['class' => 'crm-select2 crm-action-menu fa-plus huge'] + ['class' => 'crm-select2 crm-action-menu fa-plus huge', 'title' => ts('Add Contacts to Group')] ); $this->assign('group', TRUE); } diff --git a/civicrm/CRM/Report/Form/Instance.php b/civicrm/CRM/Report/Form/Instance.php index 4230e15063..e46bf73c4f 100644 --- a/civicrm/CRM/Report/Form/Instance.php +++ b/civicrm/CRM/Report/Form/Instance.php @@ -125,6 +125,7 @@ class CRM_Report_Form_Instance { 'size' => 5, 'style' => 'width:240px', 'class' => 'advmultiselect', + 'title' => ts('ACL Group/Role'), ] ); $grouprole->setButtonAttributes('add', ['value' => ts('Add >>')]); diff --git a/civicrm/CRM/Upgrade/Incremental/Base.php b/civicrm/CRM/Upgrade/Incremental/Base.php index 5b410418f6..87ae6c5ed3 100644 --- a/civicrm/CRM/Upgrade/Incremental/Base.php +++ b/civicrm/CRM/Upgrade/Incremental/Base.php @@ -390,6 +390,30 @@ class CRM_Upgrade_Incremental_Base { return CRM_Core_BAO_SchemaHandler::checkFKExists($table_name, $constraint_name); } + /** + * Task to add or change a column definition, based on the php schema spec. + * + * @param $ctx + * @param string $entityName + * @param string $fieldName + * @param array $fieldSpec + * As definied in the .entityType.php file for $entityName + * @return bool + * @throws CRM_Core_Exception + */ + public static function alterSchemaField($ctx, string $entityName, string $fieldName, array $fieldSpec): bool { + $tableName = Civi::entity($entityName)->getMeta('table'); + global $civicrm_root; + $sqlGenerator = require "$civicrm_root/mixin/lib/civimix-schema/src/SqlGenerator.php"; + $fieldSql = $sqlGenerator::generateFieldSql($fieldSpec); + if (CRM_Core_BAO_SchemaHandler::checkIfFieldExists($tableName, $fieldName, FALSE)) { + return self::alterColumn($ctx, $tableName, $fieldName, $fieldSql, !empty($fieldSpec['localizable'])); + } + else { + return self::addColumn($ctx, $tableName, $fieldName, $fieldSql, !empty($fieldSpec['localizable'])); + } + } + /** * Add a column to a table if it doesn't already exist * diff --git a/civicrm/CRM/Upgrade/Incremental/php/FiveEighty.php b/civicrm/CRM/Upgrade/Incremental/php/FiveEighty.php new file mode 100644 index 0000000000..136b57b2dd --- /dev/null +++ b/civicrm/CRM/Upgrade/Incremental/php/FiveEighty.php @@ -0,0 +1,62 @@ +<?php +/* + +--------------------------------------------------------------------+ + | Copyright CiviCRM LLC. All rights reserved. | + | | + | This work is published under the GNU AGPLv3 license with some | + | permitted exceptions and without any warranty. For full license | + | and copyright information, see https://civicrm.org/licensing | + +--------------------------------------------------------------------+ + */ + +/** + * Upgrade logic for the 5.80.x series. + * + * Each minor version in the series is handled by either a `5.80.x.mysql.tpl` file, + * or a function in this class named `upgrade_5_80_x`. + * If only a .tpl file exists for a version, it will be run automatically. + * If the function exists, it must explicitly add the 'runSql' task if there is a corresponding .mysql.tpl. + * + * This class may also implement `setPreUpgradeMessage()` and `setPostUpgradeMessage()` functions. + */ +class CRM_Upgrade_Incremental_php_FiveEighty extends CRM_Upgrade_Incremental_Base { + + /** + * Upgrade step; adds tasks including 'runSql'. + * + * @param string $rev + * The version number matching this function name + */ + public function upgrade_5_80_alpha1($rev): void { + $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev); + $this->addTask('Increase length of Website.url field', 'alterSchemaField', 'Website', 'url', [ + 'title' => ts('Website'), + 'sql_type' => 'varchar(2048)', + 'input_type' => 'Text', + 'description' => ts('Website'), + 'add' => '3.2', + 'usage' => [ + 'import', + 'export', + 'duplicate_matching', + ], + 'input_attrs' => [ + 'size' => '45', + ], + ]); + $this->addTask('Increase length of Activity.location field', 'alterSchemaField', 'Activity', 'location', [ + 'title' => ts('Location'), + 'sql_type' => 'varchar(2048)', + 'input_type' => 'Text', + 'description' => ts('Location of the activity (optional, open text).'), + 'add' => '1.1', + 'unique_name' => 'activity_location', + 'usage' => [ + 'import', + 'export', + 'duplicate_matching', + ], + ]); + } + +} diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.80.alpha1.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.80.alpha1.mysql.tpl new file mode 100644 index 0000000000..a913d871c6 --- /dev/null +++ b/civicrm/CRM/Upgrade/Incremental/sql/5.80.alpha1.mysql.tpl @@ -0,0 +1 @@ +{* file to handle db changes in 5.80.alpha1 during upgrade *} diff --git a/civicrm/CRM/Utils/EnglishNumber.php b/civicrm/CRM/Utils/EnglishNumber.php index 37a8663cce..c3a7777c95 100644 --- a/civicrm/CRM/Utils/EnglishNumber.php +++ b/civicrm/CRM/Utils/EnglishNumber.php @@ -65,18 +65,32 @@ class CRM_Utils_EnglishNumber { * Ex: 'Twelve' or 'FiftyFour'. */ public static function toCamelCase($num, $default = NULL) { + $hundreds = (int) ($num / 100); + $num = ($num % 100); + $tens = (int) ($num / 10); + $last = $num % 10; + + $prefix = ''; + if ($hundreds > 0) { + $prefix = static::toCamelCase($hundreds); + if ($tens === 0 && $last === 0) { + return $prefix . 'Hundred'; + } + elseif ($tens === 0) { + $prefix .= 'Oh'; + } + } + if (isset(self::$lowNumbers[$num])) { - return self::$lowNumbers[$num]; + return $prefix . self::$lowNumbers[$num]; } - $tens = (int) ($num / 10); - $last = $num % 10; if (isset(self::$intervalsOfTen[$tens])) { if ($last == 0) { - return self::$intervalsOfTen[$tens]; + return $prefix . self::$intervalsOfTen[$tens]; } else { - return self::$intervalsOfTen[$tens] . self::$lowNumbers[$last]; + return $prefix . self::$intervalsOfTen[$tens] . self::$lowNumbers[$last]; } } @@ -99,27 +113,8 @@ class CRM_Utils_EnglishNumber { * Ex: 'twelve' or 'fifty-four'. */ public static function toHyphen($num, $default = NULL) { - if (isset(self::$lowNumbers[$num])) { - return strtolower(self::$lowNumbers[$num]); - } - - $tens = (int) ($num / 10); - $last = $num % 10; - if (isset(self::$intervalsOfTen[$tens])) { - if ($last == 0) { - return strtolower(self::$intervalsOfTen[$tens]); - } - else { - return strtolower(self::$intervalsOfTen[$tens]) . '-' . strtolower(self::$lowNumbers[$last]); - } - } - - if ($default === NULL) { - throw new \RuntimeException("Cannot convert number to English: " . (int) $num); - } - else { - return $default; - } + $camel = static::toCamelCase($num, $default); + return strtolower(preg_replace('/([a-zA-Z])(?=[A-Z])/', '$1-', $camel)); } /** diff --git a/civicrm/CRM/Utils/Mail.php b/civicrm/CRM/Utils/Mail.php index 6329e553aa..8ea727400b 100644 --- a/civicrm/CRM/Utils/Mail.php +++ b/civicrm/CRM/Utils/Mail.php @@ -311,7 +311,7 @@ class CRM_Utils_Mail { if ($logCount < 3) { // Only record the first 3 times since there might be different messages but after 3 chances are // it's just bulk run of the same.. - CRM_Core_Error::deprecatedWarning('email output affected by undefined php properties:' . (CRM_Utils_Constant::value('CIVICRM_UF') === 'UnitTests' ? CRM_Utils_String::purifyHTML($htmlMessage) : '')); + CRM_Core_Error::deprecatedWarning('email output affected by undefined php properties:' . (CRM_Utils_Constant::value('CIVICRM_UF') === 'UnitTests' ? CRM_Utils_String::purifyHTML($htmlMessage) . CRM_Utils_String::purifyHTML($textMessage) : '')); $logCount++; \Civi::$statics[__CLASS__][__FUNCTION__]['count'] = $logCount; } diff --git a/civicrm/CRM/Utils/System.php b/civicrm/CRM/Utils/System.php index 1dcd408a30..404401d70d 100644 --- a/civicrm/CRM/Utils/System.php +++ b/civicrm/CRM/Utils/System.php @@ -1196,6 +1196,15 @@ class CRM_Utils_System { return preg_match("/^(\d{1,2}\.){2,3}(\d{1,2}|(alpha|beta)\d{1,2})(\.upgrade)?$/", $version); } + /** + * Set the html header to direct robots not to index the page. + * + * @return void + */ + public static function setNoRobotsFlag(): void { + CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">'); + } + /** * Wraps or emulates PHP's getallheaders() function. */ @@ -1552,9 +1561,7 @@ class CRM_Utils_System { } $config = CRM_Core_Config::singleton(); $result = $config->userSystem->loadBootStrap($params, $loadUser, $throwError, $realPath); - if (is_callable([$config->userSystem, 'setMySQLTimeZone'])) { - $config->userSystem->setMySQLTimeZone(); - } + $config->userSystem->setTimeZone(); return $result; } diff --git a/civicrm/CRM/Utils/System/Base.php b/civicrm/CRM/Utils/System/Base.php index fd7171be47..bec7f8aed0 100644 --- a/civicrm/CRM/Utils/System/Base.php +++ b/civicrm/CRM/Utils/System/Base.php @@ -749,10 +749,14 @@ abstract class CRM_Utils_System_Base { } /** - * Set timezone in mysql so that timestamp fields show the correct time. + * Set MySQL timezone so that timestamp fields show the correct time. + * + * @param ?string $timeZone + * Timezone string - if none provided will be fetched from system */ - public function setMySQLTimeZone() { - $timeZoneOffset = $this->getTimeZoneOffset(); + public function setMySQLTimeZone(?string $timeZone = NULL) { + $timeZone = $timeZone ?? $this->getTimeZoneString(); + $timeZoneOffset = \CRM_Utils_Time::getTimeZoneOffsetFromString($timeZone); if ($timeZoneOffset) { $sql = "SET time_zone = '$timeZoneOffset'"; CRM_Core_DAO::executeQuery($sql); @@ -760,42 +764,29 @@ abstract class CRM_Utils_System_Base { } /** - * Get timezone from CMS. + * Set PHP timezone * - * @return string|false|null + * @param ?string $timeZone + * Timezone string - default value will be fetched + * using getTimeZoneString if not provided or falsey */ - public function getTimeZoneOffset() { - $timezone = $this->getTimeZoneString(); - if ($timezone) { - if ($timezone == 'UTC' || $timezone == 'Etc/UTC') { - // CRM-17072 Let's short-circuit all the zero handling & return it here! - return '+00:00'; - } - $tzObj = new DateTimeZone($timezone); - $dateTime = new DateTime("now", $tzObj); - $tz = $tzObj->getOffset($dateTime); - - if ($tz === 0) { - // CRM-21422 - return '+00:00'; - } - - if (empty($tz)) { - return FALSE; - } - - $timeZoneOffset = sprintf("%02d:%02d", $tz / 3600, abs(($tz / 60) % 60)); - - if ($timeZoneOffset > 0) { - $timeZoneOffset = '+' . $timeZoneOffset; - } - return $timeZoneOffset; - } - return NULL; + public function setPhpTimeZone(?string $timeZone = NULL) { + $timeZone = $timeZone ?: $this->getTimeZoneString(); + date_default_timezone_set($timeZone); } /** - * Get timezone as a string. + * Set system timezone (both PHP + MySQL) + */ + public function setTimeZone(?string $timeZone = NULL) { + $timeZone = $timeZone ?? $this->getTimeZoneString(); + + $this->setPhpTimeZone($timeZone); + $this->setMySQLTimeZone($timeZone); + } + + /** + * Get timezone from CMS as a string. * @return string * Timezone string e.g. 'America/Los_Angeles' */ @@ -803,6 +794,15 @@ abstract class CRM_Utils_System_Base { return date_default_timezone_get(); } + /** + * Get timezone offset from CMS + * + * @return string|false|null + */ + public function getTimeZoneOffset() { + return \CRM_Utils_Time::getTimeZoneOffsetFromString($this->getTimeZoneString()); + } + /** * Get Unique Identifier from UserFramework system (CMS). * diff --git a/civicrm/CRM/Utils/System/Joomla.php b/civicrm/CRM/Utils/System/Joomla.php index a191e73f87..fd2dcee4d1 100644 --- a/civicrm/CRM/Utils/System/Joomla.php +++ b/civicrm/CRM/Utils/System/Joomla.php @@ -651,8 +651,7 @@ class CRM_Utils_System_Joomla extends CRM_Utils_System_Base { $config = JFactory::getConfig(); $timezone = $config->get('offset'); if ($timezone) { - date_default_timezone_set($timezone); - CRM_Core_Config::singleton()->userSystem->setMySQLTimeZone(); + $this->setTimeZone($timezone); } if (version_compare(JVERSION, '4.0', '>=')) { // Boot the DI container diff --git a/civicrm/CRM/Utils/System/Standalone.php b/civicrm/CRM/Utils/System/Standalone.php index 10d41aaeda..1d3e7c1be6 100644 --- a/civicrm/CRM/Utils/System/Standalone.php +++ b/civicrm/CRM/Utils/System/Standalone.php @@ -15,7 +15,6 @@ * @copyright CiviCRM LLC https://civicrm.org/licensing */ -use Civi\Standalone\Security; use Civi\Standalone\SessionHandler; /** @@ -24,8 +23,52 @@ use Civi\Standalone\SessionHandler; class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { /** - * @internal + * Standalone uses a CiviCRM Extension, Standaloneusers, to provide user + * functionality + * + * This is great for modularity - but does mean that there are points in + * bootstrap / install / failure where the extension isn't available + * and we need to provide fallback/failsafe behaviours + * + * This function provides a general check for whether we are in such a + * scenario + * + * (In the future, alternative user-providing extensions may be available - in + * which case this check might need generalising. One possibility could be + * to use the Api4 User interface as a spec for what any extension must provide + * + * Then maybe the check could be if (class_exists(\Civi\Api4\User::class))? + * * @return bool + * Whether user extension is available + */ + protected function isUserExtensionAvailable(): bool { + if (!class_exists(\Civi\Api4\User::class)) { + return FALSE; + } + // TODO: the following would be be a better check, as sometimes during + // upgrade the User class can exist but the entity is not actually loaded + // + // HOWEVER: it currently causes a crash during the install phase. + // https://github.com/civicrm/civicrm-core/pull/31198 may help. + // + // if (!\Civi\Api4\Utils\CoreUtil::entityExists('User')) { + // return FALSE; + // } + + // authx function is required for standalone user system + if (!function_exists('_authx_uf')) { + return FALSE; + } + + return TRUE; + } + + /** + * @inheritdoc + * + * In Standalone the UF is CiviCRM, so we're never + * running without it */ public function isLoaded(): bool { return TRUE; @@ -36,37 +79,41 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { */ public function getDefaultFileStorage() { return [ - 'url' => 'upload', - // @todo Not sure if this is wise - what about CLI invocation? - 'path' => $_SERVER['DOCUMENT_ROOT'], + 'path' => \Civi::paths()->getPath('[cms.root]/public'), + 'url' => \Civi::paths()->getUrl('[cms.root]/public'), ]; } /** * @inheritDoc - * - * Create a user in the CMS. - * - * @param array $params keys: - * - 'cms_name' - * - 'cms_pass' plaintext password - * - 'notify' boolean - * @param string $mailParam - * Name of the param which contains the email address. - * Because. Right. OK. That's what it is. - * - * @return int|bool - * uid if user was created, false otherwise */ - public function createUser(&$params, $mailParam) { - return Security::singleton()->createUser($params, $mailParam); + public function createUser(&$params, $emailParam) { + try { + $email = $params[$emailParam]; + $userID = \Civi\Api4\User::create(FALSE) + ->addValue('username', $params['cms_name']) + ->addValue('uf_name', $email) + ->addValue('password', $params['cms_pass']) + ->addValue('contact_id', $params['contact_id'] ?? NULL) + // ->addValue('uf_id', 0) // does not work without this. + ->execute()->single()['id']; + } + catch (\Exception $e) { + \Civi::log()->warning("Failed to create user '$email': " . $e->getMessage()); + return FALSE; + } + + return (int) $userID; } /** * @inheritDoc */ public function updateCMSName($ufID, $email) { - return Security::singleton()->updateCMSName($ufID, $email); + \Civi\Api4\User::update(FALSE) + ->addWhere('id', '=', $ufID) + ->addValue('uf_name', $email) + ->execute(); } /** @@ -181,13 +228,16 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { $frontend = FALSE, $forceBackend = FALSE ) { - $fragment = $fragment ? ('#' . $fragment) : ''; - if ($absolute) { - return Civi::paths()->getUrl("[cms.root]/{$path}?{$query}$fragment", 'absolute'); + // TODO: Add type hints + $query = (string) $query; + if (strlen($query)) { + $query = "?$query"; } - else { - return Civi::paths()->getUrl("[cms.root]/{$path}?{$query}$fragment"); + $fragment = (string) $fragment; + if (strlen($fragment)) { + $fragment = "#$fragment"; } + return Civi::paths()->getUrl("[cms.root]/$path$query$fragment", $absolute ? 'absolute' : 'relative'); } /** @@ -206,21 +256,28 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { * @inheritDoc * Authenticate the user against the CMS db. * + * I think this is only used by CLI so setting the session + * doesn't make sense + * * @param string $name * The user name. * @param string $password * The password for the above user. * @param bool $loadCMSBootstrap - * Load cms bootstrap?. + * Not used in Standalone context * @param string $realPath - * Filename of script + * Not used in Standalone context * * @return array|bool * [contactID, ufID, unique string] else false if no auth * @throws \CRM_Core_Exception. */ public function authenticate($name, $password, $loadCMSBootstrap = FALSE, $realPath = NULL) { - return Security::singleton()->authenticate($name, $password, $loadCMSBootstrap, $realPath); + $authxLogin = authx_login(['flow' => 'login', 'cred' => 'Basic ' . base64_encode("{$name}:{$password}")]); + + // Note: random_int is more appropriate for cryptographical use than mt_rand + // The long number is the max 32 bit value. + return [$authxLogin['contactId'], $authxLogin['userId'], random_int(0, 2147483647)]; } /** @@ -232,17 +289,23 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { * @return int|null */ public function getUfId($username) { - return Security::singleton()->getUserIDFromUsername($username); + if (!$this->isUserExtensionAvailable()) { + return NULL; + } + return \Civi\Api4\User::get(FALSE) + ->addWhere('username', '=', $username) + ->execute() + ->first()['id'] ?? NULL; } /** - * Immediately stop script execution, log out the user and redirect to the home page. - * - * @deprecated - * This function should be removed in favor of linking to the CMS's logout page + * Immediately stop script execution and log out the user */ public function logout() { - return Security::singleton()->logoutUser(); + _authx_uf()->logoutSession(); + // redirect to the home page? + // breaks tests in standaloneusers-e2e + // \CRM_Utils_System::redirect('/civicrm/login'); } /** @@ -280,7 +343,17 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { /** * Bootstrap Standalone. * + * In CRM_Utils_System context, this function is used by cv/civix/? to bootstrap + * the CMS *after* CiviCRM is already loaded (as compared to normal web requests, + * which load the CMS then CiviCRM) + * + * For Standalone there shouldn't be anything additional to load at this + * stage in terms of system services. + * + * * This is used by cv and civix, but not I (artfulrobot) think, in the main http requests. + * External scripts may assume loading a users requires the CMS bootstrap + * - so we keep support for logging in a user now * * @param array $params * Either uid, or name & pass. @@ -288,7 +361,8 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { * Boolean Require CMS user load. * @param bool $throwError * If true, print error on failure and exit. - * @param bool|string $realPath path to script + * @param bool|string $realPath + * Not used in Standalone context * * @return bool * @Todo Handle setting cleanurls configuration for CiviCRM? @@ -296,96 +370,96 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { public function loadBootStrap($params = [], $loadUser = TRUE, $throwError = TRUE, $realPath = NULL) { static $runOnce; - if (!isset($runOnce)) { - $runOnce = TRUE; - } - else { + if (isset($runOnce)) { + // we've already run return TRUE; } - global $civicrm_paths; - require_once $civicrm_paths['civicrm.vendor']['path'] . '/autoload.php'; - - // seems like we've bootstrapped drupal - $config = CRM_Core_Config::singleton(); - $config->cleanURL = 1; - - // I don't *think* this applies to Standalone: - // - // we need to call the config hook again, since we now know - // all the modules that are listening on it, does not apply - // to J! and WP as yet - // CRM-8655 - // CRM_Utils_Hook::config($config); + // dont run again + $runOnce = TRUE; if (!$loadUser) { return TRUE; } - $security = \Civi\Standalone\Security::singleton(); - if (!empty($params['uid'])) { - $user = $security->loadUserByID($params['uid']); + try { + if (!empty($params['uid'])) { + _authx_uf()->loginStateless($params['uid']); + return TRUE; + } + elseif (!empty($params['name'] && !empty($params['pass']))) { + // It seems from looking at the Drupal implementation, that + // if given username we expect a correct password. + + /** + * @throws CRM_Core_Exception if login unsuccessful + */ + $this->authenticate($params['name'], $params['pass']); + return TRUE; + } + else { + return FALSE; + } } - elseif (!empty($params['name'] && !empty($params['pass']))) { - // It seems from looking at the Drupal implementation, that - // if given username we expect a correct password. - $user = $security->loadUserByName($params['name']); - if ($user) { - if (!$security->checkPassword($params['pass'], $user['hashed_password'] ?? '')) { - return FALSE; - } + catch (\CRM_Core_Exception $e) { + // swallow any errors if $throwError is false + // (presume the expectation is these are login errors + // - though that isn't guaranteed?) + if (!$throwError) { + return FALSE; } + throw $e; } - if (!$user) { + } + + /** + * @inheritdoc + */ + public function loadUser($username) { + $userID = $this->getUfId($username) ?? NULL; + if (!$userID) { return FALSE; } - - $security->loginAuthenticatedUserRecord($user, FALSE); - + _authx_uf()->loginSession($userID); return TRUE; } - public function loadUser($username) { - $security = \Civi\Standalone\Security::singleton(); - $user = $security->loadUserByName($username); - if ($user) { - $security->loginAuthenticatedUserRecord($user, TRUE); - return TRUE; - } - else { + /** + * Load an active user by internal user ID. + * + * @return array|bool FALSE if not found. + */ + public function getUserById(int $userID) { + if (!$this->isUserExtensionAvailable()) { return FALSE; } + return \Civi\Api4\User::get(FALSE) + ->addWhere('id', '=', $userID) + ->addWhere('is_active', '=', TRUE) + ->execute() + ->first() ?: FALSE; } /** * @inheritdoc */ public function getCiviSourceStorage(): array { - global $civicrm_root; - - if (!defined('CIVICRM_UF_BASEURL')) { - throw new RuntimeException('Undefined constant: CIVICRM_UF_BASEURL'); - } - return [ - 'url' => CRM_Utils_File::addTrailingSlash(CIVICRM_UF_BASEURL, '/') . 'core/', - 'path' => CRM_Utils_File::addTrailingSlash($civicrm_root), + 'path' => Civi::paths()->getPath('[cms.root]/core'), + 'url' => Civi::paths()->getUrl('[cms.root]/core'), ]; } /** - * Determine the location of the CMS root. + * In Standalone, this returns the app root * - * @param string $path + * The $appRootPath global is set in civicrm.standalone.php * * @return NULL|string */ - public function cmsRootPath($path = NULL) { - global $civicrm_paths; - if (!empty($civicrm_paths['cms.root']['path'])) { - return $civicrm_paths['cms.root']['path']; - } - throw new \RuntimeException("Standalone requires the path is set for now. Set \$civicrm_paths['cms.root']['path'] in civicrm.settings.php to the webroot."); + public function cmsRootPath() { + global $appRootPath; + return $appRootPath; } public function isFrontEndPage() { @@ -396,7 +470,7 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { * @inheritDoc */ public function isUserLoggedIn() { - return Security::singleton()->isUserLoggedIn(); + return !empty($this->getLoggedInUfID()); } /** @@ -425,9 +499,15 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { /** * @inheritDoc + * + * If the User extension isn't available + * then no one is logged in */ public function getLoggedInUfID() { - return Security::singleton()->getLoggedInUfID(); + if (!$this->isUserExtensionAvailable()) { + return NULL; + } + return _authx_uf()->getCurrentUserId(); } /** @@ -457,52 +537,6 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { CRM_Core_Session::setStatus('', $message, 'info'); } - /** - * I don't know why this needs to be here? Does it even? - * - * Helper function to extract path, query and route name from Civicrm URLs. - * - * For example, 'civicrm/contact/view?reset=1&cid=66' will be returned as: - * - * ``` - * array( - * 'path' => 'civicrm/contact/view', - * 'route' => 'civicrm.civicrm_contact_view', - * 'query' => array('reset' => '1', 'cid' => '66'), - * ); - * ``` - * - * @param string $url - * The url to parse. - * - * @return string[] - * The parsed url parts, containing 'path', 'route' and 'query'. - */ - public function parseUrl($url) { - $processed = ['path' => '', 'route_name' => '', 'query' => []]; - - // Remove leading '/' if it exists. - $url = ltrim($url, '/'); - - // Separate out the url into its path and query components. - $url = parse_url($url); - if (empty($url['path'])) { - return $processed; - } - $processed['path'] = $url['path']; - - // Create a route name by replacing the forward slashes in the path with - // underscores, civicrm/contact/search => civicrm.civicrm_contact_search. - $processed['route_name'] = 'civicrm.' . implode('_', explode('/', $url['path'])); - - // Turn the query string (if it exists) into an associative array. - if (!empty($url['query'])) { - parse_str($url['query'], $processed['query']); - } - - return $processed; - } - /** * Append any Standalone js to coreResourcesList. * @@ -515,9 +549,9 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { * @inheritDoc */ public function getTimeZoneString() { - $userId = Security::singleton()->getLoggedInUfID(); + $userId = $this->getLoggedInUfID(); if ($userId) { - $user = Security::singleton()->loadUserByID($userId); + $user = $this->getUserById($userId); if ($user && !empty($user['timezone'])) { return $user['timezone']; } @@ -527,19 +561,10 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { /** * @inheritDoc + * @todo implement language negotiation for Standalone? */ public function languageNegotiationURL($url, $addLanguagePart = TRUE, $removeLanguagePart = FALSE) { - if (empty($url)) { - return $url; - } - - // This method is called early in the boot process. - // Check if the extensions are available yet as our implementation requires Standaloneusers. - // Debugging note: calling Civi::log() methods here creates a nasty crash. - if (!class_exists(\Civi\Standalone\Security::class)) { - return $url; - } - return Security::singleton()->languageNegotiationURL($url, $addLanguagePart = TRUE, $removeLanguagePart = FALSE); + return $url; } /** @@ -547,7 +572,7 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { * @return array */ public function getCMSPermissionsUrlParams() { - return Security::singleton()->getCMSPermissionsUrlParams(); + return ['ufAccessURL' => '/civicrm/admin/roles']; } /** @@ -560,16 +585,15 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { * - For unauthenticated users, it shows login screen with an error blurb. */ public function permissionDenied() { + // If not logged in, they need to. $session = CRM_Core_Session::singleton(); - $isAuthenticated = (bool) $session->get('ufID'); $useSession = ($session->get('authx')['useSession'] ?? TRUE); - - if ($isAuthenticated && $useSession) { + if ($this->isUserLoggedIn() && $useSession) { // They are logged in; they're just not allowed this page. CRM_Core_Error::statusBounce(ts("Access denied"), CRM_Utils_System::url('civicrm')); return; } - elseif ($isAuthenticated && !$useSession) { + elseif ($this->isUserLoggedIn() && !$useSession) { return (new CRM_Standaloneusers_Page_PermissionDenied())->run(); } else { @@ -582,20 +606,22 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { return $loginPage->run(); } - throw new CRM_Core_Exception('Access denied. Standaloneusers extension not found'); + throw new CRM_Core_Exception('Access denied. Standaloneusers login page not found'); } } /** * Start a new session. + * + * Generally this uses the SessionHander provided by Standaloneusers + * extension - but we fallback to a default PHP session to: + * a) allow the installer to work (early in the Standalone install, we dont have Standaloneusers yet) + * b) avoid unhelpfully hard crash if the ExtensionSystem goes down (without the fallback, the crash + * here swallows whatever error is actually causing the crash) */ public function sessionStart() { - if (defined('CIVI_SETUP')) { - // during installation we can't use the session - // handler from the extension yet so we just - // use a default php session - // use a different cookie name to avoid any nasty clash - $session_cookie_name = 'SESSCIVISOINSTALL'; + if (!$this->isUserExtensionAvailable()) { + $session_cookie_name = 'SESSCIVISOFALLBACK'; } else { $session_handler = new SessionHandler(); @@ -617,6 +643,38 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { ]); } + public function initialize() { + parent::initialize(); + $this->registerDefaultPaths(); + } + + /** + * Specify the default computation for various paths/URLs. + */ + protected function registerDefaultPaths(): void { + \Civi::paths() + ->register('civicrm.private', function () { + return [ + 'path' => \Civi::paths()->getPath('[cms.root]/private'), + ]; + }) + ->register('civicrm.compile', function () { + return [ + 'path' => \Civi::paths()->getPath('[civicrm.private]/cache'), + ]; + }) + ->register('civicrm.log', function () { + return [ + 'path' => \Civi::paths()->getPath('[civicrm.private]/log'), + ]; + }) + ->register('civicrm.l10n', function () { + return [ + 'path' => \Civi::paths()->getPath('[civicrm.private]/l10n'), + ]; + }); + } + /** * Standalone's session cannot be initialized until CiviCRM is booted, * since it is defined in an extension, @@ -627,19 +685,7 @@ class CRM_Utils_System_Standalone extends CRM_Utils_System_Base { $sess = \CRM_Core_Session::singleton(); $sess->initialize(); - // We want to apply timezone for this session - // However - our implementation relies on checks against standaloneusers - // so we need a guard if this is called in install - // - // Doesn't the session handler started above also need standalonusers? - // Yes it does - but we put in some guards further into those functions - // to use a fake session instead for this install bit. - // Maybe they could get moved up here - if (class_exists(\Civi\Standalone\Security::class)) { - $sessionTime = $this->getTimeZoneString(); - date_default_timezone_set($sessionTime); - $this->setMySQLTimeZone(); - } + $this->setTimeZone(); } } diff --git a/civicrm/CRM/Utils/System/WordPress.php b/civicrm/CRM/Utils/System/WordPress.php index a74e338c86..1e09f2e0b6 100644 --- a/civicrm/CRM/Utils/System/WordPress.php +++ b/civicrm/CRM/Utils/System/WordPress.php @@ -728,8 +728,7 @@ class CRM_Utils_System_WordPress extends CRM_Utils_System_Base { // Match CiviCRM timezone to WordPress site timezone. $wpSiteTimezone = $this->getTimeZoneString(); if ($wpSiteTimezone) { - date_default_timezone_set($wpSiteTimezone); - CRM_Core_Config::singleton()->userSystem->setMySQLTimeZone(); + $this->setTimeZone($wpSiteTimezone); } // Make sure pluggable WordPress functions are available. diff --git a/civicrm/CRM/Utils/Time.php b/civicrm/CRM/Utils/Time.php index 419664fbfb..4870bafee7 100644 --- a/civicrm/CRM/Utils/Time.php +++ b/civicrm/CRM/Utils/Time.php @@ -200,4 +200,38 @@ class CRM_Utils_Time { return (abs($diff) <= $threshold); } + /** + * Get timezone offset from a timezone string + * + * @return string|false|null + */ + public static function getTimeZoneOffsetFromString(string $timezone) { + if ($timezone) { + if ($timezone == 'UTC' || $timezone == 'Etc/UTC') { + // CRM-17072 Let's short-circuit all the zero handling & return it here! + return '+00:00'; + } + $tzObj = new DateTimeZone($timezone); + $dateTime = new DateTime("now", $tzObj); + $tz = $tzObj->getOffset($dateTime); + + if ($tz === 0) { + // CRM-21422 + return '+00:00'; + } + + if (empty($tz)) { + return FALSE; + } + + $timeZoneOffset = sprintf("%02d:%02d", $tz / 3600, abs(($tz / 60) % 60)); + + if ($timeZoneOffset > 0) { + $timeZoneOffset = '+' . $timeZoneOffset; + } + return $timeZoneOffset; + } + return NULL; + } + } diff --git a/civicrm/Civi/Api4/Action/LocBlock/LocBlockSaveTrait.php b/civicrm/Civi/Api4/Action/LocBlock/LocBlockSaveTrait.php index 04359efcf7..adc8e9dfdb 100644 --- a/civicrm/Civi/Api4/Action/LocBlock/LocBlockSaveTrait.php +++ b/civicrm/Civi/Api4/Action/LocBlock/LocBlockSaveTrait.php @@ -48,7 +48,7 @@ trait LocBlockSaveTrait { $entityId = $params[$joinField] ?? $locBlock[$joinField] ?? NULL; if ($item) { $labelField = CoreUtil::getInfoItem($joinEntity, 'label_field'); - // If NULL was given for the main field (e.g. `email`) then delete the record IF it's not in use + // If NULL was given for the required field (e.g. `email`) then delete the record IF it's not in use if (!empty($params['id']) && $entityId && $labelField && array_key_exists($labelField, $item) && ($item[$labelField] === NULL || $item[$labelField] === '')) { $referenceCount = CoreUtil::getRefCountTotal($joinEntity, $entityId); if ($referenceCount <= 1) { @@ -60,7 +60,8 @@ trait LocBlockSaveTrait { ]); } } - else { + // Otherwise save if the required field (e.g. `email`) has a value (or no fields are required) + elseif (!array_key_exists($labelField, $item) || (isset($item[$labelField]) && $item[$labelField] !== '')) { $item['contact_id'] = ''; if ($entityId) { $item['id'] = $entityId; diff --git a/civicrm/Civi/Api4/Event/Subscriber/HierarchicalEntitySubscriber.php b/civicrm/Civi/Api4/Event/Subscriber/HierarchicalEntitySubscriber.php index adaf6d8ef8..7100395f46 100644 --- a/civicrm/Civi/Api4/Event/Subscriber/HierarchicalEntitySubscriber.php +++ b/civicrm/Civi/Api4/Event/Subscriber/HierarchicalEntitySubscriber.php @@ -85,13 +85,14 @@ class HierarchicalEntitySubscriber extends AutoService implements EventSubscribe $childCount = count($children) + 1; // Maintaining other sort criteria, move children under their parents while ($children && $childCount > count($children)) { - // This guards against a loop getting "stuck" - if there's no progress after an iteration, abandon the orphaned children + // Guard loop against getting "stuck" - if there's no progress after an iteration, abandon the orphaned children $childCount = count($children); foreach (array_reverse($children, TRUE) as $index => $child) { // If the child has more than one parent (Groups entity), just pick the 1st valid one foreach ((array) $child[$parentName] as $parentId) { if (isset($records[$parentId])) { - $child['_depth'] = $records[$parentId]['_depth'] + 1; + self::propagateDescendents($records, $parentId, $parentName); + $child['_depth'] = ($records[$parentId]['_depth'] ?? 0) + 1; $records = self::array_insert_after($records, $parentId, [$child[$idName] => $child]); unset($children[$index]); break; @@ -109,12 +110,36 @@ class HierarchicalEntitySubscriber extends AutoService implements EventSubscribe } } + /** + * Recursively propagates the count of descendents to the parents and parents-of-parents. + * + * @param array $records + * Reference to the collection of records where propagation is done + * @param mixed $parentId + * Identifier of the parent record + * @param string $parentName + * Name of the 'parent_id' field + * + * @return void + */ + private static function propagateDescendents(array &$records, $parentId, $parentName) { + $records[$parentId]['_descendents'] ??= 0; + $records[$parentId]['_descendents'] += 1; + // If the child has more than one parent (Groups entity), just pick the 1st valid one + foreach ((array) $records[$parentId][$parentName] as $parentId) { + if (isset($records[$parentId])) { + self::propagateDescendents($records, $parentId, $parentName); + return; + } + } + } + private function applies(Event $event): bool { $apiRequest = $event->getApiRequest(); return $apiRequest['version'] == 4 && is_a($apiRequest, 'Civi\Api4\Generic\AbstractGetAction') && CoreUtil::isType($apiRequest->getEntityName(), 'HierarchicalEntity') && - in_array('_depth', $apiRequest->getSelect(), TRUE); + array_intersect(['_depth', '_descendents'], $apiRequest->getSelect()); } private function getParentField(string $entityName): array { diff --git a/civicrm/Civi/Api4/Generic/DAOGetFieldsAction.php b/civicrm/Civi/Api4/Generic/DAOGetFieldsAction.php index 9699e2cced..90fe7c6864 100644 --- a/civicrm/Civi/Api4/Generic/DAOGetFieldsAction.php +++ b/civicrm/Civi/Api4/Generic/DAOGetFieldsAction.php @@ -43,11 +43,18 @@ class DAOGetFieldsAction extends BasicGetFieldsAction { if ($this->loadOptions) { $this->loadFieldOptions($fields, $fieldsToGet ?: array_keys($fields)); } + // Add fields across implicit FK joins foreach ($fieldsToGet ?? [] as $fieldName) { if (empty($fields[$fieldName]) && str_contains($fieldName, '.')) { $fkField = $this->getFkFieldSpec($fieldName, $fields); if ($fkField) { + $fieldPrefix = substr($fieldName, 0, 0 - strlen($fkField['name'])); $fkField['name'] = $fieldName; + // Control field should get the same prefix as it belongs to the new entity now + if (!empty($fkField['input_attrs']['control_field'])) { + $fkField['input_attrs']['control_field'] = $fieldPrefix . $fkField['input_attrs']['control_field']; + } + $fkField['required'] = FALSE; $fields[] = $fkField; } } @@ -69,7 +76,7 @@ class DAOGetFieldsAction extends BasicGetFieldsAction { * @return array|null * @throws \CRM_Core_Exception */ - private function getFkFieldSpec($fieldName, $fields) { + private function getFkFieldSpec(string $fieldName, array $fields): ?array { $fieldPath = explode('.', $fieldName); // Search for the first segment alone plus the first and second // No field in the schema contains more than one dot in its name. @@ -81,9 +88,11 @@ class DAOGetFieldsAction extends BasicGetFieldsAction { 'checkPermissions' => $this->checkPermissions, 'where' => [['name', '=', $newFieldName]], 'loadOptions' => $this->loadOptions, + 'values' => FormattingUtil::filterByPath($this->values, $fieldName, $newFieldName), 'action' => $this->action, ])->first(); } + return NULL; } /** diff --git a/civicrm/Civi/Api4/Generic/Traits/SavedSearchInspectorTrait.php b/civicrm/Civi/Api4/Generic/Traits/SavedSearchInspectorTrait.php index dedfa9d54a..b44649e9b4 100644 --- a/civicrm/Civi/Api4/Generic/Traits/SavedSearchInspectorTrait.php +++ b/civicrm/Civi/Api4/Generic/Traits/SavedSearchInspectorTrait.php @@ -229,6 +229,16 @@ trait SavedSearchInspectorTrait { return FALSE; } + // If this is an implicit join, use the parent field + if (str_ends_with($fieldPath, '.' . $field['name'])) { + $baseFieldPath = substr($fieldPath, 0, -strlen('.' . $field['name'])); + $baseField = $this->getField($baseFieldPath); + if ($baseField) { + $fieldPath = $baseFieldPath; + $field = $baseField; + } + } + // If the entity this column belongs to is being grouped by id, then also no $idField = substr($fieldPath, 0, 0 - strlen($field['name'])) . CoreUtil::getIdFieldName($field['entity']); return !in_array($idField, $apiParams['groupBy']); diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/DAOFieldsCallbackAdapterSpecProvider.php b/civicrm/Civi/Api4/Service/Spec/Provider/DAOFieldsCallbackAdapterSpecProvider.php index 2ed009b107..6257be5072 100644 --- a/civicrm/Civi/Api4/Service/Spec/Provider/DAOFieldsCallbackAdapterSpecProvider.php +++ b/civicrm/Civi/Api4/Service/Spec/Provider/DAOFieldsCallbackAdapterSpecProvider.php @@ -14,6 +14,7 @@ namespace Civi\Api4\Service\Spec\Provider; use Civi\Api4\Service\Spec\FieldSpec; use Civi\Api4\Service\Spec\RequestSpec; +use Civi\Api4\Service\Spec\SpecFormatter; use Civi\Api4\Utils\CoreUtil; use Civi\Api4\Utils\FormattingUtil; use Civi\Test\Invasive; @@ -163,8 +164,8 @@ class DAOFieldsCallbackAdapterSpecProvider extends \Civi\Core\Service\AutoServic if (in_array($inputType, ['Select', 'EntityRef'], TRUE) && !empty($data['serialize'])) { $inputAttrs['multiple'] = TRUE; } - if ($inputType == 'Date' && !empty($inputAttrs['formatType'])) { - self::setLegacyDateFormat($inputAttrs); + if ($inputType == 'Date' && !empty($inputAttrs['format_type'])) { + SpecFormatter::setLegacyDateFormat($inputAttrs); } // Number input for numeric fields if ($inputType === 'Text' && in_array($dataTypeName, ['Integer', 'Float'], TRUE)) { @@ -197,23 +198,6 @@ class DAOFieldsCallbackAdapterSpecProvider extends \Civi\Core\Service\AutoServic ->setInputAttrs($inputAttrs); } - /** - * @param array $inputAttrs - */ - private static function setLegacyDateFormat(&$inputAttrs) { - if (empty(\Civi::$statics['legacyDatePrefs'][$inputAttrs['formatType']])) { - \Civi::$statics['legacyDatePrefs'][$inputAttrs['formatType']] = []; - $params = ['name' => $inputAttrs['formatType']]; - \CRM_Core_DAO::commonRetrieve('CRM_Core_DAO_PreferencesDate', $params, \Civi::$statics['legacyDatePrefs'][$inputAttrs['formatType']]); - } - $dateFormat = \Civi::$statics['legacyDatePrefs'][$inputAttrs['formatType']]; - unset($inputAttrs['formatType']); - $inputAttrs['time'] = !empty($dateFormat['time_format']); - $inputAttrs['date'] = TRUE; - $inputAttrs['start_date_years'] = (int) $dateFormat['start']; - $inputAttrs['end_date_years'] = (int) $dateFormat['end']; - } - /** * @inheritDoc */ diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/HierarchicalEntitySpecProvider.php b/civicrm/Civi/Api4/Service/Spec/Provider/HierarchicalEntitySpecProvider.php index 2ea8712b2e..e56a2b3d66 100644 --- a/civicrm/Civi/Api4/Service/Spec/Provider/HierarchicalEntitySpecProvider.php +++ b/civicrm/Civi/Api4/Service/Spec/Provider/HierarchicalEntitySpecProvider.php @@ -22,8 +22,7 @@ use Civi\Api4\Utils\CoreUtil; class HierarchicalEntitySpecProvider extends \Civi\Core\Service\AutoService implements Generic\SpecProviderInterface { /** - * Generic create spec function applies to all SortableEntity types. - * Disables required 'weight' field because that's auto-managed. + * Generic create spec function applies to all HierarchicalEntity types. * * @param \Civi\Api4\Service\Spec\RequestSpec $spec */ @@ -36,7 +35,18 @@ class HierarchicalEntitySpecProvider extends \Civi\Core\Service\AutoService impl ->setDescription(ts('Depth in the nested hierarchy')) ->setType('Extra') ->setReadonly(TRUE) - ->setSqlRenderer([__CLASS__, 'getDepth']); + ->setSqlRenderer([__CLASS__, 'getZero']); + $spec->addFieldSpec($field); + + $field = new FieldSpec('_descendents', $spec->getEntity(), 'Integer'); + $field->setLabel(ts('Descendents')) + ->setTitle(ts('Descendents')) + ->setColumnName('id') + ->setInputType('Number') + ->setDescription(ts('Number of descendents in the nested hierarchy')) + ->setType('Extra') + ->setReadonly(TRUE) + ->setSqlRenderer([__CLASS__, 'getZero']); $spec->addFieldSpec($field); } @@ -48,11 +58,11 @@ class HierarchicalEntitySpecProvider extends \Civi\Core\Service\AutoService impl } /** - * Generate SQL for _depth field + * Generate SQL for default value of _depth & _descendents fields * @param array $field * @return string */ - public static function getDepth(array $field): string { + public static function getZero(array $field): string { return "0"; } diff --git a/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php b/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php index f2dbbb533f..a9e31fc4b8 100644 --- a/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php +++ b/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php @@ -168,7 +168,7 @@ class SpecFormatter { /** * @param array $inputAttrs */ - private static function setLegacyDateFormat(&$inputAttrs) { + public static function setLegacyDateFormat(&$inputAttrs) { if (empty(\Civi::$statics['legacyDatePrefs'][$inputAttrs['format_type']])) { \Civi::$statics['legacyDatePrefs'][$inputAttrs['format_type']] = []; $params = ['name' => $inputAttrs['format_type']]; diff --git a/civicrm/Civi/Api4/Utils/FormattingUtil.php b/civicrm/Civi/Api4/Utils/FormattingUtil.php index d469f524cd..3ae8535cac 100644 --- a/civicrm/Civi/Api4/Utils/FormattingUtil.php +++ b/civicrm/Civi/Api4/Utils/FormattingUtil.php @@ -128,7 +128,19 @@ class FormattingUtil { switch ($fieldSpec['data_type'] ?? NULL) { case 'Timestamp': - $value = self::formatDateValue('YmdHis', $value, $operator, $index); + $format = 'YmdHis'; + // Using `=` with a Y-m-d timestamp means we really want `BETWEEN` midnight and 11:59:59pm. + if ($operator && is_string($value) && !array_key_exists($value, \CRM_Core_OptionGroup::values('relative_date_filters'))) { + $isYmd = (preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)); + if ($isYmd && in_array($operator, ['=', '!=', '<>'])) { + $operator = $operator === '=' ? 'BETWEEN' : 'NOT BETWEEN'; + $dateFrom = self::formatDateValue($format, "$value 00:00:00"); + $dateTo = self::formatDateValue($format, "$value 23:59:59"); + $value = [self::formatDateValue($format, $dateFrom), self::formatDateValue($format, $dateTo)]; + break; + } + } + $value = self::formatDateValue($format, $value, $operator, $index); break; case 'Date': @@ -278,7 +290,7 @@ class FormattingUtil { * @return void * @throws \CRM_Core_Exception */ - public static function getFieldOptions(array &$field, array $values = [], bool $includeDisabled = FALSE, bool $checkPermissions = FALSE, ?int $userId = NULL): ?array { + public static function getFieldOptions(array $field, array $values = [], bool $includeDisabled = FALSE, bool $checkPermissions = FALSE, ?int $userId = NULL): ?array { $fieldName = $field['name']; $entityName = $field['entity']; $customGroupName = CoreUtil::getCustomGroupName($entityName); diff --git a/civicrm/Civi/Core/SettingsManager.php b/civicrm/Civi/Core/SettingsManager.php index 3b186624d7..47d028b73b 100644 --- a/civicrm/Civi/Core/SettingsManager.php +++ b/civicrm/Civi/Core/SettingsManager.php @@ -461,9 +461,11 @@ class SettingsManager { // file in order to: // a) ensure the env values take precedence over define('CIVICRM_DSN'...) in the settings file // b) provide the right source value for CIVICRM_LOGGING_DSN (set from CIVICRM_DSN in the settings file template) - $composedDsn = $bootSettingsManager->getBagByDomain(NULL)->get('civicrm_db_dsn'); - if ($composedDsn) { - define('CIVICRM_DSN', $composedDsn); + if (!defined('CIVICRM_DSN')) { + $composedDsn = $bootSettingsManager->getBagByDomain(NULL)->get('civicrm_db_dsn'); + if ($composedDsn) { + define('CIVICRM_DSN', $composedDsn); + } } if (file_exists($settingsPath)) { @@ -485,6 +487,13 @@ class SettingsManager { // TODO: should we complain here if there are inconsistent defines // from elsewhere? } + + // if in doubt, the root of civicrm-core is 3 steps + // up from this file + global $civicrm_root; + if (!$civicrm_root) { + $civicrm_root = dirname(__FILE__, 3) . DIRECTORY_SEPARATOR; + } } } diff --git a/civicrm/Civi/Schema/LegacySqlEntityMetadata.php b/civicrm/Civi/Schema/LegacySqlEntityMetadata.php index dce317fab0..de55264879 100644 --- a/civicrm/Civi/Schema/LegacySqlEntityMetadata.php +++ b/civicrm/Civi/Schema/LegacySqlEntityMetadata.php @@ -170,6 +170,9 @@ class LegacySqlEntityMetadata extends EntityMetadataBase { case \CRM_Utils_Type::T_DATE + \CRM_Utils_Type::T_TIME: return 'datetime'; + case \CRM_Utils_Type::T_TIME: + return 'time'; + default: throw new \CRM_Core_Exception('Unknown field type for ' . $legacyField['name']); } diff --git a/civicrm/Civi/Test/Api4TestTrait.php b/civicrm/Civi/Test/Api4TestTrait.php index 4e210b5f87..17a9adbefb 100644 --- a/civicrm/Civi/Test/Api4TestTrait.php +++ b/civicrm/Civi/Test/Api4TestTrait.php @@ -47,6 +47,25 @@ trait Api4TestTrait { return $this->saveTestRecords($entityName, ['records' => [$values]])->single(); } + /** + * @param string $entityName + * @param array|string|int $idOrFilters + * Either the entity id or filters like ['name' => 'foo'] + * @return array + * @throws \CRM_Core_Exception + */ + public function getTestRecord(string $entityName, $idOrFilters): array { + if (!is_array($idOrFilters)) { + $idField = CoreUtil::getIdFieldName($entityName); + $idOrFilters = [$idField => $idOrFilters]; + } + $where = []; + foreach ($idOrFilters as $key => $value) { + $where[] = [$key, '=', $value]; + } + return civicrm_api4($entityName, 'get', ['where' => $where])->single(); + } + /** * Saves one or more test records, supplying default values. * diff --git a/civicrm/Civi/Test/EventTestTrait.php b/civicrm/Civi/Test/EventTestTrait.php index 439cd54887..0ba3b94a24 100644 --- a/civicrm/Civi/Test/EventTestTrait.php +++ b/civicrm/Civi/Test/EventTestTrait.php @@ -115,6 +115,23 @@ trait EventTestTrait { return $this->eventCreate($eventParameters, $identifier); } + /** + * Update an event. + * + * @param array $eventParameters + * Values to + * + * @param string $identifier + * Index for storing event ID in ids array. + * + */ + protected function updateEvent(array $eventParameters = [], string $identifier = 'event'): void { + Event::update(FALSE) + ->addWhere('id', '=', $this->getEventID($identifier)) + ->setValues($eventParameters) + ->execute(); + } + /** * Get the event id of the event created in set up. * @@ -243,7 +260,6 @@ trait EventTestTrait { $profiles = [ ['name' => '_pre', 'title' => 'Event Pre Profile', 'weight' => 1, 'fields' => ['email']], ['name' => '_post', 'title' => 'Event Post Profile', 'weight' => 2, 'fields' => ['first_name', 'last_name']], - ['name' => '_post_post', 'title' => 'Event Post Post Profile', 'weight' => 3, 'fields' => ['job_title']], ]; foreach ($profiles as $profile) { $this->createEventProfile($profile, $identifier); @@ -251,6 +267,21 @@ trait EventTestTrait { $this->createEventProfile($profile, $identifier, TRUE); } } + $sharedProfile = ['name' => '_post_post', 'title' => 'Event Post Post Profile', 'weight' => 3, 'fields' => ['job_title']]; + $this->createEventProfile($sharedProfile, $identifier); + if ($this->getEventValue('is_multiple_registrations', $identifier)) { + // For this one use the same profile but 2 UFJoins - to provide variation. + // e.g. we hit a bug where behaviour was different if the profiles for + // additional were the same uf group or different ones. + $profileName = $identifier . '_post_post'; + $this->setTestEntity('UFJoin', UFJoin::create(FALSE)->setValues([ + 'module' => 'CiviEvent_Additional', + 'entity_table' => 'civicrm_event', + 'uf_group_id:name' => $profileName, + 'weight' => $profile['weight'], + 'entity_id' => $this->getEventID($identifier), + ])->execute()->first(), $profileName . '_' . $identifier); + } } /** diff --git a/civicrm/Civi/Test/MinkBase.php b/civicrm/Civi/Test/MinkBase.php index c5d3a391ed..e988bc4086 100644 --- a/civicrm/Civi/Test/MinkBase.php +++ b/civicrm/Civi/Test/MinkBase.php @@ -44,7 +44,8 @@ abstract class MinkBase extends \CiviEndToEndTestCase { 'sub' => 'cid:' . $this->getUserId($user), 'scope' => 'authx', ]); - $loginUrl = Civi::url('backend://civicrm/authx/login')->addQuery([ + // The use of frontend:// or backend:// is abstract on some env's. For WP, only 'frontend' supports auth + $loginUrl = Civi::url('frontend://civicrm/authx/login')->addQuery([ '_authx' => 'Bearer ' . $tok, '_authxSes' => 1, ]); diff --git a/civicrm/Civi/Token/TokenRow.php b/civicrm/Civi/Token/TokenRow.php index 7c22f92f34..bdeaa13a72 100644 --- a/civicrm/Civi/Token/TokenRow.php +++ b/civicrm/Civi/Token/TokenRow.php @@ -144,31 +144,35 @@ class TokenRow { /** * Update the value of a token. * - * If you are reading this it probably means you can't follow this function. + * Eileen said: If you are reading this it probably means you can't follow this function. * Don't worry - I've stared at it & all I see is a bunch of letters. However, * the answer to your problem is almost certainly that you are passing in null * rather than an empty string for 'c'. + * MJW said: I've renamed the bunch of letters so they might be a bit more meaningful. + * Also, I don't think this function should ever be called without $tokenField being set + * but tests do call it like that. + * + * @param string|array $tokenEntity + * @param string|array $tokenField + * @param string|array $tokenValue * - * @param string|array $a - * @param string|array $b - * @param mixed $c * @return TokenRow */ - public function tokens($a = NULL, $b = NULL, $c = NULL) { - if (is_array($a)) { - \CRM_Utils_Array::extend($this->tokens, $a); + public function tokens($tokenEntity, $tokenField = NULL, $tokenValue = NULL): TokenRow { + if (is_array($tokenEntity)) { + \CRM_Utils_Array::extend($this->tokens, $tokenEntity); } - elseif (is_array($b)) { - \CRM_Utils_Array::extend($this->tokens[$a], $b); + elseif (is_array($tokenField)) { + \CRM_Utils_Array::extend($this->tokens[$tokenEntity], $tokenField); } - elseif (is_array($c)) { - \CRM_Utils_Array::extend($this->tokens[$a][$b], $c); + elseif (is_array($tokenValue)) { + \CRM_Utils_Array::extend($this->tokens[$tokenEntity][$tokenField], $tokenValue); } - elseif ($c === NULL) { - $this->tokens[$a] = $b; + elseif ($tokenValue === NULL) { + $this->tokens[$tokenEntity] = $tokenField; } else { - $this->tokens[$a][$b] = $c; + $this->tokens[$tokenEntity][$tokenField] = $tokenValue; } return $this; } diff --git a/civicrm/ang/api4Explorer/Explorer.js b/civicrm/ang/api4Explorer/Explorer.js index 46f5fabd0a..c82ca10947 100644 --- a/civicrm/ang/api4Explorer/Explorer.js +++ b/civicrm/ang/api4Explorer/Explorer.js @@ -1065,6 +1065,7 @@ // Format string to be cli-input-safe function cliFormat(str) { + str = str.replace(/\b(true|false)\b/g, match => match === "true" ? '1' : '0'); if (!_.includes(str, ' ') && !_.includes(str, '"') && !_.includes(str, "'")) { return str; } diff --git a/civicrm/api/api.php b/civicrm/api/api.php index 64b9caad71..3356885f8c 100644 --- a/civicrm/api/api.php +++ b/civicrm/api/api.php @@ -54,13 +54,24 @@ function civicrm_api(string $entity, string $action, array $params) { * automatically reformat the array, depending on the variable type passed: * - **Integer:** return a single result array; * e.g. `$index = 0` will return the first result, 1 will return the second, and -1 will return the last. + * + * For APIv4 Explorer, use e.g. `0` in the Index box. + * * - **String:** index the results by a field value; * e.g. `$index = "name"` will return an associative array with the field 'name' as keys. + * + * For APIv4 Explorer, use e.g. `name` in the Index box. + * * - **Non-associative array:** return a single value from each result; * e.g. `$index = ['title']` will return a non-associative array of strings - the 'title' field from each result. + * + * For APIv4 Explorer, use e.g. `[title]` in the Index box. + * * - **Associative array:** a combination of the previous two modes; * e.g. `$index = ['name' => 'title']` will return an array of strings - the 'title' field keyed by the 'name' field. * + * For APIv4 Explorer, use e.g. `{name: title}` in the Index box. + * * @return \Civi\Api4\Generic\Result * @throws \CRM_Core_Exception * @throws \Civi\API\Exception\NotImplementedException diff --git a/civicrm/api/v3/Setting.php b/civicrm/api/v3/Setting.php index 605ae2734d..341adc7f51 100644 --- a/civicrm/api/v3/Setting.php +++ b/civicrm/api/v3/Setting.php @@ -152,20 +152,32 @@ function civicrm_api3_setting_getoptions($params) { */ function civicrm_api3_setting_revert($params) { $defaults = civicrm_api('Setting', 'getdefaults', $params); - $fields = civicrm_api('Setting', 'getfields', $params); - $fields = $fields['values']; + $allSettings = civicrm_api('Setting', 'getfields', $params)['values'] ?? []; + // constant settings can't be set through the API, so can't be reverted + // so we must filter them out here + $revertable = array_filter($allSettings, function ($settingMeta) { + return !($settingMeta['is_constant'] ?? FALSE); + }); $domains = _civicrm_api3_setting_getDomainArray($params); $result = []; + $isError = FALSE; foreach ($domains as $domainID) { - $valuesToRevert = array_intersect_key($defaults['values'][$domainID], $fields); + $valuesToRevert = array_intersect_key($defaults['values'][$domainID], $revertable); if (!empty($valuesToRevert)) { $valuesToRevert['version'] = $params['version']; $valuesToRevert['domain_id'] = $domainID; // note that I haven't looked at how the result would appear with multiple domains in play $result = array_merge($result, civicrm_api('Setting', 'create', $valuesToRevert)); + if ($result['is_error'] ?? FALSE) { + $isError = TRUE; + } } } + if ($isError) { + return civicrm_api3_create_error('Error reverting settings'); + } + return civicrm_api3_create_success($result, $params, 'Setting', 'revert'); } diff --git a/civicrm/civicrm-version.php b/civicrm/civicrm-version.php index 0896fab4bb..9f44a15f2e 100644 --- a/civicrm/civicrm-version.php +++ b/civicrm/civicrm-version.php @@ -1,7 +1,7 @@ <?php /** @deprecated */ function civicrmVersion( ) { - return array( 'version' => '5.79.1', + return array( 'version' => '5.80.0', 'cms' => 'Wordpress', 'revision' => '' ); } diff --git a/civicrm/composer.json b/civicrm/composer.json index d603c5f049..76d368c35a 100644 --- a/civicrm/composer.json +++ b/civicrm/composer.json @@ -99,7 +99,7 @@ "civicrm/composer-compile-lib": "~0.6 || ~1.0", "ext-json": "*", "ezyang/htmlpurifier": "^4.13", - "phpoffice/phpspreadsheet": "^1.18", + "phpoffice/phpspreadsheet": "^1.18 || ^2", "symfony/polyfill-php80": "^1.0", "symfony/polyfill-php81": "^1.0", "symfony/polyfill-php82": "^1.0", diff --git a/civicrm/composer.lock b/civicrm/composer.lock index be7b1ffa24..cbbeed882e 100644 --- a/civicrm/composer.lock +++ b/civicrm/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "21b4d53ec38067948395139db45d6d6b", + "content-hash": "f73f8f713bb0cba7736793e45c0bdb2c", "packages": [ { "name": "adrienrn/php-mimetyper", @@ -2718,16 +2718,16 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "1.29.2", + "version": "1.29.4", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f" + "reference": "7ca7e325dca3adb6a598385aab81f527b8d6c75d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f", - "reference": "3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/7ca7e325dca3adb6a598385aab81f527b8d6c75d", + "reference": "7ca7e325dca3adb6a598385aab81f527b8d6c75d", "shasum": "" }, "require": { @@ -2817,9 +2817,9 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.2" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.4" }, - "time": "2024-09-29T07:04:47+00:00" + "time": "2024-11-10T16:26:22+00:00" }, { "name": "phpoffice/phpword", diff --git a/civicrm/css/civicrm.css b/civicrm/css/civicrm.css index c6d6b7f657..89dd5a720c 100644 --- a/civicrm/css/civicrm.css +++ b/civicrm/css/civicrm.css @@ -2290,6 +2290,14 @@ div.crm-master-accordion-header a.helpicon { display: none; } +/* Ex: Advanced Search (but not limited to) */ +.crm-container details.crm-accordion-settings summary { + text-align: right; +} +.crm-container details.crm-accordion-settings summary::before { + content: '\f013'; +} + .crm-container details details { padding: 0 0.25rem; /* adds padding for nested accordions */ } @@ -2311,7 +2319,7 @@ div.crm-master-accordion-header a.helpicon { .crm-container details > summary:before { font-family: "FontAwesome"; display: inline-block; - width: 1em; + padding-right: 0.5rem; content: "\f0da"; font-size: 13px; } diff --git a/civicrm/css/searchForm.css b/civicrm/css/searchForm.css index 8beb3a631b..0d319e79ea 100644 --- a/civicrm/css/searchForm.css +++ b/civicrm/css/searchForm.css @@ -63,10 +63,13 @@ font-weight: bold; } -.advanced-search-fields { - display: grid; - grid-template-columns: [col] repeat(3, calc(100% / 3 - 10px)); - width: 100%; +@media (min-width: 480px) { + .advanced-search-fields { + display: grid; + grid-template-columns: [col] repeat(3, 1fr); + gap: 10px; + width: 100%; + } } .advanced-search-fields .search-field { diff --git a/civicrm/deleted-files-list.json b/civicrm/deleted-files-list.json index 50dac0db10..c436bf69e6 100644 --- a/civicrm/deleted-files-list.json +++ b/civicrm/deleted-files-list.json @@ -208,7 +208,8 @@ "CRM/Upgrade/4.7.14.msg_template/*", "CRM/Upgrade/4.7.19.msg_template/*", "CRM/Upgrade/4.7.22.msg_template/*", - "CRM/Upgrade/4.7.23.msg_template/*", + "CRM/Upgrade/4.7.23.msg_template/civicrm_msg_template.tpl", + "CRM/Upgrade/4.7.23.msg_template/message_templates/*", "CRM/Upgrade/4.7.4.msg_template/*", "CRM/Upgrade/4.7.5.msg_template/*", "CRM/Upgrade/4.7.alpha1.msg_template/*", @@ -665,7 +666,14 @@ "css/menu-leaf.png", "css/navigation.css", "distmaker/core-ext.txt", + "distmaker/dists/backdrop_php5.sh", "distmaker/dists/drupal6_php5.sh", + "distmaker/dists/drupal7_dir_php5.sh", + "distmaker/dists/drupal_php5.sh", + "distmaker/dists/drupal_sk_php5.sh", + "distmaker/dists/joomla5_php.sh", + "distmaker/dists/joomla_php5.sh", + "distmaker/dists/wordpress_php5.sh", "docs/*", "ext/afform/CRM/*", "ext/afform/Civi/*", @@ -953,6 +961,22 @@ "ext/oembed/templates/oembed-basic-page.tpl", "ext/payflowpro/images/*", "ext/recaptcha/xml/*", + "ext/riverlea/core/css/_bootstrap3.css", + "ext/riverlea/core/org.civicrm.afform_core-ang/*", + "ext/riverlea/fa/*", + "ext/riverlea/fonts/InterDisplay-Italic.woff2", + "ext/riverlea/fonts/InterDisplay-Regular.woff2", + "ext/riverlea/fonts/InterDisplay-SemiBold.woff2", + "ext/riverlea/js/*", + "ext/riverlea/streams/empty/css/civicrm.css", + "ext/riverlea/streams/hackneybrook/css/civicrm.css", + "ext/riverlea/streams/minetta/css/civicrm.css", + "ext/riverlea/streams/thames/README.md", + "ext/riverlea/streams/thames/css/aah", + "ext/riverlea/streams/thames/fonts/*", + "ext/riverlea/streams/walbrook/css/_fonts.css", + "ext/riverlea/streams/walbrook/fonts/*", + "ext/riverlea/streams/wellow/*", "ext/search/*", "ext/search_kit/CRM/Search/Upgrader/*", "ext/search_kit/Civi/Api4/Action/SearchDisplay/SavedSearchInspectorTrait.php", @@ -974,6 +998,7 @@ "ext/search_kit/ang/crmSearchTasks/crmSearchTaskProcess.html", "ext/search_kit/ang/crmSearchTasks/crmSearchTasks.component.js", "ext/search_kit/ang/crmSearchTasks/crmSearchTasks.html", + "ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.html", "ext/search_kit/css/crmSearchActions.css", "ext/search_kit/sql/*", "ext/search_kit/xml/schema/*", @@ -1205,6 +1230,7 @@ "schema/Mailing/Event/*", "settings/Directory.setting.php", "settings/Extension.setting.php", + "settings/System.boot.setting.php", "settings/Url.setting.php", "setup/res/civicrm.config.php.standalone.txt", "setup/res/error.html", @@ -1271,6 +1297,7 @@ "templates/CRM/Case/Form/Task/SearchTaskHookSample.tpl", "templates/CRM/Contact/Form/Edit/Address/CustomField.tpl", "templates/CRM/Contact/Form/ProfileContact.tpl", + "templates/CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl", "templates/CRM/Contact/Form/Search/Criteria/Recurringcontribution.tpl", "templates/CRM/Contact/Form/Search/Custom.tpl", "templates/CRM/Contact/Form/Search/Custom/*", diff --git a/civicrm/ext/afform/admin/ang/afGuiEditor/afGuiEditOptions.component.js b/civicrm/ext/afform/admin/ang/afGuiEditor/afGuiEditOptions.component.js index 58759986a1..c3be348d0f 100644 --- a/civicrm/ext/afform/admin/ang/afGuiEditor/afGuiEditOptions.component.js +++ b/civicrm/ext/afform/admin/ang/afGuiEditor/afGuiEditOptions.component.js @@ -6,17 +6,21 @@ templateUrl: '~/afGuiEditor/afGuiEditOptions.html', require: {field: '^^afGuiField'}, controller: function($scope) { - var ts = $scope.ts = CRM.ts('org.civicrm.afform_admin'), - ctrl = this; + const ts = $scope.ts = CRM.ts('org.civicrm.afform_admin'); + const ctrl = this; this.$onInit = function() { + // Currently defined field options (either customized or original) $scope.options = JSON.parse(angular.toJson(ctrl.field.getOptions())); - var optionKeys = _.map($scope.options, 'id'); - $scope.deletedOptions = _.filter(JSON.parse(angular.toJson(ctrl.field.getDefn().options || [])), function (item) { - return !_.contains(optionKeys, item.id); - }); - $scope.originalLabels = _.transform(ctrl.field.getDefn().options || [], function (originalLabels, item) { + const optionKeys = $scope.options.map(option => option.id); + // Original options + const originalOptions = JSON.parse(angular.toJson(ctrl.field.getDefn().options || [])); + // Original options that are not in the current set (if customized) + $scope.deletedOptions = originalOptions.filter(item => !optionKeys.includes(item.id)); + // Deleted options have no label so fetch original + $scope.originalLabels = (ctrl.field.getDefn().options || []).reduce((originalLabels, item) => { originalLabels[item.id] = item.label; + return originalLabels; }, {}); }; diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php index a18619fa6f..417ace0708 100644 --- a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php +++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php @@ -593,11 +593,12 @@ abstract class AbstractProcessor extends \Civi\Api4\Generic\AbstractAction { $entityValues = []; foreach ($this->_formDataModel->getEntities() as $entityName => $entity) { $entityValues[$entityName] = []; - $fileFields = $this->getFileFields($entity['type'], $entity['fields']); // Gather submitted field values from $values['fields'] and sub-entities from $values['joins'] + $submittableFields = $this->getSubmittableFields($entity['fields']); + $fileFields = $this->getFileFields($entity['type'], $submittableFields); foreach ($submittedValues[$entityName] ?? [] as $values) { // Only accept values from fields on the form - $values['fields'] = array_intersect_key($values['fields'] ?? [], $entity['fields']); + $values['fields'] = array_intersect_key($values['fields'] ?? [], $submittableFields); // Unset prefilled file fields foreach ($fileFields as $fileFieldName) { if (isset($values['fields'][$fileFieldName]) && is_array($values['fields'][$fileFieldName])) { @@ -616,7 +617,7 @@ abstract class AbstractProcessor extends \Civi\Api4\Generic\AbstractAction { foreach ($values['joins'] as $joinEntity => &$joinValues) { // Only accept values from join fields on the form $idField = CoreUtil::getIdFieldName($joinEntity); - $allowedFields = $entity['joins'][$joinEntity]['fields'] ?? []; + $allowedFields = $this->getSubmittableFields($entity['joins'][$joinEntity]['fields'] ?? []); $allowedFields[$idField] = TRUE; $fileFields = $this->getFileFields($joinEntity, $allowedFields); // Enforce the limit set by join[max] @@ -662,6 +663,13 @@ abstract class AbstractProcessor extends \Civi\Api4\Generic\AbstractAction { return $entityValues; } + protected function getSubmittableFields(array $fields): array { + return array_filter($fields, function ($field) { + $inputType = $field['defn']['input_type'] ?? NULL; + return $inputType !== 'DisplayOnly'; + }); + } + /** * Process form data */ diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php index 11fee49339..4315e35d5e 100644 --- a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php +++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php @@ -460,8 +460,8 @@ class Submit extends AbstractProcessor { // Forward FK e.g. Event.loc_block_id => LocBlock $forwardFkField = self::getFkField($mainEntity['type'], $joinEntityName); if ($forwardFkField && $values) { - // Add id to values for update op - if ($whereClause) { + // Add id to values for update op, but only if id is not already on the form + if ($whereClause && empty($mainEntity['joins'][$joinEntityName]['fields'][$joinIdField])) { $values[0][$joinIdField] = $whereClause[0][2]; } $result = civicrm_api4($joinEntityName, 'save', [ diff --git a/civicrm/ext/afform/core/ang/af/afButton.directive.js b/civicrm/ext/afform/core/ang/af/afButton.directive.js new file mode 100644 index 0000000000..03f487fa70 --- /dev/null +++ b/civicrm/ext/afform/core/ang/af/afButton.directive.js @@ -0,0 +1,38 @@ +(function(angular, $, _) { + "use strict"; + angular.module('af').directive('afButton', function() { + return { + restrict: 'C', + bindToController: { + type: '@' + }, + require: { + afForm: '?^^afForm', + }, + controller: function($scope, $element) { + const ctrl = this; + + this.$onInit = function () { + const type = $element.attr('type'); + + // Pass off handling of reset button to appropriate controllers + if (type === 'reset') { + $element.on('click', function(e) { + e.preventDefault(); + $scope.$apply(function() { + // Reset submission form + if (ctrl.afForm) { + ctrl.afForm.resetForm(); + } + // Reset search form + else { + $scope.$parent.$broadcast('afFormReset'); + } + }); + }); + } + }; + } + }; + }); +})(angular, CRM.$, CRM._); diff --git a/civicrm/ext/afform/core/ang/af/afField.component.js b/civicrm/ext/afform/core/ang/af/afField.component.js index 0bd1820170..8093740b87 100644 --- a/civicrm/ext/afform/core/ang/af/afField.component.js +++ b/civicrm/ext/afform/core/ang/af/afField.component.js @@ -30,6 +30,10 @@ $element.addClass('af-field-type-' + _.kebabCase(ctrl.defn.input_type)); + if (this.defn.input_attrs && this.defn.input_attrs.multiple) { + $element.addClass('af-field-type-multiple'); + } + if (this.defn.name !== this.fieldName) { namePrefix = this.fieldName.substr(0, this.fieldName.length - this.defn.name.length); } @@ -113,6 +117,10 @@ // Wait for parent controllers to initialize $timeout(function() { + initializeValue(true); + }); + + function initializeValue(firstLoad) { // Unique field name = entity_name index . join . field_name var entityName = ctrl.afFieldset.getName(), joinEntity = ctrl.afJoin ? ctrl.afJoin.entity : null, @@ -130,7 +138,7 @@ else if (urlArgs && (ctrl.fieldName in urlArgs)) { setValue(urlArgs[ctrl.fieldName]); } - else if (ctrl.afFieldset.getStoredValue(ctrl.fieldName) !== undefined) { + else if (firstLoad && ctrl.afFieldset.getStoredValue(ctrl.fieldName) !== undefined) { setValue(ctrl.afFieldset.getStoredValue(ctrl.fieldName)); } // Set default value based on field defn @@ -157,6 +165,12 @@ } } } + } + + // Reinitialize value when resetting form + $scope.$on('afFormReset', function() { + delete $scope.dataProvider.getFieldData()[ctrl.fieldName]; + initializeValue(false); }); }; @@ -208,7 +222,7 @@ } if (ctrl.defn.input_type === 'Date' && typeof value === 'string' && value.startsWith('now')) { - value = getRelativeDate(value); + value = getRelativeDate(value, ctrl.defn.input_attrs.time); } if (ctrl.defn.input_type === 'Number' && ctrl.defn.search_range) { if (!_.isPlainObject(value)) { @@ -244,7 +258,7 @@ }; ctrl.isReadonly = function() { - if (ctrl.defn.input_attrs && ctrl.defn.input_attrs.autofill) { + if (ctrl.defn.input_attrs && ctrl.defn.input_attrs.autofill && !ctrl.afJoin) { return ctrl.afFieldset.getEntity().actions[ctrl.defn.input_attrs.autofill] === false; } // TODO: Not actually used, but could be used if we wanted to render displayOnly @@ -374,7 +388,7 @@ return currentVal; }; - function getRelativeDate(dateString) { + function getRelativeDate(dateString, includeTime) { const parts = dateString.split(' '); const baseDate = new Date(); let unit = parts[2] || 'day'; @@ -389,7 +403,11 @@ offset *= 365; } let newDate = new Date(baseDate.getTime() + offset * 24 * 60 * 60 * 1000); - return newDate.toISOString().split('T')[0]; + let defaultDate = newDate.toISOString().split('T')[0]; + if (includeTime) { + defaultDate += ' ' + newDate.toTimeString().slice(0,8); + } + return defaultDate; } } diff --git a/civicrm/ext/afform/core/ang/af/afForm.component.js b/civicrm/ext/afform/core/ang/af/afForm.component.js index b7df25e764..50a8ccffb7 100644 --- a/civicrm/ext/afform/core/ang/af/afForm.component.js +++ b/civicrm/ext/afform/core/ang/af/afForm.component.js @@ -42,6 +42,11 @@ this.getFormMeta = function getFormMeta() { return $scope.$parent.meta; }; + this.resetForm = function() { + this.ngForm.$setPristine(); + $scope.$parent.$broadcast('afFormReset'); + this.loadData(); + }; // With no arguments this will prefill the entire form based on url args // and also check if the form is open for submissions. // With selectedEntity, selectedIndex & selectedId provided this will prefill a single entity diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/Afform/AfformEventUsageTest.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/Afform/AfformEventUsageTest.php index 75149a9ef6..2160ef3cc6 100644 --- a/civicrm/ext/afform/mock/tests/phpunit/api/v4/Afform/AfformEventUsageTest.php +++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/Afform/AfformEventUsageTest.php @@ -2,13 +2,15 @@ namespace api\v4\Afform; use Civi\Api4\Afform; +use Civi\Api4\Event; +use Civi\Test\TransactionalInterface; /** * Test case for Afform.prefill and Afform.submit with Event records. * * @group headless */ -class AfformEventUsageTest extends AfformUsageTestCase { +class AfformEventUsageTest extends AfformUsageTestCase implements TransactionalInterface { use \Civi\Test\Api4TestTrait; /** @@ -75,4 +77,123 @@ EOHTML; $this->assertSame('2234567', $prefill['values'][0]['joins']['LocBlock'][0]['phone_id.phone']); } + /** + * Test saving & updating + */ + public function testEventLocationUpdate(): void { + $layout = <<<EOHTML +<af-form ctrl="afform"> + <af-entity actions="{create: true, update: true}" type="Event" name="Event1" label="Event 1" security="FBAC" /> + <fieldset af-fieldset="Event1" class="af-container" af-title="Event 1"> + <af-field name="id" /> + <af-field name="title" /> + <af-field name="start_date" /> + <af-field name="end_date" defn="{input_type: 'DisplayOnly'}" /> + <af-field name="event_type_id" /> + <div af-join="LocBlock"> + <af-field name="id" /> + <af-field name="email_id.email" /> + <af-field name="address_id.street_address" /> + </div> + </fieldset> + <button class="af-button btn btn-primary" crm-icon="fa-check" ng-click="afform.submit()">Submit</button> +</af-form> +EOHTML; + + $this->useValues([ + 'layout' => $layout, + 'permission' => \CRM_Core_Permission::ALWAYS_ALLOW_PERMISSION, + ]); + + // Create a new event with a new location + $submit = Afform::submit() + ->setName($this->formName) + ->setValues([ + 'Event1' => [ + [ + 'fields' => [ + 'title' => 'Event Title 1', + 'start_date' => '2021-01-01 00:00:00', + 'end_date' => '2021-01-02 00:00:00', + 'event_type_id' => 1, + ], + 'joins' => [ + 'LocBlock' => [ + [ + 'email_id.email' => 'test1@te.st', + 'address_id.street_address' => '12345', + ], + ], + ], + ], + ], + ])->execute(); + + $event1 = $submit[0]['Event1'][0]['id']; + $loc1 = $submit[0]['Event1'][0]['joins']['LocBlock'][0]['id']; + + // End date is readonly so should not have been saved. + $event1Values = $this->getTestRecord('Event', $event1); + $this->assertNull($event1Values['end_date']); + Event::update(FALSE) + ->addWhere('id', '=', $event1) + ->addValue('end_date', '2021-01-03 00:00:00') + ->execute(); + + // Create a 2nd new event with a new location + $submit = Afform::submit() + ->setName($this->formName) + ->setValues([ + 'Event1' => [ + [ + 'fields' => [ + 'title' => 'Event Title 2', + 'start_date' => '2022-01-01 00:00:00', + 'event_type_id' => 1, + ], + 'joins' => [ + 'LocBlock' => [ + [ + 'id' => $loc1, + ], + ], + ], + ], + ], + ])->execute(); + + $event2 = $submit[0]['Event1'][0]['id']; + $this->assertGreaterThan($event1, $event2); + $this->assertSame($loc1, $submit[0]['Event1'][0]['joins']['LocBlock'][0]['id']); + + // Update event 1 with a new location + $submit = Afform::submit() + ->setName($this->formName) + ->setValues([ + 'Event1' => [ + [ + 'fields' => [ + 'id' => $event1, + 'title' => 'Event Title 1 Updated', + ], + 'joins' => [ + 'LocBlock' => [ + [ + 'id' => NULL, + 'address_id.street_address' => '12345', + ], + ], + ], + ], + ], + ])->execute(); + + $this->assertSame($event1, $submit[0]['Event1'][0]['id']); + $this->assertGreaterThan($loc1, $submit[0]['Event1'][0]['joins']['LocBlock'][0]['id']); + + // End date is readonly so should not have been modified. + $event1Values = $this->getTestRecord('Event', $event1); + $this->assertSame('2021-01-03 00:00:00', $event1Values['end_date']); + } + } diff --git a/civicrm/ext/authx/authx.php b/civicrm/ext/authx/authx.php index 0a5ad8f9a8..f1e43e8b8f 100644 --- a/civicrm/ext/authx/authx.php +++ b/civicrm/ext/authx/authx.php @@ -124,14 +124,18 @@ function authx_civicrm_enable() { function authx_civicrm_permission(&$permissions) { $permissions['authenticate with password'] = [ 'label' => E::ts('AuthX: Authenticate to services with password'), + 'description' => E::ts('AuthX: Authenticate to services with password'), ]; $permissions['authenticate with api key'] = [ 'label' => E::ts('AuthX: Authenticate to services with API key'), + 'description' => E::ts('AuthX: Authenticate to services with API key'), ]; $permissions['generate any authx credential'] = [ 'label' => E::ts('Authx: Generate new JWT credentials for other users via the API'), + 'description' => E::ts('Authx: Generate new JWT credentials for other users via the API'), ]; $permissions['validate any authx credential'] = [ 'label' => E::ts('Authx: Validate credentials for other users via the API'), + 'description' => E::ts('Authx: Validate credentials for other users via the API'), ]; } diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_ACL_Roles.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_ACL_Roles.mgd.php index 83559710f6..b433f31f3a 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_ACL_Roles.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_ACL_Roles.mgd.php @@ -162,6 +162,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'cssRules' => [ [ diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Assigned_Financial_Accounts.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Assigned_Financial_Accounts.mgd.php index f9e34490d6..82fb498610 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Assigned_Financial_Accounts.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Assigned_Financial_Accounts.mgd.php @@ -74,6 +74,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Contact_Types.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Contact_Types.mgd.php index 351d79b8c5..fd96dcda19 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Contact_Types.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Contact_Types.mgd.php @@ -54,6 +54,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Fields.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Fields.mgd.php index 80fd556254..1b129a2c21 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Fields.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Fields.mgd.php @@ -60,6 +60,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Groups.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Groups.mgd.php index 58c8747422..dc3f58b176 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Groups.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Custom_Groups.mgd.php @@ -74,6 +74,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Accounts.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Accounts.mgd.php index 417004cec1..7fede0d57d 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Accounts.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Accounts.mgd.php @@ -66,6 +66,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Types.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Types.mgd.php index 5c935f9e6b..8c03f869c1 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Types.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Financial_Types.mgd.php @@ -82,6 +82,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Location_Types.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Location_Types.mgd.php index 6c849d7524..2955f3e265 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Location_Types.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Location_Types.mgd.php @@ -59,6 +59,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Manage_Group.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Manage_Group.mgd.php index ebe669d0f6..1bc1f1e525 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Manage_Group.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Manage_Group.mgd.php @@ -248,6 +248,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'toolbar' => [ [ @@ -268,6 +269,7 @@ return [ ], ], 'hierarchical' => TRUE, + 'collapsible' => 'closed', ], 'acl_bypass' => FALSE, ], diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Payment_Processors.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Payment_Processors.mgd.php index d1a3f718ec..7c9da854ea 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Payment_Processors.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Payment_Processors.mgd.php @@ -89,6 +89,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_ProfileFields.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_ProfileFields.mgd.php index ac0385ef2c..8a87101b89 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_ProfileFields.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_ProfileFields.mgd.php @@ -60,6 +60,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Profiles.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Profiles.mgd.php index d9653a79cb..8b52f78b67 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Profiles.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Profiles.mgd.php @@ -73,6 +73,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Relationship_Types.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Relationship_Types.mgd.php index 79892ddc99..83e2cc555b 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Relationship_Types.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Administer_Relationship_Types.mgd.php @@ -57,6 +57,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Headers_Footers_and_Automated_Messages.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Headers_Footers_and_Automated_Messages.mgd.php index 6ad01ad241..db1fe7d1cf 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Headers_Footers_and_Automated_Messages.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Headers_Footers_and_Automated_Messages.mgd.php @@ -172,6 +172,7 @@ return [ 'classes' => [ 'table-striped', 'table', + 'crm-sticky-header', ], 'toolbar' => [ [ diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Import_Export_Mappings.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Import_Export_Mappings.mgd.php index 88eea065fe..522d0a3be1 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Import_Export_Mappings.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Import_Export_Mappings.mgd.php @@ -137,6 +137,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], ], ], diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Label_Formats.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Label_Formats.mgd.php index dc2ee01d35..d334e50a60 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Label_Formats.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Label_Formats.mgd.php @@ -159,6 +159,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'draggable' => 'weight', 'toolbar' => [ diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Contribution_Pages.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Contribution_Pages.mgd.php index d041b2153e..77d8b01384 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Contribution_Pages.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Contribution_Pages.mgd.php @@ -61,6 +61,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'pager' => [ 'show_count' => TRUE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Mail_Accounts.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Mail_Accounts.mgd.php index 9d89dfbdc7..a74ee99f9f 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Mail_Accounts.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Mail_Accounts.mgd.php @@ -191,6 +191,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'toolbar' => [ [ diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Premiums.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Premiums.mgd.php index 74acbef6d6..a90e729a3a 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Premiums.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Premiums.mgd.php @@ -195,6 +195,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'cssRules' => [ [ diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Scheduled_Jobs.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Scheduled_Jobs.mgd.php index 03f602eae5..55e8b52278 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Scheduled_Jobs.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Manage_Scheduled_Jobs.mgd.php @@ -242,6 +242,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], ], 'acl_bypass' => FALSE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Print_Page_PDF_Formats.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Print_Page_PDF_Formats.mgd.php index e6d88c56b7..3c1b1f6dcf 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Print_Page_PDF_Formats.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Print_Page_PDF_Formats.mgd.php @@ -146,6 +146,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'draggable' => 'weight', 'toolbar' => [ diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Queues.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Queues.mgd.php index f0b1cc7589..fc7b1f22ff 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Queues.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Queues.mgd.php @@ -88,6 +88,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], ], ], diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_SMS_Provider.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_SMS_Provider.mgd.php index 94231165b5..18bb7f0f67 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_SMS_Provider.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_SMS_Provider.mgd.php @@ -151,6 +151,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], 'toolbar' => [ [ diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Scheduled_Jobs_Log.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Scheduled_Jobs_Log.mgd.php index 655a7d1601..c3bb9ef7f0 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Scheduled_Jobs_Log.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Scheduled_Jobs_Log.mgd.php @@ -92,6 +92,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], ], 'acl_bypass' => FALSE, diff --git a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Settings_Date_Preferences.mgd.php b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Settings_Date_Preferences.mgd.php index 5b4bb413b1..c7bb6c900c 100644 --- a/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Settings_Date_Preferences.mgd.php +++ b/civicrm/ext/civicrm_admin_ui/managed/SavedSearch_Settings_Date_Preferences.mgd.php @@ -118,6 +118,7 @@ return [ 'classes' => [ 'table', 'table-striped', + 'crm-sticky-header', ], ], ], diff --git a/civicrm/ext/civicrm_search_ui/ang/afsearchFindContributions.aff.html b/civicrm/ext/civicrm_search_ui/ang/afsearchFindContributions.aff.html index d9ada15c74..b7954934c2 100644 --- a/civicrm/ext/civicrm_search_ui/ang/afsearchFindContributions.aff.html +++ b/civicrm/ext/civicrm_search_ui/ang/afsearchFindContributions.aff.html @@ -5,7 +5,7 @@ <af-field name="Contribution_Contact_contact_id_01.tags" defn="{input_attrs: {multiple: true}}" /> <af-field name="Contribution_Contact_contact_id_01.groups" defn="{input_attrs: {multiple: true}}" /> <af-field name="Contribution_Contact_contact_id_01.contact_type" defn="{input_attrs: {multiple: true}}" /> - <af-field name="Contribution_Contact_contact_id_01.is_deleted" defn="{required: false, label: 'Search in Trash (deleted contacts)'}" /> + <af-field name="Contribution_Contact_contact_id_01.is_deleted" defn="{required: false, label: 'Search Deleted Contacts'}" /> </details> <details class="af-container af-layout-inline" open af-title="Common Filters"> <af-field name="receive_date" defn="{input_type: 'Select', search_range: true, options: [{id: '{}', label: 'Choose Date Range'}, {id: 'this.day', label: 'Today'}, {id: 'this.week', label: 'This week'}, {id: 'this.month', label: 'This calendar month'}, {id: 'this.quarter', label: 'This quarter'}, {id: 'this.fiscal_year', label: 'This fiscal year'}, {id: 'this.year', label: 'This calendar year'}, {id: 'previous.day', label: 'Yesterday'}, {id: 'previous.week', label: 'Previous week'}, {id: 'previous.month', label: 'Previous calendar month'}, {id: 'previous.quarter', label: 'Previous quarter'}, {id: 'previous.fiscal_year', label: 'Previous fiscal year'}, {id: 'previous.year', label: 'Previous calendar year'}, {id: 'ending.week', label: 'Last 7 days including today'}, {id: 'ending_30.day', label: 'Last 30 days including today'}, {id: 'ending_60.day', label: 'Last 60 days including today'}, {id: 'ending_90.day', label: 'Last 90 days including today'}, {id: 'ending.year', label: 'Last 12 months including today'}, {id: 'ending_2.year', label: 'Last 2 years including today'}, {id: 'ending_3.year', label: 'Last 3 years including today'}, {id: 'starting.day', label: 'Tomorrow'}, {id: 'next.week', label: 'Next week'}, {id: 'next.month', label: 'Next calendar month'}, {id: 'next.quarter', label: 'Next quarter'}, {id: 'next.fiscal_year', label: 'Next fiscal year'}, {id: 'next.year', label: 'Next calendar year'}, {id: 'starting.week', label: 'Next 7 days including today'}, {id: 'starting.month', label: 'Next 30 days including today'}, {id: 'starting_2.month', label: 'Next 60 days including today'}, {id: 'starting.quarter', label: 'Next 90 days including today'}, {id: 'starting.year', label: 'Next 12 months including today'}, {id: 'current.week', label: 'Current week to-date'}, {id: 'current.month', label: 'Current calendar month to-date'}, {id: 'current.quarter', label: 'Current quarter to-date'}, {id: 'current.year', label: 'Current calendar year to-date'}, {id: 'earlier.day', label: 'To end of yesterday'}, {id: 'earlier.week', label: 'To end of previous week'}, {id: 'earlier.month', label: 'To end of previous calendar month'}, {id: 'earlier.quarter', label: 'To end of previous quarter'}, {id: 'earlier.year', label: 'To end of previous calendar year'}, {id: 'greater.day', label: 'From start of current day'}, {id: 'greater.week', label: 'From start of current week'}, {id: 'greater.month', label: 'From start of current calendar month'}, {id: 'greater.quarter', label: 'From start of current quarter'}, {id: 'greater.year', label: 'From start of current calendar year'}, {id: 'less.week', label: 'To end of current week'}, {id: 'less.month', label: 'To end of current calendar month'}, {id: 'less.quarter', label: 'To end of current quarter'}, {id: 'less.year', label: 'To end of current calendar year'}, {id: 'previous_2.day', label: 'Previous 2 days'}, {id: 'previous_2.week', label: 'Previous 2 weeks'}, {id: 'previous_2.month', label: 'Previous 2 calendar months'}, {id: 'previous_2.quarter', label: 'Previous 2 quarters'}, {id: 'previous_2.year', label: 'Previous 2 calendar years'}, {id: 'previous_2.fiscal_year', label: 'Previous 2 fiscal years'}, {id: 'previous_before.day', label: 'Day prior to yesterday'}, {id: 'previous_before.week', label: 'Week prior to previous week'}, {id: 'previous_before.month', label: 'Month prior to previous calendar month'}, {id: 'previous_before.quarter', label: 'Quarter prior to previous quarter'}, {id: 'previous_before.year', label: 'Year prior to previous calendar year'}, {id: 'previous_before.fiscal_year', label: 'Fiscal year prior to previous fiscal year'}, {id: 'greater_previous.week', label: 'From end of previous week'}, {id: 'greater_previous.month', label: 'From end of previous calendar month'}, {id: 'greater_previous.quarter', label: 'From end of previous quarter'}, {id: 'greater_previous.year', label: 'From end of previous calendar year'}], input_attrs: {}}" /> diff --git a/civicrm/ext/civicrm_search_ui/ang/afsearchFindMemberships.aff.html b/civicrm/ext/civicrm_search_ui/ang/afsearchFindMemberships.aff.html index 8604ba98ba..dad6e9a436 100644 --- a/civicrm/ext/civicrm_search_ui/ang/afsearchFindMemberships.aff.html +++ b/civicrm/ext/civicrm_search_ui/ang/afsearchFindMemberships.aff.html @@ -4,7 +4,7 @@ <af-field name="Membership_Contact_contact_id_01.tags" defn="{input_attrs: {multiple: true}}" /> <af-field name="Membership_Contact_contact_id_01.groups" defn="{input_attrs: {multiple: true}}" /> <af-field name="Membership_Contact_contact_id_01.contact_type" defn="{input_attrs: {multiple: true}}" /> - <af-field name="Membership_Contact_contact_id_01.is_deleted" defn="{label: 'Search in Trash (deleted contacts)'}" /> + <af-field name="Membership_Contact_contact_id_01.is_deleted" defn="{label: 'Search Deleted Contacts'}" /> </details> <details class="af-container af-layout-inline" af-title="Membership Filters" open=""> <af-field name="membership_type_id" defn="{input_attrs: {multiple: true}, required: false}" /> diff --git a/civicrm/ext/greenwich/dist/bootstrap3.css b/civicrm/ext/greenwich/dist/bootstrap3.css index f172d468fa..f72ffede1f 100644 --- a/civicrm/ext/greenwich/dist/bootstrap3.css +++ b/civicrm/ext/greenwich/dist/bootstrap3.css @@ -7298,6 +7298,12 @@ display: list-item; } +#bootstrap-theme legend { + position: initial; + text-transform: inherit; + float: none; +} + #bootstrap-theme .form-control .select2-choice { border: 0; border-radius: 2px; diff --git a/civicrm/ext/greenwich/dist/bootstrap3.min.css b/civicrm/ext/greenwich/dist/bootstrap3.min.css index 8a86720830..4c2092e5ea 100644 --- a/civicrm/ext/greenwich/dist/bootstrap3.min.css +++ b/civicrm/ext/greenwich/dist/bootstrap3.min.css @@ -1 +1 @@ -@charset "UTF-8";#bootstrap-theme html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}#bootstrap-theme body{margin:0}#bootstrap-theme article,#bootstrap-theme aside,#bootstrap-theme details,#bootstrap-theme figcaption,#bootstrap-theme figure,#bootstrap-theme footer,#bootstrap-theme header,#bootstrap-theme hgroup,#bootstrap-theme main,#bootstrap-theme menu,#bootstrap-theme nav,#bootstrap-theme section,#bootstrap-theme summary{display:block}#bootstrap-theme audio,#bootstrap-theme canvas,#bootstrap-theme progress,#bootstrap-theme video{display:inline-block;vertical-align:baseline}#bootstrap-theme audio:not([controls]){display:none;height:0}#bootstrap-theme [hidden],#bootstrap-theme template{display:none}#bootstrap-theme a{background-color:transparent}#bootstrap-theme a:active,#bootstrap-theme a:hover{outline:0}#bootstrap-theme abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}#bootstrap-theme b,#bootstrap-theme strong{font-weight:700}#bootstrap-theme dfn{font-style:italic}#bootstrap-theme h1{font-size:2em;margin:.67em 0}#bootstrap-theme mark{background:#ff0;color:#000}#bootstrap-theme small{font-size:80%}#bootstrap-theme sub,#bootstrap-theme sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}#bootstrap-theme sup{top:-.5em}#bootstrap-theme sub{bottom:-.25em}#bootstrap-theme img{border:0}#bootstrap-theme svg:not(:root){overflow:hidden}#bootstrap-theme figure{margin:1em 40px}#bootstrap-theme hr{box-sizing:content-box;height:0}#bootstrap-theme pre{overflow:auto}#bootstrap-theme code,#bootstrap-theme kbd,#bootstrap-theme pre,#bootstrap-theme samp{font-family:monospace,monospace;font-size:1em}#bootstrap-theme button,#bootstrap-theme input,#bootstrap-theme optgroup,#bootstrap-theme select,#bootstrap-theme textarea{color:inherit;font:inherit;margin:0}#bootstrap-theme button{overflow:visible}#bootstrap-theme button,#bootstrap-theme select{text-transform:none}#bootstrap-theme button,#bootstrap-theme html input[type=button],#bootstrap-theme input[type=reset],#bootstrap-theme input[type=submit]{-webkit-appearance:button;cursor:pointer}#bootstrap-theme button[disabled],#bootstrap-theme html input[disabled]{cursor:default}#bootstrap-theme button::-moz-focus-inner,#bootstrap-theme input::-moz-focus-inner{border:0;padding:0}#bootstrap-theme input{line-height:normal}#bootstrap-theme input[type=checkbox],#bootstrap-theme input[type=radio]{box-sizing:border-box;padding:0}#bootstrap-theme input[type=number]::-webkit-inner-spin-button,#bootstrap-theme input[type=number]::-webkit-outer-spin-button{height:auto}#bootstrap-theme input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}#bootstrap-theme input[type=search]::-webkit-search-cancel-button,#bootstrap-theme input[type=search]::-webkit-search-decoration{-webkit-appearance:none}#bootstrap-theme fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}#bootstrap-theme legend{border:0;padding:0}#bootstrap-theme textarea{overflow:auto}#bootstrap-theme optgroup{font-weight:700}#bootstrap-theme table{border-collapse:collapse;border-spacing:0}#bootstrap-theme td,#bootstrap-theme th{padding:0}@media print{#bootstrap-theme *,#bootstrap-theme *:before,#bootstrap-theme *:after{color:#000 !important;text-shadow:none !important;background:0 0 !important;box-shadow:none !important}#bootstrap-theme a,#bootstrap-theme a:visited{text-decoration:underline}#bootstrap-theme a[href]:after{content:" (" attr(href) ")"}#bootstrap-theme abbr[title]:after{content:" (" attr(title) ")"}#bootstrap-theme a[href^="#"]:after,#bootstrap-theme a[href^="javascript:"]:after{content:""}#bootstrap-theme pre,#bootstrap-theme blockquote{border:1px solid #999;page-break-inside:avoid}#bootstrap-theme thead{display:table-header-group}#bootstrap-theme tr,#bootstrap-theme img{page-break-inside:avoid}#bootstrap-theme img{max-width:100% !important}#bootstrap-theme p,#bootstrap-theme h2,#bootstrap-theme h3{orphans:3;widows:3}#bootstrap-theme h2,#bootstrap-theme h3{page-break-after:avoid}#bootstrap-theme .navbar{display:none}#bootstrap-theme .btn>.caret,#bootstrap-theme .dropup>.btn>.caret{border-top-color:#000 !important}#bootstrap-theme .label{border:1px solid #000}#bootstrap-theme .table{border-collapse:collapse !important}#bootstrap-theme .table td,#bootstrap-theme .table th{background-color:#fff !important}#bootstrap-theme .table-bordered th,#bootstrap-theme .table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:"Glyphicons Halflings";src:url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.eot");src:url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.woff2") format("woff2"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.woff") format("woff"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.ttf") format("truetype"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}#bootstrap-theme .glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#bootstrap-theme .glyphicon-asterisk:before{content:"*"}#bootstrap-theme .glyphicon-plus:before{content:"+"}#bootstrap-theme .glyphicon-euro:before,#bootstrap-theme .glyphicon-eur:before{content:"€"}#bootstrap-theme .glyphicon-minus:before{content:"−"}#bootstrap-theme .glyphicon-cloud:before{content:"☁"}#bootstrap-theme .glyphicon-envelope:before{content:"✉"}#bootstrap-theme .glyphicon-pencil:before{content:"✏"}#bootstrap-theme .glyphicon-glass:before{content:""}#bootstrap-theme .glyphicon-music:before{content:""}#bootstrap-theme .glyphicon-search:before{content:""}#bootstrap-theme .glyphicon-heart:before{content:""}#bootstrap-theme .glyphicon-star:before{content:""}#bootstrap-theme .glyphicon-star-empty:before{content:""}#bootstrap-theme .glyphicon-user:before{content:""}#bootstrap-theme .glyphicon-film:before{content:""}#bootstrap-theme .glyphicon-th-large:before{content:""}#bootstrap-theme .glyphicon-th:before{content:""}#bootstrap-theme .glyphicon-th-list:before{content:""}#bootstrap-theme .glyphicon-ok:before{content:""}#bootstrap-theme .glyphicon-remove:before{content:""}#bootstrap-theme .glyphicon-zoom-in:before{content:""}#bootstrap-theme .glyphicon-zoom-out:before{content:""}#bootstrap-theme .glyphicon-off:before{content:""}#bootstrap-theme .glyphicon-signal:before{content:""}#bootstrap-theme .glyphicon-cog:before{content:""}#bootstrap-theme .glyphicon-trash:before{content:""}#bootstrap-theme .glyphicon-home:before{content:""}#bootstrap-theme .glyphicon-file:before{content:""}#bootstrap-theme .glyphicon-time:before{content:""}#bootstrap-theme .glyphicon-road:before{content:""}#bootstrap-theme .glyphicon-download-alt:before{content:""}#bootstrap-theme .glyphicon-download:before{content:""}#bootstrap-theme .glyphicon-upload:before{content:""}#bootstrap-theme .glyphicon-inbox:before{content:""}#bootstrap-theme .glyphicon-play-circle:before{content:""}#bootstrap-theme .glyphicon-repeat:before{content:""}#bootstrap-theme .glyphicon-refresh:before{content:""}#bootstrap-theme .glyphicon-list-alt:before{content:""}#bootstrap-theme .glyphicon-lock:before{content:""}#bootstrap-theme .glyphicon-flag:before{content:""}#bootstrap-theme .glyphicon-headphones:before{content:""}#bootstrap-theme .glyphicon-volume-off:before{content:""}#bootstrap-theme .glyphicon-volume-down:before{content:""}#bootstrap-theme .glyphicon-volume-up:before{content:""}#bootstrap-theme .glyphicon-qrcode:before{content:""}#bootstrap-theme .glyphicon-barcode:before{content:""}#bootstrap-theme .glyphicon-tag:before{content:""}#bootstrap-theme .glyphicon-tags:before{content:""}#bootstrap-theme .glyphicon-book:before{content:""}#bootstrap-theme .glyphicon-bookmark:before{content:""}#bootstrap-theme .glyphicon-print:before{content:""}#bootstrap-theme .glyphicon-camera:before{content:""}#bootstrap-theme .glyphicon-font:before{content:""}#bootstrap-theme .glyphicon-bold:before{content:""}#bootstrap-theme .glyphicon-italic:before{content:""}#bootstrap-theme .glyphicon-text-height:before{content:""}#bootstrap-theme .glyphicon-text-width:before{content:""}#bootstrap-theme .glyphicon-align-left:before{content:""}#bootstrap-theme .glyphicon-align-center:before{content:""}#bootstrap-theme .glyphicon-align-right:before{content:""}#bootstrap-theme .glyphicon-align-justify:before{content:""}#bootstrap-theme .glyphicon-list:before{content:""}#bootstrap-theme .glyphicon-indent-left:before{content:""}#bootstrap-theme .glyphicon-indent-right:before{content:""}#bootstrap-theme .glyphicon-facetime-video:before{content:""}#bootstrap-theme .glyphicon-picture:before{content:""}#bootstrap-theme .glyphicon-map-marker:before{content:""}#bootstrap-theme .glyphicon-adjust:before{content:""}#bootstrap-theme .glyphicon-tint:before{content:""}#bootstrap-theme .glyphicon-edit:before{content:""}#bootstrap-theme .glyphicon-share:before{content:""}#bootstrap-theme .glyphicon-check:before{content:""}#bootstrap-theme .glyphicon-move:before{content:""}#bootstrap-theme .glyphicon-step-backward:before{content:""}#bootstrap-theme .glyphicon-fast-backward:before{content:""}#bootstrap-theme .glyphicon-backward:before{content:""}#bootstrap-theme .glyphicon-play:before{content:""}#bootstrap-theme .glyphicon-pause:before{content:""}#bootstrap-theme .glyphicon-stop:before{content:""}#bootstrap-theme .glyphicon-forward:before{content:""}#bootstrap-theme .glyphicon-fast-forward:before{content:""}#bootstrap-theme .glyphicon-step-forward:before{content:""}#bootstrap-theme .glyphicon-eject:before{content:""}#bootstrap-theme .glyphicon-chevron-left:before{content:""}#bootstrap-theme .glyphicon-chevron-right:before{content:""}#bootstrap-theme .glyphicon-plus-sign:before{content:""}#bootstrap-theme .glyphicon-minus-sign:before{content:""}#bootstrap-theme .glyphicon-remove-sign:before{content:""}#bootstrap-theme .glyphicon-ok-sign:before{content:""}#bootstrap-theme .glyphicon-question-sign:before{content:""}#bootstrap-theme .glyphicon-info-sign:before{content:""}#bootstrap-theme .glyphicon-screenshot:before{content:""}#bootstrap-theme .glyphicon-remove-circle:before{content:""}#bootstrap-theme .glyphicon-ok-circle:before{content:""}#bootstrap-theme .glyphicon-ban-circle:before{content:""}#bootstrap-theme .glyphicon-arrow-left:before{content:""}#bootstrap-theme .glyphicon-arrow-right:before{content:""}#bootstrap-theme .glyphicon-arrow-up:before{content:""}#bootstrap-theme .glyphicon-arrow-down:before{content:""}#bootstrap-theme .glyphicon-share-alt:before{content:""}#bootstrap-theme .glyphicon-resize-full:before{content:""}#bootstrap-theme .glyphicon-resize-small:before{content:""}#bootstrap-theme .glyphicon-exclamation-sign:before{content:""}#bootstrap-theme .glyphicon-gift:before{content:""}#bootstrap-theme .glyphicon-leaf:before{content:""}#bootstrap-theme .glyphicon-fire:before{content:""}#bootstrap-theme .glyphicon-eye-open:before{content:""}#bootstrap-theme .glyphicon-eye-close:before{content:""}#bootstrap-theme .glyphicon-warning-sign:before{content:""}#bootstrap-theme .glyphicon-plane:before{content:""}#bootstrap-theme .glyphicon-calendar:before{content:""}#bootstrap-theme .glyphicon-random:before{content:""}#bootstrap-theme .glyphicon-comment:before{content:""}#bootstrap-theme .glyphicon-magnet:before{content:""}#bootstrap-theme .glyphicon-chevron-up:before{content:""}#bootstrap-theme .glyphicon-chevron-down:before{content:""}#bootstrap-theme .glyphicon-retweet:before{content:""}#bootstrap-theme .glyphicon-shopping-cart:before{content:""}#bootstrap-theme .glyphicon-folder-close:before{content:""}#bootstrap-theme .glyphicon-folder-open:before{content:""}#bootstrap-theme .glyphicon-resize-vertical:before{content:""}#bootstrap-theme .glyphicon-resize-horizontal:before{content:""}#bootstrap-theme .glyphicon-hdd:before{content:""}#bootstrap-theme .glyphicon-bullhorn:before{content:""}#bootstrap-theme .glyphicon-bell:before{content:""}#bootstrap-theme .glyphicon-certificate:before{content:""}#bootstrap-theme .glyphicon-thumbs-up:before{content:""}#bootstrap-theme .glyphicon-thumbs-down:before{content:""}#bootstrap-theme .glyphicon-hand-right:before{content:""}#bootstrap-theme .glyphicon-hand-left:before{content:""}#bootstrap-theme .glyphicon-hand-up:before{content:""}#bootstrap-theme .glyphicon-hand-down:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-right:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-left:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-up:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-down:before{content:""}#bootstrap-theme .glyphicon-globe:before{content:""}#bootstrap-theme .glyphicon-wrench:before{content:""}#bootstrap-theme .glyphicon-tasks:before{content:""}#bootstrap-theme .glyphicon-filter:before{content:""}#bootstrap-theme .glyphicon-briefcase:before{content:""}#bootstrap-theme .glyphicon-fullscreen:before{content:""}#bootstrap-theme .glyphicon-dashboard:before{content:""}#bootstrap-theme .glyphicon-paperclip:before{content:""}#bootstrap-theme .glyphicon-heart-empty:before{content:""}#bootstrap-theme .glyphicon-link:before{content:""}#bootstrap-theme .glyphicon-phone:before{content:""}#bootstrap-theme .glyphicon-pushpin:before{content:""}#bootstrap-theme .glyphicon-usd:before{content:""}#bootstrap-theme .glyphicon-gbp:before{content:""}#bootstrap-theme .glyphicon-sort:before{content:""}#bootstrap-theme .glyphicon-sort-by-alphabet:before{content:""}#bootstrap-theme .glyphicon-sort-by-alphabet-alt:before{content:""}#bootstrap-theme .glyphicon-sort-by-order:before{content:""}#bootstrap-theme .glyphicon-sort-by-order-alt:before{content:""}#bootstrap-theme .glyphicon-sort-by-attributes:before{content:""}#bootstrap-theme .glyphicon-sort-by-attributes-alt:before{content:""}#bootstrap-theme .glyphicon-unchecked:before{content:""}#bootstrap-theme .glyphicon-expand:before{content:""}#bootstrap-theme .glyphicon-collapse-down:before{content:""}#bootstrap-theme .glyphicon-collapse-up:before{content:""}#bootstrap-theme .glyphicon-log-in:before{content:""}#bootstrap-theme .glyphicon-flash:before{content:""}#bootstrap-theme .glyphicon-log-out:before{content:""}#bootstrap-theme .glyphicon-new-window:before{content:""}#bootstrap-theme .glyphicon-record:before{content:""}#bootstrap-theme .glyphicon-save:before{content:""}#bootstrap-theme .glyphicon-open:before{content:""}#bootstrap-theme .glyphicon-saved:before{content:""}#bootstrap-theme .glyphicon-import:before{content:""}#bootstrap-theme .glyphicon-export:before{content:""}#bootstrap-theme .glyphicon-send:before{content:""}#bootstrap-theme .glyphicon-floppy-disk:before{content:""}#bootstrap-theme .glyphicon-floppy-saved:before{content:""}#bootstrap-theme .glyphicon-floppy-remove:before{content:""}#bootstrap-theme .glyphicon-floppy-save:before{content:""}#bootstrap-theme .glyphicon-floppy-open:before{content:""}#bootstrap-theme .glyphicon-credit-card:before{content:""}#bootstrap-theme .glyphicon-transfer:before{content:""}#bootstrap-theme .glyphicon-cutlery:before{content:""}#bootstrap-theme .glyphicon-header:before{content:""}#bootstrap-theme .glyphicon-compressed:before{content:""}#bootstrap-theme .glyphicon-earphone:before{content:""}#bootstrap-theme .glyphicon-phone-alt:before{content:""}#bootstrap-theme .glyphicon-tower:before{content:""}#bootstrap-theme .glyphicon-stats:before{content:""}#bootstrap-theme .glyphicon-sd-video:before{content:""}#bootstrap-theme .glyphicon-hd-video:before{content:""}#bootstrap-theme .glyphicon-subtitles:before{content:""}#bootstrap-theme .glyphicon-sound-stereo:before{content:""}#bootstrap-theme .glyphicon-sound-dolby:before{content:""}#bootstrap-theme .glyphicon-sound-5-1:before{content:""}#bootstrap-theme .glyphicon-sound-6-1:before{content:""}#bootstrap-theme .glyphicon-sound-7-1:before{content:""}#bootstrap-theme .glyphicon-copyright-mark:before{content:""}#bootstrap-theme .glyphicon-registration-mark:before{content:""}#bootstrap-theme .glyphicon-cloud-download:before{content:""}#bootstrap-theme .glyphicon-cloud-upload:before{content:""}#bootstrap-theme .glyphicon-tree-conifer:before{content:""}#bootstrap-theme .glyphicon-tree-deciduous:before{content:""}#bootstrap-theme .glyphicon-cd:before{content:""}#bootstrap-theme .glyphicon-save-file:before{content:""}#bootstrap-theme .glyphicon-open-file:before{content:""}#bootstrap-theme .glyphicon-level-up:before{content:""}#bootstrap-theme .glyphicon-copy:before{content:""}#bootstrap-theme .glyphicon-paste:before{content:""}#bootstrap-theme .glyphicon-alert:before{content:""}#bootstrap-theme .glyphicon-equalizer:before{content:""}#bootstrap-theme .glyphicon-king:before{content:""}#bootstrap-theme .glyphicon-queen:before{content:""}#bootstrap-theme .glyphicon-pawn:before{content:""}#bootstrap-theme .glyphicon-bishop:before{content:""}#bootstrap-theme .glyphicon-knight:before{content:""}#bootstrap-theme .glyphicon-baby-formula:before{content:""}#bootstrap-theme .glyphicon-tent:before{content:"⛺"}#bootstrap-theme .glyphicon-blackboard:before{content:""}#bootstrap-theme .glyphicon-bed:before{content:""}#bootstrap-theme .glyphicon-apple:before{content:""}#bootstrap-theme .glyphicon-erase:before{content:""}#bootstrap-theme .glyphicon-hourglass:before{content:"⌛"}#bootstrap-theme .glyphicon-lamp:before{content:""}#bootstrap-theme .glyphicon-duplicate:before{content:""}#bootstrap-theme .glyphicon-piggy-bank:before{content:""}#bootstrap-theme .glyphicon-scissors:before{content:""}#bootstrap-theme .glyphicon-bitcoin:before{content:""}#bootstrap-theme .glyphicon-btc:before{content:""}#bootstrap-theme .glyphicon-xbt:before{content:""}#bootstrap-theme .glyphicon-yen:before{content:"¥"}#bootstrap-theme .glyphicon-jpy:before{content:"¥"}#bootstrap-theme .glyphicon-ruble:before{content:"₽"}#bootstrap-theme .glyphicon-rub:before{content:"₽"}#bootstrap-theme .glyphicon-scale:before{content:""}#bootstrap-theme .glyphicon-ice-lolly:before{content:""}#bootstrap-theme .glyphicon-ice-lolly-tasted:before{content:""}#bootstrap-theme .glyphicon-education:before{content:""}#bootstrap-theme .glyphicon-option-horizontal:before{content:""}#bootstrap-theme .glyphicon-option-vertical:before{content:""}#bootstrap-theme .glyphicon-menu-hamburger:before{content:""}#bootstrap-theme .glyphicon-modal-window:before{content:""}#bootstrap-theme .glyphicon-oil:before{content:""}#bootstrap-theme .glyphicon-grain:before{content:""}#bootstrap-theme .glyphicon-sunglasses:before{content:""}#bootstrap-theme .glyphicon-text-size:before{content:""}#bootstrap-theme .glyphicon-text-color:before{content:""}#bootstrap-theme .glyphicon-text-background:before{content:""}#bootstrap-theme .glyphicon-object-align-top:before{content:""}#bootstrap-theme .glyphicon-object-align-bottom:before{content:""}#bootstrap-theme .glyphicon-object-align-horizontal:before{content:""}#bootstrap-theme .glyphicon-object-align-left:before{content:""}#bootstrap-theme .glyphicon-object-align-vertical:before{content:""}#bootstrap-theme .glyphicon-object-align-right:before{content:""}#bootstrap-theme .glyphicon-triangle-right:before{content:""}#bootstrap-theme .glyphicon-triangle-left:before{content:""}#bootstrap-theme .glyphicon-triangle-bottom:before{content:""}#bootstrap-theme .glyphicon-triangle-top:before{content:""}#bootstrap-theme .glyphicon-console:before{content:""}#bootstrap-theme .glyphicon-superscript:before{content:""}#bootstrap-theme .glyphicon-subscript:before{content:""}#bootstrap-theme .glyphicon-menu-left:before{content:""}#bootstrap-theme .glyphicon-menu-right:before{content:""}#bootstrap-theme .glyphicon-menu-down:before{content:""}#bootstrap-theme .glyphicon-menu-up:before{content:""}#bootstrap-theme *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#bootstrap-theme *:before,#bootstrap-theme *:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#bootstrap-theme html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}#bootstrap-theme body{font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff}#bootstrap-theme input,#bootstrap-theme button,#bootstrap-theme select,#bootstrap-theme textarea{font-family:inherit;font-size:inherit;line-height:inherit}#bootstrap-theme a{color:#2786c2;text-decoration:none}#bootstrap-theme a:hover,#bootstrap-theme a:focus{color:#1a5a82;text-decoration:underline}#bootstrap-theme a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme figure{margin:0}#bootstrap-theme img{vertical-align:middle}#bootstrap-theme .img-responsive{display:block;max-width:100%;height:auto}#bootstrap-theme .img-rounded{border-radius:6px}#bootstrap-theme .img-thumbnail{padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}#bootstrap-theme .img-circle{border-radius:50%}#bootstrap-theme hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}#bootstrap-theme .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}#bootstrap-theme .sr-only-focusable:active,#bootstrap-theme .sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}#bootstrap-theme [role=button]{cursor:pointer}#bootstrap-theme h1,#bootstrap-theme h2,#bootstrap-theme h3,#bootstrap-theme h4,#bootstrap-theme h5,#bootstrap-theme h6,#bootstrap-theme .h1,#bootstrap-theme .h2,#bootstrap-theme .h3,#bootstrap-theme .h4,#bootstrap-theme .h5,#bootstrap-theme .h6{font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.2;color:#000}#bootstrap-theme h1 small,#bootstrap-theme h1 .small,#bootstrap-theme h2 small,#bootstrap-theme h2 .small,#bootstrap-theme h3 small,#bootstrap-theme h3 .small,#bootstrap-theme h4 small,#bootstrap-theme h4 .small,#bootstrap-theme h5 small,#bootstrap-theme h5 .small,#bootstrap-theme h6 small,#bootstrap-theme h6 .small,#bootstrap-theme .h1 small,#bootstrap-theme .h1 .small,#bootstrap-theme .h2 small,#bootstrap-theme .h2 .small,#bootstrap-theme .h3 small,#bootstrap-theme .h3 .small,#bootstrap-theme .h4 small,#bootstrap-theme .h4 .small,#bootstrap-theme .h5 small,#bootstrap-theme .h5 .small,#bootstrap-theme .h6 small,#bootstrap-theme .h6 .small{font-weight:400;line-height:1;color:#999}#bootstrap-theme h1,#bootstrap-theme .h1,#bootstrap-theme h2,#bootstrap-theme .h2,#bootstrap-theme h3,#bootstrap-theme .h3{margin-top:20px;margin-bottom:10px}#bootstrap-theme h1 small,#bootstrap-theme h1 .small,#bootstrap-theme .h1 small,#bootstrap-theme .h1 .small,#bootstrap-theme h2 small,#bootstrap-theme h2 .small,#bootstrap-theme .h2 small,#bootstrap-theme .h2 .small,#bootstrap-theme h3 small,#bootstrap-theme h3 .small,#bootstrap-theme .h3 small,#bootstrap-theme .h3 .small{font-size:65%}#bootstrap-theme h4,#bootstrap-theme .h4,#bootstrap-theme h5,#bootstrap-theme .h5,#bootstrap-theme h6,#bootstrap-theme .h6{margin-top:10px;margin-bottom:10px}#bootstrap-theme h4 small,#bootstrap-theme h4 .small,#bootstrap-theme .h4 small,#bootstrap-theme .h4 .small,#bootstrap-theme h5 small,#bootstrap-theme h5 .small,#bootstrap-theme .h5 small,#bootstrap-theme .h5 .small,#bootstrap-theme h6 small,#bootstrap-theme h6 .small,#bootstrap-theme .h6 small,#bootstrap-theme .h6 .small{font-size:75%}#bootstrap-theme h1,#bootstrap-theme .h1{font-size:36px}#bootstrap-theme h2,#bootstrap-theme .h2{font-size:30px}#bootstrap-theme h3,#bootstrap-theme .h3{font-size:24px}#bootstrap-theme h4,#bootstrap-theme .h4{font-size:18px}#bootstrap-theme h5,#bootstrap-theme .h5{font-size:14px}#bootstrap-theme h6,#bootstrap-theme .h6{font-size:12px}#bootstrap-theme p{margin:0 0 10px}#bootstrap-theme .lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){#bootstrap-theme .lead{font-size:21px}}#bootstrap-theme small,#bootstrap-theme .small{font-size:85%}#bootstrap-theme mark,#bootstrap-theme .mark{padding:.2em;background-color:#fcf8e3}#bootstrap-theme .text-left{text-align:left}#bootstrap-theme .text-right{text-align:right}#bootstrap-theme .text-center{text-align:center}#bootstrap-theme .text-justify{text-align:justify}#bootstrap-theme .text-nowrap{white-space:nowrap}#bootstrap-theme .text-lowercase{text-transform:lowercase}#bootstrap-theme .text-uppercase,#bootstrap-theme .initialism{text-transform:uppercase}#bootstrap-theme .text-capitalize{text-transform:capitalize}#bootstrap-theme .text-muted{color:#999}#bootstrap-theme .text-primary{color:#000}#bootstrap-theme a.text-primary:hover,#bootstrap-theme a.text-primary:focus{color:#000}#bootstrap-theme .text-success{color:#468847}#bootstrap-theme a.text-success:hover,#bootstrap-theme a.text-success:focus{color:#356635}#bootstrap-theme .text-info{color:#3a87ad}#bootstrap-theme a.text-info:hover,#bootstrap-theme a.text-info:focus{color:#2d6987}#bootstrap-theme .text-warning{color:#c09853}#bootstrap-theme a.text-warning:hover,#bootstrap-theme a.text-warning:focus{color:#a47e3c}#bootstrap-theme .text-danger{color:#b94a48}#bootstrap-theme a.text-danger:hover,#bootstrap-theme a.text-danger:focus{color:#953b39}#bootstrap-theme .bg-primary{color:#fff}#bootstrap-theme .bg-primary{background-color:#000}#bootstrap-theme a.bg-primary:hover,#bootstrap-theme a.bg-primary:focus{background-color:#000}#bootstrap-theme .bg-success{background-color:#dff0d8}#bootstrap-theme a.bg-success:hover,#bootstrap-theme a.bg-success:focus{background-color:#c1e2b3}#bootstrap-theme .bg-info{background-color:#d9edf7}#bootstrap-theme a.bg-info:hover,#bootstrap-theme a.bg-info:focus{background-color:#afd9ee}#bootstrap-theme .bg-warning{background-color:#fcf8e3}#bootstrap-theme a.bg-warning:hover,#bootstrap-theme a.bg-warning:focus{background-color:#f7ecb5}#bootstrap-theme .bg-danger{background-color:#f2dede}#bootstrap-theme a.bg-danger:hover,#bootstrap-theme a.bg-danger:focus{background-color:#e4b9b9}#bootstrap-theme .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}#bootstrap-theme ul,#bootstrap-theme ol{margin-top:0;margin-bottom:10px}#bootstrap-theme ul ul,#bootstrap-theme ul ol,#bootstrap-theme ol ul,#bootstrap-theme ol ol{margin-bottom:0}#bootstrap-theme .list-unstyled{padding-left:0;list-style:none}#bootstrap-theme .list-inline{padding-left:0;list-style:none;margin-left:-5px}#bootstrap-theme .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}#bootstrap-theme dl{margin-top:0;margin-bottom:20px}#bootstrap-theme dt,#bootstrap-theme dd{line-height:1.428571429}#bootstrap-theme dt{font-weight:700}#bootstrap-theme dd{margin-left:0}#bootstrap-theme .dl-horizontal dd:before,#bootstrap-theme .dl-horizontal dd:after{display:table;content:" "}#bootstrap-theme .dl-horizontal dd:after{clear:both}@media (min-width:768px){#bootstrap-theme .dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#bootstrap-theme .dl-horizontal dd{margin-left:180px}}#bootstrap-theme abbr[title],#bootstrap-theme abbr[data-original-title]{cursor:help}#bootstrap-theme .initialism{font-size:90%}#bootstrap-theme blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}#bootstrap-theme blockquote p:last-child,#bootstrap-theme blockquote ul:last-child,#bootstrap-theme blockquote ol:last-child{margin-bottom:0}#bootstrap-theme blockquote footer,#bootstrap-theme blockquote small,#bootstrap-theme blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}#bootstrap-theme blockquote footer:before,#bootstrap-theme blockquote small:before,#bootstrap-theme blockquote .small:before{content:"— "}#bootstrap-theme .blockquote-reverse,#bootstrap-theme blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}#bootstrap-theme .blockquote-reverse footer:before,#bootstrap-theme .blockquote-reverse small:before,#bootstrap-theme .blockquote-reverse .small:before,#bootstrap-theme blockquote.pull-right footer:before,#bootstrap-theme blockquote.pull-right small:before,#bootstrap-theme blockquote.pull-right .small:before{content:""}#bootstrap-theme .blockquote-reverse footer:after,#bootstrap-theme .blockquote-reverse small:after,#bootstrap-theme .blockquote-reverse .small:after,#bootstrap-theme blockquote.pull-right footer:after,#bootstrap-theme blockquote.pull-right small:after,#bootstrap-theme blockquote.pull-right .small:after{content:" —"}#bootstrap-theme address{margin-bottom:20px;font-style:normal;line-height:1.428571429}#bootstrap-theme code,#bootstrap-theme kbd,#bootstrap-theme pre,#bootstrap-theme samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}#bootstrap-theme code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}#bootstrap-theme kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}#bootstrap-theme kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}#bootstrap-theme pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;-ms-word-break:break-all;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}#bootstrap-theme pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}#bootstrap-theme .pre-scrollable{max-height:340px;overflow-y:scroll}#bootstrap-theme .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#bootstrap-theme .container:before,#bootstrap-theme .container:after{display:table;content:" "}#bootstrap-theme .container:after{clear:both}@media (min-width:768px){#bootstrap-theme .container{width:750px}}@media (min-width:992px){#bootstrap-theme .container{width:970px}}@media (min-width:1200px){#bootstrap-theme .container{width:1170px}}#bootstrap-theme .container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#bootstrap-theme .container-fluid:before,#bootstrap-theme .container-fluid:after{display:table;content:" "}#bootstrap-theme .container-fluid:after{clear:both}#bootstrap-theme .row{margin-right:-15px;margin-left:-15px}#bootstrap-theme .row:before,#bootstrap-theme .row:after{display:table;content:" "}#bootstrap-theme .row:after{clear:both}#bootstrap-theme .row-no-gutters{margin-right:0;margin-left:0}#bootstrap-theme .row-no-gutters [class*=col-]{padding-right:0;padding-left:0}#bootstrap-theme .col-xs-1,#bootstrap-theme .col-sm-1,#bootstrap-theme .col-md-1,#bootstrap-theme .col-lg-1,#bootstrap-theme .col-xs-2,#bootstrap-theme .col-sm-2,#bootstrap-theme .col-md-2,#bootstrap-theme .col-lg-2,#bootstrap-theme .col-xs-3,#bootstrap-theme .col-sm-3,#bootstrap-theme .col-md-3,#bootstrap-theme .col-lg-3,#bootstrap-theme .col-xs-4,#bootstrap-theme .col-sm-4,#bootstrap-theme .col-md-4,#bootstrap-theme .col-lg-4,#bootstrap-theme .col-xs-5,#bootstrap-theme .col-sm-5,#bootstrap-theme .col-md-5,#bootstrap-theme .col-lg-5,#bootstrap-theme .col-xs-6,#bootstrap-theme .col-sm-6,#bootstrap-theme .col-md-6,#bootstrap-theme .col-lg-6,#bootstrap-theme .col-xs-7,#bootstrap-theme .col-sm-7,#bootstrap-theme .col-md-7,#bootstrap-theme .col-lg-7,#bootstrap-theme .col-xs-8,#bootstrap-theme .col-sm-8,#bootstrap-theme .col-md-8,#bootstrap-theme .col-lg-8,#bootstrap-theme .col-xs-9,#bootstrap-theme .col-sm-9,#bootstrap-theme .col-md-9,#bootstrap-theme .col-lg-9,#bootstrap-theme .col-xs-10,#bootstrap-theme .col-sm-10,#bootstrap-theme .col-md-10,#bootstrap-theme .col-lg-10,#bootstrap-theme .col-xs-11,#bootstrap-theme .col-sm-11,#bootstrap-theme .col-md-11,#bootstrap-theme .col-lg-11,#bootstrap-theme .col-xs-12,#bootstrap-theme .col-sm-12,#bootstrap-theme .col-md-12,#bootstrap-theme .col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}#bootstrap-theme .col-xs-1,#bootstrap-theme .col-xs-2,#bootstrap-theme .col-xs-3,#bootstrap-theme .col-xs-4,#bootstrap-theme .col-xs-5,#bootstrap-theme .col-xs-6,#bootstrap-theme .col-xs-7,#bootstrap-theme .col-xs-8,#bootstrap-theme .col-xs-9,#bootstrap-theme .col-xs-10,#bootstrap-theme .col-xs-11,#bootstrap-theme .col-xs-12{float:left}#bootstrap-theme .col-xs-1{width:8.3333333333%}#bootstrap-theme .col-xs-2{width:16.6666666667%}#bootstrap-theme .col-xs-3{width:25%}#bootstrap-theme .col-xs-4{width:33.3333333333%}#bootstrap-theme .col-xs-5{width:41.6666666667%}#bootstrap-theme .col-xs-6{width:50%}#bootstrap-theme .col-xs-7{width:58.3333333333%}#bootstrap-theme .col-xs-8{width:66.6666666667%}#bootstrap-theme .col-xs-9{width:75%}#bootstrap-theme .col-xs-10{width:83.3333333333%}#bootstrap-theme .col-xs-11{width:91.6666666667%}#bootstrap-theme .col-xs-12{width:100%}#bootstrap-theme .col-xs-pull-0{right:auto}#bootstrap-theme .col-xs-pull-1{right:8.3333333333%}#bootstrap-theme .col-xs-pull-2{right:16.6666666667%}#bootstrap-theme .col-xs-pull-3{right:25%}#bootstrap-theme .col-xs-pull-4{right:33.3333333333%}#bootstrap-theme .col-xs-pull-5{right:41.6666666667%}#bootstrap-theme .col-xs-pull-6{right:50%}#bootstrap-theme .col-xs-pull-7{right:58.3333333333%}#bootstrap-theme .col-xs-pull-8{right:66.6666666667%}#bootstrap-theme .col-xs-pull-9{right:75%}#bootstrap-theme .col-xs-pull-10{right:83.3333333333%}#bootstrap-theme .col-xs-pull-11{right:91.6666666667%}#bootstrap-theme .col-xs-pull-12{right:100%}#bootstrap-theme .col-xs-push-0{left:auto}#bootstrap-theme .col-xs-push-1{left:8.3333333333%}#bootstrap-theme .col-xs-push-2{left:16.6666666667%}#bootstrap-theme .col-xs-push-3{left:25%}#bootstrap-theme .col-xs-push-4{left:33.3333333333%}#bootstrap-theme .col-xs-push-5{left:41.6666666667%}#bootstrap-theme .col-xs-push-6{left:50%}#bootstrap-theme .col-xs-push-7{left:58.3333333333%}#bootstrap-theme .col-xs-push-8{left:66.6666666667%}#bootstrap-theme .col-xs-push-9{left:75%}#bootstrap-theme .col-xs-push-10{left:83.3333333333%}#bootstrap-theme .col-xs-push-11{left:91.6666666667%}#bootstrap-theme .col-xs-push-12{left:100%}#bootstrap-theme .col-xs-offset-0{margin-left:0}#bootstrap-theme .col-xs-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-xs-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-xs-offset-3{margin-left:25%}#bootstrap-theme .col-xs-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-xs-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-xs-offset-6{margin-left:50%}#bootstrap-theme .col-xs-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-xs-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-xs-offset-9{margin-left:75%}#bootstrap-theme .col-xs-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-xs-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-xs-offset-12{margin-left:100%}@media (min-width:768px){#bootstrap-theme .col-sm-1,#bootstrap-theme .col-sm-2,#bootstrap-theme .col-sm-3,#bootstrap-theme .col-sm-4,#bootstrap-theme .col-sm-5,#bootstrap-theme .col-sm-6,#bootstrap-theme .col-sm-7,#bootstrap-theme .col-sm-8,#bootstrap-theme .col-sm-9,#bootstrap-theme .col-sm-10,#bootstrap-theme .col-sm-11,#bootstrap-theme .col-sm-12{float:left}#bootstrap-theme .col-sm-1{width:8.3333333333%}#bootstrap-theme .col-sm-2{width:16.6666666667%}#bootstrap-theme .col-sm-3{width:25%}#bootstrap-theme .col-sm-4{width:33.3333333333%}#bootstrap-theme .col-sm-5{width:41.6666666667%}#bootstrap-theme .col-sm-6{width:50%}#bootstrap-theme .col-sm-7{width:58.3333333333%}#bootstrap-theme .col-sm-8{width:66.6666666667%}#bootstrap-theme .col-sm-9{width:75%}#bootstrap-theme .col-sm-10{width:83.3333333333%}#bootstrap-theme .col-sm-11{width:91.6666666667%}#bootstrap-theme .col-sm-12{width:100%}#bootstrap-theme .col-sm-pull-0{right:auto}#bootstrap-theme .col-sm-pull-1{right:8.3333333333%}#bootstrap-theme .col-sm-pull-2{right:16.6666666667%}#bootstrap-theme .col-sm-pull-3{right:25%}#bootstrap-theme .col-sm-pull-4{right:33.3333333333%}#bootstrap-theme .col-sm-pull-5{right:41.6666666667%}#bootstrap-theme .col-sm-pull-6{right:50%}#bootstrap-theme .col-sm-pull-7{right:58.3333333333%}#bootstrap-theme .col-sm-pull-8{right:66.6666666667%}#bootstrap-theme .col-sm-pull-9{right:75%}#bootstrap-theme .col-sm-pull-10{right:83.3333333333%}#bootstrap-theme .col-sm-pull-11{right:91.6666666667%}#bootstrap-theme .col-sm-pull-12{right:100%}#bootstrap-theme .col-sm-push-0{left:auto}#bootstrap-theme .col-sm-push-1{left:8.3333333333%}#bootstrap-theme .col-sm-push-2{left:16.6666666667%}#bootstrap-theme .col-sm-push-3{left:25%}#bootstrap-theme .col-sm-push-4{left:33.3333333333%}#bootstrap-theme .col-sm-push-5{left:41.6666666667%}#bootstrap-theme .col-sm-push-6{left:50%}#bootstrap-theme .col-sm-push-7{left:58.3333333333%}#bootstrap-theme .col-sm-push-8{left:66.6666666667%}#bootstrap-theme .col-sm-push-9{left:75%}#bootstrap-theme .col-sm-push-10{left:83.3333333333%}#bootstrap-theme .col-sm-push-11{left:91.6666666667%}#bootstrap-theme .col-sm-push-12{left:100%}#bootstrap-theme .col-sm-offset-0{margin-left:0}#bootstrap-theme .col-sm-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-sm-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-sm-offset-3{margin-left:25%}#bootstrap-theme .col-sm-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-sm-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-sm-offset-6{margin-left:50%}#bootstrap-theme .col-sm-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-sm-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-sm-offset-9{margin-left:75%}#bootstrap-theme .col-sm-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-sm-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-sm-offset-12{margin-left:100%}}@media (min-width:992px){#bootstrap-theme .col-md-1,#bootstrap-theme .col-md-2,#bootstrap-theme .col-md-3,#bootstrap-theme .col-md-4,#bootstrap-theme .col-md-5,#bootstrap-theme .col-md-6,#bootstrap-theme .col-md-7,#bootstrap-theme .col-md-8,#bootstrap-theme .col-md-9,#bootstrap-theme .col-md-10,#bootstrap-theme .col-md-11,#bootstrap-theme .col-md-12{float:left}#bootstrap-theme .col-md-1{width:8.3333333333%}#bootstrap-theme .col-md-2{width:16.6666666667%}#bootstrap-theme .col-md-3{width:25%}#bootstrap-theme .col-md-4{width:33.3333333333%}#bootstrap-theme .col-md-5{width:41.6666666667%}#bootstrap-theme .col-md-6{width:50%}#bootstrap-theme .col-md-7{width:58.3333333333%}#bootstrap-theme .col-md-8{width:66.6666666667%}#bootstrap-theme .col-md-9{width:75%}#bootstrap-theme .col-md-10{width:83.3333333333%}#bootstrap-theme .col-md-11{width:91.6666666667%}#bootstrap-theme .col-md-12{width:100%}#bootstrap-theme .col-md-pull-0{right:auto}#bootstrap-theme .col-md-pull-1{right:8.3333333333%}#bootstrap-theme .col-md-pull-2{right:16.6666666667%}#bootstrap-theme .col-md-pull-3{right:25%}#bootstrap-theme .col-md-pull-4{right:33.3333333333%}#bootstrap-theme .col-md-pull-5{right:41.6666666667%}#bootstrap-theme .col-md-pull-6{right:50%}#bootstrap-theme .col-md-pull-7{right:58.3333333333%}#bootstrap-theme .col-md-pull-8{right:66.6666666667%}#bootstrap-theme .col-md-pull-9{right:75%}#bootstrap-theme .col-md-pull-10{right:83.3333333333%}#bootstrap-theme .col-md-pull-11{right:91.6666666667%}#bootstrap-theme .col-md-pull-12{right:100%}#bootstrap-theme .col-md-push-0{left:auto}#bootstrap-theme .col-md-push-1{left:8.3333333333%}#bootstrap-theme .col-md-push-2{left:16.6666666667%}#bootstrap-theme .col-md-push-3{left:25%}#bootstrap-theme .col-md-push-4{left:33.3333333333%}#bootstrap-theme .col-md-push-5{left:41.6666666667%}#bootstrap-theme .col-md-push-6{left:50%}#bootstrap-theme .col-md-push-7{left:58.3333333333%}#bootstrap-theme .col-md-push-8{left:66.6666666667%}#bootstrap-theme .col-md-push-9{left:75%}#bootstrap-theme .col-md-push-10{left:83.3333333333%}#bootstrap-theme .col-md-push-11{left:91.6666666667%}#bootstrap-theme .col-md-push-12{left:100%}#bootstrap-theme .col-md-offset-0{margin-left:0}#bootstrap-theme .col-md-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-md-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-md-offset-3{margin-left:25%}#bootstrap-theme .col-md-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-md-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-md-offset-6{margin-left:50%}#bootstrap-theme .col-md-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-md-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-md-offset-9{margin-left:75%}#bootstrap-theme .col-md-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-md-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-md-offset-12{margin-left:100%}}@media (min-width:1200px){#bootstrap-theme .col-lg-1,#bootstrap-theme .col-lg-2,#bootstrap-theme .col-lg-3,#bootstrap-theme .col-lg-4,#bootstrap-theme .col-lg-5,#bootstrap-theme .col-lg-6,#bootstrap-theme .col-lg-7,#bootstrap-theme .col-lg-8,#bootstrap-theme .col-lg-9,#bootstrap-theme .col-lg-10,#bootstrap-theme .col-lg-11,#bootstrap-theme .col-lg-12{float:left}#bootstrap-theme .col-lg-1{width:8.3333333333%}#bootstrap-theme .col-lg-2{width:16.6666666667%}#bootstrap-theme .col-lg-3{width:25%}#bootstrap-theme .col-lg-4{width:33.3333333333%}#bootstrap-theme .col-lg-5{width:41.6666666667%}#bootstrap-theme .col-lg-6{width:50%}#bootstrap-theme .col-lg-7{width:58.3333333333%}#bootstrap-theme .col-lg-8{width:66.6666666667%}#bootstrap-theme .col-lg-9{width:75%}#bootstrap-theme .col-lg-10{width:83.3333333333%}#bootstrap-theme .col-lg-11{width:91.6666666667%}#bootstrap-theme .col-lg-12{width:100%}#bootstrap-theme .col-lg-pull-0{right:auto}#bootstrap-theme .col-lg-pull-1{right:8.3333333333%}#bootstrap-theme .col-lg-pull-2{right:16.6666666667%}#bootstrap-theme .col-lg-pull-3{right:25%}#bootstrap-theme .col-lg-pull-4{right:33.3333333333%}#bootstrap-theme .col-lg-pull-5{right:41.6666666667%}#bootstrap-theme .col-lg-pull-6{right:50%}#bootstrap-theme .col-lg-pull-7{right:58.3333333333%}#bootstrap-theme .col-lg-pull-8{right:66.6666666667%}#bootstrap-theme .col-lg-pull-9{right:75%}#bootstrap-theme .col-lg-pull-10{right:83.3333333333%}#bootstrap-theme .col-lg-pull-11{right:91.6666666667%}#bootstrap-theme .col-lg-pull-12{right:100%}#bootstrap-theme .col-lg-push-0{left:auto}#bootstrap-theme .col-lg-push-1{left:8.3333333333%}#bootstrap-theme .col-lg-push-2{left:16.6666666667%}#bootstrap-theme .col-lg-push-3{left:25%}#bootstrap-theme .col-lg-push-4{left:33.3333333333%}#bootstrap-theme .col-lg-push-5{left:41.6666666667%}#bootstrap-theme .col-lg-push-6{left:50%}#bootstrap-theme .col-lg-push-7{left:58.3333333333%}#bootstrap-theme .col-lg-push-8{left:66.6666666667%}#bootstrap-theme .col-lg-push-9{left:75%}#bootstrap-theme .col-lg-push-10{left:83.3333333333%}#bootstrap-theme .col-lg-push-11{left:91.6666666667%}#bootstrap-theme .col-lg-push-12{left:100%}#bootstrap-theme .col-lg-offset-0{margin-left:0}#bootstrap-theme .col-lg-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-lg-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-lg-offset-3{margin-left:25%}#bootstrap-theme .col-lg-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-lg-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-lg-offset-6{margin-left:50%}#bootstrap-theme .col-lg-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-lg-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-lg-offset-9{margin-left:75%}#bootstrap-theme .col-lg-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-lg-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-lg-offset-12{margin-left:100%}}#bootstrap-theme table{background-color:transparent}#bootstrap-theme table col[class*=col-]{position:static;display:table-column;float:none}#bootstrap-theme table td[class*=col-],#bootstrap-theme table th[class*=col-]{position:static;display:table-cell;float:none}#bootstrap-theme caption{padding-top:8px;padding-bottom:8px;color:#999;text-align:left}#bootstrap-theme th{text-align:left}#bootstrap-theme .table{width:100%;max-width:100%;margin-bottom:20px}#bootstrap-theme .table>thead>tr>th,#bootstrap-theme .table>thead>tr>td,#bootstrap-theme .table>tbody>tr>th,#bootstrap-theme .table>tbody>tr>td,#bootstrap-theme .table>tfoot>tr>th,#bootstrap-theme .table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}#bootstrap-theme .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}#bootstrap-theme .table>caption+thead>tr:first-child>th,#bootstrap-theme .table>caption+thead>tr:first-child>td,#bootstrap-theme .table>colgroup+thead>tr:first-child>th,#bootstrap-theme .table>colgroup+thead>tr:first-child>td,#bootstrap-theme .table>thead:first-child>tr:first-child>th,#bootstrap-theme .table>thead:first-child>tr:first-child>td{border-top:0}#bootstrap-theme .table>tbody+tbody{border-top:2px solid #ddd}#bootstrap-theme .table .table{background-color:#fff}#bootstrap-theme .table-condensed>thead>tr>th,#bootstrap-theme .table-condensed>thead>tr>td,#bootstrap-theme .table-condensed>tbody>tr>th,#bootstrap-theme .table-condensed>tbody>tr>td,#bootstrap-theme .table-condensed>tfoot>tr>th,#bootstrap-theme .table-condensed>tfoot>tr>td{padding:5px}#bootstrap-theme .table-bordered{border:1px solid #ddd}#bootstrap-theme .table-bordered>thead>tr>th,#bootstrap-theme .table-bordered>thead>tr>td,#bootstrap-theme .table-bordered>tbody>tr>th,#bootstrap-theme .table-bordered>tbody>tr>td,#bootstrap-theme .table-bordered>tfoot>tr>th,#bootstrap-theme .table-bordered>tfoot>tr>td{border:1px solid #ddd}#bootstrap-theme .table-bordered>thead>tr>th,#bootstrap-theme .table-bordered>thead>tr>td{border-bottom-width:2px}#bootstrap-theme .table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}#bootstrap-theme .table-hover>tbody>tr:hover{background-color:#f5f5f5}#bootstrap-theme .table>thead>tr>td.active,#bootstrap-theme .table>thead>tr>th.active,#bootstrap-theme .table>thead>tr.active>td,#bootstrap-theme .table>thead>tr.active>th,#bootstrap-theme .table>tbody>tr>td.active,#bootstrap-theme .table>tbody>tr>th.active,#bootstrap-theme .table>tbody>tr.active>td,#bootstrap-theme .table>tbody>tr.active>th,#bootstrap-theme .table>tfoot>tr>td.active,#bootstrap-theme .table>tfoot>tr>th.active,#bootstrap-theme .table>tfoot>tr.active>td,#bootstrap-theme .table>tfoot>tr.active>th{background-color:#f5f5f5}#bootstrap-theme .table-hover>tbody>tr>td.active:hover,#bootstrap-theme .table-hover>tbody>tr>th.active:hover,#bootstrap-theme .table-hover>tbody>tr.active:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.active,#bootstrap-theme .table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}#bootstrap-theme .table>thead>tr>td.success,#bootstrap-theme .table>thead>tr>th.success,#bootstrap-theme .table>thead>tr.success>td,#bootstrap-theme .table>thead>tr.success>th,#bootstrap-theme .table>tbody>tr>td.success,#bootstrap-theme .table>tbody>tr>th.success,#bootstrap-theme .table>tbody>tr.success>td,#bootstrap-theme .table>tbody>tr.success>th,#bootstrap-theme .table>tfoot>tr>td.success,#bootstrap-theme .table>tfoot>tr>th.success,#bootstrap-theme .table>tfoot>tr.success>td,#bootstrap-theme .table>tfoot>tr.success>th{background-color:#dff0d8}#bootstrap-theme .table-hover>tbody>tr>td.success:hover,#bootstrap-theme .table-hover>tbody>tr>th.success:hover,#bootstrap-theme .table-hover>tbody>tr.success:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.success,#bootstrap-theme .table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}#bootstrap-theme .table>thead>tr>td.info,#bootstrap-theme .table>thead>tr>th.info,#bootstrap-theme .table>thead>tr.info>td,#bootstrap-theme .table>thead>tr.info>th,#bootstrap-theme .table>tbody>tr>td.info,#bootstrap-theme .table>tbody>tr>th.info,#bootstrap-theme .table>tbody>tr.info>td,#bootstrap-theme .table>tbody>tr.info>th,#bootstrap-theme .table>tfoot>tr>td.info,#bootstrap-theme .table>tfoot>tr>th.info,#bootstrap-theme .table>tfoot>tr.info>td,#bootstrap-theme .table>tfoot>tr.info>th{background-color:#d9edf7}#bootstrap-theme .table-hover>tbody>tr>td.info:hover,#bootstrap-theme .table-hover>tbody>tr>th.info:hover,#bootstrap-theme .table-hover>tbody>tr.info:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.info,#bootstrap-theme .table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}#bootstrap-theme .table>thead>tr>td.warning,#bootstrap-theme .table>thead>tr>th.warning,#bootstrap-theme .table>thead>tr.warning>td,#bootstrap-theme .table>thead>tr.warning>th,#bootstrap-theme .table>tbody>tr>td.warning,#bootstrap-theme .table>tbody>tr>th.warning,#bootstrap-theme .table>tbody>tr.warning>td,#bootstrap-theme .table>tbody>tr.warning>th,#bootstrap-theme .table>tfoot>tr>td.warning,#bootstrap-theme .table>tfoot>tr>th.warning,#bootstrap-theme .table>tfoot>tr.warning>td,#bootstrap-theme .table>tfoot>tr.warning>th{background-color:#fcf8e3}#bootstrap-theme .table-hover>tbody>tr>td.warning:hover,#bootstrap-theme .table-hover>tbody>tr>th.warning:hover,#bootstrap-theme .table-hover>tbody>tr.warning:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.warning,#bootstrap-theme .table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}#bootstrap-theme .table>thead>tr>td.danger,#bootstrap-theme .table>thead>tr>th.danger,#bootstrap-theme .table>thead>tr.danger>td,#bootstrap-theme .table>thead>tr.danger>th,#bootstrap-theme .table>tbody>tr>td.danger,#bootstrap-theme .table>tbody>tr>th.danger,#bootstrap-theme .table>tbody>tr.danger>td,#bootstrap-theme .table>tbody>tr.danger>th,#bootstrap-theme .table>tfoot>tr>td.danger,#bootstrap-theme .table>tfoot>tr>th.danger,#bootstrap-theme .table>tfoot>tr.danger>td,#bootstrap-theme .table>tfoot>tr.danger>th{background-color:#f2dede}#bootstrap-theme .table-hover>tbody>tr>td.danger:hover,#bootstrap-theme .table-hover>tbody>tr>th.danger:hover,#bootstrap-theme .table-hover>tbody>tr.danger:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.danger,#bootstrap-theme .table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}#bootstrap-theme .table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){#bootstrap-theme .table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}#bootstrap-theme .table-responsive>.table{margin-bottom:0}#bootstrap-theme .table-responsive>.table>thead>tr>th,#bootstrap-theme .table-responsive>.table>thead>tr>td,#bootstrap-theme .table-responsive>.table>tbody>tr>th,#bootstrap-theme .table-responsive>.table>tbody>tr>td,#bootstrap-theme .table-responsive>.table>tfoot>tr>th,#bootstrap-theme .table-responsive>.table>tfoot>tr>td{white-space:nowrap}#bootstrap-theme .table-responsive>.table-bordered{border:0}#bootstrap-theme .table-responsive>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}#bootstrap-theme .table-responsive>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}#bootstrap-theme .table-responsive>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr:last-child>th,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}#bootstrap-theme fieldset{min-width:0;padding:0;margin:0;border:0}#bootstrap-theme legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#555;border:0;border-bottom:1px solid #e5e5e5}#bootstrap-theme label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}#bootstrap-theme input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}#bootstrap-theme input[type=radio],#bootstrap-theme input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}#bootstrap-theme input[type=radio][disabled],#bootstrap-theme input[type=radio].disabled,fieldset[disabled] #bootstrap-theme input[type=radio],#bootstrap-theme input[type=checkbox][disabled],#bootstrap-theme input[type=checkbox].disabled,fieldset[disabled] #bootstrap-theme input[type=checkbox]{cursor:not-allowed}#bootstrap-theme input[type=file]{display:block}#bootstrap-theme input[type=range]{display:block;width:100%}#bootstrap-theme select[multiple],#bootstrap-theme select[size]{height:auto}#bootstrap-theme input[type=file]:focus,#bootstrap-theme input[type=radio]:focus,#bootstrap-theme input[type=checkbox]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme output{display:block;padding-top:5px;font-size:14px;line-height:1.428571429;color:#555}#bootstrap-theme .form-control{display:block;width:100%;height:30px;padding:4px 8px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}#bootstrap-theme .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}#bootstrap-theme .form-control::-moz-placeholder{color:#999;opacity:1}#bootstrap-theme .form-control:-ms-input-placeholder{color:#999}#bootstrap-theme .form-control::-webkit-input-placeholder{color:#999}#bootstrap-theme .form-control::-ms-expand{background-color:transparent;border:0}#bootstrap-theme .form-control[disabled],#bootstrap-theme .form-control[readonly],fieldset[disabled] #bootstrap-theme .form-control{background-color:#eee;opacity:1}#bootstrap-theme .form-control[disabled],fieldset[disabled] #bootstrap-theme .form-control{cursor:not-allowed}#bootstrap-theme textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){#bootstrap-theme input[type=date].form-control,#bootstrap-theme input[type=time].form-control,#bootstrap-theme input[type=datetime-local].form-control,#bootstrap-theme input[type=month].form-control{line-height:30px}#bootstrap-theme input[type=date].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=date],#bootstrap-theme .input-group-sm>input.input-group-addon[type=date],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=date],.input-group-sm #bootstrap-theme input[type=date],#bootstrap-theme input[type=time].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=time],#bootstrap-theme .input-group-sm>input.input-group-addon[type=time],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=time],.input-group-sm #bootstrap-theme input[type=time],#bootstrap-theme input[type=datetime-local].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=datetime-local],#bootstrap-theme .input-group-sm>input.input-group-addon[type=datetime-local],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=datetime-local],.input-group-sm #bootstrap-theme input[type=datetime-local],#bootstrap-theme input[type=month].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=month],#bootstrap-theme .input-group-sm>input.input-group-addon[type=month],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=month],.input-group-sm #bootstrap-theme input[type=month]{line-height:30px}#bootstrap-theme input[type=date].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=date],#bootstrap-theme .input-group-lg>input.input-group-addon[type=date],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=date],.input-group-lg #bootstrap-theme input[type=date],#bootstrap-theme input[type=time].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=time],#bootstrap-theme .input-group-lg>input.input-group-addon[type=time],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=time],.input-group-lg #bootstrap-theme input[type=time],#bootstrap-theme input[type=datetime-local].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=datetime-local],#bootstrap-theme .input-group-lg>input.input-group-addon[type=datetime-local],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=datetime-local],.input-group-lg #bootstrap-theme input[type=datetime-local],#bootstrap-theme input[type=month].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=month],#bootstrap-theme .input-group-lg>input.input-group-addon[type=month],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=month],.input-group-lg #bootstrap-theme input[type=month]{line-height:54px}}#bootstrap-theme .form-group{margin-bottom:15px}#bootstrap-theme .radio,#bootstrap-theme .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}#bootstrap-theme .radio.disabled label,fieldset[disabled] #bootstrap-theme .radio label,#bootstrap-theme .checkbox.disabled label,fieldset[disabled] #bootstrap-theme .checkbox label{cursor:not-allowed}#bootstrap-theme .radio label,#bootstrap-theme .checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}#bootstrap-theme .radio input[type=radio],#bootstrap-theme .radio-inline input[type=radio],#bootstrap-theme .checkbox input[type=checkbox],#bootstrap-theme .checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}#bootstrap-theme .radio+.radio,#bootstrap-theme .checkbox+.checkbox{margin-top:-5px}#bootstrap-theme .radio-inline,#bootstrap-theme .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}#bootstrap-theme .radio-inline.disabled,fieldset[disabled] #bootstrap-theme .radio-inline,#bootstrap-theme .checkbox-inline.disabled,fieldset[disabled] #bootstrap-theme .checkbox-inline{cursor:not-allowed}#bootstrap-theme .radio-inline+.radio-inline,#bootstrap-theme .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}#bootstrap-theme .form-control-static{min-height:34px;padding-top:5px;padding-bottom:5px;margin-bottom:0}#bootstrap-theme .form-control-static.input-lg,#bootstrap-theme .input-group-lg>.form-control-static.form-control,#bootstrap-theme .input-group-lg>.form-control-static.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.form-control-static.btn,#bootstrap-theme .form-control-static.input-sm,#bootstrap-theme .input-group-sm>.form-control-static.form-control,#bootstrap-theme .input-group-sm>.form-control-static.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}#bootstrap-theme .input-sm,#bootstrap-theme .input-group-sm>.form-control,#bootstrap-theme .input-group-sm>.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme select.input-sm,#bootstrap-theme .input-group-sm>select.form-control,#bootstrap-theme .input-group-sm>select.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>select.btn{height:30px;line-height:30px}#bootstrap-theme textarea.input-sm,#bootstrap-theme .input-group-sm>textarea.form-control,#bootstrap-theme .input-group-sm>textarea.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>textarea.btn,#bootstrap-theme select[multiple].input-sm,#bootstrap-theme .input-group-sm>select.form-control[multiple],#bootstrap-theme .input-group-sm>select.input-group-addon[multiple],#bootstrap-theme .input-group-sm>.input-group-btn>select.btn[multiple]{height:auto}#bootstrap-theme .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .form-group-sm select.form-control{height:30px;line-height:30px}#bootstrap-theme .form-group-sm textarea.form-control,#bootstrap-theme .form-group-sm select[multiple].form-control{height:auto}#bootstrap-theme .form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}#bootstrap-theme .input-lg,#bootstrap-theme .input-group-lg>.form-control,#bootstrap-theme .input-group-lg>.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme select.input-lg,#bootstrap-theme .input-group-lg>select.form-control,#bootstrap-theme .input-group-lg>select.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>select.btn{height:54px;line-height:54px}#bootstrap-theme textarea.input-lg,#bootstrap-theme .input-group-lg>textarea.form-control,#bootstrap-theme .input-group-lg>textarea.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>textarea.btn,#bootstrap-theme select[multiple].input-lg,#bootstrap-theme .input-group-lg>select.form-control[multiple],#bootstrap-theme .input-group-lg>select.input-group-addon[multiple],#bootstrap-theme .input-group-lg>.input-group-btn>select.btn[multiple]{height:auto}#bootstrap-theme .form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme .form-group-lg select.form-control{height:54px;line-height:54px}#bootstrap-theme .form-group-lg textarea.form-control,#bootstrap-theme .form-group-lg select[multiple].form-control{height:auto}#bootstrap-theme .form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}#bootstrap-theme .has-feedback{position:relative}#bootstrap-theme .has-feedback .form-control{padding-right:37.5px}#bootstrap-theme .form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:30px;height:30px;line-height:30px;text-align:center;pointer-events:none}#bootstrap-theme .input-lg+.form-control-feedback,#bootstrap-theme .input-group-lg>.form-control+.form-control-feedback,#bootstrap-theme .input-group-lg>.input-group-addon+.form-control-feedback,#bootstrap-theme .input-group-lg>.input-group-btn>.btn+.form-control-feedback,#bootstrap-theme .input-group-lg+.form-control-feedback,#bootstrap-theme .form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}#bootstrap-theme .input-sm+.form-control-feedback,#bootstrap-theme .input-group-sm>.form-control+.form-control-feedback,#bootstrap-theme .input-group-sm>.input-group-addon+.form-control-feedback,#bootstrap-theme .input-group-sm>.input-group-btn>.btn+.form-control-feedback,#bootstrap-theme .input-group-sm+.form-control-feedback,#bootstrap-theme .form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}#bootstrap-theme .has-success .help-block,#bootstrap-theme .has-success .control-label,#bootstrap-theme .has-success .radio,#bootstrap-theme .has-success .checkbox,#bootstrap-theme .has-success .radio-inline,#bootstrap-theme .has-success .checkbox-inline,#bootstrap-theme .has-success.radio label,#bootstrap-theme .has-success.checkbox label,#bootstrap-theme .has-success.radio-inline label,#bootstrap-theme .has-success.checkbox-inline label{color:#468847}#bootstrap-theme .has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}#bootstrap-theme .has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}#bootstrap-theme .has-success .form-control-feedback{color:#468847}#bootstrap-theme .has-warning .help-block,#bootstrap-theme .has-warning .control-label,#bootstrap-theme .has-warning .radio,#bootstrap-theme .has-warning .checkbox,#bootstrap-theme .has-warning .radio-inline,#bootstrap-theme .has-warning .checkbox-inline,#bootstrap-theme .has-warning.radio label,#bootstrap-theme .has-warning.checkbox label,#bootstrap-theme .has-warning.radio-inline label,#bootstrap-theme .has-warning.checkbox-inline label{color:#c09853}#bootstrap-theme .has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}#bootstrap-theme .has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}#bootstrap-theme .has-warning .form-control-feedback{color:#c09853}#bootstrap-theme .has-error .help-block,#bootstrap-theme .has-error .control-label,#bootstrap-theme .has-error .radio,#bootstrap-theme .has-error .checkbox,#bootstrap-theme .has-error .radio-inline,#bootstrap-theme .has-error .checkbox-inline,#bootstrap-theme .has-error.radio label,#bootstrap-theme .has-error.checkbox label,#bootstrap-theme .has-error.radio-inline label,#bootstrap-theme .has-error.checkbox-inline label{color:#b94a48}#bootstrap-theme .has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}#bootstrap-theme .has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}#bootstrap-theme .has-error .form-control-feedback{color:#b94a48}#bootstrap-theme .has-feedback label~.form-control-feedback{top:25px}#bootstrap-theme .has-feedback label.sr-only~.form-control-feedback{top:0}#bootstrap-theme .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#959595}@media (min-width:768px){#bootstrap-theme .form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}#bootstrap-theme .form-inline .form-control-static{display:inline-block}#bootstrap-theme .form-inline .input-group{display:inline-table;vertical-align:middle}#bootstrap-theme .form-inline .input-group .input-group-addon,#bootstrap-theme .form-inline .input-group .input-group-btn,#bootstrap-theme .form-inline .input-group .form-control{width:auto}#bootstrap-theme .form-inline .input-group>.form-control{width:100%}#bootstrap-theme .form-inline .control-label{margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .radio,#bootstrap-theme .form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .radio label,#bootstrap-theme .form-inline .checkbox label{padding-left:0}#bootstrap-theme .form-inline .radio input[type=radio],#bootstrap-theme .form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}#bootstrap-theme .form-inline .has-feedback .form-control-feedback{top:0}}#bootstrap-theme .form-horizontal .radio,#bootstrap-theme .form-horizontal .checkbox,#bootstrap-theme .form-horizontal .radio-inline,#bootstrap-theme .form-horizontal .checkbox-inline{padding-top:5px;margin-top:0;margin-bottom:0}#bootstrap-theme .form-horizontal .radio,#bootstrap-theme .form-horizontal .checkbox{min-height:25px}#bootstrap-theme .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}#bootstrap-theme .form-horizontal .form-group:before,#bootstrap-theme .form-horizontal .form-group:after{display:table;content:" "}#bootstrap-theme .form-horizontal .form-group:after{clear:both}@media (min-width:768px){#bootstrap-theme .form-horizontal .control-label{padding-top:5px;margin-bottom:0;text-align:right}}#bootstrap-theme .form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){#bootstrap-theme .form-horizontal .form-group-lg .control-label{padding-top:15px;font-size:18px}}@media (min-width:768px){#bootstrap-theme .form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}#bootstrap-theme .btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:4px 8px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#bootstrap-theme .btn:focus,#bootstrap-theme .btn.focus,#bootstrap-theme .btn:active:focus,#bootstrap-theme .btn:active.focus,#bootstrap-theme .btn.active:focus,#bootstrap-theme .btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme .btn:hover,#bootstrap-theme .btn:focus,#bootstrap-theme .btn.focus{color:#fff;text-decoration:none}#bootstrap-theme .btn:active,#bootstrap-theme .btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}#bootstrap-theme .btn.disabled,#bootstrap-theme .btn[disabled],fieldset[disabled] #bootstrap-theme .btn{cursor:not-allowed;-webkit-filter:alpha(opacity=65);filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme a.btn.disabled,fieldset[disabled] #bootstrap-theme a.btn{pointer-events:none}#bootstrap-theme .btn-default{color:#fff;background-color:#70716b;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:focus,#bootstrap-theme .btn-default.focus{color:#fff;background-color:#565752;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:hover{color:#fff;background-color:#565752;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:active,#bootstrap-theme .btn-default.active,.open>#bootstrap-theme .btn-default.dropdown-toggle{color:#fff;background-color:#565752;background-image:none;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:active:hover,#bootstrap-theme .btn-default:active:focus,#bootstrap-theme .btn-default:active.focus,#bootstrap-theme .btn-default.active:hover,#bootstrap-theme .btn-default.active:focus,#bootstrap-theme .btn-default.active.focus,.open>#bootstrap-theme .btn-default.dropdown-toggle:hover,.open>#bootstrap-theme .btn-default.dropdown-toggle:focus,.open>#bootstrap-theme .btn-default.dropdown-toggle.focus{color:#fff;background-color:#444441;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default.disabled:hover,#bootstrap-theme .btn-default.disabled:focus,#bootstrap-theme .btn-default.disabled.focus,#bootstrap-theme .btn-default[disabled]:hover,#bootstrap-theme .btn-default[disabled]:focus,#bootstrap-theme .btn-default[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-default:hover,fieldset[disabled] #bootstrap-theme .btn-default:focus,fieldset[disabled] #bootstrap-theme .btn-default.focus{background-color:#70716b;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default .badge{color:#70716b;background-color:#fff}#bootstrap-theme .btn-primary{color:#fff;background-color:#70716b;border-color:#70716b}#bootstrap-theme .btn-primary:focus,#bootstrap-theme .btn-primary.focus{color:#fff;background-color:#565752;border-color:#2f302d}#bootstrap-theme .btn-primary:hover{color:#fff;background-color:#565752;border-color:#51524d}#bootstrap-theme .btn-primary:active,#bootstrap-theme .btn-primary.active,.open>#bootstrap-theme .btn-primary.dropdown-toggle{color:#fff;background-color:#565752;background-image:none;border-color:#51524d}#bootstrap-theme .btn-primary:active:hover,#bootstrap-theme .btn-primary:active:focus,#bootstrap-theme .btn-primary:active.focus,#bootstrap-theme .btn-primary.active:hover,#bootstrap-theme .btn-primary.active:focus,#bootstrap-theme .btn-primary.active.focus,.open>#bootstrap-theme .btn-primary.dropdown-toggle:hover,.open>#bootstrap-theme .btn-primary.dropdown-toggle:focus,.open>#bootstrap-theme .btn-primary.dropdown-toggle.focus{color:#fff;background-color:#444441;border-color:#2f302d}#bootstrap-theme .btn-primary.disabled:hover,#bootstrap-theme .btn-primary.disabled:focus,#bootstrap-theme .btn-primary.disabled.focus,#bootstrap-theme .btn-primary[disabled]:hover,#bootstrap-theme .btn-primary[disabled]:focus,#bootstrap-theme .btn-primary[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-primary:hover,fieldset[disabled] #bootstrap-theme .btn-primary:focus,fieldset[disabled] #bootstrap-theme .btn-primary.focus{background-color:#70716b;border-color:#70716b}#bootstrap-theme .btn-primary .badge{color:#70716b;background-color:#fff}#bootstrap-theme .btn-success{color:#fff;background-color:#73a839;border-color:#73a839}#bootstrap-theme .btn-success:focus,#bootstrap-theme .btn-success.focus{color:#fff;background-color:#59822c;border-color:#324919}#bootstrap-theme .btn-success:hover{color:#fff;background-color:#59822c;border-color:#547a29}#bootstrap-theme .btn-success:active,#bootstrap-theme .btn-success.active,.open>#bootstrap-theme .btn-success.dropdown-toggle{color:#fff;background-color:#59822c;background-image:none;border-color:#547a29}#bootstrap-theme .btn-success:active:hover,#bootstrap-theme .btn-success:active:focus,#bootstrap-theme .btn-success:active.focus,#bootstrap-theme .btn-success.active:hover,#bootstrap-theme .btn-success.active:focus,#bootstrap-theme .btn-success.active.focus,.open>#bootstrap-theme .btn-success.dropdown-toggle:hover,.open>#bootstrap-theme .btn-success.dropdown-toggle:focus,.open>#bootstrap-theme .btn-success.dropdown-toggle.focus{color:#fff;background-color:#476723;border-color:#324919}#bootstrap-theme .btn-success.disabled:hover,#bootstrap-theme .btn-success.disabled:focus,#bootstrap-theme .btn-success.disabled.focus,#bootstrap-theme .btn-success[disabled]:hover,#bootstrap-theme .btn-success[disabled]:focus,#bootstrap-theme .btn-success[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-success:hover,fieldset[disabled] #bootstrap-theme .btn-success:focus,fieldset[disabled] #bootstrap-theme .btn-success.focus{background-color:#73a839;border-color:#73a839}#bootstrap-theme .btn-success .badge{color:#73a839;background-color:#fff}#bootstrap-theme .btn-info{color:#000;background-color:#cde8fe;border-color:#cde8fe}#bootstrap-theme .btn-info:focus,#bootstrap-theme .btn-info.focus{color:#000;background-color:#9bd1fd;border-color:#50affc}#bootstrap-theme .btn-info:hover{color:#000;background-color:#9bd1fd;border-color:#91ccfd}#bootstrap-theme .btn-info:active,#bootstrap-theme .btn-info.active,.open>#bootstrap-theme .btn-info.dropdown-toggle{color:#000;background-color:#9bd1fd;background-image:none;border-color:#91ccfd}#bootstrap-theme .btn-info:active:hover,#bootstrap-theme .btn-info:active:focus,#bootstrap-theme .btn-info:active.focus,#bootstrap-theme .btn-info.active:hover,#bootstrap-theme .btn-info.active:focus,#bootstrap-theme .btn-info.active.focus,.open>#bootstrap-theme .btn-info.dropdown-toggle:hover,.open>#bootstrap-theme .btn-info.dropdown-toggle:focus,.open>#bootstrap-theme .btn-info.dropdown-toggle.focus{color:#000;background-color:#78c1fc;border-color:#50affc}#bootstrap-theme .btn-info.disabled:hover,#bootstrap-theme .btn-info.disabled:focus,#bootstrap-theme .btn-info.disabled.focus,#bootstrap-theme .btn-info[disabled]:hover,#bootstrap-theme .btn-info[disabled]:focus,#bootstrap-theme .btn-info[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-info:hover,fieldset[disabled] #bootstrap-theme .btn-info:focus,fieldset[disabled] #bootstrap-theme .btn-info.focus{background-color:#cde8fe;border-color:#cde8fe}#bootstrap-theme .btn-info .badge{color:#cde8fe;background-color:#000}#bootstrap-theme .btn-warning{color:#fff;background-color:#dd5600;border-color:#dd5600}#bootstrap-theme .btn-warning:focus,#bootstrap-theme .btn-warning.focus{color:#fff;background-color:#aa4200;border-color:#5e2400}#bootstrap-theme .btn-warning:hover{color:#fff;background-color:#aa4200;border-color:#a03e00}#bootstrap-theme .btn-warning:active,#bootstrap-theme .btn-warning.active,.open>#bootstrap-theme .btn-warning.dropdown-toggle{color:#fff;background-color:#aa4200;background-image:none;border-color:#a03e00}#bootstrap-theme .btn-warning:active:hover,#bootstrap-theme .btn-warning:active:focus,#bootstrap-theme .btn-warning:active.focus,#bootstrap-theme .btn-warning.active:hover,#bootstrap-theme .btn-warning.active:focus,#bootstrap-theme .btn-warning.active.focus,.open>#bootstrap-theme .btn-warning.dropdown-toggle:hover,.open>#bootstrap-theme .btn-warning.dropdown-toggle:focus,.open>#bootstrap-theme .btn-warning.dropdown-toggle.focus{color:#fff;background-color:#863400;border-color:#5e2400}#bootstrap-theme .btn-warning.disabled:hover,#bootstrap-theme .btn-warning.disabled:focus,#bootstrap-theme .btn-warning.disabled.focus,#bootstrap-theme .btn-warning[disabled]:hover,#bootstrap-theme .btn-warning[disabled]:focus,#bootstrap-theme .btn-warning[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-warning:hover,fieldset[disabled] #bootstrap-theme .btn-warning:focus,fieldset[disabled] #bootstrap-theme .btn-warning.focus{background-color:#dd5600;border-color:#dd5600}#bootstrap-theme .btn-warning .badge{color:#dd5600;background-color:#fff}#bootstrap-theme .btn-danger{color:#fff;background-color:#c71c22;border-color:#c71c22}#bootstrap-theme .btn-danger:focus,#bootstrap-theme .btn-danger.focus{color:#fff;background-color:#9a161a;border-color:#570c0f}#bootstrap-theme .btn-danger:hover{color:#fff;background-color:#9a161a;border-color:#911419}#bootstrap-theme .btn-danger:active,#bootstrap-theme .btn-danger.active,.open>#bootstrap-theme .btn-danger.dropdown-toggle{color:#fff;background-color:#9a161a;background-image:none;border-color:#911419}#bootstrap-theme .btn-danger:active:hover,#bootstrap-theme .btn-danger:active:focus,#bootstrap-theme .btn-danger:active.focus,#bootstrap-theme .btn-danger.active:hover,#bootstrap-theme .btn-danger.active:focus,#bootstrap-theme .btn-danger.active.focus,.open>#bootstrap-theme .btn-danger.dropdown-toggle:hover,.open>#bootstrap-theme .btn-danger.dropdown-toggle:focus,.open>#bootstrap-theme .btn-danger.dropdown-toggle.focus{color:#fff;background-color:#7b1115;border-color:#570c0f}#bootstrap-theme .btn-danger.disabled:hover,#bootstrap-theme .btn-danger.disabled:focus,#bootstrap-theme .btn-danger.disabled.focus,#bootstrap-theme .btn-danger[disabled]:hover,#bootstrap-theme .btn-danger[disabled]:focus,#bootstrap-theme .btn-danger[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-danger:hover,fieldset[disabled] #bootstrap-theme .btn-danger:focus,fieldset[disabled] #bootstrap-theme .btn-danger.focus{background-color:#c71c22;border-color:#c71c22}#bootstrap-theme .btn-danger .badge{color:#c71c22;background-color:#fff}#bootstrap-theme .btn-link{font-weight:400;color:#2786c2;border-radius:0}#bootstrap-theme .btn-link,#bootstrap-theme .btn-link:active,#bootstrap-theme .btn-link.active,#bootstrap-theme .btn-link[disabled],fieldset[disabled] #bootstrap-theme .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme .btn-link,#bootstrap-theme .btn-link:hover,#bootstrap-theme .btn-link:focus,#bootstrap-theme .btn-link:active{border-color:transparent}#bootstrap-theme .btn-link:hover,#bootstrap-theme .btn-link:focus{color:#1a5a82;text-decoration:underline;background-color:transparent}#bootstrap-theme .btn-link[disabled]:hover,#bootstrap-theme .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .btn-link:hover,fieldset[disabled] #bootstrap-theme .btn-link:focus{color:#999;text-decoration:none}#bootstrap-theme .btn-lg,#bootstrap-theme .btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme .btn-sm,#bootstrap-theme .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .btn-xs,#bootstrap-theme .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .btn-block{display:block;width:100%}#bootstrap-theme .btn-block+.btn-block{margin-top:5px}#bootstrap-theme input[type=submit].btn-block,#bootstrap-theme input[type=reset].btn-block,#bootstrap-theme input[type=button].btn-block{width:100%}#bootstrap-theme .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}#bootstrap-theme .fade.in{opacity:1}#bootstrap-theme .collapse{display:none}#bootstrap-theme .collapse.in{display:block}#bootstrap-theme tr.collapse.in{display:table-row}#bootstrap-theme tbody.collapse.in{display:table-row-group}#bootstrap-theme .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}#bootstrap-theme .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}#bootstrap-theme .dropup,#bootstrap-theme .dropdown{position:relative}#bootstrap-theme .dropdown-toggle:focus{outline:0}#bootstrap-theme .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;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}#bootstrap-theme .dropdown-menu.pull-right{right:0;left:auto}#bootstrap-theme .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}#bootstrap-theme .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}#bootstrap-theme .dropdown-menu>li>a:hover,#bootstrap-theme .dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#000}#bootstrap-theme .dropdown-menu>.active>a,#bootstrap-theme .dropdown-menu>.active>a:hover,#bootstrap-theme .dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#000;outline:0}#bootstrap-theme .dropdown-menu>.disabled>a,#bootstrap-theme .dropdown-menu>.disabled>a:hover,#bootstrap-theme .dropdown-menu>.disabled>a:focus{color:#999}#bootstrap-theme .dropdown-menu>.disabled>a:hover,#bootstrap-theme .dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;-webkit-filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}#bootstrap-theme .open>.dropdown-menu{display:block}#bootstrap-theme .open>a{outline:0}#bootstrap-theme .dropdown-menu-right{right:0;left:auto}#bootstrap-theme .dropdown-menu-left{right:auto;left:0}#bootstrap-theme .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999;white-space:nowrap}#bootstrap-theme .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}#bootstrap-theme .pull-right>.dropdown-menu{right:0;left:auto}#bootstrap-theme .dropup .caret,#bootstrap-theme .navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9}#bootstrap-theme .dropup .dropdown-menu,#bootstrap-theme .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){#bootstrap-theme .navbar-right .dropdown-menu{right:0;left:auto}#bootstrap-theme .navbar-right .dropdown-menu-left{left:0;right:auto}}#bootstrap-theme .btn-group,#bootstrap-theme .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}#bootstrap-theme .btn-group>.btn,#bootstrap-theme .btn-group-vertical>.btn{position:relative;float:left}#bootstrap-theme .btn-group>.btn:hover,#bootstrap-theme .btn-group>.btn:focus,#bootstrap-theme .btn-group>.btn:active,#bootstrap-theme .btn-group>.btn.active,#bootstrap-theme .btn-group-vertical>.btn:hover,#bootstrap-theme .btn-group-vertical>.btn:focus,#bootstrap-theme .btn-group-vertical>.btn:active,#bootstrap-theme .btn-group-vertical>.btn.active{z-index:2}#bootstrap-theme .btn-group .btn+.btn,#bootstrap-theme .btn-group .btn+.btn-group,#bootstrap-theme .btn-group .btn-group+.btn,#bootstrap-theme .btn-group .btn-group+.btn-group{margin-left:-1px}#bootstrap-theme .btn-toolbar{margin-left:-5px}#bootstrap-theme .btn-toolbar:before,#bootstrap-theme .btn-toolbar:after{display:table;content:" "}#bootstrap-theme .btn-toolbar:after{clear:both}#bootstrap-theme .btn-toolbar .btn,#bootstrap-theme .btn-toolbar .btn-group,#bootstrap-theme .btn-toolbar .input-group{float:left}#bootstrap-theme .btn-toolbar>.btn,#bootstrap-theme .btn-toolbar>.btn-group,#bootstrap-theme .btn-toolbar>.input-group{margin-left:5px}#bootstrap-theme .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}#bootstrap-theme .btn-group>.btn:first-child{margin-left:0}#bootstrap-theme .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .btn-group>.btn:last-child:not(:first-child),#bootstrap-theme .btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group>.btn-group{float:left}#bootstrap-theme .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}#bootstrap-theme .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,#bootstrap-theme .btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group .dropdown-toggle:active,#bootstrap-theme .btn-group.open .dropdown-toggle{outline:0}#bootstrap-theme .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}#bootstrap-theme .btn-group>.btn-lg+.dropdown-toggle,#bootstrap-theme .btn-group-lg.btn-group>.btn+.dropdown-toggle,#bootstrap-theme .btn-group-lg>.btn-group>.btn+.dropdown-toggle{padding-right:12px;padding-left:12px}#bootstrap-theme .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}#bootstrap-theme .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme .btn .caret{margin-left:0}#bootstrap-theme .btn-lg .caret,#bootstrap-theme .btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}#bootstrap-theme .dropup .btn-lg .caret,#bootstrap-theme .dropup .btn-group-lg>.btn .caret{border-width:0 5px 5px}#bootstrap-theme .btn-group-vertical>.btn,#bootstrap-theme .btn-group-vertical>.btn-group,#bootstrap-theme .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}#bootstrap-theme .btn-group-vertical>.btn-group:before,#bootstrap-theme .btn-group-vertical>.btn-group:after{display:table;content:" "}#bootstrap-theme .btn-group-vertical>.btn-group:after{clear:both}#bootstrap-theme .btn-group-vertical>.btn-group>.btn{float:none}#bootstrap-theme .btn-group-vertical>.btn+.btn,#bootstrap-theme .btn-group-vertical>.btn+.btn-group,#bootstrap-theme .btn-group-vertical>.btn-group+.btn,#bootstrap-theme .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}#bootstrap-theme .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}#bootstrap-theme .btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}#bootstrap-theme .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,#bootstrap-theme .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}#bootstrap-theme .btn-group-justified>.btn,#bootstrap-theme .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}#bootstrap-theme .btn-group-justified>.btn-group .btn{width:100%}#bootstrap-theme .btn-group-justified>.btn-group .dropdown-menu{left:auto}#bootstrap-theme [data-toggle=buttons]>.btn input[type=radio],#bootstrap-theme [data-toggle=buttons]>.btn input[type=checkbox],#bootstrap-theme [data-toggle=buttons]>.btn-group>.btn input[type=radio],#bootstrap-theme [data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}#bootstrap-theme .input-group{position:relative;display:table;border-collapse:separate}#bootstrap-theme .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}#bootstrap-theme .input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}#bootstrap-theme .input-group .form-control:focus{z-index:3}#bootstrap-theme .input-group-addon,#bootstrap-theme .input-group-btn,#bootstrap-theme .input-group .form-control{display:table-cell}#bootstrap-theme .input-group-addon:not(:first-child):not(:last-child),#bootstrap-theme .input-group-btn:not(:first-child):not(:last-child),#bootstrap-theme .input-group .form-control:not(:first-child):not(:last-child){border-radius:0}#bootstrap-theme .input-group-addon,#bootstrap-theme .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}#bootstrap-theme .input-group-addon{padding:4px 8px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}#bootstrap-theme .input-group-addon.input-sm,#bootstrap-theme .input-group-sm>.input-group-addon.form-control,#bootstrap-theme .input-group-sm>.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.input-group-addon.btn{padding:5px 10px;font-size:12px;border-radius:3px}#bootstrap-theme .input-group-addon.input-lg,#bootstrap-theme .input-group-lg>.input-group-addon.form-control,#bootstrap-theme .input-group-lg>.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.input-group-addon.btn{padding:14px 16px;font-size:18px;border-radius:6px}#bootstrap-theme .input-group-addon input[type=radio],#bootstrap-theme .input-group-addon input[type=checkbox]{margin-top:0}#bootstrap-theme .input-group .form-control:first-child,#bootstrap-theme .input-group-addon:first-child,#bootstrap-theme .input-group-btn:first-child>.btn,#bootstrap-theme .input-group-btn:first-child>.btn-group>.btn,#bootstrap-theme .input-group-btn:first-child>.dropdown-toggle,#bootstrap-theme .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),#bootstrap-theme .input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .input-group-addon:first-child{border-right:0}#bootstrap-theme .input-group .form-control:last-child,#bootstrap-theme .input-group-addon:last-child,#bootstrap-theme .input-group-btn:last-child>.btn,#bootstrap-theme .input-group-btn:last-child>.btn-group>.btn,#bootstrap-theme .input-group-btn:last-child>.dropdown-toggle,#bootstrap-theme .input-group-btn:first-child>.btn:not(:first-child),#bootstrap-theme .input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .input-group-addon:last-child{border-left:0}#bootstrap-theme .input-group-btn{position:relative;font-size:0;white-space:nowrap}#bootstrap-theme .input-group-btn>.btn{position:relative}#bootstrap-theme .input-group-btn>.btn+.btn{margin-left:-1px}#bootstrap-theme .input-group-btn>.btn:hover,#bootstrap-theme .input-group-btn>.btn:focus,#bootstrap-theme .input-group-btn>.btn:active{z-index:2}#bootstrap-theme .input-group-btn:first-child>.btn,#bootstrap-theme .input-group-btn:first-child>.btn-group{margin-right:-1px}#bootstrap-theme .input-group-btn:last-child>.btn,#bootstrap-theme .input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}#bootstrap-theme .nav{padding-left:0;margin-bottom:0;list-style:none}#bootstrap-theme .nav:before,#bootstrap-theme .nav:after{display:table;content:" "}#bootstrap-theme .nav:after{clear:both}#bootstrap-theme .nav>li{position:relative;display:block}#bootstrap-theme .nav>li>a{position:relative;display:block;padding:10px 15px}#bootstrap-theme .nav>li>a:hover,#bootstrap-theme .nav>li>a:focus{text-decoration:none;background-color:#eee}#bootstrap-theme .nav>li.disabled>a{color:#999}#bootstrap-theme .nav>li.disabled>a:hover,#bootstrap-theme .nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}#bootstrap-theme .nav .open>a,#bootstrap-theme .nav .open>a:hover,#bootstrap-theme .nav .open>a:focus{background-color:#eee;border-color:#2786c2}#bootstrap-theme .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}#bootstrap-theme .nav>li>a>img{max-width:none}#bootstrap-theme .nav-tabs{border-bottom:1px solid #ddd}#bootstrap-theme .nav-tabs>li{float:left;margin-bottom:-1px}#bootstrap-theme .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}#bootstrap-theme .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}#bootstrap-theme .nav-tabs>li.active>a,#bootstrap-theme .nav-tabs>li.active>a:hover,#bootstrap-theme .nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}#bootstrap-theme .nav-pills>li{float:left}#bootstrap-theme .nav-pills>li>a{border-radius:4px}#bootstrap-theme .nav-pills>li+li{margin-left:2px}#bootstrap-theme .nav-pills>li.active>a,#bootstrap-theme .nav-pills>li.active>a:hover,#bootstrap-theme .nav-pills>li.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .nav-stacked>li{float:none}#bootstrap-theme .nav-stacked>li+li{margin-top:2px;margin-left:0}#bootstrap-theme .nav-justified,#bootstrap-theme .nav-tabs.nav-justified{width:100%}#bootstrap-theme .nav-justified>li,#bootstrap-theme .nav-tabs.nav-justified>li{float:none}#bootstrap-theme .nav-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}#bootstrap-theme .nav-justified>.dropdown .dropdown-menu,#bootstrap-theme .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){#bootstrap-theme .nav-justified>li,#bootstrap-theme .nav-tabs.nav-justified>li{display:table-cell;width:1%}#bootstrap-theme .nav-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-bottom:0}}#bootstrap-theme .nav-tabs-justified,#bootstrap-theme .nav-tabs.nav-justified{border-bottom:0}#bootstrap-theme .nav-tabs-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}#bootstrap-theme .nav-tabs-justified>.active>a,#bootstrap-theme .nav-tabs.nav-justified>.active>a,#bootstrap-theme .nav-tabs-justified>.active>a:hover,#bootstrap-theme .nav-tabs.nav-justified>.active>a:hover,#bootstrap-theme .nav-tabs-justified>.active>a:focus,#bootstrap-theme .nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){#bootstrap-theme .nav-tabs-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}#bootstrap-theme .nav-tabs-justified>.active>a,#bootstrap-theme .nav-tabs.nav-justified>.active>a,#bootstrap-theme .nav-tabs-justified>.active>a:hover,#bootstrap-theme .nav-tabs.nav-justified>.active>a:hover,#bootstrap-theme .nav-tabs-justified>.active>a:focus,#bootstrap-theme .nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}#bootstrap-theme .tab-content>.tab-pane{display:none}#bootstrap-theme .tab-content>.active{display:block}#bootstrap-theme .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}#bootstrap-theme .navbar:before,#bootstrap-theme .navbar:after{display:table;content:" "}#bootstrap-theme .navbar:after{clear:both}@media (min-width:768px){#bootstrap-theme .navbar{border-radius:4px}}#bootstrap-theme .navbar-header:before,#bootstrap-theme .navbar-header:after{display:table;content:" "}#bootstrap-theme .navbar-header:after{clear:both}@media (min-width:768px){#bootstrap-theme .navbar-header{float:left}}#bootstrap-theme .navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}#bootstrap-theme .navbar-collapse:before,#bootstrap-theme .navbar-collapse:after{display:table;content:" "}#bootstrap-theme .navbar-collapse:after{clear:both}#bootstrap-theme .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){#bootstrap-theme .navbar-collapse{width:auto;border-top:0;box-shadow:none}#bootstrap-theme .navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}#bootstrap-theme .navbar-collapse.in{overflow-y:visible}.navbar-fixed-top #bootstrap-theme .navbar-collapse,.navbar-static-top #bootstrap-theme .navbar-collapse,.navbar-fixed-bottom #bootstrap-theme .navbar-collapse{padding-right:0;padding-left:0}}#bootstrap-theme .navbar-fixed-top,#bootstrap-theme .navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}#bootstrap-theme .navbar-fixed-top .navbar-collapse,#bootstrap-theme .navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){#bootstrap-theme .navbar-fixed-top .navbar-collapse,#bootstrap-theme .navbar-fixed-bottom .navbar-collapse{max-height:200px}}@media (min-width:768px){#bootstrap-theme .navbar-fixed-top,#bootstrap-theme .navbar-fixed-bottom{border-radius:0}}#bootstrap-theme .navbar-fixed-top{top:0;border-width:0 0 1px}#bootstrap-theme .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}#bootstrap-theme .container>.navbar-header,#bootstrap-theme .container>.navbar-collapse,#bootstrap-theme .container-fluid>.navbar-header,#bootstrap-theme .container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){#bootstrap-theme .container>.navbar-header,#bootstrap-theme .container>.navbar-collapse,#bootstrap-theme .container-fluid>.navbar-header,#bootstrap-theme .container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}#bootstrap-theme .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){#bootstrap-theme .navbar-static-top{border-radius:0}}#bootstrap-theme .navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}#bootstrap-theme .navbar-brand:hover,#bootstrap-theme .navbar-brand:focus{text-decoration:none}#bootstrap-theme .navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container #bootstrap-theme .navbar-brand,.navbar>.container-fluid #bootstrap-theme .navbar-brand{margin-left:-15px}}#bootstrap-theme .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}#bootstrap-theme .navbar-toggle:focus{outline:0}#bootstrap-theme .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}#bootstrap-theme .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){#bootstrap-theme .navbar-toggle{display:none}}#bootstrap-theme .navbar-nav{margin:7.5px -15px}#bootstrap-theme .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){#bootstrap-theme .navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a,#bootstrap-theme .navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a{line-height:20px}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){#bootstrap-theme .navbar-nav{float:left;margin:0}#bootstrap-theme .navbar-nav>li{float:left}#bootstrap-theme .navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}#bootstrap-theme .navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-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);margin-top:10px;margin-bottom:10px}@media (min-width:768px){#bootstrap-theme .navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}#bootstrap-theme .navbar-form .form-control-static{display:inline-block}#bootstrap-theme .navbar-form .input-group{display:inline-table;vertical-align:middle}#bootstrap-theme .navbar-form .input-group .input-group-addon,#bootstrap-theme .navbar-form .input-group .input-group-btn,#bootstrap-theme .navbar-form .input-group .form-control{width:auto}#bootstrap-theme .navbar-form .input-group>.form-control{width:100%}#bootstrap-theme .navbar-form .control-label{margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .radio,#bootstrap-theme .navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .radio label,#bootstrap-theme .navbar-form .checkbox label{padding-left:0}#bootstrap-theme .navbar-form .radio input[type=radio],#bootstrap-theme .navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}#bootstrap-theme .navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){#bootstrap-theme .navbar-form .form-group{margin-bottom:5px}#bootstrap-theme .navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){#bootstrap-theme .navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}#bootstrap-theme .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .navbar-btn{margin-top:10px;margin-bottom:10px}#bootstrap-theme .navbar-btn.btn-sm,#bootstrap-theme .btn-group-sm>.navbar-btn.btn{margin-top:10px;margin-bottom:10px}#bootstrap-theme .navbar-btn.btn-xs,#bootstrap-theme .btn-group-xs>.navbar-btn.btn{margin-top:14px;margin-bottom:14px}#bootstrap-theme .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){#bootstrap-theme .navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){#bootstrap-theme .navbar-left{float:left !important}#bootstrap-theme .navbar-right{float:right !important;margin-right:-15px}#bootstrap-theme .navbar-right~.navbar-right{margin-right:0}}#bootstrap-theme .navbar-default{background-color:#000;border-color:#000}#bootstrap-theme .navbar-default .navbar-brand{color:#fff}#bootstrap-theme .navbar-default .navbar-brand:hover,#bootstrap-theme .navbar-default .navbar-brand:focus{color:#fff;background-color:none}#bootstrap-theme .navbar-default .navbar-text{color:#ddd}#bootstrap-theme .navbar-default .navbar-nav>li>a{color:#fff}#bootstrap-theme .navbar-default .navbar-nav>li>a:hover,#bootstrap-theme .navbar-default .navbar-nav>li>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav>.active>a,#bootstrap-theme .navbar-default .navbar-nav>.active>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav>.disabled>a,#bootstrap-theme .navbar-default .navbar-nav>.disabled>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.disabled>a:focus{color:#ddd;background-color:transparent}#bootstrap-theme .navbar-default .navbar-nav>.open>a,#bootstrap-theme .navbar-default .navbar-nav>.open>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.open>a:focus{color:#fff;background-color:#000}@media (max-width:767px){#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ddd;background-color:transparent}}#bootstrap-theme .navbar-default .navbar-toggle{border-color:#000}#bootstrap-theme .navbar-default .navbar-toggle:hover,#bootstrap-theme .navbar-default .navbar-toggle:focus{background-color:#000}#bootstrap-theme .navbar-default .navbar-toggle .icon-bar{background-color:#fff}#bootstrap-theme .navbar-default .navbar-collapse,#bootstrap-theme .navbar-default .navbar-form{border-color:#000}#bootstrap-theme .navbar-default .navbar-link{color:#fff}#bootstrap-theme .navbar-default .navbar-link:hover{color:#fff}#bootstrap-theme .navbar-default .btn-link{color:#fff}#bootstrap-theme .navbar-default .btn-link:hover,#bootstrap-theme .navbar-default .btn-link:focus{color:#fff}#bootstrap-theme .navbar-default .btn-link[disabled]:hover,#bootstrap-theme .navbar-default .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:hover,fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:focus{color:#ddd}#bootstrap-theme .navbar-inverse{background-color:#cde8fe;border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-brand{color:#fff}#bootstrap-theme .navbar-inverse .navbar-brand:hover,#bootstrap-theme .navbar-inverse .navbar-brand:focus{color:#fff;background-color:none}#bootstrap-theme .navbar-inverse .navbar-text{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav>li>a{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav>li>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav>.active>a,#bootstrap-theme .navbar-inverse .navbar-nav>.active>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a,#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}#bootstrap-theme .navbar-inverse .navbar-nav>.open>a,#bootstrap-theme .navbar-inverse .navbar-nav>.open>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#b4ddfe}@media (max-width:767px){#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}#bootstrap-theme .navbar-inverse .navbar-toggle{border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-toggle:hover,#bootstrap-theme .navbar-inverse .navbar-toggle:focus{background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}#bootstrap-theme .navbar-inverse .navbar-collapse,#bootstrap-theme .navbar-inverse .navbar-form{border-color:#aad8fd}#bootstrap-theme .navbar-inverse .navbar-link{color:#fff}#bootstrap-theme .navbar-inverse .navbar-link:hover{color:#fff}#bootstrap-theme .navbar-inverse .btn-link{color:#fff}#bootstrap-theme .navbar-inverse .btn-link:hover,#bootstrap-theme .navbar-inverse .btn-link:focus{color:#fff}#bootstrap-theme .navbar-inverse .btn-link[disabled]:hover,#bootstrap-theme .navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:hover,fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:focus{color:#ccc}#bootstrap-theme .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}#bootstrap-theme .breadcrumb>li{display:inline-block}#bootstrap-theme .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/ "}#bootstrap-theme .breadcrumb>.active{color:#999}#bootstrap-theme .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}#bootstrap-theme .pagination>li{display:inline}#bootstrap-theme .pagination>li>a,#bootstrap-theme .pagination>li>span{position:relative;float:left;padding:4px 8px;margin-left:-1px;line-height:1.428571429;color:#2786c2;text-decoration:none;background-color:#fff;border:1px solid #ddd}#bootstrap-theme .pagination>li>a:hover,#bootstrap-theme .pagination>li>a:focus,#bootstrap-theme .pagination>li>span:hover,#bootstrap-theme .pagination>li>span:focus{z-index:2;color:#1a5a82;background-color:#eee;border-color:#ddd}#bootstrap-theme .pagination>li:first-child>a,#bootstrap-theme .pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .pagination>li:last-child>a,#bootstrap-theme .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}#bootstrap-theme .pagination>.active>a,#bootstrap-theme .pagination>.active>a:hover,#bootstrap-theme .pagination>.active>a:focus,#bootstrap-theme .pagination>.active>span,#bootstrap-theme .pagination>.active>span:hover,#bootstrap-theme .pagination>.active>span:focus{z-index:3;color:#999;cursor:default;background-color:#f5f5f5;border-color:#ddd}#bootstrap-theme .pagination>.disabled>span,#bootstrap-theme .pagination>.disabled>span:hover,#bootstrap-theme .pagination>.disabled>span:focus,#bootstrap-theme .pagination>.disabled>a,#bootstrap-theme .pagination>.disabled>a:hover,#bootstrap-theme .pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}#bootstrap-theme .pagination-lg>li>a,#bootstrap-theme .pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}#bootstrap-theme .pagination-lg>li:first-child>a,#bootstrap-theme .pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}#bootstrap-theme .pagination-lg>li:last-child>a,#bootstrap-theme .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}#bootstrap-theme .pagination-sm>li>a,#bootstrap-theme .pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}#bootstrap-theme .pagination-sm>li:first-child>a,#bootstrap-theme .pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .pagination-sm>li:last-child>a,#bootstrap-theme .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}#bootstrap-theme .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}#bootstrap-theme .pager:before,#bootstrap-theme .pager:after{display:table;content:" "}#bootstrap-theme .pager:after{clear:both}#bootstrap-theme .pager li{display:inline}#bootstrap-theme .pager li>a,#bootstrap-theme .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}#bootstrap-theme .pager li>a:hover,#bootstrap-theme .pager li>a:focus{text-decoration:none;background-color:#eee}#bootstrap-theme .pager .next>a,#bootstrap-theme .pager .next>span{float:right}#bootstrap-theme .pager .previous>a,#bootstrap-theme .pager .previous>span{float:left}#bootstrap-theme .pager .disabled>a,#bootstrap-theme .pager .disabled>a:hover,#bootstrap-theme .pager .disabled>a:focus,#bootstrap-theme .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}#bootstrap-theme .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}#bootstrap-theme .label:empty{display:none}.btn #bootstrap-theme .label{position:relative;top:-1px}#bootstrap-theme a.label:hover,#bootstrap-theme a.label:focus{color:#fff;text-decoration:none;cursor:pointer}#bootstrap-theme .label-default{background-color:#999}#bootstrap-theme .label-default[href]:hover,#bootstrap-theme .label-default[href]:focus{background-color:gray}#bootstrap-theme .label-primary{background-color:#000}#bootstrap-theme .label-primary[href]:hover,#bootstrap-theme .label-primary[href]:focus{background-color:#000}#bootstrap-theme .label-success{background-color:#73a839}#bootstrap-theme .label-success[href]:hover,#bootstrap-theme .label-success[href]:focus{background-color:#59822c}#bootstrap-theme .label-info{background-color:#cde8fe}#bootstrap-theme .label-info[href]:hover,#bootstrap-theme .label-info[href]:focus{background-color:#9bd1fd}#bootstrap-theme .label-warning{background-color:#dd5600}#bootstrap-theme .label-warning[href]:hover,#bootstrap-theme .label-warning[href]:focus{background-color:#aa4200}#bootstrap-theme .label-danger{background-color:#c71c22}#bootstrap-theme .label-danger[href]:hover,#bootstrap-theme .label-danger[href]:focus{background-color:#9a161a}#bootstrap-theme .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#000;border-radius:10px}#bootstrap-theme .badge:empty{display:none}.btn #bootstrap-theme .badge{position:relative;top:-1px}.btn-xs #bootstrap-theme .badge,#bootstrap-theme .btn-group-xs>.btn #bootstrap-theme .badge,.btn-group-xs>.btn #bootstrap-theme .badge{top:0;padding:1px 5px}.list-group-item.active>#bootstrap-theme .badge,.nav-pills>.active>a>#bootstrap-theme .badge{color:#2786c2;background-color:#fff}.list-group-item>#bootstrap-theme .badge{float:right}.list-group-item>#bootstrap-theme .badge+#bootstrap-theme .badge{margin-right:5px}.nav-pills>li>a>#bootstrap-theme .badge{margin-left:3px}#bootstrap-theme a.badge:hover,#bootstrap-theme a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}#bootstrap-theme .jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}#bootstrap-theme .jumbotron h1,#bootstrap-theme .jumbotron .h1{color:inherit}#bootstrap-theme .jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}#bootstrap-theme .jumbotron>hr{border-top-color:#d5d5d5}.container #bootstrap-theme .jumbotron,.container-fluid #bootstrap-theme .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}#bootstrap-theme .jumbotron .container{max-width:100%}@media screen and (min-width:768px){#bootstrap-theme .jumbotron{padding-top:48px;padding-bottom:48px}.container #bootstrap-theme .jumbotron,.container-fluid #bootstrap-theme .jumbotron{padding-right:60px;padding-left:60px}#bootstrap-theme .jumbotron h1,#bootstrap-theme .jumbotron .h1{font-size:63px}}#bootstrap-theme .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}#bootstrap-theme .thumbnail>img,#bootstrap-theme .thumbnail a>img{display:block;max-width:100%;height:auto;margin-right:auto;margin-left:auto}#bootstrap-theme .thumbnail .caption{padding:9px;color:#555}#bootstrap-theme a.thumbnail:hover,#bootstrap-theme a.thumbnail:focus,#bootstrap-theme a.thumbnail.active{border-color:#2786c2}#bootstrap-theme .alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}#bootstrap-theme .alert h4{margin-top:0;color:inherit}#bootstrap-theme .alert .alert-link{font-weight:700}#bootstrap-theme .alert>p,#bootstrap-theme .alert>ul{margin-bottom:0}#bootstrap-theme .alert>p+p{margin-top:5px}#bootstrap-theme .alert-dismissable,#bootstrap-theme .alert-dismissible{padding-right:35px}#bootstrap-theme .alert-dismissable .close,#bootstrap-theme .alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}#bootstrap-theme .alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}#bootstrap-theme .alert-success hr{border-top-color:#c9e2b3}#bootstrap-theme .alert-success .alert-link{color:#356635}#bootstrap-theme .alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}#bootstrap-theme .alert-info hr{border-top-color:#a6e1ec}#bootstrap-theme .alert-info .alert-link{color:#2d6987}#bootstrap-theme .alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}#bootstrap-theme .alert-warning hr{border-top-color:#f8e5be}#bootstrap-theme .alert-warning .alert-link{color:#a47e3c}#bootstrap-theme .alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}#bootstrap-theme .alert-danger hr{border-top-color:#e6c1c7}#bootstrap-theme .alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}#bootstrap-theme .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}#bootstrap-theme .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#000;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}#bootstrap-theme .progress-striped .progress-bar,#bootstrap-theme .progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}#bootstrap-theme .progress.active .progress-bar,#bootstrap-theme .progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}#bootstrap-theme .progress-bar-success{background-color:#73a839}.progress-striped #bootstrap-theme .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-info{background-color:#cde8fe}.progress-striped #bootstrap-theme .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-warning{background-color:#dd5600}.progress-striped #bootstrap-theme .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-danger{background-color:#c71c22}.progress-striped #bootstrap-theme .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .media{margin-top:15px}#bootstrap-theme .media:first-child{margin-top:0}#bootstrap-theme .media,#bootstrap-theme .media-body{overflow:hidden;zoom:1}#bootstrap-theme .media-body{width:10000px}#bootstrap-theme .media-object{display:block}#bootstrap-theme .media-object.img-thumbnail{max-width:none}#bootstrap-theme .media-right,#bootstrap-theme .media>.pull-right{padding-left:10px}#bootstrap-theme .media-left,#bootstrap-theme .media>.pull-left{padding-right:10px}#bootstrap-theme .media-left,#bootstrap-theme .media-right,#bootstrap-theme .media-body{display:table-cell;vertical-align:top}#bootstrap-theme .media-middle{vertical-align:middle}#bootstrap-theme .media-bottom{vertical-align:bottom}#bootstrap-theme .media-heading{margin-top:0;margin-bottom:5px}#bootstrap-theme .media-list{padding-left:0;list-style:none}#bootstrap-theme .list-group{padding-left:0;margin-bottom:20px}#bootstrap-theme .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}#bootstrap-theme .list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}#bootstrap-theme .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .list-group-item.disabled,#bootstrap-theme .list-group-item.disabled:hover,#bootstrap-theme .list-group-item.disabled:focus{color:#999;cursor:not-allowed;background-color:#eee}#bootstrap-theme .list-group-item.disabled .list-group-item-heading,#bootstrap-theme .list-group-item.disabled:hover .list-group-item-heading,#bootstrap-theme .list-group-item.disabled:focus .list-group-item-heading{color:inherit}#bootstrap-theme .list-group-item.disabled .list-group-item-text,#bootstrap-theme .list-group-item.disabled:hover .list-group-item-text,#bootstrap-theme .list-group-item.disabled:focus .list-group-item-text{color:#999}#bootstrap-theme .list-group-item.active,#bootstrap-theme .list-group-item.active:hover,#bootstrap-theme .list-group-item.active:focus{z-index:2;color:#fff;background-color:#000;border-color:#000}#bootstrap-theme .list-group-item.active .list-group-item-heading,#bootstrap-theme .list-group-item.active .list-group-item-heading>small,#bootstrap-theme .list-group-item.active .list-group-item-heading>.small,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading>small,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading>.small,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading>small,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading>.small{color:inherit}#bootstrap-theme .list-group-item.active .list-group-item-text,#bootstrap-theme .list-group-item.active:hover .list-group-item-text,#bootstrap-theme .list-group-item.active:focus .list-group-item-text{color:#666}#bootstrap-theme a.list-group-item,#bootstrap-theme button.list-group-item{color:#555}#bootstrap-theme a.list-group-item .list-group-item-heading,#bootstrap-theme button.list-group-item .list-group-item-heading{color:#333}#bootstrap-theme a.list-group-item:hover,#bootstrap-theme a.list-group-item:focus,#bootstrap-theme button.list-group-item:hover,#bootstrap-theme button.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}#bootstrap-theme button.list-group-item{width:100%;text-align:left}#bootstrap-theme .list-group-item-success{color:#468847;background-color:#dff0d8}#bootstrap-theme a.list-group-item-success,#bootstrap-theme button.list-group-item-success{color:#468847}#bootstrap-theme a.list-group-item-success .list-group-item-heading,#bootstrap-theme button.list-group-item-success .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-success:hover,#bootstrap-theme a.list-group-item-success:focus,#bootstrap-theme button.list-group-item-success:hover,#bootstrap-theme button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}#bootstrap-theme a.list-group-item-success.active,#bootstrap-theme a.list-group-item-success.active:hover,#bootstrap-theme a.list-group-item-success.active:focus,#bootstrap-theme button.list-group-item-success.active,#bootstrap-theme button.list-group-item-success.active:hover,#bootstrap-theme button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}#bootstrap-theme .list-group-item-info{color:#3a87ad;background-color:#d9edf7}#bootstrap-theme a.list-group-item-info,#bootstrap-theme button.list-group-item-info{color:#3a87ad}#bootstrap-theme a.list-group-item-info .list-group-item-heading,#bootstrap-theme button.list-group-item-info .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-info:hover,#bootstrap-theme a.list-group-item-info:focus,#bootstrap-theme button.list-group-item-info:hover,#bootstrap-theme button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}#bootstrap-theme a.list-group-item-info.active,#bootstrap-theme a.list-group-item-info.active:hover,#bootstrap-theme a.list-group-item-info.active:focus,#bootstrap-theme button.list-group-item-info.active,#bootstrap-theme button.list-group-item-info.active:hover,#bootstrap-theme button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}#bootstrap-theme .list-group-item-warning{color:#c09853;background-color:#fcf8e3}#bootstrap-theme a.list-group-item-warning,#bootstrap-theme button.list-group-item-warning{color:#c09853}#bootstrap-theme a.list-group-item-warning .list-group-item-heading,#bootstrap-theme button.list-group-item-warning .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-warning:hover,#bootstrap-theme a.list-group-item-warning:focus,#bootstrap-theme button.list-group-item-warning:hover,#bootstrap-theme button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}#bootstrap-theme a.list-group-item-warning.active,#bootstrap-theme a.list-group-item-warning.active:hover,#bootstrap-theme a.list-group-item-warning.active:focus,#bootstrap-theme button.list-group-item-warning.active,#bootstrap-theme button.list-group-item-warning.active:hover,#bootstrap-theme button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}#bootstrap-theme .list-group-item-danger{color:#b94a48;background-color:#f2dede}#bootstrap-theme a.list-group-item-danger,#bootstrap-theme button.list-group-item-danger{color:#b94a48}#bootstrap-theme a.list-group-item-danger .list-group-item-heading,#bootstrap-theme button.list-group-item-danger .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-danger:hover,#bootstrap-theme a.list-group-item-danger:focus,#bootstrap-theme button.list-group-item-danger:hover,#bootstrap-theme button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}#bootstrap-theme a.list-group-item-danger.active,#bootstrap-theme a.list-group-item-danger.active:hover,#bootstrap-theme a.list-group-item-danger.active:focus,#bootstrap-theme button.list-group-item-danger.active,#bootstrap-theme button.list-group-item-danger.active:hover,#bootstrap-theme button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}#bootstrap-theme .list-group-item-heading{margin-top:0;margin-bottom:5px}#bootstrap-theme .list-group-item-text{margin-bottom:0;line-height:1.3}#bootstrap-theme .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}#bootstrap-theme .panel-body{padding:15px}#bootstrap-theme .panel-body:before,#bootstrap-theme .panel-body:after{display:table;content:" "}#bootstrap-theme .panel-body:after{clear:both}#bootstrap-theme .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel-heading>.dropdown .dropdown-toggle{color:inherit}#bootstrap-theme .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}#bootstrap-theme .panel-title>a,#bootstrap-theme .panel-title>small,#bootstrap-theme .panel-title>.small,#bootstrap-theme .panel-title>small>a,#bootstrap-theme .panel-title>.small>a{color:inherit}#bootstrap-theme .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.list-group,#bootstrap-theme .panel>.panel-collapse>.list-group{margin-bottom:0}#bootstrap-theme .panel>.list-group .list-group-item,#bootstrap-theme .panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}#bootstrap-theme .panel>.list-group:first-child .list-group-item:first-child,#bootstrap-theme .panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.list-group:last-child .list-group-item:last-child,#bootstrap-theme .panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}#bootstrap-theme .list-group+.panel-footer{border-top-width:0}#bootstrap-theme .panel>.table,#bootstrap-theme .panel>.table-responsive>.table,#bootstrap-theme .panel>.panel-collapse>.table{margin-bottom:0}#bootstrap-theme .panel>.table caption,#bootstrap-theme .panel>.table-responsive>.table caption,#bootstrap-theme .panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}#bootstrap-theme .panel>.table:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}#bootstrap-theme .panel>.table:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}#bootstrap-theme .panel>.panel-body+.table,#bootstrap-theme .panel>.panel-body+.table-responsive,#bootstrap-theme .panel>.table+.panel-body,#bootstrap-theme .panel>.table-responsive+.panel-body{border-top:1px solid #ddd}#bootstrap-theme .panel>.table>tbody:first-child>tr:first-child th,#bootstrap-theme .panel>.table>tbody:first-child>tr:first-child td{border-top:0}#bootstrap-theme .panel>.table-bordered,#bootstrap-theme .panel>.table-responsive>.table-bordered{border:0}#bootstrap-theme .panel>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}#bootstrap-theme .panel>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}#bootstrap-theme .panel>.table-bordered>thead>tr:first-child>td,#bootstrap-theme .panel>.table-bordered>thead>tr:first-child>th,#bootstrap-theme .panel>.table-bordered>tbody>tr:first-child>td,#bootstrap-theme .panel>.table-bordered>tbody>tr:first-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr:first-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr:first-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}#bootstrap-theme .panel>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .panel>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .panel>.table-bordered>tfoot>tr:last-child>td,#bootstrap-theme .panel>.table-bordered>tfoot>tr:last-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}#bootstrap-theme .panel>.table-responsive{margin-bottom:0;border:0}#bootstrap-theme .panel-group{margin-bottom:20px}#bootstrap-theme .panel-group .panel{margin-bottom:0;border-radius:4px}#bootstrap-theme .panel-group .panel+.panel{margin-top:5px}#bootstrap-theme .panel-group .panel-heading{border-bottom:0}#bootstrap-theme .panel-group .panel-heading+.panel-collapse>.panel-body,#bootstrap-theme .panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}#bootstrap-theme .panel-group .panel-footer{border-top:0}#bootstrap-theme .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}#bootstrap-theme .panel-default{border-color:#ddd}#bootstrap-theme .panel-default>.panel-heading{color:#555;background-color:#f5f5f5;border-color:#ddd}#bootstrap-theme .panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#555}#bootstrap-theme .panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-primary{border-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading{color:#fff;background-color:#000;border-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading .badge{color:#000;background-color:#fff}#bootstrap-theme .panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-success{border-color:#ddd}#bootstrap-theme .panel-success>.panel-heading{color:#468847;background-color:#73a839;border-color:#ddd}#bootstrap-theme .panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-success>.panel-heading .badge{color:#73a839;background-color:#468847}#bootstrap-theme .panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-info{border-color:#ddd}#bootstrap-theme .panel-info>.panel-heading{color:#3a87ad;background-color:#cde8fe;border-color:#ddd}#bootstrap-theme .panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-info>.panel-heading .badge{color:#cde8fe;background-color:#3a87ad}#bootstrap-theme .panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-warning{border-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading{color:#c09853;background-color:#dd5600;border-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading .badge{color:#dd5600;background-color:#c09853}#bootstrap-theme .panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-danger{border-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading{color:#b94a48;background-color:#c71c22;border-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading .badge{color:#c71c22;background-color:#b94a48}#bootstrap-theme .panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}#bootstrap-theme .embed-responsive .embed-responsive-item,#bootstrap-theme .embed-responsive iframe,#bootstrap-theme .embed-responsive embed,#bootstrap-theme .embed-responsive object,#bootstrap-theme .embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}#bootstrap-theme .embed-responsive-16by9{padding-bottom:56.25%}#bootstrap-theme .embed-responsive-4by3{padding-bottom:75%}#bootstrap-theme .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}#bootstrap-theme .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}#bootstrap-theme .well-lg{padding:24px;border-radius:6px}#bootstrap-theme .well-sm{padding:9px;border-radius:3px}#bootstrap-theme .close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;-webkit-filter:alpha(opacity=20);filter:alpha(opacity=20);opacity:.2}#bootstrap-theme .close:hover,#bootstrap-theme .close:focus{color:#000;text-decoration:none;cursor:pointer;-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}#bootstrap-theme .modal-open{overflow:hidden}#bootstrap-theme .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}#bootstrap-theme .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-ms-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out}#bootstrap-theme .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}#bootstrap-theme .modal-open .modal{overflow-x:hidden;overflow-y:auto}#bootstrap-theme .modal-dialog{position:relative;width:auto;margin:10px}#bootstrap-theme .modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}#bootstrap-theme .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}#bootstrap-theme .modal-backdrop.fade{-webkit-filter:alpha(opacity=0);filter:alpha(opacity=0);opacity:0}#bootstrap-theme .modal-backdrop.in{-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme .modal-header{padding:15px;border-bottom:1px solid #e5e5e5}#bootstrap-theme .modal-header:before,#bootstrap-theme .modal-header:after{display:table;content:" "}#bootstrap-theme .modal-header:after{clear:both}#bootstrap-theme .modal-header .close{margin-top:-2px}#bootstrap-theme .modal-title{margin:0;line-height:1.428571429}#bootstrap-theme .modal-body{position:relative;padding:20px}#bootstrap-theme .modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}#bootstrap-theme .modal-footer:before,#bootstrap-theme .modal-footer:after{display:table;content:" "}#bootstrap-theme .modal-footer:after{clear:both}#bootstrap-theme .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}#bootstrap-theme .modal-footer .btn-group .btn+.btn{margin-left:-1px}#bootstrap-theme .modal-footer .btn-block+.btn-block{margin-left:0}#bootstrap-theme .modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){#bootstrap-theme .modal-dialog{width:600px;margin:30px auto}#bootstrap-theme .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}#bootstrap-theme .modal-sm{width:300px}}@media (min-width:992px){#bootstrap-theme .modal-lg{width:900px}}#bootstrap-theme .tooltip{position:absolute;z-index:1070;display:block;font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.428571429;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;-ms-word-break:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;-webkit-filter:alpha(opacity=0);filter:alpha(opacity=0);opacity:0}#bootstrap-theme .tooltip.in{-webkit-filter:alpha(opacity=90);filter:alpha(opacity=90);opacity:.9}#bootstrap-theme .tooltip.top{padding:5px 0;margin-top:-3px}#bootstrap-theme .tooltip.right{padding:0 5px;margin-left:3px}#bootstrap-theme .tooltip.bottom{padding:5px 0;margin-top:3px}#bootstrap-theme .tooltip.left{padding:0 5px;margin-left:-3px}#bootstrap-theme .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}#bootstrap-theme .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}#bootstrap-theme .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}#bootstrap-theme .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}#bootstrap-theme .popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.428571429;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;-ms-word-break:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}#bootstrap-theme .popover.top{margin-top:-10px}#bootstrap-theme .popover.right{margin-left:10px}#bootstrap-theme .popover.bottom{margin-top:10px}#bootstrap-theme .popover.left{margin-left:-10px}#bootstrap-theme .popover>.arrow{border-width:11px}#bootstrap-theme .popover>.arrow,#bootstrap-theme .popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}#bootstrap-theme .popover>.arrow:after{content:"";border-width:10px}#bootstrap-theme .popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}#bootstrap-theme .popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}#bootstrap-theme .popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}#bootstrap-theme .popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}#bootstrap-theme .popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}#bootstrap-theme .popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}#bootstrap-theme .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,.25)}#bootstrap-theme .popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}#bootstrap-theme .popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}#bootstrap-theme .popover-content{padding:9px 14px}#bootstrap-theme .carousel{position:relative}#bootstrap-theme .carousel-inner{position:relative;width:100%;overflow:hidden}#bootstrap-theme .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}#bootstrap-theme .carousel-inner>.item>img,#bootstrap-theme .carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}@media (transform-3d),(-webkit-transform-3d){#bootstrap-theme .carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-ms-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}#bootstrap-theme .carousel-inner>.item.next,#bootstrap-theme .carousel-inner>.item.active.right{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}#bootstrap-theme .carousel-inner>.item.prev,#bootstrap-theme .carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}#bootstrap-theme .carousel-inner>.item.next.left,#bootstrap-theme .carousel-inner>.item.prev.right,#bootstrap-theme .carousel-inner>.item.active{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}#bootstrap-theme .carousel-inner>.active,#bootstrap-theme .carousel-inner>.next,#bootstrap-theme .carousel-inner>.prev{display:block}#bootstrap-theme .carousel-inner>.active{left:0}#bootstrap-theme .carousel-inner>.next,#bootstrap-theme .carousel-inner>.prev{position:absolute;top:0;width:100%}#bootstrap-theme .carousel-inner>.next{left:100%}#bootstrap-theme .carousel-inner>.prev{left:-100%}#bootstrap-theme .carousel-inner>.next.left,#bootstrap-theme .carousel-inner>.prev.right{left:0}#bootstrap-theme .carousel-inner>.active.left{left:-100%}#bootstrap-theme .carousel-inner>.active.right{left:100%}#bootstrap-theme .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);-webkit-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);background-repeat:repeat-x}#bootstrap-theme .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);-webkit-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);background-repeat:repeat-x}#bootstrap-theme .carousel-control:hover,#bootstrap-theme .carousel-control:focus{color:#fff;text-decoration:none;outline:0;-webkit-filter:alpha(opacity=90);filter:alpha(opacity=90);opacity:.9}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next,#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}#bootstrap-theme .carousel-control .icon-next,#bootstrap-theme .carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next{width:20px;height:20px;font-family:serif;line-height:1}#bootstrap-theme .carousel-control .icon-prev:before{content:"‹"}#bootstrap-theme .carousel-control .icon-next:before{content:"›"}#bootstrap-theme .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}#bootstrap-theme .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}#bootstrap-theme .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}#bootstrap-theme .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}#bootstrap-theme .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .glyphicon-chevron-right,#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .icon-prev{margin-left:-10px}#bootstrap-theme .carousel-control .glyphicon-chevron-right,#bootstrap-theme .carousel-control .icon-next{margin-right:-10px}#bootstrap-theme .carousel-caption{right:20%;left:20%;padding-bottom:30px}#bootstrap-theme .carousel-indicators{bottom:20px}}#bootstrap-theme .clearfix:before,#bootstrap-theme .clearfix:after{display:table;content:" "}#bootstrap-theme .clearfix:after{clear:both}#bootstrap-theme .center-block{display:block;margin-right:auto;margin-left:auto}#bootstrap-theme .pull-right{float:right !important}#bootstrap-theme .pull-left{float:left !important}#bootstrap-theme .hide{display:none !important}#bootstrap-theme .show{display:block !important}#bootstrap-theme .invisible{visibility:hidden}#bootstrap-theme .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}#bootstrap-theme .hidden{display:none !important}#bootstrap-theme .affix{position:fixed}@-ms-viewport{width:device-width}#bootstrap-theme .visible-sm{display:none !important}#bootstrap-theme .visible-md{display:none !important}#bootstrap-theme .visible-lg{display:none !important}#bootstrap-theme .visible-xs-block,#bootstrap-theme .visible-xs-inline,#bootstrap-theme .visible-xs-inline-block,#bootstrap-theme .visible-sm-block,#bootstrap-theme .visible-sm-inline,#bootstrap-theme .visible-sm-inline-block,#bootstrap-theme .visible-md-block,#bootstrap-theme .visible-md-inline,#bootstrap-theme .visible-md-inline-block,#bootstrap-theme .visible-lg-block,#bootstrap-theme .visible-lg-inline,#bootstrap-theme .visible-lg-inline-block{display:none !important}@media (max-width:767px){#bootstrap-theme .visible-xs{display:block !important}#bootstrap-theme table.visible-xs{display:table !important}#bootstrap-theme tr.visible-xs{display:table-row !important}#bootstrap-theme th.visible-xs,#bootstrap-theme td.visible-xs{display:table-cell !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-block{display:block !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-inline{display:inline !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm{display:block !important}#bootstrap-theme table.visible-sm{display:table !important}#bootstrap-theme tr.visible-sm{display:table-row !important}#bootstrap-theme th.visible-sm,#bootstrap-theme td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md{display:block !important}#bootstrap-theme table.visible-md{display:table !important}#bootstrap-theme tr.visible-md{display:table-row !important}#bootstrap-theme th.visible-md,#bootstrap-theme td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg{display:block !important}#bootstrap-theme table.visible-lg{display:table !important}#bootstrap-theme tr.visible-lg{display:table-row !important}#bootstrap-theme th.visible-lg,#bootstrap-theme td.visible-lg{display:table-cell !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-block{display:block !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-inline{display:inline !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){#bootstrap-theme .hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .hidden-md{display:none !important}}@media (min-width:1200px){#bootstrap-theme .hidden-lg{display:none !important}}#bootstrap-theme .visible-print{display:none !important}@media print{#bootstrap-theme .visible-print{display:block !important}#bootstrap-theme table.visible-print{display:table !important}#bootstrap-theme tr.visible-print{display:table-row !important}#bootstrap-theme th.visible-print,#bootstrap-theme td.visible-print{display:table-cell !important}}#bootstrap-theme .visible-print-block{display:none !important}@media print{#bootstrap-theme .visible-print-block{display:block !important}}#bootstrap-theme .visible-print-inline{display:none !important}@media print{#bootstrap-theme .visible-print-inline{display:inline !important}}#bootstrap-theme .visible-print-inline-block{display:none !important}@media print{#bootstrap-theme .visible-print-inline-block{display:inline-block !important}}@media print{#bootstrap-theme .hidden-print{display:none !important}}#bootstrap-theme ul,#bootstrap-theme ol{margin-left:0;margin-right:0}#bootstrap-theme .form-control.checkbox-inline>label{margin-left:9px}#bootstrap-theme label input[type=checkbox]:not(:checked)+*{font-weight:400}#bootstrap-theme .select2-choices{margin-bottom:0}#bootstrap-theme input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}#bootstrap-theme .select2-container .select2-choice>.select2-chosen{font-size:inherit;font-weight:400}#bootstrap-theme summary{display:list-item}#bootstrap-theme .form-control .select2-choice{border:0;border-radius:2px}#bootstrap-theme .form-control .select2-choice .select2-arrow{border-radius:0 2px 2px 0}#bootstrap-theme .form-control.select2-container{height:auto !important;padding:0}#bootstrap-theme .form-control.select2-container.select2-dropdown-open{border-color:#5897fb;border-radius:3px 3px 0 0}#bootstrap-theme .form-control .select2-container.select2-dropdown-open .select2-choices{border-radius:3px 3px 0 0}#bootstrap-theme .form-control.select2-container .select2-choices{border:0 !important;border-radius:3px}#bootstrap-theme .control-group.warning .select2-container .select2-choice,#bootstrap-theme .control-group.warning .select2-container .select2-choices,#bootstrap-theme .control-group.warning .select2-container-active .select2-choice,#bootstrap-theme .control-group.warning .select2-container-active .select2-choices,#bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.warning .select2-container-multi.select2-container-active .select2-choices{border:1px solid #c09853 !important}#bootstrap-theme .control-group.warning .select2-container .select2-choice div{border-left:1px solid #c09853 !important;background:#fcf8e3 !important}#bootstrap-theme .control-group.error .select2-container .select2-choice,#bootstrap-theme .control-group.error .select2-container .select2-choices,#bootstrap-theme .control-group.error .select2-container-active .select2-choice,#bootstrap-theme .control-group.error .select2-container-active .select2-choices,#bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.error .select2-container-multi.select2-container-active .select2-choices{border:1px solid #b94a48 !important}#bootstrap-theme .control-group.error .select2-container .select2-choice div{border-left:1px solid #b94a48 !important;background:#f2dede !important}#bootstrap-theme .control-group.info .select2-container .select2-choice,#bootstrap-theme .control-group.info .select2-container .select2-choices,#bootstrap-theme .control-group.info .select2-container-active .select2-choice,#bootstrap-theme .control-group.info .select2-container-active .select2-choices,#bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.info .select2-container-multi.select2-container-active .select2-choices{border:1px solid #3a87ad !important}#bootstrap-theme .control-group.info .select2-container .select2-choice div{border-left:1px solid #3a87ad !important;background:#d9edf7 !important}#bootstrap-theme .control-group.success .select2-container .select2-choice,#bootstrap-theme .control-group.success .select2-container .select2-choices,#bootstrap-theme .control-group.success .select2-container-active .select2-choice,#bootstrap-theme .control-group.success .select2-container-active .select2-choices,#bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.success .select2-container-multi.select2-container-active .select2-choices{border:1px solid #468847 !important}#bootstrap-theme .control-group.success .select2-container .select2-choice div{border-left:1px solid #468847 !important;background:#dff0d8 !important} \ No newline at end of file +@charset "UTF-8";#bootstrap-theme html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}#bootstrap-theme body{margin:0}#bootstrap-theme article,#bootstrap-theme aside,#bootstrap-theme details,#bootstrap-theme figcaption,#bootstrap-theme figure,#bootstrap-theme footer,#bootstrap-theme header,#bootstrap-theme hgroup,#bootstrap-theme main,#bootstrap-theme menu,#bootstrap-theme nav,#bootstrap-theme section,#bootstrap-theme summary{display:block}#bootstrap-theme audio,#bootstrap-theme canvas,#bootstrap-theme progress,#bootstrap-theme video{display:inline-block;vertical-align:baseline}#bootstrap-theme audio:not([controls]){display:none;height:0}#bootstrap-theme [hidden],#bootstrap-theme template{display:none}#bootstrap-theme a{background-color:transparent}#bootstrap-theme a:active,#bootstrap-theme a:hover{outline:0}#bootstrap-theme abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}#bootstrap-theme b,#bootstrap-theme strong{font-weight:700}#bootstrap-theme dfn{font-style:italic}#bootstrap-theme h1{font-size:2em;margin:.67em 0}#bootstrap-theme mark{background:#ff0;color:#000}#bootstrap-theme small{font-size:80%}#bootstrap-theme sub,#bootstrap-theme sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}#bootstrap-theme sup{top:-.5em}#bootstrap-theme sub{bottom:-.25em}#bootstrap-theme img{border:0}#bootstrap-theme svg:not(:root){overflow:hidden}#bootstrap-theme figure{margin:1em 40px}#bootstrap-theme hr{box-sizing:content-box;height:0}#bootstrap-theme pre{overflow:auto}#bootstrap-theme code,#bootstrap-theme kbd,#bootstrap-theme pre,#bootstrap-theme samp{font-family:monospace,monospace;font-size:1em}#bootstrap-theme button,#bootstrap-theme input,#bootstrap-theme optgroup,#bootstrap-theme select,#bootstrap-theme textarea{color:inherit;font:inherit;margin:0}#bootstrap-theme button{overflow:visible}#bootstrap-theme button,#bootstrap-theme select{text-transform:none}#bootstrap-theme button,#bootstrap-theme html input[type=button],#bootstrap-theme input[type=reset],#bootstrap-theme input[type=submit]{-webkit-appearance:button;cursor:pointer}#bootstrap-theme button[disabled],#bootstrap-theme html input[disabled]{cursor:default}#bootstrap-theme button::-moz-focus-inner,#bootstrap-theme input::-moz-focus-inner{border:0;padding:0}#bootstrap-theme input{line-height:normal}#bootstrap-theme input[type=checkbox],#bootstrap-theme input[type=radio]{box-sizing:border-box;padding:0}#bootstrap-theme input[type=number]::-webkit-inner-spin-button,#bootstrap-theme input[type=number]::-webkit-outer-spin-button{height:auto}#bootstrap-theme input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}#bootstrap-theme input[type=search]::-webkit-search-cancel-button,#bootstrap-theme input[type=search]::-webkit-search-decoration{-webkit-appearance:none}#bootstrap-theme fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}#bootstrap-theme legend{border:0;padding:0}#bootstrap-theme textarea{overflow:auto}#bootstrap-theme optgroup{font-weight:700}#bootstrap-theme table{border-collapse:collapse;border-spacing:0}#bootstrap-theme td,#bootstrap-theme th{padding:0}@media print{#bootstrap-theme *,#bootstrap-theme *:before,#bootstrap-theme *:after{color:#000 !important;text-shadow:none !important;background:0 0 !important;box-shadow:none !important}#bootstrap-theme a,#bootstrap-theme a:visited{text-decoration:underline}#bootstrap-theme a[href]:after{content:" (" attr(href) ")"}#bootstrap-theme abbr[title]:after{content:" (" attr(title) ")"}#bootstrap-theme a[href^="#"]:after,#bootstrap-theme a[href^="javascript:"]:after{content:""}#bootstrap-theme pre,#bootstrap-theme blockquote{border:1px solid #999;page-break-inside:avoid}#bootstrap-theme thead{display:table-header-group}#bootstrap-theme tr,#bootstrap-theme img{page-break-inside:avoid}#bootstrap-theme img{max-width:100% !important}#bootstrap-theme p,#bootstrap-theme h2,#bootstrap-theme h3{orphans:3;widows:3}#bootstrap-theme h2,#bootstrap-theme h3{page-break-after:avoid}#bootstrap-theme .navbar{display:none}#bootstrap-theme .btn>.caret,#bootstrap-theme .dropup>.btn>.caret{border-top-color:#000 !important}#bootstrap-theme .label{border:1px solid #000}#bootstrap-theme .table{border-collapse:collapse !important}#bootstrap-theme .table td,#bootstrap-theme .table th{background-color:#fff !important}#bootstrap-theme .table-bordered th,#bootstrap-theme .table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:"Glyphicons Halflings";src:url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.eot");src:url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.woff2") format("woff2"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.woff") format("woff"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.ttf") format("truetype"),url("https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}#bootstrap-theme .glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#bootstrap-theme .glyphicon-asterisk:before{content:"*"}#bootstrap-theme .glyphicon-plus:before{content:"+"}#bootstrap-theme .glyphicon-euro:before,#bootstrap-theme .glyphicon-eur:before{content:"€"}#bootstrap-theme .glyphicon-minus:before{content:"−"}#bootstrap-theme .glyphicon-cloud:before{content:"☁"}#bootstrap-theme .glyphicon-envelope:before{content:"✉"}#bootstrap-theme .glyphicon-pencil:before{content:"✏"}#bootstrap-theme .glyphicon-glass:before{content:""}#bootstrap-theme .glyphicon-music:before{content:""}#bootstrap-theme .glyphicon-search:before{content:""}#bootstrap-theme .glyphicon-heart:before{content:""}#bootstrap-theme .glyphicon-star:before{content:""}#bootstrap-theme .glyphicon-star-empty:before{content:""}#bootstrap-theme .glyphicon-user:before{content:""}#bootstrap-theme .glyphicon-film:before{content:""}#bootstrap-theme .glyphicon-th-large:before{content:""}#bootstrap-theme .glyphicon-th:before{content:""}#bootstrap-theme .glyphicon-th-list:before{content:""}#bootstrap-theme .glyphicon-ok:before{content:""}#bootstrap-theme .glyphicon-remove:before{content:""}#bootstrap-theme .glyphicon-zoom-in:before{content:""}#bootstrap-theme .glyphicon-zoom-out:before{content:""}#bootstrap-theme .glyphicon-off:before{content:""}#bootstrap-theme .glyphicon-signal:before{content:""}#bootstrap-theme .glyphicon-cog:before{content:""}#bootstrap-theme .glyphicon-trash:before{content:""}#bootstrap-theme .glyphicon-home:before{content:""}#bootstrap-theme .glyphicon-file:before{content:""}#bootstrap-theme .glyphicon-time:before{content:""}#bootstrap-theme .glyphicon-road:before{content:""}#bootstrap-theme .glyphicon-download-alt:before{content:""}#bootstrap-theme .glyphicon-download:before{content:""}#bootstrap-theme .glyphicon-upload:before{content:""}#bootstrap-theme .glyphicon-inbox:before{content:""}#bootstrap-theme .glyphicon-play-circle:before{content:""}#bootstrap-theme .glyphicon-repeat:before{content:""}#bootstrap-theme .glyphicon-refresh:before{content:""}#bootstrap-theme .glyphicon-list-alt:before{content:""}#bootstrap-theme .glyphicon-lock:before{content:""}#bootstrap-theme .glyphicon-flag:before{content:""}#bootstrap-theme .glyphicon-headphones:before{content:""}#bootstrap-theme .glyphicon-volume-off:before{content:""}#bootstrap-theme .glyphicon-volume-down:before{content:""}#bootstrap-theme .glyphicon-volume-up:before{content:""}#bootstrap-theme .glyphicon-qrcode:before{content:""}#bootstrap-theme .glyphicon-barcode:before{content:""}#bootstrap-theme .glyphicon-tag:before{content:""}#bootstrap-theme .glyphicon-tags:before{content:""}#bootstrap-theme .glyphicon-book:before{content:""}#bootstrap-theme .glyphicon-bookmark:before{content:""}#bootstrap-theme .glyphicon-print:before{content:""}#bootstrap-theme .glyphicon-camera:before{content:""}#bootstrap-theme .glyphicon-font:before{content:""}#bootstrap-theme .glyphicon-bold:before{content:""}#bootstrap-theme .glyphicon-italic:before{content:""}#bootstrap-theme .glyphicon-text-height:before{content:""}#bootstrap-theme .glyphicon-text-width:before{content:""}#bootstrap-theme .glyphicon-align-left:before{content:""}#bootstrap-theme .glyphicon-align-center:before{content:""}#bootstrap-theme .glyphicon-align-right:before{content:""}#bootstrap-theme .glyphicon-align-justify:before{content:""}#bootstrap-theme .glyphicon-list:before{content:""}#bootstrap-theme .glyphicon-indent-left:before{content:""}#bootstrap-theme .glyphicon-indent-right:before{content:""}#bootstrap-theme .glyphicon-facetime-video:before{content:""}#bootstrap-theme .glyphicon-picture:before{content:""}#bootstrap-theme .glyphicon-map-marker:before{content:""}#bootstrap-theme .glyphicon-adjust:before{content:""}#bootstrap-theme .glyphicon-tint:before{content:""}#bootstrap-theme .glyphicon-edit:before{content:""}#bootstrap-theme .glyphicon-share:before{content:""}#bootstrap-theme .glyphicon-check:before{content:""}#bootstrap-theme .glyphicon-move:before{content:""}#bootstrap-theme .glyphicon-step-backward:before{content:""}#bootstrap-theme .glyphicon-fast-backward:before{content:""}#bootstrap-theme .glyphicon-backward:before{content:""}#bootstrap-theme .glyphicon-play:before{content:""}#bootstrap-theme .glyphicon-pause:before{content:""}#bootstrap-theme .glyphicon-stop:before{content:""}#bootstrap-theme .glyphicon-forward:before{content:""}#bootstrap-theme .glyphicon-fast-forward:before{content:""}#bootstrap-theme .glyphicon-step-forward:before{content:""}#bootstrap-theme .glyphicon-eject:before{content:""}#bootstrap-theme .glyphicon-chevron-left:before{content:""}#bootstrap-theme .glyphicon-chevron-right:before{content:""}#bootstrap-theme .glyphicon-plus-sign:before{content:""}#bootstrap-theme .glyphicon-minus-sign:before{content:""}#bootstrap-theme .glyphicon-remove-sign:before{content:""}#bootstrap-theme .glyphicon-ok-sign:before{content:""}#bootstrap-theme .glyphicon-question-sign:before{content:""}#bootstrap-theme .glyphicon-info-sign:before{content:""}#bootstrap-theme .glyphicon-screenshot:before{content:""}#bootstrap-theme .glyphicon-remove-circle:before{content:""}#bootstrap-theme .glyphicon-ok-circle:before{content:""}#bootstrap-theme .glyphicon-ban-circle:before{content:""}#bootstrap-theme .glyphicon-arrow-left:before{content:""}#bootstrap-theme .glyphicon-arrow-right:before{content:""}#bootstrap-theme .glyphicon-arrow-up:before{content:""}#bootstrap-theme .glyphicon-arrow-down:before{content:""}#bootstrap-theme .glyphicon-share-alt:before{content:""}#bootstrap-theme .glyphicon-resize-full:before{content:""}#bootstrap-theme .glyphicon-resize-small:before{content:""}#bootstrap-theme .glyphicon-exclamation-sign:before{content:""}#bootstrap-theme .glyphicon-gift:before{content:""}#bootstrap-theme .glyphicon-leaf:before{content:""}#bootstrap-theme .glyphicon-fire:before{content:""}#bootstrap-theme .glyphicon-eye-open:before{content:""}#bootstrap-theme .glyphicon-eye-close:before{content:""}#bootstrap-theme .glyphicon-warning-sign:before{content:""}#bootstrap-theme .glyphicon-plane:before{content:""}#bootstrap-theme .glyphicon-calendar:before{content:""}#bootstrap-theme .glyphicon-random:before{content:""}#bootstrap-theme .glyphicon-comment:before{content:""}#bootstrap-theme .glyphicon-magnet:before{content:""}#bootstrap-theme .glyphicon-chevron-up:before{content:""}#bootstrap-theme .glyphicon-chevron-down:before{content:""}#bootstrap-theme .glyphicon-retweet:before{content:""}#bootstrap-theme .glyphicon-shopping-cart:before{content:""}#bootstrap-theme .glyphicon-folder-close:before{content:""}#bootstrap-theme .glyphicon-folder-open:before{content:""}#bootstrap-theme .glyphicon-resize-vertical:before{content:""}#bootstrap-theme .glyphicon-resize-horizontal:before{content:""}#bootstrap-theme .glyphicon-hdd:before{content:""}#bootstrap-theme .glyphicon-bullhorn:before{content:""}#bootstrap-theme .glyphicon-bell:before{content:""}#bootstrap-theme .glyphicon-certificate:before{content:""}#bootstrap-theme .glyphicon-thumbs-up:before{content:""}#bootstrap-theme .glyphicon-thumbs-down:before{content:""}#bootstrap-theme .glyphicon-hand-right:before{content:""}#bootstrap-theme .glyphicon-hand-left:before{content:""}#bootstrap-theme .glyphicon-hand-up:before{content:""}#bootstrap-theme .glyphicon-hand-down:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-right:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-left:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-up:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-down:before{content:""}#bootstrap-theme .glyphicon-globe:before{content:""}#bootstrap-theme .glyphicon-wrench:before{content:""}#bootstrap-theme .glyphicon-tasks:before{content:""}#bootstrap-theme .glyphicon-filter:before{content:""}#bootstrap-theme .glyphicon-briefcase:before{content:""}#bootstrap-theme .glyphicon-fullscreen:before{content:""}#bootstrap-theme .glyphicon-dashboard:before{content:""}#bootstrap-theme .glyphicon-paperclip:before{content:""}#bootstrap-theme .glyphicon-heart-empty:before{content:""}#bootstrap-theme .glyphicon-link:before{content:""}#bootstrap-theme .glyphicon-phone:before{content:""}#bootstrap-theme .glyphicon-pushpin:before{content:""}#bootstrap-theme .glyphicon-usd:before{content:""}#bootstrap-theme .glyphicon-gbp:before{content:""}#bootstrap-theme .glyphicon-sort:before{content:""}#bootstrap-theme .glyphicon-sort-by-alphabet:before{content:""}#bootstrap-theme .glyphicon-sort-by-alphabet-alt:before{content:""}#bootstrap-theme .glyphicon-sort-by-order:before{content:""}#bootstrap-theme .glyphicon-sort-by-order-alt:before{content:""}#bootstrap-theme .glyphicon-sort-by-attributes:before{content:""}#bootstrap-theme .glyphicon-sort-by-attributes-alt:before{content:""}#bootstrap-theme .glyphicon-unchecked:before{content:""}#bootstrap-theme .glyphicon-expand:before{content:""}#bootstrap-theme .glyphicon-collapse-down:before{content:""}#bootstrap-theme .glyphicon-collapse-up:before{content:""}#bootstrap-theme .glyphicon-log-in:before{content:""}#bootstrap-theme .glyphicon-flash:before{content:""}#bootstrap-theme .glyphicon-log-out:before{content:""}#bootstrap-theme .glyphicon-new-window:before{content:""}#bootstrap-theme .glyphicon-record:before{content:""}#bootstrap-theme .glyphicon-save:before{content:""}#bootstrap-theme .glyphicon-open:before{content:""}#bootstrap-theme .glyphicon-saved:before{content:""}#bootstrap-theme .glyphicon-import:before{content:""}#bootstrap-theme .glyphicon-export:before{content:""}#bootstrap-theme .glyphicon-send:before{content:""}#bootstrap-theme .glyphicon-floppy-disk:before{content:""}#bootstrap-theme .glyphicon-floppy-saved:before{content:""}#bootstrap-theme .glyphicon-floppy-remove:before{content:""}#bootstrap-theme .glyphicon-floppy-save:before{content:""}#bootstrap-theme .glyphicon-floppy-open:before{content:""}#bootstrap-theme .glyphicon-credit-card:before{content:""}#bootstrap-theme .glyphicon-transfer:before{content:""}#bootstrap-theme .glyphicon-cutlery:before{content:""}#bootstrap-theme .glyphicon-header:before{content:""}#bootstrap-theme .glyphicon-compressed:before{content:""}#bootstrap-theme .glyphicon-earphone:before{content:""}#bootstrap-theme .glyphicon-phone-alt:before{content:""}#bootstrap-theme .glyphicon-tower:before{content:""}#bootstrap-theme .glyphicon-stats:before{content:""}#bootstrap-theme .glyphicon-sd-video:before{content:""}#bootstrap-theme .glyphicon-hd-video:before{content:""}#bootstrap-theme .glyphicon-subtitles:before{content:""}#bootstrap-theme .glyphicon-sound-stereo:before{content:""}#bootstrap-theme .glyphicon-sound-dolby:before{content:""}#bootstrap-theme .glyphicon-sound-5-1:before{content:""}#bootstrap-theme .glyphicon-sound-6-1:before{content:""}#bootstrap-theme .glyphicon-sound-7-1:before{content:""}#bootstrap-theme .glyphicon-copyright-mark:before{content:""}#bootstrap-theme .glyphicon-registration-mark:before{content:""}#bootstrap-theme .glyphicon-cloud-download:before{content:""}#bootstrap-theme .glyphicon-cloud-upload:before{content:""}#bootstrap-theme .glyphicon-tree-conifer:before{content:""}#bootstrap-theme .glyphicon-tree-deciduous:before{content:""}#bootstrap-theme .glyphicon-cd:before{content:""}#bootstrap-theme .glyphicon-save-file:before{content:""}#bootstrap-theme .glyphicon-open-file:before{content:""}#bootstrap-theme .glyphicon-level-up:before{content:""}#bootstrap-theme .glyphicon-copy:before{content:""}#bootstrap-theme .glyphicon-paste:before{content:""}#bootstrap-theme .glyphicon-alert:before{content:""}#bootstrap-theme .glyphicon-equalizer:before{content:""}#bootstrap-theme .glyphicon-king:before{content:""}#bootstrap-theme .glyphicon-queen:before{content:""}#bootstrap-theme .glyphicon-pawn:before{content:""}#bootstrap-theme .glyphicon-bishop:before{content:""}#bootstrap-theme .glyphicon-knight:before{content:""}#bootstrap-theme .glyphicon-baby-formula:before{content:""}#bootstrap-theme .glyphicon-tent:before{content:"⛺"}#bootstrap-theme .glyphicon-blackboard:before{content:""}#bootstrap-theme .glyphicon-bed:before{content:""}#bootstrap-theme .glyphicon-apple:before{content:""}#bootstrap-theme .glyphicon-erase:before{content:""}#bootstrap-theme .glyphicon-hourglass:before{content:"⌛"}#bootstrap-theme .glyphicon-lamp:before{content:""}#bootstrap-theme .glyphicon-duplicate:before{content:""}#bootstrap-theme .glyphicon-piggy-bank:before{content:""}#bootstrap-theme .glyphicon-scissors:before{content:""}#bootstrap-theme .glyphicon-bitcoin:before{content:""}#bootstrap-theme .glyphicon-btc:before{content:""}#bootstrap-theme .glyphicon-xbt:before{content:""}#bootstrap-theme .glyphicon-yen:before{content:"¥"}#bootstrap-theme .glyphicon-jpy:before{content:"¥"}#bootstrap-theme .glyphicon-ruble:before{content:"₽"}#bootstrap-theme .glyphicon-rub:before{content:"₽"}#bootstrap-theme .glyphicon-scale:before{content:""}#bootstrap-theme .glyphicon-ice-lolly:before{content:""}#bootstrap-theme .glyphicon-ice-lolly-tasted:before{content:""}#bootstrap-theme .glyphicon-education:before{content:""}#bootstrap-theme .glyphicon-option-horizontal:before{content:""}#bootstrap-theme .glyphicon-option-vertical:before{content:""}#bootstrap-theme .glyphicon-menu-hamburger:before{content:""}#bootstrap-theme .glyphicon-modal-window:before{content:""}#bootstrap-theme .glyphicon-oil:before{content:""}#bootstrap-theme .glyphicon-grain:before{content:""}#bootstrap-theme .glyphicon-sunglasses:before{content:""}#bootstrap-theme .glyphicon-text-size:before{content:""}#bootstrap-theme .glyphicon-text-color:before{content:""}#bootstrap-theme .glyphicon-text-background:before{content:""}#bootstrap-theme .glyphicon-object-align-top:before{content:""}#bootstrap-theme .glyphicon-object-align-bottom:before{content:""}#bootstrap-theme .glyphicon-object-align-horizontal:before{content:""}#bootstrap-theme .glyphicon-object-align-left:before{content:""}#bootstrap-theme .glyphicon-object-align-vertical:before{content:""}#bootstrap-theme .glyphicon-object-align-right:before{content:""}#bootstrap-theme .glyphicon-triangle-right:before{content:""}#bootstrap-theme .glyphicon-triangle-left:before{content:""}#bootstrap-theme .glyphicon-triangle-bottom:before{content:""}#bootstrap-theme .glyphicon-triangle-top:before{content:""}#bootstrap-theme .glyphicon-console:before{content:""}#bootstrap-theme .glyphicon-superscript:before{content:""}#bootstrap-theme .glyphicon-subscript:before{content:""}#bootstrap-theme .glyphicon-menu-left:before{content:""}#bootstrap-theme .glyphicon-menu-right:before{content:""}#bootstrap-theme .glyphicon-menu-down:before{content:""}#bootstrap-theme .glyphicon-menu-up:before{content:""}#bootstrap-theme *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#bootstrap-theme *:before,#bootstrap-theme *:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#bootstrap-theme html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}#bootstrap-theme body{font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff}#bootstrap-theme input,#bootstrap-theme button,#bootstrap-theme select,#bootstrap-theme textarea{font-family:inherit;font-size:inherit;line-height:inherit}#bootstrap-theme a{color:#2786c2;text-decoration:none}#bootstrap-theme a:hover,#bootstrap-theme a:focus{color:#1a5a82;text-decoration:underline}#bootstrap-theme a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme figure{margin:0}#bootstrap-theme img{vertical-align:middle}#bootstrap-theme .img-responsive{display:block;max-width:100%;height:auto}#bootstrap-theme .img-rounded{border-radius:6px}#bootstrap-theme .img-thumbnail{padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}#bootstrap-theme .img-circle{border-radius:50%}#bootstrap-theme hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}#bootstrap-theme .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}#bootstrap-theme .sr-only-focusable:active,#bootstrap-theme .sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}#bootstrap-theme [role=button]{cursor:pointer}#bootstrap-theme h1,#bootstrap-theme h2,#bootstrap-theme h3,#bootstrap-theme h4,#bootstrap-theme h5,#bootstrap-theme h6,#bootstrap-theme .h1,#bootstrap-theme .h2,#bootstrap-theme .h3,#bootstrap-theme .h4,#bootstrap-theme .h5,#bootstrap-theme .h6{font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.2;color:#000}#bootstrap-theme h1 small,#bootstrap-theme h1 .small,#bootstrap-theme h2 small,#bootstrap-theme h2 .small,#bootstrap-theme h3 small,#bootstrap-theme h3 .small,#bootstrap-theme h4 small,#bootstrap-theme h4 .small,#bootstrap-theme h5 small,#bootstrap-theme h5 .small,#bootstrap-theme h6 small,#bootstrap-theme h6 .small,#bootstrap-theme .h1 small,#bootstrap-theme .h1 .small,#bootstrap-theme .h2 small,#bootstrap-theme .h2 .small,#bootstrap-theme .h3 small,#bootstrap-theme .h3 .small,#bootstrap-theme .h4 small,#bootstrap-theme .h4 .small,#bootstrap-theme .h5 small,#bootstrap-theme .h5 .small,#bootstrap-theme .h6 small,#bootstrap-theme .h6 .small{font-weight:400;line-height:1;color:#999}#bootstrap-theme h1,#bootstrap-theme .h1,#bootstrap-theme h2,#bootstrap-theme .h2,#bootstrap-theme h3,#bootstrap-theme .h3{margin-top:20px;margin-bottom:10px}#bootstrap-theme h1 small,#bootstrap-theme h1 .small,#bootstrap-theme .h1 small,#bootstrap-theme .h1 .small,#bootstrap-theme h2 small,#bootstrap-theme h2 .small,#bootstrap-theme .h2 small,#bootstrap-theme .h2 .small,#bootstrap-theme h3 small,#bootstrap-theme h3 .small,#bootstrap-theme .h3 small,#bootstrap-theme .h3 .small{font-size:65%}#bootstrap-theme h4,#bootstrap-theme .h4,#bootstrap-theme h5,#bootstrap-theme .h5,#bootstrap-theme h6,#bootstrap-theme .h6{margin-top:10px;margin-bottom:10px}#bootstrap-theme h4 small,#bootstrap-theme h4 .small,#bootstrap-theme .h4 small,#bootstrap-theme .h4 .small,#bootstrap-theme h5 small,#bootstrap-theme h5 .small,#bootstrap-theme .h5 small,#bootstrap-theme .h5 .small,#bootstrap-theme h6 small,#bootstrap-theme h6 .small,#bootstrap-theme .h6 small,#bootstrap-theme .h6 .small{font-size:75%}#bootstrap-theme h1,#bootstrap-theme .h1{font-size:36px}#bootstrap-theme h2,#bootstrap-theme .h2{font-size:30px}#bootstrap-theme h3,#bootstrap-theme .h3{font-size:24px}#bootstrap-theme h4,#bootstrap-theme .h4{font-size:18px}#bootstrap-theme h5,#bootstrap-theme .h5{font-size:14px}#bootstrap-theme h6,#bootstrap-theme .h6{font-size:12px}#bootstrap-theme p{margin:0 0 10px}#bootstrap-theme .lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){#bootstrap-theme .lead{font-size:21px}}#bootstrap-theme small,#bootstrap-theme .small{font-size:85%}#bootstrap-theme mark,#bootstrap-theme .mark{padding:.2em;background-color:#fcf8e3}#bootstrap-theme .text-left{text-align:left}#bootstrap-theme .text-right{text-align:right}#bootstrap-theme .text-center{text-align:center}#bootstrap-theme .text-justify{text-align:justify}#bootstrap-theme .text-nowrap{white-space:nowrap}#bootstrap-theme .text-lowercase{text-transform:lowercase}#bootstrap-theme .text-uppercase,#bootstrap-theme .initialism{text-transform:uppercase}#bootstrap-theme .text-capitalize{text-transform:capitalize}#bootstrap-theme .text-muted{color:#999}#bootstrap-theme .text-primary{color:#000}#bootstrap-theme a.text-primary:hover,#bootstrap-theme a.text-primary:focus{color:#000}#bootstrap-theme .text-success{color:#468847}#bootstrap-theme a.text-success:hover,#bootstrap-theme a.text-success:focus{color:#356635}#bootstrap-theme .text-info{color:#3a87ad}#bootstrap-theme a.text-info:hover,#bootstrap-theme a.text-info:focus{color:#2d6987}#bootstrap-theme .text-warning{color:#c09853}#bootstrap-theme a.text-warning:hover,#bootstrap-theme a.text-warning:focus{color:#a47e3c}#bootstrap-theme .text-danger{color:#b94a48}#bootstrap-theme a.text-danger:hover,#bootstrap-theme a.text-danger:focus{color:#953b39}#bootstrap-theme .bg-primary{color:#fff}#bootstrap-theme .bg-primary{background-color:#000}#bootstrap-theme a.bg-primary:hover,#bootstrap-theme a.bg-primary:focus{background-color:#000}#bootstrap-theme .bg-success{background-color:#dff0d8}#bootstrap-theme a.bg-success:hover,#bootstrap-theme a.bg-success:focus{background-color:#c1e2b3}#bootstrap-theme .bg-info{background-color:#d9edf7}#bootstrap-theme a.bg-info:hover,#bootstrap-theme a.bg-info:focus{background-color:#afd9ee}#bootstrap-theme .bg-warning{background-color:#fcf8e3}#bootstrap-theme a.bg-warning:hover,#bootstrap-theme a.bg-warning:focus{background-color:#f7ecb5}#bootstrap-theme .bg-danger{background-color:#f2dede}#bootstrap-theme a.bg-danger:hover,#bootstrap-theme a.bg-danger:focus{background-color:#e4b9b9}#bootstrap-theme .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}#bootstrap-theme ul,#bootstrap-theme ol{margin-top:0;margin-bottom:10px}#bootstrap-theme ul ul,#bootstrap-theme ul ol,#bootstrap-theme ol ul,#bootstrap-theme ol ol{margin-bottom:0}#bootstrap-theme .list-unstyled{padding-left:0;list-style:none}#bootstrap-theme .list-inline{padding-left:0;list-style:none;margin-left:-5px}#bootstrap-theme .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}#bootstrap-theme dl{margin-top:0;margin-bottom:20px}#bootstrap-theme dt,#bootstrap-theme dd{line-height:1.428571429}#bootstrap-theme dt{font-weight:700}#bootstrap-theme dd{margin-left:0}#bootstrap-theme .dl-horizontal dd:before,#bootstrap-theme .dl-horizontal dd:after{display:table;content:" "}#bootstrap-theme .dl-horizontal dd:after{clear:both}@media (min-width:768px){#bootstrap-theme .dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#bootstrap-theme .dl-horizontal dd{margin-left:180px}}#bootstrap-theme abbr[title],#bootstrap-theme abbr[data-original-title]{cursor:help}#bootstrap-theme .initialism{font-size:90%}#bootstrap-theme blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}#bootstrap-theme blockquote p:last-child,#bootstrap-theme blockquote ul:last-child,#bootstrap-theme blockquote ol:last-child{margin-bottom:0}#bootstrap-theme blockquote footer,#bootstrap-theme blockquote small,#bootstrap-theme blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}#bootstrap-theme blockquote footer:before,#bootstrap-theme blockquote small:before,#bootstrap-theme blockquote .small:before{content:"— "}#bootstrap-theme .blockquote-reverse,#bootstrap-theme blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}#bootstrap-theme .blockquote-reverse footer:before,#bootstrap-theme .blockquote-reverse small:before,#bootstrap-theme .blockquote-reverse .small:before,#bootstrap-theme blockquote.pull-right footer:before,#bootstrap-theme blockquote.pull-right small:before,#bootstrap-theme blockquote.pull-right .small:before{content:""}#bootstrap-theme .blockquote-reverse footer:after,#bootstrap-theme .blockquote-reverse small:after,#bootstrap-theme .blockquote-reverse .small:after,#bootstrap-theme blockquote.pull-right footer:after,#bootstrap-theme blockquote.pull-right small:after,#bootstrap-theme blockquote.pull-right .small:after{content:" —"}#bootstrap-theme address{margin-bottom:20px;font-style:normal;line-height:1.428571429}#bootstrap-theme code,#bootstrap-theme kbd,#bootstrap-theme pre,#bootstrap-theme samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}#bootstrap-theme code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}#bootstrap-theme kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}#bootstrap-theme kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}#bootstrap-theme pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;-ms-word-break:break-all;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}#bootstrap-theme pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}#bootstrap-theme .pre-scrollable{max-height:340px;overflow-y:scroll}#bootstrap-theme .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#bootstrap-theme .container:before,#bootstrap-theme .container:after{display:table;content:" "}#bootstrap-theme .container:after{clear:both}@media (min-width:768px){#bootstrap-theme .container{width:750px}}@media (min-width:992px){#bootstrap-theme .container{width:970px}}@media (min-width:1200px){#bootstrap-theme .container{width:1170px}}#bootstrap-theme .container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#bootstrap-theme .container-fluid:before,#bootstrap-theme .container-fluid:after{display:table;content:" "}#bootstrap-theme .container-fluid:after{clear:both}#bootstrap-theme .row{margin-right:-15px;margin-left:-15px}#bootstrap-theme .row:before,#bootstrap-theme .row:after{display:table;content:" "}#bootstrap-theme .row:after{clear:both}#bootstrap-theme .row-no-gutters{margin-right:0;margin-left:0}#bootstrap-theme .row-no-gutters [class*=col-]{padding-right:0;padding-left:0}#bootstrap-theme .col-xs-1,#bootstrap-theme .col-sm-1,#bootstrap-theme .col-md-1,#bootstrap-theme .col-lg-1,#bootstrap-theme .col-xs-2,#bootstrap-theme .col-sm-2,#bootstrap-theme .col-md-2,#bootstrap-theme .col-lg-2,#bootstrap-theme .col-xs-3,#bootstrap-theme .col-sm-3,#bootstrap-theme .col-md-3,#bootstrap-theme .col-lg-3,#bootstrap-theme .col-xs-4,#bootstrap-theme .col-sm-4,#bootstrap-theme .col-md-4,#bootstrap-theme .col-lg-4,#bootstrap-theme .col-xs-5,#bootstrap-theme .col-sm-5,#bootstrap-theme .col-md-5,#bootstrap-theme .col-lg-5,#bootstrap-theme .col-xs-6,#bootstrap-theme .col-sm-6,#bootstrap-theme .col-md-6,#bootstrap-theme .col-lg-6,#bootstrap-theme .col-xs-7,#bootstrap-theme .col-sm-7,#bootstrap-theme .col-md-7,#bootstrap-theme .col-lg-7,#bootstrap-theme .col-xs-8,#bootstrap-theme .col-sm-8,#bootstrap-theme .col-md-8,#bootstrap-theme .col-lg-8,#bootstrap-theme .col-xs-9,#bootstrap-theme .col-sm-9,#bootstrap-theme .col-md-9,#bootstrap-theme .col-lg-9,#bootstrap-theme .col-xs-10,#bootstrap-theme .col-sm-10,#bootstrap-theme .col-md-10,#bootstrap-theme .col-lg-10,#bootstrap-theme .col-xs-11,#bootstrap-theme .col-sm-11,#bootstrap-theme .col-md-11,#bootstrap-theme .col-lg-11,#bootstrap-theme .col-xs-12,#bootstrap-theme .col-sm-12,#bootstrap-theme .col-md-12,#bootstrap-theme .col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}#bootstrap-theme .col-xs-1,#bootstrap-theme .col-xs-2,#bootstrap-theme .col-xs-3,#bootstrap-theme .col-xs-4,#bootstrap-theme .col-xs-5,#bootstrap-theme .col-xs-6,#bootstrap-theme .col-xs-7,#bootstrap-theme .col-xs-8,#bootstrap-theme .col-xs-9,#bootstrap-theme .col-xs-10,#bootstrap-theme .col-xs-11,#bootstrap-theme .col-xs-12{float:left}#bootstrap-theme .col-xs-1{width:8.3333333333%}#bootstrap-theme .col-xs-2{width:16.6666666667%}#bootstrap-theme .col-xs-3{width:25%}#bootstrap-theme .col-xs-4{width:33.3333333333%}#bootstrap-theme .col-xs-5{width:41.6666666667%}#bootstrap-theme .col-xs-6{width:50%}#bootstrap-theme .col-xs-7{width:58.3333333333%}#bootstrap-theme .col-xs-8{width:66.6666666667%}#bootstrap-theme .col-xs-9{width:75%}#bootstrap-theme .col-xs-10{width:83.3333333333%}#bootstrap-theme .col-xs-11{width:91.6666666667%}#bootstrap-theme .col-xs-12{width:100%}#bootstrap-theme .col-xs-pull-0{right:auto}#bootstrap-theme .col-xs-pull-1{right:8.3333333333%}#bootstrap-theme .col-xs-pull-2{right:16.6666666667%}#bootstrap-theme .col-xs-pull-3{right:25%}#bootstrap-theme .col-xs-pull-4{right:33.3333333333%}#bootstrap-theme .col-xs-pull-5{right:41.6666666667%}#bootstrap-theme .col-xs-pull-6{right:50%}#bootstrap-theme .col-xs-pull-7{right:58.3333333333%}#bootstrap-theme .col-xs-pull-8{right:66.6666666667%}#bootstrap-theme .col-xs-pull-9{right:75%}#bootstrap-theme .col-xs-pull-10{right:83.3333333333%}#bootstrap-theme .col-xs-pull-11{right:91.6666666667%}#bootstrap-theme .col-xs-pull-12{right:100%}#bootstrap-theme .col-xs-push-0{left:auto}#bootstrap-theme .col-xs-push-1{left:8.3333333333%}#bootstrap-theme .col-xs-push-2{left:16.6666666667%}#bootstrap-theme .col-xs-push-3{left:25%}#bootstrap-theme .col-xs-push-4{left:33.3333333333%}#bootstrap-theme .col-xs-push-5{left:41.6666666667%}#bootstrap-theme .col-xs-push-6{left:50%}#bootstrap-theme .col-xs-push-7{left:58.3333333333%}#bootstrap-theme .col-xs-push-8{left:66.6666666667%}#bootstrap-theme .col-xs-push-9{left:75%}#bootstrap-theme .col-xs-push-10{left:83.3333333333%}#bootstrap-theme .col-xs-push-11{left:91.6666666667%}#bootstrap-theme .col-xs-push-12{left:100%}#bootstrap-theme .col-xs-offset-0{margin-left:0}#bootstrap-theme .col-xs-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-xs-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-xs-offset-3{margin-left:25%}#bootstrap-theme .col-xs-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-xs-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-xs-offset-6{margin-left:50%}#bootstrap-theme .col-xs-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-xs-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-xs-offset-9{margin-left:75%}#bootstrap-theme .col-xs-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-xs-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-xs-offset-12{margin-left:100%}@media (min-width:768px){#bootstrap-theme .col-sm-1,#bootstrap-theme .col-sm-2,#bootstrap-theme .col-sm-3,#bootstrap-theme .col-sm-4,#bootstrap-theme .col-sm-5,#bootstrap-theme .col-sm-6,#bootstrap-theme .col-sm-7,#bootstrap-theme .col-sm-8,#bootstrap-theme .col-sm-9,#bootstrap-theme .col-sm-10,#bootstrap-theme .col-sm-11,#bootstrap-theme .col-sm-12{float:left}#bootstrap-theme .col-sm-1{width:8.3333333333%}#bootstrap-theme .col-sm-2{width:16.6666666667%}#bootstrap-theme .col-sm-3{width:25%}#bootstrap-theme .col-sm-4{width:33.3333333333%}#bootstrap-theme .col-sm-5{width:41.6666666667%}#bootstrap-theme .col-sm-6{width:50%}#bootstrap-theme .col-sm-7{width:58.3333333333%}#bootstrap-theme .col-sm-8{width:66.6666666667%}#bootstrap-theme .col-sm-9{width:75%}#bootstrap-theme .col-sm-10{width:83.3333333333%}#bootstrap-theme .col-sm-11{width:91.6666666667%}#bootstrap-theme .col-sm-12{width:100%}#bootstrap-theme .col-sm-pull-0{right:auto}#bootstrap-theme .col-sm-pull-1{right:8.3333333333%}#bootstrap-theme .col-sm-pull-2{right:16.6666666667%}#bootstrap-theme .col-sm-pull-3{right:25%}#bootstrap-theme .col-sm-pull-4{right:33.3333333333%}#bootstrap-theme .col-sm-pull-5{right:41.6666666667%}#bootstrap-theme .col-sm-pull-6{right:50%}#bootstrap-theme .col-sm-pull-7{right:58.3333333333%}#bootstrap-theme .col-sm-pull-8{right:66.6666666667%}#bootstrap-theme .col-sm-pull-9{right:75%}#bootstrap-theme .col-sm-pull-10{right:83.3333333333%}#bootstrap-theme .col-sm-pull-11{right:91.6666666667%}#bootstrap-theme .col-sm-pull-12{right:100%}#bootstrap-theme .col-sm-push-0{left:auto}#bootstrap-theme .col-sm-push-1{left:8.3333333333%}#bootstrap-theme .col-sm-push-2{left:16.6666666667%}#bootstrap-theme .col-sm-push-3{left:25%}#bootstrap-theme .col-sm-push-4{left:33.3333333333%}#bootstrap-theme .col-sm-push-5{left:41.6666666667%}#bootstrap-theme .col-sm-push-6{left:50%}#bootstrap-theme .col-sm-push-7{left:58.3333333333%}#bootstrap-theme .col-sm-push-8{left:66.6666666667%}#bootstrap-theme .col-sm-push-9{left:75%}#bootstrap-theme .col-sm-push-10{left:83.3333333333%}#bootstrap-theme .col-sm-push-11{left:91.6666666667%}#bootstrap-theme .col-sm-push-12{left:100%}#bootstrap-theme .col-sm-offset-0{margin-left:0}#bootstrap-theme .col-sm-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-sm-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-sm-offset-3{margin-left:25%}#bootstrap-theme .col-sm-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-sm-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-sm-offset-6{margin-left:50%}#bootstrap-theme .col-sm-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-sm-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-sm-offset-9{margin-left:75%}#bootstrap-theme .col-sm-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-sm-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-sm-offset-12{margin-left:100%}}@media (min-width:992px){#bootstrap-theme .col-md-1,#bootstrap-theme .col-md-2,#bootstrap-theme .col-md-3,#bootstrap-theme .col-md-4,#bootstrap-theme .col-md-5,#bootstrap-theme .col-md-6,#bootstrap-theme .col-md-7,#bootstrap-theme .col-md-8,#bootstrap-theme .col-md-9,#bootstrap-theme .col-md-10,#bootstrap-theme .col-md-11,#bootstrap-theme .col-md-12{float:left}#bootstrap-theme .col-md-1{width:8.3333333333%}#bootstrap-theme .col-md-2{width:16.6666666667%}#bootstrap-theme .col-md-3{width:25%}#bootstrap-theme .col-md-4{width:33.3333333333%}#bootstrap-theme .col-md-5{width:41.6666666667%}#bootstrap-theme .col-md-6{width:50%}#bootstrap-theme .col-md-7{width:58.3333333333%}#bootstrap-theme .col-md-8{width:66.6666666667%}#bootstrap-theme .col-md-9{width:75%}#bootstrap-theme .col-md-10{width:83.3333333333%}#bootstrap-theme .col-md-11{width:91.6666666667%}#bootstrap-theme .col-md-12{width:100%}#bootstrap-theme .col-md-pull-0{right:auto}#bootstrap-theme .col-md-pull-1{right:8.3333333333%}#bootstrap-theme .col-md-pull-2{right:16.6666666667%}#bootstrap-theme .col-md-pull-3{right:25%}#bootstrap-theme .col-md-pull-4{right:33.3333333333%}#bootstrap-theme .col-md-pull-5{right:41.6666666667%}#bootstrap-theme .col-md-pull-6{right:50%}#bootstrap-theme .col-md-pull-7{right:58.3333333333%}#bootstrap-theme .col-md-pull-8{right:66.6666666667%}#bootstrap-theme .col-md-pull-9{right:75%}#bootstrap-theme .col-md-pull-10{right:83.3333333333%}#bootstrap-theme .col-md-pull-11{right:91.6666666667%}#bootstrap-theme .col-md-pull-12{right:100%}#bootstrap-theme .col-md-push-0{left:auto}#bootstrap-theme .col-md-push-1{left:8.3333333333%}#bootstrap-theme .col-md-push-2{left:16.6666666667%}#bootstrap-theme .col-md-push-3{left:25%}#bootstrap-theme .col-md-push-4{left:33.3333333333%}#bootstrap-theme .col-md-push-5{left:41.6666666667%}#bootstrap-theme .col-md-push-6{left:50%}#bootstrap-theme .col-md-push-7{left:58.3333333333%}#bootstrap-theme .col-md-push-8{left:66.6666666667%}#bootstrap-theme .col-md-push-9{left:75%}#bootstrap-theme .col-md-push-10{left:83.3333333333%}#bootstrap-theme .col-md-push-11{left:91.6666666667%}#bootstrap-theme .col-md-push-12{left:100%}#bootstrap-theme .col-md-offset-0{margin-left:0}#bootstrap-theme .col-md-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-md-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-md-offset-3{margin-left:25%}#bootstrap-theme .col-md-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-md-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-md-offset-6{margin-left:50%}#bootstrap-theme .col-md-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-md-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-md-offset-9{margin-left:75%}#bootstrap-theme .col-md-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-md-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-md-offset-12{margin-left:100%}}@media (min-width:1200px){#bootstrap-theme .col-lg-1,#bootstrap-theme .col-lg-2,#bootstrap-theme .col-lg-3,#bootstrap-theme .col-lg-4,#bootstrap-theme .col-lg-5,#bootstrap-theme .col-lg-6,#bootstrap-theme .col-lg-7,#bootstrap-theme .col-lg-8,#bootstrap-theme .col-lg-9,#bootstrap-theme .col-lg-10,#bootstrap-theme .col-lg-11,#bootstrap-theme .col-lg-12{float:left}#bootstrap-theme .col-lg-1{width:8.3333333333%}#bootstrap-theme .col-lg-2{width:16.6666666667%}#bootstrap-theme .col-lg-3{width:25%}#bootstrap-theme .col-lg-4{width:33.3333333333%}#bootstrap-theme .col-lg-5{width:41.6666666667%}#bootstrap-theme .col-lg-6{width:50%}#bootstrap-theme .col-lg-7{width:58.3333333333%}#bootstrap-theme .col-lg-8{width:66.6666666667%}#bootstrap-theme .col-lg-9{width:75%}#bootstrap-theme .col-lg-10{width:83.3333333333%}#bootstrap-theme .col-lg-11{width:91.6666666667%}#bootstrap-theme .col-lg-12{width:100%}#bootstrap-theme .col-lg-pull-0{right:auto}#bootstrap-theme .col-lg-pull-1{right:8.3333333333%}#bootstrap-theme .col-lg-pull-2{right:16.6666666667%}#bootstrap-theme .col-lg-pull-3{right:25%}#bootstrap-theme .col-lg-pull-4{right:33.3333333333%}#bootstrap-theme .col-lg-pull-5{right:41.6666666667%}#bootstrap-theme .col-lg-pull-6{right:50%}#bootstrap-theme .col-lg-pull-7{right:58.3333333333%}#bootstrap-theme .col-lg-pull-8{right:66.6666666667%}#bootstrap-theme .col-lg-pull-9{right:75%}#bootstrap-theme .col-lg-pull-10{right:83.3333333333%}#bootstrap-theme .col-lg-pull-11{right:91.6666666667%}#bootstrap-theme .col-lg-pull-12{right:100%}#bootstrap-theme .col-lg-push-0{left:auto}#bootstrap-theme .col-lg-push-1{left:8.3333333333%}#bootstrap-theme .col-lg-push-2{left:16.6666666667%}#bootstrap-theme .col-lg-push-3{left:25%}#bootstrap-theme .col-lg-push-4{left:33.3333333333%}#bootstrap-theme .col-lg-push-5{left:41.6666666667%}#bootstrap-theme .col-lg-push-6{left:50%}#bootstrap-theme .col-lg-push-7{left:58.3333333333%}#bootstrap-theme .col-lg-push-8{left:66.6666666667%}#bootstrap-theme .col-lg-push-9{left:75%}#bootstrap-theme .col-lg-push-10{left:83.3333333333%}#bootstrap-theme .col-lg-push-11{left:91.6666666667%}#bootstrap-theme .col-lg-push-12{left:100%}#bootstrap-theme .col-lg-offset-0{margin-left:0}#bootstrap-theme .col-lg-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-lg-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-lg-offset-3{margin-left:25%}#bootstrap-theme .col-lg-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-lg-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-lg-offset-6{margin-left:50%}#bootstrap-theme .col-lg-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-lg-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-lg-offset-9{margin-left:75%}#bootstrap-theme .col-lg-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-lg-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-lg-offset-12{margin-left:100%}}#bootstrap-theme table{background-color:transparent}#bootstrap-theme table col[class*=col-]{position:static;display:table-column;float:none}#bootstrap-theme table td[class*=col-],#bootstrap-theme table th[class*=col-]{position:static;display:table-cell;float:none}#bootstrap-theme caption{padding-top:8px;padding-bottom:8px;color:#999;text-align:left}#bootstrap-theme th{text-align:left}#bootstrap-theme .table{width:100%;max-width:100%;margin-bottom:20px}#bootstrap-theme .table>thead>tr>th,#bootstrap-theme .table>thead>tr>td,#bootstrap-theme .table>tbody>tr>th,#bootstrap-theme .table>tbody>tr>td,#bootstrap-theme .table>tfoot>tr>th,#bootstrap-theme .table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}#bootstrap-theme .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}#bootstrap-theme .table>caption+thead>tr:first-child>th,#bootstrap-theme .table>caption+thead>tr:first-child>td,#bootstrap-theme .table>colgroup+thead>tr:first-child>th,#bootstrap-theme .table>colgroup+thead>tr:first-child>td,#bootstrap-theme .table>thead:first-child>tr:first-child>th,#bootstrap-theme .table>thead:first-child>tr:first-child>td{border-top:0}#bootstrap-theme .table>tbody+tbody{border-top:2px solid #ddd}#bootstrap-theme .table .table{background-color:#fff}#bootstrap-theme .table-condensed>thead>tr>th,#bootstrap-theme .table-condensed>thead>tr>td,#bootstrap-theme .table-condensed>tbody>tr>th,#bootstrap-theme .table-condensed>tbody>tr>td,#bootstrap-theme .table-condensed>tfoot>tr>th,#bootstrap-theme .table-condensed>tfoot>tr>td{padding:5px}#bootstrap-theme .table-bordered{border:1px solid #ddd}#bootstrap-theme .table-bordered>thead>tr>th,#bootstrap-theme .table-bordered>thead>tr>td,#bootstrap-theme .table-bordered>tbody>tr>th,#bootstrap-theme .table-bordered>tbody>tr>td,#bootstrap-theme .table-bordered>tfoot>tr>th,#bootstrap-theme .table-bordered>tfoot>tr>td{border:1px solid #ddd}#bootstrap-theme .table-bordered>thead>tr>th,#bootstrap-theme .table-bordered>thead>tr>td{border-bottom-width:2px}#bootstrap-theme .table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}#bootstrap-theme .table-hover>tbody>tr:hover{background-color:#f5f5f5}#bootstrap-theme .table>thead>tr>td.active,#bootstrap-theme .table>thead>tr>th.active,#bootstrap-theme .table>thead>tr.active>td,#bootstrap-theme .table>thead>tr.active>th,#bootstrap-theme .table>tbody>tr>td.active,#bootstrap-theme .table>tbody>tr>th.active,#bootstrap-theme .table>tbody>tr.active>td,#bootstrap-theme .table>tbody>tr.active>th,#bootstrap-theme .table>tfoot>tr>td.active,#bootstrap-theme .table>tfoot>tr>th.active,#bootstrap-theme .table>tfoot>tr.active>td,#bootstrap-theme .table>tfoot>tr.active>th{background-color:#f5f5f5}#bootstrap-theme .table-hover>tbody>tr>td.active:hover,#bootstrap-theme .table-hover>tbody>tr>th.active:hover,#bootstrap-theme .table-hover>tbody>tr.active:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.active,#bootstrap-theme .table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}#bootstrap-theme .table>thead>tr>td.success,#bootstrap-theme .table>thead>tr>th.success,#bootstrap-theme .table>thead>tr.success>td,#bootstrap-theme .table>thead>tr.success>th,#bootstrap-theme .table>tbody>tr>td.success,#bootstrap-theme .table>tbody>tr>th.success,#bootstrap-theme .table>tbody>tr.success>td,#bootstrap-theme .table>tbody>tr.success>th,#bootstrap-theme .table>tfoot>tr>td.success,#bootstrap-theme .table>tfoot>tr>th.success,#bootstrap-theme .table>tfoot>tr.success>td,#bootstrap-theme .table>tfoot>tr.success>th{background-color:#dff0d8}#bootstrap-theme .table-hover>tbody>tr>td.success:hover,#bootstrap-theme .table-hover>tbody>tr>th.success:hover,#bootstrap-theme .table-hover>tbody>tr.success:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.success,#bootstrap-theme .table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}#bootstrap-theme .table>thead>tr>td.info,#bootstrap-theme .table>thead>tr>th.info,#bootstrap-theme .table>thead>tr.info>td,#bootstrap-theme .table>thead>tr.info>th,#bootstrap-theme .table>tbody>tr>td.info,#bootstrap-theme .table>tbody>tr>th.info,#bootstrap-theme .table>tbody>tr.info>td,#bootstrap-theme .table>tbody>tr.info>th,#bootstrap-theme .table>tfoot>tr>td.info,#bootstrap-theme .table>tfoot>tr>th.info,#bootstrap-theme .table>tfoot>tr.info>td,#bootstrap-theme .table>tfoot>tr.info>th{background-color:#d9edf7}#bootstrap-theme .table-hover>tbody>tr>td.info:hover,#bootstrap-theme .table-hover>tbody>tr>th.info:hover,#bootstrap-theme .table-hover>tbody>tr.info:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.info,#bootstrap-theme .table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}#bootstrap-theme .table>thead>tr>td.warning,#bootstrap-theme .table>thead>tr>th.warning,#bootstrap-theme .table>thead>tr.warning>td,#bootstrap-theme .table>thead>tr.warning>th,#bootstrap-theme .table>tbody>tr>td.warning,#bootstrap-theme .table>tbody>tr>th.warning,#bootstrap-theme .table>tbody>tr.warning>td,#bootstrap-theme .table>tbody>tr.warning>th,#bootstrap-theme .table>tfoot>tr>td.warning,#bootstrap-theme .table>tfoot>tr>th.warning,#bootstrap-theme .table>tfoot>tr.warning>td,#bootstrap-theme .table>tfoot>tr.warning>th{background-color:#fcf8e3}#bootstrap-theme .table-hover>tbody>tr>td.warning:hover,#bootstrap-theme .table-hover>tbody>tr>th.warning:hover,#bootstrap-theme .table-hover>tbody>tr.warning:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.warning,#bootstrap-theme .table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}#bootstrap-theme .table>thead>tr>td.danger,#bootstrap-theme .table>thead>tr>th.danger,#bootstrap-theme .table>thead>tr.danger>td,#bootstrap-theme .table>thead>tr.danger>th,#bootstrap-theme .table>tbody>tr>td.danger,#bootstrap-theme .table>tbody>tr>th.danger,#bootstrap-theme .table>tbody>tr.danger>td,#bootstrap-theme .table>tbody>tr.danger>th,#bootstrap-theme .table>tfoot>tr>td.danger,#bootstrap-theme .table>tfoot>tr>th.danger,#bootstrap-theme .table>tfoot>tr.danger>td,#bootstrap-theme .table>tfoot>tr.danger>th{background-color:#f2dede}#bootstrap-theme .table-hover>tbody>tr>td.danger:hover,#bootstrap-theme .table-hover>tbody>tr>th.danger:hover,#bootstrap-theme .table-hover>tbody>tr.danger:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.danger,#bootstrap-theme .table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}#bootstrap-theme .table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){#bootstrap-theme .table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}#bootstrap-theme .table-responsive>.table{margin-bottom:0}#bootstrap-theme .table-responsive>.table>thead>tr>th,#bootstrap-theme .table-responsive>.table>thead>tr>td,#bootstrap-theme .table-responsive>.table>tbody>tr>th,#bootstrap-theme .table-responsive>.table>tbody>tr>td,#bootstrap-theme .table-responsive>.table>tfoot>tr>th,#bootstrap-theme .table-responsive>.table>tfoot>tr>td{white-space:nowrap}#bootstrap-theme .table-responsive>.table-bordered{border:0}#bootstrap-theme .table-responsive>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}#bootstrap-theme .table-responsive>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}#bootstrap-theme .table-responsive>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr:last-child>th,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}#bootstrap-theme fieldset{min-width:0;padding:0;margin:0;border:0}#bootstrap-theme legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#555;border:0;border-bottom:1px solid #e5e5e5}#bootstrap-theme label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}#bootstrap-theme input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}#bootstrap-theme input[type=radio],#bootstrap-theme input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}#bootstrap-theme input[type=radio][disabled],#bootstrap-theme input[type=radio].disabled,fieldset[disabled] #bootstrap-theme input[type=radio],#bootstrap-theme input[type=checkbox][disabled],#bootstrap-theme input[type=checkbox].disabled,fieldset[disabled] #bootstrap-theme input[type=checkbox]{cursor:not-allowed}#bootstrap-theme input[type=file]{display:block}#bootstrap-theme input[type=range]{display:block;width:100%}#bootstrap-theme select[multiple],#bootstrap-theme select[size]{height:auto}#bootstrap-theme input[type=file]:focus,#bootstrap-theme input[type=radio]:focus,#bootstrap-theme input[type=checkbox]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme output{display:block;padding-top:5px;font-size:14px;line-height:1.428571429;color:#555}#bootstrap-theme .form-control{display:block;width:100%;height:30px;padding:4px 8px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}#bootstrap-theme .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}#bootstrap-theme .form-control::-moz-placeholder{color:#999;opacity:1}#bootstrap-theme .form-control:-ms-input-placeholder{color:#999}#bootstrap-theme .form-control::-webkit-input-placeholder{color:#999}#bootstrap-theme .form-control::-ms-expand{background-color:transparent;border:0}#bootstrap-theme .form-control[disabled],#bootstrap-theme .form-control[readonly],fieldset[disabled] #bootstrap-theme .form-control{background-color:#eee;opacity:1}#bootstrap-theme .form-control[disabled],fieldset[disabled] #bootstrap-theme .form-control{cursor:not-allowed}#bootstrap-theme textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){#bootstrap-theme input[type=date].form-control,#bootstrap-theme input[type=time].form-control,#bootstrap-theme input[type=datetime-local].form-control,#bootstrap-theme input[type=month].form-control{line-height:30px}#bootstrap-theme input[type=date].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=date],#bootstrap-theme .input-group-sm>input.input-group-addon[type=date],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=date],.input-group-sm #bootstrap-theme input[type=date],#bootstrap-theme input[type=time].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=time],#bootstrap-theme .input-group-sm>input.input-group-addon[type=time],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=time],.input-group-sm #bootstrap-theme input[type=time],#bootstrap-theme input[type=datetime-local].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=datetime-local],#bootstrap-theme .input-group-sm>input.input-group-addon[type=datetime-local],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=datetime-local],.input-group-sm #bootstrap-theme input[type=datetime-local],#bootstrap-theme input[type=month].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=month],#bootstrap-theme .input-group-sm>input.input-group-addon[type=month],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=month],.input-group-sm #bootstrap-theme input[type=month]{line-height:30px}#bootstrap-theme input[type=date].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=date],#bootstrap-theme .input-group-lg>input.input-group-addon[type=date],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=date],.input-group-lg #bootstrap-theme input[type=date],#bootstrap-theme input[type=time].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=time],#bootstrap-theme .input-group-lg>input.input-group-addon[type=time],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=time],.input-group-lg #bootstrap-theme input[type=time],#bootstrap-theme input[type=datetime-local].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=datetime-local],#bootstrap-theme .input-group-lg>input.input-group-addon[type=datetime-local],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=datetime-local],.input-group-lg #bootstrap-theme input[type=datetime-local],#bootstrap-theme input[type=month].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=month],#bootstrap-theme .input-group-lg>input.input-group-addon[type=month],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=month],.input-group-lg #bootstrap-theme input[type=month]{line-height:54px}}#bootstrap-theme .form-group{margin-bottom:15px}#bootstrap-theme .radio,#bootstrap-theme .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}#bootstrap-theme .radio.disabled label,fieldset[disabled] #bootstrap-theme .radio label,#bootstrap-theme .checkbox.disabled label,fieldset[disabled] #bootstrap-theme .checkbox label{cursor:not-allowed}#bootstrap-theme .radio label,#bootstrap-theme .checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}#bootstrap-theme .radio input[type=radio],#bootstrap-theme .radio-inline input[type=radio],#bootstrap-theme .checkbox input[type=checkbox],#bootstrap-theme .checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}#bootstrap-theme .radio+.radio,#bootstrap-theme .checkbox+.checkbox{margin-top:-5px}#bootstrap-theme .radio-inline,#bootstrap-theme .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}#bootstrap-theme .radio-inline.disabled,fieldset[disabled] #bootstrap-theme .radio-inline,#bootstrap-theme .checkbox-inline.disabled,fieldset[disabled] #bootstrap-theme .checkbox-inline{cursor:not-allowed}#bootstrap-theme .radio-inline+.radio-inline,#bootstrap-theme .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}#bootstrap-theme .form-control-static{min-height:34px;padding-top:5px;padding-bottom:5px;margin-bottom:0}#bootstrap-theme .form-control-static.input-lg,#bootstrap-theme .input-group-lg>.form-control-static.form-control,#bootstrap-theme .input-group-lg>.form-control-static.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.form-control-static.btn,#bootstrap-theme .form-control-static.input-sm,#bootstrap-theme .input-group-sm>.form-control-static.form-control,#bootstrap-theme .input-group-sm>.form-control-static.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}#bootstrap-theme .input-sm,#bootstrap-theme .input-group-sm>.form-control,#bootstrap-theme .input-group-sm>.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme select.input-sm,#bootstrap-theme .input-group-sm>select.form-control,#bootstrap-theme .input-group-sm>select.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>select.btn{height:30px;line-height:30px}#bootstrap-theme textarea.input-sm,#bootstrap-theme .input-group-sm>textarea.form-control,#bootstrap-theme .input-group-sm>textarea.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>textarea.btn,#bootstrap-theme select[multiple].input-sm,#bootstrap-theme .input-group-sm>select.form-control[multiple],#bootstrap-theme .input-group-sm>select.input-group-addon[multiple],#bootstrap-theme .input-group-sm>.input-group-btn>select.btn[multiple]{height:auto}#bootstrap-theme .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .form-group-sm select.form-control{height:30px;line-height:30px}#bootstrap-theme .form-group-sm textarea.form-control,#bootstrap-theme .form-group-sm select[multiple].form-control{height:auto}#bootstrap-theme .form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}#bootstrap-theme .input-lg,#bootstrap-theme .input-group-lg>.form-control,#bootstrap-theme .input-group-lg>.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme select.input-lg,#bootstrap-theme .input-group-lg>select.form-control,#bootstrap-theme .input-group-lg>select.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>select.btn{height:54px;line-height:54px}#bootstrap-theme textarea.input-lg,#bootstrap-theme .input-group-lg>textarea.form-control,#bootstrap-theme .input-group-lg>textarea.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>textarea.btn,#bootstrap-theme select[multiple].input-lg,#bootstrap-theme .input-group-lg>select.form-control[multiple],#bootstrap-theme .input-group-lg>select.input-group-addon[multiple],#bootstrap-theme .input-group-lg>.input-group-btn>select.btn[multiple]{height:auto}#bootstrap-theme .form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme .form-group-lg select.form-control{height:54px;line-height:54px}#bootstrap-theme .form-group-lg textarea.form-control,#bootstrap-theme .form-group-lg select[multiple].form-control{height:auto}#bootstrap-theme .form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}#bootstrap-theme .has-feedback{position:relative}#bootstrap-theme .has-feedback .form-control{padding-right:37.5px}#bootstrap-theme .form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:30px;height:30px;line-height:30px;text-align:center;pointer-events:none}#bootstrap-theme .input-lg+.form-control-feedback,#bootstrap-theme .input-group-lg>.form-control+.form-control-feedback,#bootstrap-theme .input-group-lg>.input-group-addon+.form-control-feedback,#bootstrap-theme .input-group-lg>.input-group-btn>.btn+.form-control-feedback,#bootstrap-theme .input-group-lg+.form-control-feedback,#bootstrap-theme .form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}#bootstrap-theme .input-sm+.form-control-feedback,#bootstrap-theme .input-group-sm>.form-control+.form-control-feedback,#bootstrap-theme .input-group-sm>.input-group-addon+.form-control-feedback,#bootstrap-theme .input-group-sm>.input-group-btn>.btn+.form-control-feedback,#bootstrap-theme .input-group-sm+.form-control-feedback,#bootstrap-theme .form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}#bootstrap-theme .has-success .help-block,#bootstrap-theme .has-success .control-label,#bootstrap-theme .has-success .radio,#bootstrap-theme .has-success .checkbox,#bootstrap-theme .has-success .radio-inline,#bootstrap-theme .has-success .checkbox-inline,#bootstrap-theme .has-success.radio label,#bootstrap-theme .has-success.checkbox label,#bootstrap-theme .has-success.radio-inline label,#bootstrap-theme .has-success.checkbox-inline label{color:#468847}#bootstrap-theme .has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}#bootstrap-theme .has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}#bootstrap-theme .has-success .form-control-feedback{color:#468847}#bootstrap-theme .has-warning .help-block,#bootstrap-theme .has-warning .control-label,#bootstrap-theme .has-warning .radio,#bootstrap-theme .has-warning .checkbox,#bootstrap-theme .has-warning .radio-inline,#bootstrap-theme .has-warning .checkbox-inline,#bootstrap-theme .has-warning.radio label,#bootstrap-theme .has-warning.checkbox label,#bootstrap-theme .has-warning.radio-inline label,#bootstrap-theme .has-warning.checkbox-inline label{color:#c09853}#bootstrap-theme .has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}#bootstrap-theme .has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}#bootstrap-theme .has-warning .form-control-feedback{color:#c09853}#bootstrap-theme .has-error .help-block,#bootstrap-theme .has-error .control-label,#bootstrap-theme .has-error .radio,#bootstrap-theme .has-error .checkbox,#bootstrap-theme .has-error .radio-inline,#bootstrap-theme .has-error .checkbox-inline,#bootstrap-theme .has-error.radio label,#bootstrap-theme .has-error.checkbox label,#bootstrap-theme .has-error.radio-inline label,#bootstrap-theme .has-error.checkbox-inline label{color:#b94a48}#bootstrap-theme .has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}#bootstrap-theme .has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}#bootstrap-theme .has-error .form-control-feedback{color:#b94a48}#bootstrap-theme .has-feedback label~.form-control-feedback{top:25px}#bootstrap-theme .has-feedback label.sr-only~.form-control-feedback{top:0}#bootstrap-theme .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#959595}@media (min-width:768px){#bootstrap-theme .form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}#bootstrap-theme .form-inline .form-control-static{display:inline-block}#bootstrap-theme .form-inline .input-group{display:inline-table;vertical-align:middle}#bootstrap-theme .form-inline .input-group .input-group-addon,#bootstrap-theme .form-inline .input-group .input-group-btn,#bootstrap-theme .form-inline .input-group .form-control{width:auto}#bootstrap-theme .form-inline .input-group>.form-control{width:100%}#bootstrap-theme .form-inline .control-label{margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .radio,#bootstrap-theme .form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .radio label,#bootstrap-theme .form-inline .checkbox label{padding-left:0}#bootstrap-theme .form-inline .radio input[type=radio],#bootstrap-theme .form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}#bootstrap-theme .form-inline .has-feedback .form-control-feedback{top:0}}#bootstrap-theme .form-horizontal .radio,#bootstrap-theme .form-horizontal .checkbox,#bootstrap-theme .form-horizontal .radio-inline,#bootstrap-theme .form-horizontal .checkbox-inline{padding-top:5px;margin-top:0;margin-bottom:0}#bootstrap-theme .form-horizontal .radio,#bootstrap-theme .form-horizontal .checkbox{min-height:25px}#bootstrap-theme .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}#bootstrap-theme .form-horizontal .form-group:before,#bootstrap-theme .form-horizontal .form-group:after{display:table;content:" "}#bootstrap-theme .form-horizontal .form-group:after{clear:both}@media (min-width:768px){#bootstrap-theme .form-horizontal .control-label{padding-top:5px;margin-bottom:0;text-align:right}}#bootstrap-theme .form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){#bootstrap-theme .form-horizontal .form-group-lg .control-label{padding-top:15px;font-size:18px}}@media (min-width:768px){#bootstrap-theme .form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}#bootstrap-theme .btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:4px 8px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#bootstrap-theme .btn:focus,#bootstrap-theme .btn.focus,#bootstrap-theme .btn:active:focus,#bootstrap-theme .btn:active.focus,#bootstrap-theme .btn.active:focus,#bootstrap-theme .btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme .btn:hover,#bootstrap-theme .btn:focus,#bootstrap-theme .btn.focus{color:#fff;text-decoration:none}#bootstrap-theme .btn:active,#bootstrap-theme .btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}#bootstrap-theme .btn.disabled,#bootstrap-theme .btn[disabled],fieldset[disabled] #bootstrap-theme .btn{cursor:not-allowed;-webkit-filter:alpha(opacity=65);filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme a.btn.disabled,fieldset[disabled] #bootstrap-theme a.btn{pointer-events:none}#bootstrap-theme .btn-default{color:#fff;background-color:#70716b;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:focus,#bootstrap-theme .btn-default.focus{color:#fff;background-color:#565752;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:hover{color:#fff;background-color:#565752;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:active,#bootstrap-theme .btn-default.active,.open>#bootstrap-theme .btn-default.dropdown-toggle{color:#fff;background-color:#565752;background-image:none;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:active:hover,#bootstrap-theme .btn-default:active:focus,#bootstrap-theme .btn-default:active.focus,#bootstrap-theme .btn-default.active:hover,#bootstrap-theme .btn-default.active:focus,#bootstrap-theme .btn-default.active.focus,.open>#bootstrap-theme .btn-default.dropdown-toggle:hover,.open>#bootstrap-theme .btn-default.dropdown-toggle:focus,.open>#bootstrap-theme .btn-default.dropdown-toggle.focus{color:#fff;background-color:#444441;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default.disabled:hover,#bootstrap-theme .btn-default.disabled:focus,#bootstrap-theme .btn-default.disabled.focus,#bootstrap-theme .btn-default[disabled]:hover,#bootstrap-theme .btn-default[disabled]:focus,#bootstrap-theme .btn-default[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-default:hover,fieldset[disabled] #bootstrap-theme .btn-default:focus,fieldset[disabled] #bootstrap-theme .btn-default.focus{background-color:#70716b;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default .badge{color:#70716b;background-color:#fff}#bootstrap-theme .btn-primary{color:#fff;background-color:#70716b;border-color:#70716b}#bootstrap-theme .btn-primary:focus,#bootstrap-theme .btn-primary.focus{color:#fff;background-color:#565752;border-color:#2f302d}#bootstrap-theme .btn-primary:hover{color:#fff;background-color:#565752;border-color:#51524d}#bootstrap-theme .btn-primary:active,#bootstrap-theme .btn-primary.active,.open>#bootstrap-theme .btn-primary.dropdown-toggle{color:#fff;background-color:#565752;background-image:none;border-color:#51524d}#bootstrap-theme .btn-primary:active:hover,#bootstrap-theme .btn-primary:active:focus,#bootstrap-theme .btn-primary:active.focus,#bootstrap-theme .btn-primary.active:hover,#bootstrap-theme .btn-primary.active:focus,#bootstrap-theme .btn-primary.active.focus,.open>#bootstrap-theme .btn-primary.dropdown-toggle:hover,.open>#bootstrap-theme .btn-primary.dropdown-toggle:focus,.open>#bootstrap-theme .btn-primary.dropdown-toggle.focus{color:#fff;background-color:#444441;border-color:#2f302d}#bootstrap-theme .btn-primary.disabled:hover,#bootstrap-theme .btn-primary.disabled:focus,#bootstrap-theme .btn-primary.disabled.focus,#bootstrap-theme .btn-primary[disabled]:hover,#bootstrap-theme .btn-primary[disabled]:focus,#bootstrap-theme .btn-primary[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-primary:hover,fieldset[disabled] #bootstrap-theme .btn-primary:focus,fieldset[disabled] #bootstrap-theme .btn-primary.focus{background-color:#70716b;border-color:#70716b}#bootstrap-theme .btn-primary .badge{color:#70716b;background-color:#fff}#bootstrap-theme .btn-success{color:#fff;background-color:#73a839;border-color:#73a839}#bootstrap-theme .btn-success:focus,#bootstrap-theme .btn-success.focus{color:#fff;background-color:#59822c;border-color:#324919}#bootstrap-theme .btn-success:hover{color:#fff;background-color:#59822c;border-color:#547a29}#bootstrap-theme .btn-success:active,#bootstrap-theme .btn-success.active,.open>#bootstrap-theme .btn-success.dropdown-toggle{color:#fff;background-color:#59822c;background-image:none;border-color:#547a29}#bootstrap-theme .btn-success:active:hover,#bootstrap-theme .btn-success:active:focus,#bootstrap-theme .btn-success:active.focus,#bootstrap-theme .btn-success.active:hover,#bootstrap-theme .btn-success.active:focus,#bootstrap-theme .btn-success.active.focus,.open>#bootstrap-theme .btn-success.dropdown-toggle:hover,.open>#bootstrap-theme .btn-success.dropdown-toggle:focus,.open>#bootstrap-theme .btn-success.dropdown-toggle.focus{color:#fff;background-color:#476723;border-color:#324919}#bootstrap-theme .btn-success.disabled:hover,#bootstrap-theme .btn-success.disabled:focus,#bootstrap-theme .btn-success.disabled.focus,#bootstrap-theme .btn-success[disabled]:hover,#bootstrap-theme .btn-success[disabled]:focus,#bootstrap-theme .btn-success[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-success:hover,fieldset[disabled] #bootstrap-theme .btn-success:focus,fieldset[disabled] #bootstrap-theme .btn-success.focus{background-color:#73a839;border-color:#73a839}#bootstrap-theme .btn-success .badge{color:#73a839;background-color:#fff}#bootstrap-theme .btn-info{color:#000;background-color:#cde8fe;border-color:#cde8fe}#bootstrap-theme .btn-info:focus,#bootstrap-theme .btn-info.focus{color:#000;background-color:#9bd1fd;border-color:#50affc}#bootstrap-theme .btn-info:hover{color:#000;background-color:#9bd1fd;border-color:#91ccfd}#bootstrap-theme .btn-info:active,#bootstrap-theme .btn-info.active,.open>#bootstrap-theme .btn-info.dropdown-toggle{color:#000;background-color:#9bd1fd;background-image:none;border-color:#91ccfd}#bootstrap-theme .btn-info:active:hover,#bootstrap-theme .btn-info:active:focus,#bootstrap-theme .btn-info:active.focus,#bootstrap-theme .btn-info.active:hover,#bootstrap-theme .btn-info.active:focus,#bootstrap-theme .btn-info.active.focus,.open>#bootstrap-theme .btn-info.dropdown-toggle:hover,.open>#bootstrap-theme .btn-info.dropdown-toggle:focus,.open>#bootstrap-theme .btn-info.dropdown-toggle.focus{color:#000;background-color:#78c1fc;border-color:#50affc}#bootstrap-theme .btn-info.disabled:hover,#bootstrap-theme .btn-info.disabled:focus,#bootstrap-theme .btn-info.disabled.focus,#bootstrap-theme .btn-info[disabled]:hover,#bootstrap-theme .btn-info[disabled]:focus,#bootstrap-theme .btn-info[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-info:hover,fieldset[disabled] #bootstrap-theme .btn-info:focus,fieldset[disabled] #bootstrap-theme .btn-info.focus{background-color:#cde8fe;border-color:#cde8fe}#bootstrap-theme .btn-info .badge{color:#cde8fe;background-color:#000}#bootstrap-theme .btn-warning{color:#fff;background-color:#dd5600;border-color:#dd5600}#bootstrap-theme .btn-warning:focus,#bootstrap-theme .btn-warning.focus{color:#fff;background-color:#aa4200;border-color:#5e2400}#bootstrap-theme .btn-warning:hover{color:#fff;background-color:#aa4200;border-color:#a03e00}#bootstrap-theme .btn-warning:active,#bootstrap-theme .btn-warning.active,.open>#bootstrap-theme .btn-warning.dropdown-toggle{color:#fff;background-color:#aa4200;background-image:none;border-color:#a03e00}#bootstrap-theme .btn-warning:active:hover,#bootstrap-theme .btn-warning:active:focus,#bootstrap-theme .btn-warning:active.focus,#bootstrap-theme .btn-warning.active:hover,#bootstrap-theme .btn-warning.active:focus,#bootstrap-theme .btn-warning.active.focus,.open>#bootstrap-theme .btn-warning.dropdown-toggle:hover,.open>#bootstrap-theme .btn-warning.dropdown-toggle:focus,.open>#bootstrap-theme .btn-warning.dropdown-toggle.focus{color:#fff;background-color:#863400;border-color:#5e2400}#bootstrap-theme .btn-warning.disabled:hover,#bootstrap-theme .btn-warning.disabled:focus,#bootstrap-theme .btn-warning.disabled.focus,#bootstrap-theme .btn-warning[disabled]:hover,#bootstrap-theme .btn-warning[disabled]:focus,#bootstrap-theme .btn-warning[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-warning:hover,fieldset[disabled] #bootstrap-theme .btn-warning:focus,fieldset[disabled] #bootstrap-theme .btn-warning.focus{background-color:#dd5600;border-color:#dd5600}#bootstrap-theme .btn-warning .badge{color:#dd5600;background-color:#fff}#bootstrap-theme .btn-danger{color:#fff;background-color:#c71c22;border-color:#c71c22}#bootstrap-theme .btn-danger:focus,#bootstrap-theme .btn-danger.focus{color:#fff;background-color:#9a161a;border-color:#570c0f}#bootstrap-theme .btn-danger:hover{color:#fff;background-color:#9a161a;border-color:#911419}#bootstrap-theme .btn-danger:active,#bootstrap-theme .btn-danger.active,.open>#bootstrap-theme .btn-danger.dropdown-toggle{color:#fff;background-color:#9a161a;background-image:none;border-color:#911419}#bootstrap-theme .btn-danger:active:hover,#bootstrap-theme .btn-danger:active:focus,#bootstrap-theme .btn-danger:active.focus,#bootstrap-theme .btn-danger.active:hover,#bootstrap-theme .btn-danger.active:focus,#bootstrap-theme .btn-danger.active.focus,.open>#bootstrap-theme .btn-danger.dropdown-toggle:hover,.open>#bootstrap-theme .btn-danger.dropdown-toggle:focus,.open>#bootstrap-theme .btn-danger.dropdown-toggle.focus{color:#fff;background-color:#7b1115;border-color:#570c0f}#bootstrap-theme .btn-danger.disabled:hover,#bootstrap-theme .btn-danger.disabled:focus,#bootstrap-theme .btn-danger.disabled.focus,#bootstrap-theme .btn-danger[disabled]:hover,#bootstrap-theme .btn-danger[disabled]:focus,#bootstrap-theme .btn-danger[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-danger:hover,fieldset[disabled] #bootstrap-theme .btn-danger:focus,fieldset[disabled] #bootstrap-theme .btn-danger.focus{background-color:#c71c22;border-color:#c71c22}#bootstrap-theme .btn-danger .badge{color:#c71c22;background-color:#fff}#bootstrap-theme .btn-link{font-weight:400;color:#2786c2;border-radius:0}#bootstrap-theme .btn-link,#bootstrap-theme .btn-link:active,#bootstrap-theme .btn-link.active,#bootstrap-theme .btn-link[disabled],fieldset[disabled] #bootstrap-theme .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme .btn-link,#bootstrap-theme .btn-link:hover,#bootstrap-theme .btn-link:focus,#bootstrap-theme .btn-link:active{border-color:transparent}#bootstrap-theme .btn-link:hover,#bootstrap-theme .btn-link:focus{color:#1a5a82;text-decoration:underline;background-color:transparent}#bootstrap-theme .btn-link[disabled]:hover,#bootstrap-theme .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .btn-link:hover,fieldset[disabled] #bootstrap-theme .btn-link:focus{color:#999;text-decoration:none}#bootstrap-theme .btn-lg,#bootstrap-theme .btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme .btn-sm,#bootstrap-theme .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .btn-xs,#bootstrap-theme .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .btn-block{display:block;width:100%}#bootstrap-theme .btn-block+.btn-block{margin-top:5px}#bootstrap-theme input[type=submit].btn-block,#bootstrap-theme input[type=reset].btn-block,#bootstrap-theme input[type=button].btn-block{width:100%}#bootstrap-theme .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}#bootstrap-theme .fade.in{opacity:1}#bootstrap-theme .collapse{display:none}#bootstrap-theme .collapse.in{display:block}#bootstrap-theme tr.collapse.in{display:table-row}#bootstrap-theme tbody.collapse.in{display:table-row-group}#bootstrap-theme .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}#bootstrap-theme .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}#bootstrap-theme .dropup,#bootstrap-theme .dropdown{position:relative}#bootstrap-theme .dropdown-toggle:focus{outline:0}#bootstrap-theme .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;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}#bootstrap-theme .dropdown-menu.pull-right{right:0;left:auto}#bootstrap-theme .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}#bootstrap-theme .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}#bootstrap-theme .dropdown-menu>li>a:hover,#bootstrap-theme .dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#000}#bootstrap-theme .dropdown-menu>.active>a,#bootstrap-theme .dropdown-menu>.active>a:hover,#bootstrap-theme .dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#000;outline:0}#bootstrap-theme .dropdown-menu>.disabled>a,#bootstrap-theme .dropdown-menu>.disabled>a:hover,#bootstrap-theme .dropdown-menu>.disabled>a:focus{color:#999}#bootstrap-theme .dropdown-menu>.disabled>a:hover,#bootstrap-theme .dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;-webkit-filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}#bootstrap-theme .open>.dropdown-menu{display:block}#bootstrap-theme .open>a{outline:0}#bootstrap-theme .dropdown-menu-right{right:0;left:auto}#bootstrap-theme .dropdown-menu-left{right:auto;left:0}#bootstrap-theme .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999;white-space:nowrap}#bootstrap-theme .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}#bootstrap-theme .pull-right>.dropdown-menu{right:0;left:auto}#bootstrap-theme .dropup .caret,#bootstrap-theme .navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9}#bootstrap-theme .dropup .dropdown-menu,#bootstrap-theme .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){#bootstrap-theme .navbar-right .dropdown-menu{right:0;left:auto}#bootstrap-theme .navbar-right .dropdown-menu-left{left:0;right:auto}}#bootstrap-theme .btn-group,#bootstrap-theme .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}#bootstrap-theme .btn-group>.btn,#bootstrap-theme .btn-group-vertical>.btn{position:relative;float:left}#bootstrap-theme .btn-group>.btn:hover,#bootstrap-theme .btn-group>.btn:focus,#bootstrap-theme .btn-group>.btn:active,#bootstrap-theme .btn-group>.btn.active,#bootstrap-theme .btn-group-vertical>.btn:hover,#bootstrap-theme .btn-group-vertical>.btn:focus,#bootstrap-theme .btn-group-vertical>.btn:active,#bootstrap-theme .btn-group-vertical>.btn.active{z-index:2}#bootstrap-theme .btn-group .btn+.btn,#bootstrap-theme .btn-group .btn+.btn-group,#bootstrap-theme .btn-group .btn-group+.btn,#bootstrap-theme .btn-group .btn-group+.btn-group{margin-left:-1px}#bootstrap-theme .btn-toolbar{margin-left:-5px}#bootstrap-theme .btn-toolbar:before,#bootstrap-theme .btn-toolbar:after{display:table;content:" "}#bootstrap-theme .btn-toolbar:after{clear:both}#bootstrap-theme .btn-toolbar .btn,#bootstrap-theme .btn-toolbar .btn-group,#bootstrap-theme .btn-toolbar .input-group{float:left}#bootstrap-theme .btn-toolbar>.btn,#bootstrap-theme .btn-toolbar>.btn-group,#bootstrap-theme .btn-toolbar>.input-group{margin-left:5px}#bootstrap-theme .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}#bootstrap-theme .btn-group>.btn:first-child{margin-left:0}#bootstrap-theme .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .btn-group>.btn:last-child:not(:first-child),#bootstrap-theme .btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group>.btn-group{float:left}#bootstrap-theme .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}#bootstrap-theme .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,#bootstrap-theme .btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group .dropdown-toggle:active,#bootstrap-theme .btn-group.open .dropdown-toggle{outline:0}#bootstrap-theme .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}#bootstrap-theme .btn-group>.btn-lg+.dropdown-toggle,#bootstrap-theme .btn-group-lg.btn-group>.btn+.dropdown-toggle,#bootstrap-theme .btn-group-lg>.btn-group>.btn+.dropdown-toggle{padding-right:12px;padding-left:12px}#bootstrap-theme .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}#bootstrap-theme .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme .btn .caret{margin-left:0}#bootstrap-theme .btn-lg .caret,#bootstrap-theme .btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}#bootstrap-theme .dropup .btn-lg .caret,#bootstrap-theme .dropup .btn-group-lg>.btn .caret{border-width:0 5px 5px}#bootstrap-theme .btn-group-vertical>.btn,#bootstrap-theme .btn-group-vertical>.btn-group,#bootstrap-theme .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}#bootstrap-theme .btn-group-vertical>.btn-group:before,#bootstrap-theme .btn-group-vertical>.btn-group:after{display:table;content:" "}#bootstrap-theme .btn-group-vertical>.btn-group:after{clear:both}#bootstrap-theme .btn-group-vertical>.btn-group>.btn{float:none}#bootstrap-theme .btn-group-vertical>.btn+.btn,#bootstrap-theme .btn-group-vertical>.btn+.btn-group,#bootstrap-theme .btn-group-vertical>.btn-group+.btn,#bootstrap-theme .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}#bootstrap-theme .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}#bootstrap-theme .btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}#bootstrap-theme .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,#bootstrap-theme .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}#bootstrap-theme .btn-group-justified>.btn,#bootstrap-theme .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}#bootstrap-theme .btn-group-justified>.btn-group .btn{width:100%}#bootstrap-theme .btn-group-justified>.btn-group .dropdown-menu{left:auto}#bootstrap-theme [data-toggle=buttons]>.btn input[type=radio],#bootstrap-theme [data-toggle=buttons]>.btn input[type=checkbox],#bootstrap-theme [data-toggle=buttons]>.btn-group>.btn input[type=radio],#bootstrap-theme [data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}#bootstrap-theme .input-group{position:relative;display:table;border-collapse:separate}#bootstrap-theme .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}#bootstrap-theme .input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}#bootstrap-theme .input-group .form-control:focus{z-index:3}#bootstrap-theme .input-group-addon,#bootstrap-theme .input-group-btn,#bootstrap-theme .input-group .form-control{display:table-cell}#bootstrap-theme .input-group-addon:not(:first-child):not(:last-child),#bootstrap-theme .input-group-btn:not(:first-child):not(:last-child),#bootstrap-theme .input-group .form-control:not(:first-child):not(:last-child){border-radius:0}#bootstrap-theme .input-group-addon,#bootstrap-theme .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}#bootstrap-theme .input-group-addon{padding:4px 8px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}#bootstrap-theme .input-group-addon.input-sm,#bootstrap-theme .input-group-sm>.input-group-addon.form-control,#bootstrap-theme .input-group-sm>.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.input-group-addon.btn{padding:5px 10px;font-size:12px;border-radius:3px}#bootstrap-theme .input-group-addon.input-lg,#bootstrap-theme .input-group-lg>.input-group-addon.form-control,#bootstrap-theme .input-group-lg>.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.input-group-addon.btn{padding:14px 16px;font-size:18px;border-radius:6px}#bootstrap-theme .input-group-addon input[type=radio],#bootstrap-theme .input-group-addon input[type=checkbox]{margin-top:0}#bootstrap-theme .input-group .form-control:first-child,#bootstrap-theme .input-group-addon:first-child,#bootstrap-theme .input-group-btn:first-child>.btn,#bootstrap-theme .input-group-btn:first-child>.btn-group>.btn,#bootstrap-theme .input-group-btn:first-child>.dropdown-toggle,#bootstrap-theme .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),#bootstrap-theme .input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .input-group-addon:first-child{border-right:0}#bootstrap-theme .input-group .form-control:last-child,#bootstrap-theme .input-group-addon:last-child,#bootstrap-theme .input-group-btn:last-child>.btn,#bootstrap-theme .input-group-btn:last-child>.btn-group>.btn,#bootstrap-theme .input-group-btn:last-child>.dropdown-toggle,#bootstrap-theme .input-group-btn:first-child>.btn:not(:first-child),#bootstrap-theme .input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .input-group-addon:last-child{border-left:0}#bootstrap-theme .input-group-btn{position:relative;font-size:0;white-space:nowrap}#bootstrap-theme .input-group-btn>.btn{position:relative}#bootstrap-theme .input-group-btn>.btn+.btn{margin-left:-1px}#bootstrap-theme .input-group-btn>.btn:hover,#bootstrap-theme .input-group-btn>.btn:focus,#bootstrap-theme .input-group-btn>.btn:active{z-index:2}#bootstrap-theme .input-group-btn:first-child>.btn,#bootstrap-theme .input-group-btn:first-child>.btn-group{margin-right:-1px}#bootstrap-theme .input-group-btn:last-child>.btn,#bootstrap-theme .input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}#bootstrap-theme .nav{padding-left:0;margin-bottom:0;list-style:none}#bootstrap-theme .nav:before,#bootstrap-theme .nav:after{display:table;content:" "}#bootstrap-theme .nav:after{clear:both}#bootstrap-theme .nav>li{position:relative;display:block}#bootstrap-theme .nav>li>a{position:relative;display:block;padding:10px 15px}#bootstrap-theme .nav>li>a:hover,#bootstrap-theme .nav>li>a:focus{text-decoration:none;background-color:#eee}#bootstrap-theme .nav>li.disabled>a{color:#999}#bootstrap-theme .nav>li.disabled>a:hover,#bootstrap-theme .nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}#bootstrap-theme .nav .open>a,#bootstrap-theme .nav .open>a:hover,#bootstrap-theme .nav .open>a:focus{background-color:#eee;border-color:#2786c2}#bootstrap-theme .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}#bootstrap-theme .nav>li>a>img{max-width:none}#bootstrap-theme .nav-tabs{border-bottom:1px solid #ddd}#bootstrap-theme .nav-tabs>li{float:left;margin-bottom:-1px}#bootstrap-theme .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}#bootstrap-theme .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}#bootstrap-theme .nav-tabs>li.active>a,#bootstrap-theme .nav-tabs>li.active>a:hover,#bootstrap-theme .nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}#bootstrap-theme .nav-pills>li{float:left}#bootstrap-theme .nav-pills>li>a{border-radius:4px}#bootstrap-theme .nav-pills>li+li{margin-left:2px}#bootstrap-theme .nav-pills>li.active>a,#bootstrap-theme .nav-pills>li.active>a:hover,#bootstrap-theme .nav-pills>li.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .nav-stacked>li{float:none}#bootstrap-theme .nav-stacked>li+li{margin-top:2px;margin-left:0}#bootstrap-theme .nav-justified,#bootstrap-theme .nav-tabs.nav-justified{width:100%}#bootstrap-theme .nav-justified>li,#bootstrap-theme .nav-tabs.nav-justified>li{float:none}#bootstrap-theme .nav-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}#bootstrap-theme .nav-justified>.dropdown .dropdown-menu,#bootstrap-theme .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){#bootstrap-theme .nav-justified>li,#bootstrap-theme .nav-tabs.nav-justified>li{display:table-cell;width:1%}#bootstrap-theme .nav-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-bottom:0}}#bootstrap-theme .nav-tabs-justified,#bootstrap-theme .nav-tabs.nav-justified{border-bottom:0}#bootstrap-theme .nav-tabs-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}#bootstrap-theme .nav-tabs-justified>.active>a,#bootstrap-theme .nav-tabs.nav-justified>.active>a,#bootstrap-theme .nav-tabs-justified>.active>a:hover,#bootstrap-theme .nav-tabs.nav-justified>.active>a:hover,#bootstrap-theme .nav-tabs-justified>.active>a:focus,#bootstrap-theme .nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){#bootstrap-theme .nav-tabs-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}#bootstrap-theme .nav-tabs-justified>.active>a,#bootstrap-theme .nav-tabs.nav-justified>.active>a,#bootstrap-theme .nav-tabs-justified>.active>a:hover,#bootstrap-theme .nav-tabs.nav-justified>.active>a:hover,#bootstrap-theme .nav-tabs-justified>.active>a:focus,#bootstrap-theme .nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}#bootstrap-theme .tab-content>.tab-pane{display:none}#bootstrap-theme .tab-content>.active{display:block}#bootstrap-theme .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}#bootstrap-theme .navbar:before,#bootstrap-theme .navbar:after{display:table;content:" "}#bootstrap-theme .navbar:after{clear:both}@media (min-width:768px){#bootstrap-theme .navbar{border-radius:4px}}#bootstrap-theme .navbar-header:before,#bootstrap-theme .navbar-header:after{display:table;content:" "}#bootstrap-theme .navbar-header:after{clear:both}@media (min-width:768px){#bootstrap-theme .navbar-header{float:left}}#bootstrap-theme .navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}#bootstrap-theme .navbar-collapse:before,#bootstrap-theme .navbar-collapse:after{display:table;content:" "}#bootstrap-theme .navbar-collapse:after{clear:both}#bootstrap-theme .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){#bootstrap-theme .navbar-collapse{width:auto;border-top:0;box-shadow:none}#bootstrap-theme .navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}#bootstrap-theme .navbar-collapse.in{overflow-y:visible}.navbar-fixed-top #bootstrap-theme .navbar-collapse,.navbar-static-top #bootstrap-theme .navbar-collapse,.navbar-fixed-bottom #bootstrap-theme .navbar-collapse{padding-right:0;padding-left:0}}#bootstrap-theme .navbar-fixed-top,#bootstrap-theme .navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}#bootstrap-theme .navbar-fixed-top .navbar-collapse,#bootstrap-theme .navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){#bootstrap-theme .navbar-fixed-top .navbar-collapse,#bootstrap-theme .navbar-fixed-bottom .navbar-collapse{max-height:200px}}@media (min-width:768px){#bootstrap-theme .navbar-fixed-top,#bootstrap-theme .navbar-fixed-bottom{border-radius:0}}#bootstrap-theme .navbar-fixed-top{top:0;border-width:0 0 1px}#bootstrap-theme .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}#bootstrap-theme .container>.navbar-header,#bootstrap-theme .container>.navbar-collapse,#bootstrap-theme .container-fluid>.navbar-header,#bootstrap-theme .container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){#bootstrap-theme .container>.navbar-header,#bootstrap-theme .container>.navbar-collapse,#bootstrap-theme .container-fluid>.navbar-header,#bootstrap-theme .container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}#bootstrap-theme .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){#bootstrap-theme .navbar-static-top{border-radius:0}}#bootstrap-theme .navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}#bootstrap-theme .navbar-brand:hover,#bootstrap-theme .navbar-brand:focus{text-decoration:none}#bootstrap-theme .navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container #bootstrap-theme .navbar-brand,.navbar>.container-fluid #bootstrap-theme .navbar-brand{margin-left:-15px}}#bootstrap-theme .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}#bootstrap-theme .navbar-toggle:focus{outline:0}#bootstrap-theme .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}#bootstrap-theme .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){#bootstrap-theme .navbar-toggle{display:none}}#bootstrap-theme .navbar-nav{margin:7.5px -15px}#bootstrap-theme .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){#bootstrap-theme .navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a,#bootstrap-theme .navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a{line-height:20px}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){#bootstrap-theme .navbar-nav{float:left;margin:0}#bootstrap-theme .navbar-nav>li{float:left}#bootstrap-theme .navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}#bootstrap-theme .navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-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);margin-top:10px;margin-bottom:10px}@media (min-width:768px){#bootstrap-theme .navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}#bootstrap-theme .navbar-form .form-control-static{display:inline-block}#bootstrap-theme .navbar-form .input-group{display:inline-table;vertical-align:middle}#bootstrap-theme .navbar-form .input-group .input-group-addon,#bootstrap-theme .navbar-form .input-group .input-group-btn,#bootstrap-theme .navbar-form .input-group .form-control{width:auto}#bootstrap-theme .navbar-form .input-group>.form-control{width:100%}#bootstrap-theme .navbar-form .control-label{margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .radio,#bootstrap-theme .navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .radio label,#bootstrap-theme .navbar-form .checkbox label{padding-left:0}#bootstrap-theme .navbar-form .radio input[type=radio],#bootstrap-theme .navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}#bootstrap-theme .navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){#bootstrap-theme .navbar-form .form-group{margin-bottom:5px}#bootstrap-theme .navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){#bootstrap-theme .navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}#bootstrap-theme .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .navbar-btn{margin-top:10px;margin-bottom:10px}#bootstrap-theme .navbar-btn.btn-sm,#bootstrap-theme .btn-group-sm>.navbar-btn.btn{margin-top:10px;margin-bottom:10px}#bootstrap-theme .navbar-btn.btn-xs,#bootstrap-theme .btn-group-xs>.navbar-btn.btn{margin-top:14px;margin-bottom:14px}#bootstrap-theme .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){#bootstrap-theme .navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){#bootstrap-theme .navbar-left{float:left !important}#bootstrap-theme .navbar-right{float:right !important;margin-right:-15px}#bootstrap-theme .navbar-right~.navbar-right{margin-right:0}}#bootstrap-theme .navbar-default{background-color:#000;border-color:#000}#bootstrap-theme .navbar-default .navbar-brand{color:#fff}#bootstrap-theme .navbar-default .navbar-brand:hover,#bootstrap-theme .navbar-default .navbar-brand:focus{color:#fff;background-color:none}#bootstrap-theme .navbar-default .navbar-text{color:#ddd}#bootstrap-theme .navbar-default .navbar-nav>li>a{color:#fff}#bootstrap-theme .navbar-default .navbar-nav>li>a:hover,#bootstrap-theme .navbar-default .navbar-nav>li>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav>.active>a,#bootstrap-theme .navbar-default .navbar-nav>.active>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav>.disabled>a,#bootstrap-theme .navbar-default .navbar-nav>.disabled>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.disabled>a:focus{color:#ddd;background-color:transparent}#bootstrap-theme .navbar-default .navbar-nav>.open>a,#bootstrap-theme .navbar-default .navbar-nav>.open>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.open>a:focus{color:#fff;background-color:#000}@media (max-width:767px){#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ddd;background-color:transparent}}#bootstrap-theme .navbar-default .navbar-toggle{border-color:#000}#bootstrap-theme .navbar-default .navbar-toggle:hover,#bootstrap-theme .navbar-default .navbar-toggle:focus{background-color:#000}#bootstrap-theme .navbar-default .navbar-toggle .icon-bar{background-color:#fff}#bootstrap-theme .navbar-default .navbar-collapse,#bootstrap-theme .navbar-default .navbar-form{border-color:#000}#bootstrap-theme .navbar-default .navbar-link{color:#fff}#bootstrap-theme .navbar-default .navbar-link:hover{color:#fff}#bootstrap-theme .navbar-default .btn-link{color:#fff}#bootstrap-theme .navbar-default .btn-link:hover,#bootstrap-theme .navbar-default .btn-link:focus{color:#fff}#bootstrap-theme .navbar-default .btn-link[disabled]:hover,#bootstrap-theme .navbar-default .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:hover,fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:focus{color:#ddd}#bootstrap-theme .navbar-inverse{background-color:#cde8fe;border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-brand{color:#fff}#bootstrap-theme .navbar-inverse .navbar-brand:hover,#bootstrap-theme .navbar-inverse .navbar-brand:focus{color:#fff;background-color:none}#bootstrap-theme .navbar-inverse .navbar-text{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav>li>a{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav>li>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav>.active>a,#bootstrap-theme .navbar-inverse .navbar-nav>.active>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a,#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}#bootstrap-theme .navbar-inverse .navbar-nav>.open>a,#bootstrap-theme .navbar-inverse .navbar-nav>.open>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#b4ddfe}@media (max-width:767px){#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}#bootstrap-theme .navbar-inverse .navbar-toggle{border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-toggle:hover,#bootstrap-theme .navbar-inverse .navbar-toggle:focus{background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}#bootstrap-theme .navbar-inverse .navbar-collapse,#bootstrap-theme .navbar-inverse .navbar-form{border-color:#aad8fd}#bootstrap-theme .navbar-inverse .navbar-link{color:#fff}#bootstrap-theme .navbar-inverse .navbar-link:hover{color:#fff}#bootstrap-theme .navbar-inverse .btn-link{color:#fff}#bootstrap-theme .navbar-inverse .btn-link:hover,#bootstrap-theme .navbar-inverse .btn-link:focus{color:#fff}#bootstrap-theme .navbar-inverse .btn-link[disabled]:hover,#bootstrap-theme .navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:hover,fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:focus{color:#ccc}#bootstrap-theme .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}#bootstrap-theme .breadcrumb>li{display:inline-block}#bootstrap-theme .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/ "}#bootstrap-theme .breadcrumb>.active{color:#999}#bootstrap-theme .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}#bootstrap-theme .pagination>li{display:inline}#bootstrap-theme .pagination>li>a,#bootstrap-theme .pagination>li>span{position:relative;float:left;padding:4px 8px;margin-left:-1px;line-height:1.428571429;color:#2786c2;text-decoration:none;background-color:#fff;border:1px solid #ddd}#bootstrap-theme .pagination>li>a:hover,#bootstrap-theme .pagination>li>a:focus,#bootstrap-theme .pagination>li>span:hover,#bootstrap-theme .pagination>li>span:focus{z-index:2;color:#1a5a82;background-color:#eee;border-color:#ddd}#bootstrap-theme .pagination>li:first-child>a,#bootstrap-theme .pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .pagination>li:last-child>a,#bootstrap-theme .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}#bootstrap-theme .pagination>.active>a,#bootstrap-theme .pagination>.active>a:hover,#bootstrap-theme .pagination>.active>a:focus,#bootstrap-theme .pagination>.active>span,#bootstrap-theme .pagination>.active>span:hover,#bootstrap-theme .pagination>.active>span:focus{z-index:3;color:#999;cursor:default;background-color:#f5f5f5;border-color:#ddd}#bootstrap-theme .pagination>.disabled>span,#bootstrap-theme .pagination>.disabled>span:hover,#bootstrap-theme .pagination>.disabled>span:focus,#bootstrap-theme .pagination>.disabled>a,#bootstrap-theme .pagination>.disabled>a:hover,#bootstrap-theme .pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}#bootstrap-theme .pagination-lg>li>a,#bootstrap-theme .pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}#bootstrap-theme .pagination-lg>li:first-child>a,#bootstrap-theme .pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}#bootstrap-theme .pagination-lg>li:last-child>a,#bootstrap-theme .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}#bootstrap-theme .pagination-sm>li>a,#bootstrap-theme .pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}#bootstrap-theme .pagination-sm>li:first-child>a,#bootstrap-theme .pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .pagination-sm>li:last-child>a,#bootstrap-theme .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}#bootstrap-theme .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}#bootstrap-theme .pager:before,#bootstrap-theme .pager:after{display:table;content:" "}#bootstrap-theme .pager:after{clear:both}#bootstrap-theme .pager li{display:inline}#bootstrap-theme .pager li>a,#bootstrap-theme .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}#bootstrap-theme .pager li>a:hover,#bootstrap-theme .pager li>a:focus{text-decoration:none;background-color:#eee}#bootstrap-theme .pager .next>a,#bootstrap-theme .pager .next>span{float:right}#bootstrap-theme .pager .previous>a,#bootstrap-theme .pager .previous>span{float:left}#bootstrap-theme .pager .disabled>a,#bootstrap-theme .pager .disabled>a:hover,#bootstrap-theme .pager .disabled>a:focus,#bootstrap-theme .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}#bootstrap-theme .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}#bootstrap-theme .label:empty{display:none}.btn #bootstrap-theme .label{position:relative;top:-1px}#bootstrap-theme a.label:hover,#bootstrap-theme a.label:focus{color:#fff;text-decoration:none;cursor:pointer}#bootstrap-theme .label-default{background-color:#999}#bootstrap-theme .label-default[href]:hover,#bootstrap-theme .label-default[href]:focus{background-color:gray}#bootstrap-theme .label-primary{background-color:#000}#bootstrap-theme .label-primary[href]:hover,#bootstrap-theme .label-primary[href]:focus{background-color:#000}#bootstrap-theme .label-success{background-color:#73a839}#bootstrap-theme .label-success[href]:hover,#bootstrap-theme .label-success[href]:focus{background-color:#59822c}#bootstrap-theme .label-info{background-color:#cde8fe}#bootstrap-theme .label-info[href]:hover,#bootstrap-theme .label-info[href]:focus{background-color:#9bd1fd}#bootstrap-theme .label-warning{background-color:#dd5600}#bootstrap-theme .label-warning[href]:hover,#bootstrap-theme .label-warning[href]:focus{background-color:#aa4200}#bootstrap-theme .label-danger{background-color:#c71c22}#bootstrap-theme .label-danger[href]:hover,#bootstrap-theme .label-danger[href]:focus{background-color:#9a161a}#bootstrap-theme .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#000;border-radius:10px}#bootstrap-theme .badge:empty{display:none}.btn #bootstrap-theme .badge{position:relative;top:-1px}.btn-xs #bootstrap-theme .badge,#bootstrap-theme .btn-group-xs>.btn #bootstrap-theme .badge,.btn-group-xs>.btn #bootstrap-theme .badge{top:0;padding:1px 5px}.list-group-item.active>#bootstrap-theme .badge,.nav-pills>.active>a>#bootstrap-theme .badge{color:#2786c2;background-color:#fff}.list-group-item>#bootstrap-theme .badge{float:right}.list-group-item>#bootstrap-theme .badge+#bootstrap-theme .badge{margin-right:5px}.nav-pills>li>a>#bootstrap-theme .badge{margin-left:3px}#bootstrap-theme a.badge:hover,#bootstrap-theme a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}#bootstrap-theme .jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}#bootstrap-theme .jumbotron h1,#bootstrap-theme .jumbotron .h1{color:inherit}#bootstrap-theme .jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}#bootstrap-theme .jumbotron>hr{border-top-color:#d5d5d5}.container #bootstrap-theme .jumbotron,.container-fluid #bootstrap-theme .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}#bootstrap-theme .jumbotron .container{max-width:100%}@media screen and (min-width:768px){#bootstrap-theme .jumbotron{padding-top:48px;padding-bottom:48px}.container #bootstrap-theme .jumbotron,.container-fluid #bootstrap-theme .jumbotron{padding-right:60px;padding-left:60px}#bootstrap-theme .jumbotron h1,#bootstrap-theme .jumbotron .h1{font-size:63px}}#bootstrap-theme .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}#bootstrap-theme .thumbnail>img,#bootstrap-theme .thumbnail a>img{display:block;max-width:100%;height:auto;margin-right:auto;margin-left:auto}#bootstrap-theme .thumbnail .caption{padding:9px;color:#555}#bootstrap-theme a.thumbnail:hover,#bootstrap-theme a.thumbnail:focus,#bootstrap-theme a.thumbnail.active{border-color:#2786c2}#bootstrap-theme .alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}#bootstrap-theme .alert h4{margin-top:0;color:inherit}#bootstrap-theme .alert .alert-link{font-weight:700}#bootstrap-theme .alert>p,#bootstrap-theme .alert>ul{margin-bottom:0}#bootstrap-theme .alert>p+p{margin-top:5px}#bootstrap-theme .alert-dismissable,#bootstrap-theme .alert-dismissible{padding-right:35px}#bootstrap-theme .alert-dismissable .close,#bootstrap-theme .alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}#bootstrap-theme .alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}#bootstrap-theme .alert-success hr{border-top-color:#c9e2b3}#bootstrap-theme .alert-success .alert-link{color:#356635}#bootstrap-theme .alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}#bootstrap-theme .alert-info hr{border-top-color:#a6e1ec}#bootstrap-theme .alert-info .alert-link{color:#2d6987}#bootstrap-theme .alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}#bootstrap-theme .alert-warning hr{border-top-color:#f8e5be}#bootstrap-theme .alert-warning .alert-link{color:#a47e3c}#bootstrap-theme .alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}#bootstrap-theme .alert-danger hr{border-top-color:#e6c1c7}#bootstrap-theme .alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}#bootstrap-theme .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}#bootstrap-theme .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#000;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}#bootstrap-theme .progress-striped .progress-bar,#bootstrap-theme .progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}#bootstrap-theme .progress.active .progress-bar,#bootstrap-theme .progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}#bootstrap-theme .progress-bar-success{background-color:#73a839}.progress-striped #bootstrap-theme .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-info{background-color:#cde8fe}.progress-striped #bootstrap-theme .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-warning{background-color:#dd5600}.progress-striped #bootstrap-theme .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-danger{background-color:#c71c22}.progress-striped #bootstrap-theme .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .media{margin-top:15px}#bootstrap-theme .media:first-child{margin-top:0}#bootstrap-theme .media,#bootstrap-theme .media-body{overflow:hidden;zoom:1}#bootstrap-theme .media-body{width:10000px}#bootstrap-theme .media-object{display:block}#bootstrap-theme .media-object.img-thumbnail{max-width:none}#bootstrap-theme .media-right,#bootstrap-theme .media>.pull-right{padding-left:10px}#bootstrap-theme .media-left,#bootstrap-theme .media>.pull-left{padding-right:10px}#bootstrap-theme .media-left,#bootstrap-theme .media-right,#bootstrap-theme .media-body{display:table-cell;vertical-align:top}#bootstrap-theme .media-middle{vertical-align:middle}#bootstrap-theme .media-bottom{vertical-align:bottom}#bootstrap-theme .media-heading{margin-top:0;margin-bottom:5px}#bootstrap-theme .media-list{padding-left:0;list-style:none}#bootstrap-theme .list-group{padding-left:0;margin-bottom:20px}#bootstrap-theme .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}#bootstrap-theme .list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}#bootstrap-theme .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .list-group-item.disabled,#bootstrap-theme .list-group-item.disabled:hover,#bootstrap-theme .list-group-item.disabled:focus{color:#999;cursor:not-allowed;background-color:#eee}#bootstrap-theme .list-group-item.disabled .list-group-item-heading,#bootstrap-theme .list-group-item.disabled:hover .list-group-item-heading,#bootstrap-theme .list-group-item.disabled:focus .list-group-item-heading{color:inherit}#bootstrap-theme .list-group-item.disabled .list-group-item-text,#bootstrap-theme .list-group-item.disabled:hover .list-group-item-text,#bootstrap-theme .list-group-item.disabled:focus .list-group-item-text{color:#999}#bootstrap-theme .list-group-item.active,#bootstrap-theme .list-group-item.active:hover,#bootstrap-theme .list-group-item.active:focus{z-index:2;color:#fff;background-color:#000;border-color:#000}#bootstrap-theme .list-group-item.active .list-group-item-heading,#bootstrap-theme .list-group-item.active .list-group-item-heading>small,#bootstrap-theme .list-group-item.active .list-group-item-heading>.small,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading>small,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading>.small,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading>small,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading>.small{color:inherit}#bootstrap-theme .list-group-item.active .list-group-item-text,#bootstrap-theme .list-group-item.active:hover .list-group-item-text,#bootstrap-theme .list-group-item.active:focus .list-group-item-text{color:#666}#bootstrap-theme a.list-group-item,#bootstrap-theme button.list-group-item{color:#555}#bootstrap-theme a.list-group-item .list-group-item-heading,#bootstrap-theme button.list-group-item .list-group-item-heading{color:#333}#bootstrap-theme a.list-group-item:hover,#bootstrap-theme a.list-group-item:focus,#bootstrap-theme button.list-group-item:hover,#bootstrap-theme button.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}#bootstrap-theme button.list-group-item{width:100%;text-align:left}#bootstrap-theme .list-group-item-success{color:#468847;background-color:#dff0d8}#bootstrap-theme a.list-group-item-success,#bootstrap-theme button.list-group-item-success{color:#468847}#bootstrap-theme a.list-group-item-success .list-group-item-heading,#bootstrap-theme button.list-group-item-success .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-success:hover,#bootstrap-theme a.list-group-item-success:focus,#bootstrap-theme button.list-group-item-success:hover,#bootstrap-theme button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}#bootstrap-theme a.list-group-item-success.active,#bootstrap-theme a.list-group-item-success.active:hover,#bootstrap-theme a.list-group-item-success.active:focus,#bootstrap-theme button.list-group-item-success.active,#bootstrap-theme button.list-group-item-success.active:hover,#bootstrap-theme button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}#bootstrap-theme .list-group-item-info{color:#3a87ad;background-color:#d9edf7}#bootstrap-theme a.list-group-item-info,#bootstrap-theme button.list-group-item-info{color:#3a87ad}#bootstrap-theme a.list-group-item-info .list-group-item-heading,#bootstrap-theme button.list-group-item-info .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-info:hover,#bootstrap-theme a.list-group-item-info:focus,#bootstrap-theme button.list-group-item-info:hover,#bootstrap-theme button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}#bootstrap-theme a.list-group-item-info.active,#bootstrap-theme a.list-group-item-info.active:hover,#bootstrap-theme a.list-group-item-info.active:focus,#bootstrap-theme button.list-group-item-info.active,#bootstrap-theme button.list-group-item-info.active:hover,#bootstrap-theme button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}#bootstrap-theme .list-group-item-warning{color:#c09853;background-color:#fcf8e3}#bootstrap-theme a.list-group-item-warning,#bootstrap-theme button.list-group-item-warning{color:#c09853}#bootstrap-theme a.list-group-item-warning .list-group-item-heading,#bootstrap-theme button.list-group-item-warning .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-warning:hover,#bootstrap-theme a.list-group-item-warning:focus,#bootstrap-theme button.list-group-item-warning:hover,#bootstrap-theme button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}#bootstrap-theme a.list-group-item-warning.active,#bootstrap-theme a.list-group-item-warning.active:hover,#bootstrap-theme a.list-group-item-warning.active:focus,#bootstrap-theme button.list-group-item-warning.active,#bootstrap-theme button.list-group-item-warning.active:hover,#bootstrap-theme button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}#bootstrap-theme .list-group-item-danger{color:#b94a48;background-color:#f2dede}#bootstrap-theme a.list-group-item-danger,#bootstrap-theme button.list-group-item-danger{color:#b94a48}#bootstrap-theme a.list-group-item-danger .list-group-item-heading,#bootstrap-theme button.list-group-item-danger .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-danger:hover,#bootstrap-theme a.list-group-item-danger:focus,#bootstrap-theme button.list-group-item-danger:hover,#bootstrap-theme button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}#bootstrap-theme a.list-group-item-danger.active,#bootstrap-theme a.list-group-item-danger.active:hover,#bootstrap-theme a.list-group-item-danger.active:focus,#bootstrap-theme button.list-group-item-danger.active,#bootstrap-theme button.list-group-item-danger.active:hover,#bootstrap-theme button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}#bootstrap-theme .list-group-item-heading{margin-top:0;margin-bottom:5px}#bootstrap-theme .list-group-item-text{margin-bottom:0;line-height:1.3}#bootstrap-theme .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}#bootstrap-theme .panel-body{padding:15px}#bootstrap-theme .panel-body:before,#bootstrap-theme .panel-body:after{display:table;content:" "}#bootstrap-theme .panel-body:after{clear:both}#bootstrap-theme .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel-heading>.dropdown .dropdown-toggle{color:inherit}#bootstrap-theme .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}#bootstrap-theme .panel-title>a,#bootstrap-theme .panel-title>small,#bootstrap-theme .panel-title>.small,#bootstrap-theme .panel-title>small>a,#bootstrap-theme .panel-title>.small>a{color:inherit}#bootstrap-theme .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.list-group,#bootstrap-theme .panel>.panel-collapse>.list-group{margin-bottom:0}#bootstrap-theme .panel>.list-group .list-group-item,#bootstrap-theme .panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}#bootstrap-theme .panel>.list-group:first-child .list-group-item:first-child,#bootstrap-theme .panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.list-group:last-child .list-group-item:last-child,#bootstrap-theme .panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}#bootstrap-theme .list-group+.panel-footer{border-top-width:0}#bootstrap-theme .panel>.table,#bootstrap-theme .panel>.table-responsive>.table,#bootstrap-theme .panel>.panel-collapse>.table{margin-bottom:0}#bootstrap-theme .panel>.table caption,#bootstrap-theme .panel>.table-responsive>.table caption,#bootstrap-theme .panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}#bootstrap-theme .panel>.table:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}#bootstrap-theme .panel>.table:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}#bootstrap-theme .panel>.panel-body+.table,#bootstrap-theme .panel>.panel-body+.table-responsive,#bootstrap-theme .panel>.table+.panel-body,#bootstrap-theme .panel>.table-responsive+.panel-body{border-top:1px solid #ddd}#bootstrap-theme .panel>.table>tbody:first-child>tr:first-child th,#bootstrap-theme .panel>.table>tbody:first-child>tr:first-child td{border-top:0}#bootstrap-theme .panel>.table-bordered,#bootstrap-theme .panel>.table-responsive>.table-bordered{border:0}#bootstrap-theme .panel>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}#bootstrap-theme .panel>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}#bootstrap-theme .panel>.table-bordered>thead>tr:first-child>td,#bootstrap-theme .panel>.table-bordered>thead>tr:first-child>th,#bootstrap-theme .panel>.table-bordered>tbody>tr:first-child>td,#bootstrap-theme .panel>.table-bordered>tbody>tr:first-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr:first-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr:first-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}#bootstrap-theme .panel>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .panel>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .panel>.table-bordered>tfoot>tr:last-child>td,#bootstrap-theme .panel>.table-bordered>tfoot>tr:last-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}#bootstrap-theme .panel>.table-responsive{margin-bottom:0;border:0}#bootstrap-theme .panel-group{margin-bottom:20px}#bootstrap-theme .panel-group .panel{margin-bottom:0;border-radius:4px}#bootstrap-theme .panel-group .panel+.panel{margin-top:5px}#bootstrap-theme .panel-group .panel-heading{border-bottom:0}#bootstrap-theme .panel-group .panel-heading+.panel-collapse>.panel-body,#bootstrap-theme .panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}#bootstrap-theme .panel-group .panel-footer{border-top:0}#bootstrap-theme .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}#bootstrap-theme .panel-default{border-color:#ddd}#bootstrap-theme .panel-default>.panel-heading{color:#555;background-color:#f5f5f5;border-color:#ddd}#bootstrap-theme .panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#555}#bootstrap-theme .panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-primary{border-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading{color:#fff;background-color:#000;border-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading .badge{color:#000;background-color:#fff}#bootstrap-theme .panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-success{border-color:#ddd}#bootstrap-theme .panel-success>.panel-heading{color:#468847;background-color:#73a839;border-color:#ddd}#bootstrap-theme .panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-success>.panel-heading .badge{color:#73a839;background-color:#468847}#bootstrap-theme .panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-info{border-color:#ddd}#bootstrap-theme .panel-info>.panel-heading{color:#3a87ad;background-color:#cde8fe;border-color:#ddd}#bootstrap-theme .panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-info>.panel-heading .badge{color:#cde8fe;background-color:#3a87ad}#bootstrap-theme .panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-warning{border-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading{color:#c09853;background-color:#dd5600;border-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading .badge{color:#dd5600;background-color:#c09853}#bootstrap-theme .panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-danger{border-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading{color:#b94a48;background-color:#c71c22;border-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading .badge{color:#c71c22;background-color:#b94a48}#bootstrap-theme .panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}#bootstrap-theme .embed-responsive .embed-responsive-item,#bootstrap-theme .embed-responsive iframe,#bootstrap-theme .embed-responsive embed,#bootstrap-theme .embed-responsive object,#bootstrap-theme .embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}#bootstrap-theme .embed-responsive-16by9{padding-bottom:56.25%}#bootstrap-theme .embed-responsive-4by3{padding-bottom:75%}#bootstrap-theme .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}#bootstrap-theme .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}#bootstrap-theme .well-lg{padding:24px;border-radius:6px}#bootstrap-theme .well-sm{padding:9px;border-radius:3px}#bootstrap-theme .close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;-webkit-filter:alpha(opacity=20);filter:alpha(opacity=20);opacity:.2}#bootstrap-theme .close:hover,#bootstrap-theme .close:focus{color:#000;text-decoration:none;cursor:pointer;-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}#bootstrap-theme .modal-open{overflow:hidden}#bootstrap-theme .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}#bootstrap-theme .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-ms-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out}#bootstrap-theme .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}#bootstrap-theme .modal-open .modal{overflow-x:hidden;overflow-y:auto}#bootstrap-theme .modal-dialog{position:relative;width:auto;margin:10px}#bootstrap-theme .modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}#bootstrap-theme .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}#bootstrap-theme .modal-backdrop.fade{-webkit-filter:alpha(opacity=0);filter:alpha(opacity=0);opacity:0}#bootstrap-theme .modal-backdrop.in{-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme .modal-header{padding:15px;border-bottom:1px solid #e5e5e5}#bootstrap-theme .modal-header:before,#bootstrap-theme .modal-header:after{display:table;content:" "}#bootstrap-theme .modal-header:after{clear:both}#bootstrap-theme .modal-header .close{margin-top:-2px}#bootstrap-theme .modal-title{margin:0;line-height:1.428571429}#bootstrap-theme .modal-body{position:relative;padding:20px}#bootstrap-theme .modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}#bootstrap-theme .modal-footer:before,#bootstrap-theme .modal-footer:after{display:table;content:" "}#bootstrap-theme .modal-footer:after{clear:both}#bootstrap-theme .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}#bootstrap-theme .modal-footer .btn-group .btn+.btn{margin-left:-1px}#bootstrap-theme .modal-footer .btn-block+.btn-block{margin-left:0}#bootstrap-theme .modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){#bootstrap-theme .modal-dialog{width:600px;margin:30px auto}#bootstrap-theme .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}#bootstrap-theme .modal-sm{width:300px}}@media (min-width:992px){#bootstrap-theme .modal-lg{width:900px}}#bootstrap-theme .tooltip{position:absolute;z-index:1070;display:block;font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.428571429;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;-ms-word-break:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;-webkit-filter:alpha(opacity=0);filter:alpha(opacity=0);opacity:0}#bootstrap-theme .tooltip.in{-webkit-filter:alpha(opacity=90);filter:alpha(opacity=90);opacity:.9}#bootstrap-theme .tooltip.top{padding:5px 0;margin-top:-3px}#bootstrap-theme .tooltip.right{padding:0 5px;margin-left:3px}#bootstrap-theme .tooltip.bottom{padding:5px 0;margin-top:3px}#bootstrap-theme .tooltip.left{padding:0 5px;margin-left:-3px}#bootstrap-theme .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}#bootstrap-theme .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}#bootstrap-theme .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}#bootstrap-theme .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}#bootstrap-theme .popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.428571429;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;-ms-word-break:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}#bootstrap-theme .popover.top{margin-top:-10px}#bootstrap-theme .popover.right{margin-left:10px}#bootstrap-theme .popover.bottom{margin-top:10px}#bootstrap-theme .popover.left{margin-left:-10px}#bootstrap-theme .popover>.arrow{border-width:11px}#bootstrap-theme .popover>.arrow,#bootstrap-theme .popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}#bootstrap-theme .popover>.arrow:after{content:"";border-width:10px}#bootstrap-theme .popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}#bootstrap-theme .popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}#bootstrap-theme .popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}#bootstrap-theme .popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}#bootstrap-theme .popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}#bootstrap-theme .popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}#bootstrap-theme .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,.25)}#bootstrap-theme .popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}#bootstrap-theme .popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}#bootstrap-theme .popover-content{padding:9px 14px}#bootstrap-theme .carousel{position:relative}#bootstrap-theme .carousel-inner{position:relative;width:100%;overflow:hidden}#bootstrap-theme .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}#bootstrap-theme .carousel-inner>.item>img,#bootstrap-theme .carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}@media (transform-3d),(-webkit-transform-3d){#bootstrap-theme .carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-ms-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}#bootstrap-theme .carousel-inner>.item.next,#bootstrap-theme .carousel-inner>.item.active.right{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}#bootstrap-theme .carousel-inner>.item.prev,#bootstrap-theme .carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}#bootstrap-theme .carousel-inner>.item.next.left,#bootstrap-theme .carousel-inner>.item.prev.right,#bootstrap-theme .carousel-inner>.item.active{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}#bootstrap-theme .carousel-inner>.active,#bootstrap-theme .carousel-inner>.next,#bootstrap-theme .carousel-inner>.prev{display:block}#bootstrap-theme .carousel-inner>.active{left:0}#bootstrap-theme .carousel-inner>.next,#bootstrap-theme .carousel-inner>.prev{position:absolute;top:0;width:100%}#bootstrap-theme .carousel-inner>.next{left:100%}#bootstrap-theme .carousel-inner>.prev{left:-100%}#bootstrap-theme .carousel-inner>.next.left,#bootstrap-theme .carousel-inner>.prev.right{left:0}#bootstrap-theme .carousel-inner>.active.left{left:-100%}#bootstrap-theme .carousel-inner>.active.right{left:100%}#bootstrap-theme .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);-webkit-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);background-repeat:repeat-x}#bootstrap-theme .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);-webkit-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);background-repeat:repeat-x}#bootstrap-theme .carousel-control:hover,#bootstrap-theme .carousel-control:focus{color:#fff;text-decoration:none;outline:0;-webkit-filter:alpha(opacity=90);filter:alpha(opacity=90);opacity:.9}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next,#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}#bootstrap-theme .carousel-control .icon-next,#bootstrap-theme .carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next{width:20px;height:20px;font-family:serif;line-height:1}#bootstrap-theme .carousel-control .icon-prev:before{content:"‹"}#bootstrap-theme .carousel-control .icon-next:before{content:"›"}#bootstrap-theme .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}#bootstrap-theme .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}#bootstrap-theme .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}#bootstrap-theme .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}#bootstrap-theme .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .glyphicon-chevron-right,#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .icon-prev{margin-left:-10px}#bootstrap-theme .carousel-control .glyphicon-chevron-right,#bootstrap-theme .carousel-control .icon-next{margin-right:-10px}#bootstrap-theme .carousel-caption{right:20%;left:20%;padding-bottom:30px}#bootstrap-theme .carousel-indicators{bottom:20px}}#bootstrap-theme .clearfix:before,#bootstrap-theme .clearfix:after{display:table;content:" "}#bootstrap-theme .clearfix:after{clear:both}#bootstrap-theme .center-block{display:block;margin-right:auto;margin-left:auto}#bootstrap-theme .pull-right{float:right !important}#bootstrap-theme .pull-left{float:left !important}#bootstrap-theme .hide{display:none !important}#bootstrap-theme .show{display:block !important}#bootstrap-theme .invisible{visibility:hidden}#bootstrap-theme .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}#bootstrap-theme .hidden{display:none !important}#bootstrap-theme .affix{position:fixed}@-ms-viewport{width:device-width}#bootstrap-theme .visible-sm{display:none !important}#bootstrap-theme .visible-md{display:none !important}#bootstrap-theme .visible-lg{display:none !important}#bootstrap-theme .visible-xs-block,#bootstrap-theme .visible-xs-inline,#bootstrap-theme .visible-xs-inline-block,#bootstrap-theme .visible-sm-block,#bootstrap-theme .visible-sm-inline,#bootstrap-theme .visible-sm-inline-block,#bootstrap-theme .visible-md-block,#bootstrap-theme .visible-md-inline,#bootstrap-theme .visible-md-inline-block,#bootstrap-theme .visible-lg-block,#bootstrap-theme .visible-lg-inline,#bootstrap-theme .visible-lg-inline-block{display:none !important}@media (max-width:767px){#bootstrap-theme .visible-xs{display:block !important}#bootstrap-theme table.visible-xs{display:table !important}#bootstrap-theme tr.visible-xs{display:table-row !important}#bootstrap-theme th.visible-xs,#bootstrap-theme td.visible-xs{display:table-cell !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-block{display:block !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-inline{display:inline !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm{display:block !important}#bootstrap-theme table.visible-sm{display:table !important}#bootstrap-theme tr.visible-sm{display:table-row !important}#bootstrap-theme th.visible-sm,#bootstrap-theme td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md{display:block !important}#bootstrap-theme table.visible-md{display:table !important}#bootstrap-theme tr.visible-md{display:table-row !important}#bootstrap-theme th.visible-md,#bootstrap-theme td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg{display:block !important}#bootstrap-theme table.visible-lg{display:table !important}#bootstrap-theme tr.visible-lg{display:table-row !important}#bootstrap-theme th.visible-lg,#bootstrap-theme td.visible-lg{display:table-cell !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-block{display:block !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-inline{display:inline !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){#bootstrap-theme .hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .hidden-md{display:none !important}}@media (min-width:1200px){#bootstrap-theme .hidden-lg{display:none !important}}#bootstrap-theme .visible-print{display:none !important}@media print{#bootstrap-theme .visible-print{display:block !important}#bootstrap-theme table.visible-print{display:table !important}#bootstrap-theme tr.visible-print{display:table-row !important}#bootstrap-theme th.visible-print,#bootstrap-theme td.visible-print{display:table-cell !important}}#bootstrap-theme .visible-print-block{display:none !important}@media print{#bootstrap-theme .visible-print-block{display:block !important}}#bootstrap-theme .visible-print-inline{display:none !important}@media print{#bootstrap-theme .visible-print-inline{display:inline !important}}#bootstrap-theme .visible-print-inline-block{display:none !important}@media print{#bootstrap-theme .visible-print-inline-block{display:inline-block !important}}@media print{#bootstrap-theme .hidden-print{display:none !important}}#bootstrap-theme ul,#bootstrap-theme ol{margin-left:0;margin-right:0}#bootstrap-theme .form-control.checkbox-inline>label{margin-left:9px}#bootstrap-theme label input[type=checkbox]:not(:checked)+*{font-weight:400}#bootstrap-theme .select2-choices{margin-bottom:0}#bootstrap-theme input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}#bootstrap-theme .select2-container .select2-choice>.select2-chosen{font-size:inherit;font-weight:400}#bootstrap-theme summary{display:list-item}#bootstrap-theme legend{position:initial;text-transform:inherit;float:none}#bootstrap-theme .form-control .select2-choice{border:0;border-radius:2px}#bootstrap-theme .form-control .select2-choice .select2-arrow{border-radius:0 2px 2px 0}#bootstrap-theme .form-control.select2-container{height:auto !important;padding:0}#bootstrap-theme .form-control.select2-container.select2-dropdown-open{border-color:#5897fb;border-radius:3px 3px 0 0}#bootstrap-theme .form-control .select2-container.select2-dropdown-open .select2-choices{border-radius:3px 3px 0 0}#bootstrap-theme .form-control.select2-container .select2-choices{border:0 !important;border-radius:3px}#bootstrap-theme .control-group.warning .select2-container .select2-choice,#bootstrap-theme .control-group.warning .select2-container .select2-choices,#bootstrap-theme .control-group.warning .select2-container-active .select2-choice,#bootstrap-theme .control-group.warning .select2-container-active .select2-choices,#bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.warning .select2-container-multi.select2-container-active .select2-choices{border:1px solid #c09853 !important}#bootstrap-theme .control-group.warning .select2-container .select2-choice div{border-left:1px solid #c09853 !important;background:#fcf8e3 !important}#bootstrap-theme .control-group.error .select2-container .select2-choice,#bootstrap-theme .control-group.error .select2-container .select2-choices,#bootstrap-theme .control-group.error .select2-container-active .select2-choice,#bootstrap-theme .control-group.error .select2-container-active .select2-choices,#bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.error .select2-container-multi.select2-container-active .select2-choices{border:1px solid #b94a48 !important}#bootstrap-theme .control-group.error .select2-container .select2-choice div{border-left:1px solid #b94a48 !important;background:#f2dede !important}#bootstrap-theme .control-group.info .select2-container .select2-choice,#bootstrap-theme .control-group.info .select2-container .select2-choices,#bootstrap-theme .control-group.info .select2-container-active .select2-choice,#bootstrap-theme .control-group.info .select2-container-active .select2-choices,#bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.info .select2-container-multi.select2-container-active .select2-choices{border:1px solid #3a87ad !important}#bootstrap-theme .control-group.info .select2-container .select2-choice div{border-left:1px solid #3a87ad !important;background:#d9edf7 !important}#bootstrap-theme .control-group.success .select2-container .select2-choice,#bootstrap-theme .control-group.success .select2-container .select2-choices,#bootstrap-theme .control-group.success .select2-container-active .select2-choice,#bootstrap-theme .control-group.success .select2-container-active .select2-choices,#bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.success .select2-container-multi.select2-container-active .select2-choices{border:1px solid #468847 !important}#bootstrap-theme .control-group.success .select2-container .select2-choice div{border-left:1px solid #468847 !important;background:#dff0d8 !important} \ No newline at end of file diff --git a/civicrm/ext/greenwich/scss/_tweaks.scss b/civicrm/ext/greenwich/scss/_tweaks.scss index e472c7e5e4..22133269e8 100644 --- a/civicrm/ext/greenwich/scss/_tweaks.scss +++ b/civicrm/ext/greenwich/scss/_tweaks.scss @@ -29,3 +29,9 @@ input[type="search"]::-webkit-search-cancel-button { summary { display: list-item; } +/* Reset breaky stuff from some cms themes: https://lab.civicrm.org/dev/core/-/issues/5561 */ +legend { + position: initial; + text-transform: inherit; + float: none; +} diff --git a/civicrm/ext/oauth-client/info.xml b/civicrm/ext/oauth-client/info.xml index ba7d1b14ab..4a31ba1f35 100644 --- a/civicrm/ext/oauth-client/info.xml +++ b/civicrm/ext/oauth-client/info.xml @@ -35,6 +35,7 @@ <mixin>setting-php@1.0.0</mixin> <mixin>smarty@1.0.0</mixin> <mixin>entity-types-php@1.0.0</mixin> + <mixin>scan-classes@1.0.0</mixin> </mixins> <civix> <namespace>CRM/OAuth</namespace> diff --git a/civicrm/ext/riverlea/.gitignore b/civicrm/ext/riverlea/.gitignore new file mode 100644 index 0000000000..68ae180729 --- /dev/null +++ b/civicrm/ext/riverlea/.gitignore @@ -0,0 +1,2 @@ +css/.DS_store +.DS_store diff --git a/civicrm/ext/riverlea/CHANGELOG.md b/civicrm/ext/riverlea/CHANGELOG.md new file mode 100644 index 0000000000..968ea498f8 --- /dev/null +++ b/civicrm/ext/riverlea/CHANGELOG.md @@ -0,0 +1,544 @@ +1.80.14 + - FIXED - regression caused by trying to reset clipping in Thames (ref: https://lab.civicrm.org/extensions/riverlea/-/issues/91) + +1.80.13 + - FIXED - removed margin on ul.nav that's added by browser/CMS theme ul styling (seen on Message Template Afform) + - FIXED - extra box-shadow from .panel-heading (was creating an odd dble shadow) + - FIXED - clipped overflowing responsive tables in Thames (ref https://lab.civicrm.org/extensions/riverlea/-/issues/90) + - FIXED - .crm-pager padding/positioning (ref https://lab.civicrm.org/extensions/riverlea/-/issues/11#note_173013) - also removed hidden top pager from some results. + - FIXED - Joomla4+ Atum admin theme bug that adds underline on dropdown menu links + - CHANGED - removed second drop-shadow on BS .panel inside a .panel (visible in Walbrook, e.g. Message Template Afform). + - CHANGED - more balanced padding in panel-heading. + - ADDED - .nav.nav-pills style based on buttons Message Template Afform. + +1.80.12 + - CHANGED - CRM Status Update page - added drop-shadow to dropdowns, made dropdown button border transparent, made h3 text colour match background variable. + - CHANGED - Minetta active accordion tab and panel bg colour now matches Greenwich + - FIXED - Accordion summary label colour inaccessible - needed !important, plus margin reset. + - FIXED - Accordion regression for Bootstrap accordions using .collapse, not summary/details (ref https://lab.civicrm.org/extensions/riverlea/-/issues/89). Also better namespaced Bootstrap collapse functions, and added support for BS4+ '.show'. + - REPLACED - replaced Inter font with font downloaded from https://gwfh.mranftl.com/fonts (the same place as Lato for Thames) and updated Walbrook's reference to it. + +1.80.11 + - FIXED - Wallbrook avatar image returned to 100px as had created a gap (ext/riverlea/#87) + - FIXED - Double icon on .messages.crm-empty-table + - FIXED - changed specificity of .hiddenElement (ext/riverlea/#11) to ensure unhidden elements are unhidden. + - CHANGED - version numbering again. See note in ReadMe: the 2nd number represents the Civi version tested against, the 3rd number is the RL version number for that Civi version. + - CHANGED - Alert colour bg for .messages.crm-empty-table now matches icon colour ('info' range) + - CHANGED - streams/empty/_variables.css to match core variables.css + - CHANGED - reduce verbose Bootstrap table styling css in tables.css + - CHANGED - cascade order of table colours to put .crm-row-selected class last + - ADDED - contact merge screen error/ok/selected background colours (ext/riverlea/#88) + - ADDED - margin (`--crm-flex-gap`) to bottom of .description text. + - ADDED - accordion with error text and border colour to fix contrast ratio issues + - ADDED - D9 Claro .action-link margin reset + +1.1.10 / 5.80.9 + - FIXED - D7 Seven theme .button style overwriting colours + - CHANGED - D7 Seven, matched page-padding. + - FIXED - Responsive contact dashboard, below 768px: wrapped contact-summary label/data, wrap action links. + - FIXED - Responsive contact dashboard, below 500px: improve hidden text and sidetabs width. + - MOVED - Responsive contact dashboard css from tabs.css to contactSummary.css + - CHANGED - Walbrook avatar image - made a little larger and thiner border + - FIXED - better name-spaced AFform padding for front-end vs backend + +1.1.9 / 5.80.8 + - CHANGED - CiviLint - further lint adjustments (tabs for double space, missing semi-colons) + - FIXED - SearchKit button group hierarchy wrapping button groups + - FIXED - removed button styling for another (x)-type cancel-only button in SearchKit builder + - FIXED - avatar positioning works to an extent (floats right in dashboard header for Walbrook / Hackney) (#87) + - REMOVED - avatar flexbox positioning and simplified css, as not being applied + - ADDED - dash image border in Walbrook + - ADDED CSS VARIABLES (3) + --crm-dash-image-right (distance from right for avatar) + --crm-dash-image-top (distance from top) + --crm-dash-image-border (optional border) + - REMOVED CSS VARIABLES (2) + --crm-dash-image-justify + --crm-dash-image-direction + +1.1.8 / 5.80.7 + - CHANGED - CiviLint - made Thames CSS more verbose (#84) + - CHANGED - CiviLint - reduced four char spaces to two + - CHANGED - CiviLint - changes to PHP files + - CHANGED - CiviLint - no empty variables + - CHANGED - .gitignore file updated + - REMOVED - Duplicate BoostrapJS files + +1.1.7 / 5.80.6 + - FIXED - trailing comma (merge_requests/42) + - FIXED - FormBuilder customise options doesn't show icons on Wallbrook (#83) + - FIXED - FormBuilder customise options grab region background doesn't show + - CHANGED - Background colours for customise options alternating rows + - CHANGED - CSS tidying around FormBuilder customise options + - REMOVED - responsive tables - fix being used wasn't responsive and had some usability questions (#82) + +1.1.6 / 5.80.5 + - FIXED - reset checkbox margin in checkbox lists (that shrunk the checkbox size) + - FIXED - changed td.label to table-cell to address sizing inconsistencies (#68) + - CHANGED - apply `--crm-c-page-background` to WordPress body, not only .crm-container (#77) + - FIXED - right column inline edit on contact dashboard was positioned left (#76) + +1.1.5 / 5.80.4 + - CHANGED - CSS Variable '--crm-flex-gap' moved from core css into variables (fixed scenarios where it wasn't loading) + - ADDED - right/bottom margin to SK grid buttons to create space in SK displays (#81) + - CHANGED - multi-select select2, use input padding variable + - FIXES - action menu dropdown icon hover colour (#78) + - FIXES - radio buttons and checkboxes had a min-width applied causing layout problems (#80) + +1.1.4 / 5.80.3 + - FIXED tooltip dropdown: double shadow, gap next to arrow, padding/border on bottom (ref #74) + - ADDED float: none for FormBuilder legends + - FIXED added 'important' to 'hiddenElement' as it's getting lost in some cascades, (ref dev/core/#5598) + - FIXED td.label width not being applied, creating various other quirks; changed display type to inline-table. + - ADDED small inline margin to help icons to separate from label text + - ADDED min-height of 100vh to avoid block of white-space below #crm-container (same as Thames) + - CHANGED Readme - simplified some wording, expanded description, removed roadmap, changed order, created 'customisation' section. + - ADDED instructions for creating a subtheme/stream extension pointing to RiverLea. + +1.1.3 / 5.80.2 + - FIXED z-index for date-picker in modals + - FIXED Open Street Map tiles not loading + +1.1.2 / 5.80.1 + - FIXED padding in event config dropdown + - CHANGED padding in HackneyBrook dialogs from 0 to --crm-s. + - FIXED reset of table-scrolling with dropdowns (e.g. Event dashboard dropdown was clipping the dropdown) + - FIXED dropdown link width (reset in WordPress) + - FIXED contact dashboard action links dropdown delete icon color + - FIXED contact dashboard inline name edit overflow hidden reset + - FIXED contact dashboard white text on white bg for contact name inline edit in Walbrook + - CHANGED crm-accordion-settings body padding changed from 0 to match crm-accordion-bold + - FIXED focus colour on Select2 now should display on tab/focus (github.com/31433) + +1.1.1 / 5.80.0 + - FIXED metadata - RiverLea version numbering in variables file & info.xml + +1.1.0 / 5.80.0 + - CHANGED info.xml version to 5.80 to synch with CiviCRM core (github.com/31389) + - FIXED clipping of dropdown on sidescroll tables (#73). + - FIXED Wallbrook, table header bg, should be white. + - CHANGED readme. + - ADDED front-end type across all Streams is reset to 'inherit', over-riding the Stream's font to instead use the CMS front-end theme font(s). For Standalone, inherit will default to the System font stack. + +1.0.12 + - ADDED z-index to sticky table headers: ref github/#31396 + - ADDED crm-accordion-settings ref github/#31293 + - CHANGED accordion file layout (order/headings) + - ADDED 5.80 version compatability to info.xml + - FIXED Font Awesome icon spinner off-center + - FIXED missing bg images in Form Builder dropdown (#71) + - FIXED front-end select2 dropdown input search too wide + - FIXED front-end date/time wrapping issue (#72) + - FIXED front-end date/time height inconsistent + - FIXED front-end FB fieldset titles beaten by Bootstrap - colour & padding + - FIXED stops FB flexbox front-end for inline column collapsing + - FIXED dropdown table select checkbox wrapping in Walbrook + +1.0.11 + - ADDED inline block for code tags inside paragraphs (#69) + - ADDED fixed width for WordPress checkbox/radios (#68) + - CHANGED checkbox list alignment to use grid align rather than pixels + - CHANGED font-weight on input labels in Minetta to 600, not 'bold' (#66) + - ADDED gap between two inline buttons + - ADDED credit card FA icons for contribution pages (originally image sprites) + - FIXED padding on table form label cells didn't match form input cells + - FIXED flexbox with help icons breaking table structure (#68) + - ADDED bg colour and border for pay later options in events/contribution creation to help differentiate + - CHANGED bootstrap small button icon height is fixed to keep button groups matching heights + - FIXED hover issue on cancel icon buttons (#67) + +1.0.10 + - CHANGED sort icons on SK tables to sit inline for wrapping labels. + - FIXED checkbox for SK table header padding so shouldn't wrap. + - CHANGED explicitly set text-decoration to none for buttons + - REMOVED broken link to _font.css in Walbrook. + +1.0.9 + - FIXES text-wrapping on recently viewed block (D7) + - ADDED opacity / hover for view/edit links on recently viewed block + - FIXED Garland/D7 li margin reset blocking tab formatting. + - FIXED Garland/D7 input label width reset + - FIXED Contact summary label width on narrower screens. + - ADDED More table overflow scrolls (e.g. Membership table on contact dashboard). + - FIXED Link colour for some primary/secondary background coloured regions. + +1.0.8 + - FIXES further regressions caused by 1.0.4: removes new #bootstrap-theme applications on input fields + - ADDED background colour for SearchKit admin panel to match active tab. + - ADDED matches height for SearchKit admin title + - ADDED inline flexbox for FormBuilder form-inline. + - CHANGED footer status link underline. + +1.0.7 + - FIXES further regressions caused by 1.0.4. + +1.0.6 + - FIXED regressions caused by 1.0.4. + +1.0.5 + - ADDED nowrap to action links (#64) + +1.0.4 + - ADDED and swapped #bootstrap-theme prefix to button, background and input elements in response to issues with front-end specificity against 3rd party themes #61 + +1.0.3 + - FIXED WordPress FormBuilder checkboxes weren't square + - CHANGED WordPress checkbox and radio alignment no longer reset with other WP resets + - ADDED flex wrapping to FormBuilder for responsive. + - FIXED regression from 1.0.2 on select.form-control elements. + - FIXED FormBuilder dropdown arrow alignment. + - FIXED FormBuilder flex wrap and input overflow. Various other FormBuider front-end responsive tweaks (ref #62) + - CHANGED Multiple Thames fixes, including darkmode and alerts (see !34 and !35) + +1.0.2 + - REMOVED WordPress select list appearance reset (https://lab.civicrm.org/extensions/riverlea/-/issues/60) + +1.0.1 + - CHANGED updated streams/empty/_variables.css to reflect latest variables list. + +1.0.0 + - CHANGED status to stable + +1.0.0beta3 + - REMOVED narrow front-end form width for all Streams other than Hackney + - FIXED inline edit button alignment for SearchKit output + - CHANGED readme. + - REMOVED border from form builder fieldset + - CHANGED Hackney button icon background to tint to support button colouring + - CHANGED Minetta tab body and active state to another value than --crm-page-background + +1.0.0beta2 + - ADDED padding to FormBuilder dashlets + - ADDED tabs border fixes to FormBuilder, and SK/FB listings + - FIXED inconsistent tabs display + - FIXED bold font setting for extensions list accordion + - FIXED transparent background for tabs + - ADDED separate styling for the 'danger' delete links in dropdowns, created Thames override for default + - NEW CSS VARIABLE + --crm-tabs-radius + --crm-dropdown-alert-bg + +1.0.0beta + - CHANGED fonts are in shared directory rather than streams' directory + - REMOVED duplicate parts of Thames + +0.10.20 + - NEW STREAM - Thames, by Rich Lott, @artfulrobot. + +0.10.19 + - FIXED FormBuilder List to match SearchKit list (better fix would harmonise markup) + - FIXED padding on SearchKit Dashlets + - ADDED front-end Legend realignment to SK/FB fieldset/legends (all three issues in #5) + - FIXED contribution page tabs/button alignment/offset + +0.10.18 + - CHANGED better front-end handling of form-builder pages + - FIXED alert message handling (all was treated as .help, including .error and .warning) + - CHANGED alignment of icons in alerts + - FIXED - inline edit alignment, styling (https://lab.civicrm.org/extensions/riverlea/-/issues/5#note_170713) + +0.10.17 + - ADDED civicrm.css to core with default settings. This is primarily to support separate theme extensions using RiverLea as a parent theme. + - REMOVED civicrm.css from streams where not custom (e.g. Minetta but not Walbrook) + - CHANGED front-end form layout, including hiding Stream name/version on front-end + +0.10.16 + - ADDED CiviMail custom CSS override (civi_mail-ang/crmMailing.css) + - CHANGED CiviMail custom CSS to integrate with override file, replace fixed values with variables + - ADDED crmStatusPage custom CSS override ang/crmStatusPage.css + - CHANGED Status page customisations and integration (e.g. colours, dropdwon settings), plus inline flexbox + +0.10.15 + - REMOVED Wallbrook SemiBoldItalic font (unused) + - REMOVED Wallbrook font.css - moved font family definitions into civicrm.css + - FIXED min width issue in contact dashboard tabs + - CHANGED Wallbrook fonts file removed + - REMOVED 2 CSS VARIABLES (simplification / drops Blackberry, iOS1 support) + --crm-italic-style + --crm-bold-weight + +0.10.14 + - FIXED table header/sort colour issues #57 + - FIXED drop shadown css variable in alpha filter not used + - ADDED label colour + - ADDED label bold/weight variables to contact dashboard label + - ADDED CSS VARIABLE: + --crm-input-label-color + --crm-btn-margin (for spacing between buttons) + +0.10.13 + - CHANGED radio/checkbox handling for WordPress to inherit more of the WordPress styling. + - REMOVED unused CSS variable + - ADDED joomla.css into /core/css - and removed Joomla specific css from _cms.css (shrinking the two together) + +0.10.12 + - CHANGED - empty.css file to reflect recent changes, removed empty variables from darkmode + - FIXED - --crm-table-sort-active-col is set but wasn't being called, ref #57 2 + - REMOVED 1 CSS VARIABLE: + --crm-tabs-2-border + - ADDED 1 CSS VARIABLE: + --crm-table-header-col (to set a custom colour for a table header, ref #57 1) + +0.10.11 + - CHANGED - major tabs refactor and simplify (see - https://lab.civicrm.org/extensions/riverlea/-/issues/54) + - REMOVED - quite a bit of now redundant tab-related css. + - REMOVED 8 CSS VARIABLES: + --crm-dashlet-tabs-bg + --crm-dashlet-tab-bg + --crm-dashlet-tab-border + --crm-dashlet-tab-color + --crm-dashlet-tab-active + --crm-dashlet-tab-border-active + --crm-dashlet-tab-body-border + --crm-dashlet-tab-body-padding (NB - it was adding these variables that forced the tab rethink) + +0.10.10 + - FIXED - date time input simplified + - CHANGED - Select2 dropdown advanced: border line between list elements, smaller description, simplified padding. + - FIXED - various issues flagged in https://lab.civicrm.org/extensions/riverlea/-/issues/46 + +0.10.9 + - FIXED - issue 46.1 - configuration checklist contrast ratio + - CHANGED - issue 46.3 - radio and checkbox labels are no longer bold if 'label' is bold + - FIXED - issue 46.4 - legibility issue + - FIXED - issue 46.5 - positioning issue + +0.10.8 +- CHANGED - Button height handling to allow wrapping double line buttons to keep their padding, but also protect streams that have full-height icon backgrounds (ref: https://lab.civicrm.org/extensions/riverlea/-/issues/55). +- FIXED - Issue with icon backgrounds on buttons not stretching full height on double-height buttons. +- NEW CSS VARIABLE - + added: --crm-btn-icon-padding (defaults to 'var(--crm-btn-padding-block)'). NB: fine to ignore this variable unless you want distinct button icon backgrounds, when you should set it to `0px`. + +0.10.7 +- FIXED - Number field is narrower than browser width. +- CHANGED - WordPress font-size not set to 100%, padding variable moved. +- ADDED - line-height to .crm-container +- REMOVED - removed prefers-color-scheme setting from variables (as it seems to be unncessary from the packaged dark mode approach) +- CHANGED - WordPress settings made more specific + +0.10.6 +- ADDED - HackneyBrook primary & secondary hover text variables (ref 0.10.4) +- ADDED - Advanced search layout optimisations (brings closer to original Greenwich/Shoreditch) +- ADDED - table select-icon padding (https://lab.civicrm.org/artfulrobot/riverlea/-/blob/thames/streams/thames/css/civicrm.css#L363) +- FIXED - focus state causes layout shift: https://lab.civicrm.org/extensions/riverlea/-/issues/49 +- FIXED - table cell alignment issue for form layouts +- FIXED - hover state for even table rows in SearchKit: https://lab.civicrm.org/extensions/riverlea/-/issues/50 +- NEW CSS VARIABLE - for alpha-filter spacing (Thames inspired) + added: --crm-filter-spacing (defaults 'start') + +0.10.5 +- FIXED - issue with CSS rewrite happening even if the theme isn't selected: https://lab.civicrm.org/extensions/riverlea/-/merge_requests/26 + +0.10.4 +- NEW CSS VARIABLES to support different text hover colour, and allow contact dashboard roundness of tabs to work left/right as well as top/bottom + added: --crm-c-primary-hover-text + added: --crm-c-secondary-hover-text + added: --crm-dash-tabs-roundness - for the tabs group radius on the contact dashboard + added: --crn-dash-panel-radius - for the tab panel radius on the contact dashboard +- FIXED text area 100% width + +0.10.3 + - ADDED - JQueery spinner styling (number counter with arrows used on pagination) + - FIXED - contact tooltip position in search results + - FIXED - pagination/etc on search results + - FIXED - button wrapping on dialogs https://lab.civicrm.org/extensions/riverlea/-/issues/5 + - ADDED - hover state for contact dashboard main name + - NEW CSS VARIABLES - for alpha-filter (Wellow inspired) + added: --crm-filter-bg + added: --crm-filter-padding + added: --crm-filter-item-bg + added: --crm-filter-item-shadow + +0.10.2 + - FIXES - alignment of table sort headers + - ADDED - min height to body (via Thames) + - CHANGED - Significant change to variables (described https://lab.civicrm.org/extensions/riverlea/-/issues/43). Minetta variables put in core as default variables. Stream variables loaded only when they are different to Minetta, shrinking those files. Empty ('starter') stream variables now copy of core _variables.css, but with everything commented out (build a stream by gradually uncommenting). + +0.10.1 + - ADDED - accordion summary background colour changes if it contains a required input error message (to help find input errors on forms with multiple accordions, such as add new contact) + - FIXES - overflow scroll on import screens due to margin resets on import screens + - FIXES - padding on Mailing screen wizard (walbrook) + - FIXES - next/previous button order on dashboard (https://lab.civicrm.org/extensions/riverlea/-/issues/48) + - FIXES - inlines contact dashboard editor button, handles hover state better + - FIXES - icon bg colour for Hackney. + - CHANGED - buttons from flex to inline-flex with related cleanups (https://lab.civicrm.org/extensions/riverlea/-/issues/45) + +0.10.0 + - version jump to reflect functional maturity, shift to focus on integrating two new streams, and preparation for stable 1.0.0 release. + - REMOVED - contact dashboard page padding distinct from other pages + - CHANGED - Walbrook buttons text no longer uppercase. + - ADDED - styling for the extensions dbse upgrade 'queue runner' screen + - FIXES - missing action button styling for links on contact dashboard header (e.g. contact dashboard editor) + +0.9.56 + - CHANGED - reworking of dashlets, modals and tabs to support more style variations + - NEW CSS VARIABLES (11) + added: --crm-dashlet-header-border + added: --crm-dashlet-header-border-width + added: --crm-dashlet-header-font-size + added: --crm-dashlet-box-shadow + added: --crm-dashlet-dashlets-bg + added: --crm-dialog-inner-shadow + added: --crm-dropdown-radius + added: --crm-dashlet-tab-color + added: --crm-dashlet-tab-body-border + added: --crm-dashlet-tab-body-padding + added: --crm-dashlet-tabs-border + +0.9.55 + - ADDED - functional darkmode settings screen for front and backend. This includes multiple changes, described on the MR: https://lab.civicrm.org/extensions/riverlea/-/merge_requests/22 + - ADDED - each stream has a _dark.css file for darkmode variables, which no longer appear in _variables.css + - FIXED - page title on Drupal 10 doesn't match dark-mode. + +0.9.54 + - CHANGED - reworking of accordions with new variables to support full .crm-accordion-light styling. + - CHANGED - listing of new CSS variables in changelog + - NEW CSS VARIABLES (8 new, 6 renamed): + added: --crm-expand-radius (border radius for accordion) + added: --crm-expand-header-font (for setting bold/font pair) + added: --crm-expand2-header-bg-active + added: --crm-expand2-header-font + added: --crm-expand2-header-border + added: --crm-expand2-header-border-width + added: --crm-expand2-header-padding + added: --crm-expand2-border-width + renamed: --crm-expand-header2-bg => --crm-expand2-header-bg + renamed: --crm-expand-header2-weight => --crm-expand2-header-weight + renamed: --crm-expand-header2-color => --crm-expand2-header-color + renamed: --crm-expand-2-border => --crm-expand2-border + renamed: --crm-expand-body2-bg => --crm-expand2-body-bg + renamed: --crm-expand-2-body-padding => --crm-expand2-body-padding + +0.9.53 + - ADDED - BG colour for standalone login screen + - FIXED - Hackney icon alignment on .button, z-index on tabs. + - FIXED - dashlet close icon inheriting wrong color + - REMOVED - resets on input in base.css + - FIXED - colour of lists on notify alerts matches alert colour + - FIXED - restored list bullets to notification lists + - ADDED - margin reset to top element in notification text, to remove extra padding. + - ADDED - block padding to crm-section divs to separate form elements + +0.9.52 + - FIXED - contact summary dashboard, hidden popup - https://lab.civicrm.org/extensions/riverlea/-/issues/41. Removed unnecessary definition and adjusted caret colour. + - FIXED - Mosaico wizard uses custom markup, but the wizard now matches the stream wizard settings - https://lab.civicrm.org/extensions/riverlea/-/issues/12. Also makes the hover buttons always visible for accessibility. + +0.9.51 + - CHANGED - cleans-up & merges two Bootstrap files: removes some un-used/duplicates, adds CSS variables, sorts into sub-headings + - REMOVES - bootstrap3.css file + +0.9.50 + - FIXES - more icon button padding issues + - ADDED - text colour to headings so H1, H2, etc display correctly in darkmode + - FIXES - WordPress override + - FIXES - Epic empty line spacing 'pink shears' cleanup https://lab.civicrm.org/extensions/riverlea/-/merge_requests/19 + +0.9.49 + - CHANGED - Button icon colour scope broaden - for any stream that sets them, e.g. Hackney Brook (https://lab.civicrm.org/extensions/riverlea/-/issues/37) + - FIXES - multiple button padding & alignment fixes, all streams + - FIXES - multiple button icon padding/alignment fixes, all streams + +0.9.48 + - CHANGED - Minetta input styles to be closer to Bootstrap (ref https://lab.civicrm.org/extensions/riverlea/-/issues/18) + - ADDED - input size modifiers (e.g. for shorter inputs, such as 'prefix') + +0.9.47 + - ADDED - page padding for database upgrade screens. minor type fixes to upgrade complete screen + - FIXES - missing bg on dashlet selector, table padding for dashlet filter table, grab cursor on dashlet header. + - FIXES - notifcation alert type colour. + - FIXES - removes text decoration from notification icon links + - ADDED - icon spinner for select2 loading (https://lab.civicrm.org/extensions/riverlea/-/issues/35#note_169442) + +0.9.46 + - ADDED - basics for dark-mode settings screen (menu link, navigation menu / setting.php, etc). Not yet functioning + - REVERTS - button icon spacing fix from 0.9.43 as it caused new problems. + +0.9.45 + - FIXES - missing delete icon in SK admin table editor + - CHANGED - multiple SK admin editor UI improvements + - FIXES - crm-iconPicker.css isn't being loaded by theme, so overwrites added to _icon.css + +0.9.44 + - CHANGED logo icon in navbar to SVG image (higher resolution). + - CHANGED Standalone inline padding set to 3vw, matching default (https://lab.civicrm.org/extensions/riverlea/-/issues/26#note_169213). + - ADDED alert background colour to delete link on contact summary action dropdown (https://lab.civicrm.org/dev/user-interface/-/issues/54#note_169299). + - ADDED matching bg colour for SK 'select all' checkbox and dropdown + - REMOVES column line for contact summary action dropdown + - REMOVES bounding border for SearchKit tables, other than the main SK admin list (https://lab.civicrm.org/extensions/riverlea/-/issues/36) + - FIXES double border on SK admin list (https://lab.civicrm.org/extensions/riverlea/-/issues/36) + - FIXES SK table head 'select all' checkbox padding (differed for checked/unchecked) + - ADDED crm-iconPicker.css theme override + - FIXES icon picker layout + - CHANGED SK editor layout view table: align drag icons, add padding to details body + - FIXES multiple contrast issues with info/success/warning/danger button + background colour/text combos (https://lab.civicrm.org/extensions/riverlea/-/issues/38) + - NEW CSS VARIABLES (5) - 5 new variables for above fix: + added: --crm-btn-cancel-text + added: --crm-btn-info-text + added: --crm-btn-warning-text + added: --crm-btn-success-text + added: --crm-btn-alert-text + +0.9.43 + - ADDED Operating System font fallbacks for Hackney Brook + - FIXES Second conditional dropdown not showing: https://lab.civicrm.org/extensions/riverlea/-/issues/35 + - FIXES JQuery UI background images appearing on some UI icon classes. NB - this fix remvoes all JQuery UI icon background images so if icons vanish, it'll be linked to this, and need further work. + - FIXES select2 inplace search too wide + - FIXES notification dialog 'restore' button matches theme style rather than JQueryUI. + - FIXES removes webkit font-smoothing on .button in Drupal8+ + - FIXES icon padding when button has an internal span + - CHANGED .pull-right handling: removes from Bootstrap & adds to base, creates Flexbox override for SearchKit: https://lab.civicrm.org/extensions/riverlea/-/issues/5#note_169180. + - FIXES Mosaico: wizard button padding, inactive colour and thumbnail bg (last two fix darkmode issue: https://lab.civicrm.org/extensions/riverlea/-/issues/34) + +0.9.42 + - CHANGED metadata files (readme, info.xml). Package released + - ADDED history to changelog + +0.9.41 + - ADDED changelog + - ADDED Drupal 7 Garland support + +0.9.0 - 0.9.40 + - ADDED overwrites for civi core CSS, e.g. SearchKit & FormBuilder. (Works on 5.75+ only as it uses Angular css overwrites added in https://github.com/civicrm/civicrm-core/pull/30397 to replace the css for Search Kit, Form Builder and some other files, so that CSS variables can be applied to them, fewer '!important' tags used and file size is shurnk). + - ADDED avatar support on contact dashboard + - ADDED visible version-numbering to support development + - FIXED many issues. Adds on-screen commit-version-numbering. + - NEW CSS VARIBLES: + added: --crm-c-code-background + added: --crm-dash-image-size + added: --crm-dash-image-radius + added: --crm-dash-image-justify + added: --crm-dash-image-direction + added: --crm-version (metadata) + added: --crm-release (meetadata) + +0.8 + +Front-end layouts. Adds front-end support for each stream. Adds CiviCRM logo for front-end pages as inline SVG. Adds CSS Variables for front end with --crm-f prefix, including to choose between inline and stacked label/inputs, to create a focus background, to limit the form width and adjust the logo size.Some fixes. NB v0.8 will be the last major version of RiverLea to work on CiviCRM < 5.75, due to file structure changes enabled by that release. Small fixes can be added as v0.8.1, v0.8.2, etc. NEW VARIBLES + +0.7 + +Dark-mode. Improves dark-mode across all three streams. Improves Hackney Brook. More responsive tables. Many small fixes. Thanks SarahFG, Rich Lott & Guillaume Sorel. NEW VARIBLES + +0.6 + +Adds third stream (Finsbury Park / Hackney Brook). Adds basic dark-mode support. Adds new stream: Hackney Brook, based on Finsbury Park (~90% port). Adds new CSS variables to all streams to support Finsbury Park's two main differences to Shoreditch and Greenwich: button icon styling (unique colours, background, border), and contact dashboard side tabs with active/hover border, similar to the 5.72 SearchKit UI, as well as some extra useful variables (e.g. dialog header border, notification border radius, etc). NEW VARIBLES + +0.5 + +Extensive UI and accessibility fixes following testing in CiviCamp Hamburg - with many thanks to Guillaume Sorel, Thomas Renner, Rositza Dikova, Luciano Spiegel & Peter Reck and the organisers - as well as Rich Lott and the Core Team. Instances of #crm-container removed or replaced with .crm-container which changes some cascade order. Preparation for overwriting other core CiviCRM CSS files from v0.6 which will require CiviCRM 5.75. Version compatibility raised to 5.72 from 5.69 because of Search Kit Builder interface changes: if that interface isn't used then compatibility before 5.69 should be fine. + +0.4 + +CSS files restructure into /core/css and /streams/[stream-name]/css/ with stream variables defined in [stream-name]/css/_variables.css. Variables files are version-numbered - 0.4 with this version. Version numbers should only increase when the CSS Variables in these files change name, are removed or added. + +0.3 + +Two streams, 6 CMS setups tested: Backdrop, Drupal7 + Seven, Drupal9 + Claro/Seven, Joomla 4, Standalone, WordPress. Loads with two theme variations/streams: Minetta and Walbrook. Does not cover: front-end layouts, < 1000px screens, Joomla 3, other Drupal admin themes, light/dark modes. + +0.2 + +Establishes structure, adds a bunch of css variables for testing/dev, adds the entirity of the current Greenwich Bootstrap 3 build to start cutting it back, and adds a components directory with initial component 'accordions' (with animated exapnd/close + CSS variables). Separate components files will likely be merged when the extension is moving to testing, to reduce http requests. + +0.1 + +Proof-of-concept, Brunswick, empty theme structure doing just two things: for older CMS interfaces enforces a 100% font-size default to cascade the browser default font-size, and demonstrates a 1rem variable on top of that for some Civi body text sizes. The computed font-size of Civi paragraph and table text should show as 16px in Inspector (for standard setups). diff --git a/civicrm/ext/riverlea/Civi/riverlea/DynamicCss.php b/civicrm/ext/riverlea/Civi/riverlea/DynamicCss.php new file mode 100644 index 0000000000..683636b6ea --- /dev/null +++ b/civicrm/ext/riverlea/Civi/riverlea/DynamicCss.php @@ -0,0 +1,114 @@ +<?php + +namespace Civi\riverlea; + +use CRM_riverlea_ExtensionUtil as E; + +/** + * This class generates a `river.css` file for Riverlea themes containing + * dynamically generated css content + * + * At the moment this is used to serve the right vars for a given dark mode setting + * + * In the future it might allow other dynamic tweaks + * + * @service riverlea.dynamic_css + */ +class DynamicCss implements \Symfony\Component\EventDispatcher\EventSubscriberInterface, \Civi\Core\Service\AutoServiceInterface { + + use \Civi\Core\Service\AutoServiceTrait; + + public const CSS_FILE = 'river.css'; + + public static function getSubscribedEvents() { + return [ + 'hook_civicrm_buildAsset' => ['buildAssetCss', 0], + ]; + } + + public static function getCssParams(): array { + $darkModeSetting = \CRM_Utils_System::isFrontendPage() ? + \Civi::settings()->get('riverlea_dark_mode_frontend') : + \Civi::settings()->get('riverlea_dark_mode_backend'); + + return [ + 'stream' => \Civi::service('themes')->getActiveThemeKey(), + 'dark' => $darkModeSetting, + ]; + } + + /** + * Generate asset content (when accessed via AssetBuilder). + * + * @param \Civi\Core\Event\GenericHookEvent $e + * + * @see CRM_Utils_hook::buildAsset() + * @see \Civi\Core\AssetBuilder + */ + public static function buildAssetCss($e) { + if ($e->asset !== static::CSS_FILE) { + return; + } + $e->mimeType = 'text/css'; + + $params = $e->params; + + $stream = $params['stream'] ?? 'empty'; + + $content = []; + + // add base vars for the stream + $content[] = self::getCSSFromFile('_variables.css', $stream); + + switch ($params['dark'] ?? NULL) { + case 'light': + // nothing more to do + break; + + case 'dark': + // add dark vars unconditionally + $content[] = self::getCSSFromFile('_dark.css', $stream); + break; + + case 'inherit': + default: + // add dark vars wrapped inside a media query + $content[] = '@media (prefers-color-scheme: dark) {'; + $content[] = self::getCSSFromFile('_dark.css', $stream); + $content[] = '}'; + break; + } + + $e->content = implode("\n", $content); + } + + /** + * Check file exists and return contents or empty string + * + * @param string $cssFileName The name of the css file (eg. _variables.css) + * @param string $stream The name of the riverlea stream (eg. walbrook) + * + * @return string + */ + private static function getCSSFromFile(string $cssFileName, string $stream): string { + $res = \Civi::resources(); + $theme = \Civi::service('themes')->get($stream); + $file = ''; + // For riverlea themes CSS should be located in stream/streamname/css - prefix="stream/streamname/" + if (isset($theme['prefix'])) { + $file .= $theme['prefix']; + } + // Append css dir and filename so we end up with stream/streamname/css/filename.css + $file .= 'css/' . $cssFileName; + $file = $res->filterMinify($theme['ext'], $file); + + // Now get the full path for the css file + $filePath = $res->getPath($theme['ext'], $file); + if (is_file($filePath)) { + // File exists and is a file? Return it! + return file_get_contents($filePath) ?? ''; + } + return ''; + } + +} diff --git a/civicrm/ext/riverlea/LICENSE.txt b/civicrm/ext/riverlea/LICENSE.txt new file mode 100755 index 0000000000..1a5847b2a0 --- /dev/null +++ b/civicrm/ext/riverlea/LICENSE.txt @@ -0,0 +1,667 @@ +Package: riverlea +Copyright (C) 2024, Nicol Wistreich +Licensed under the GNU Affero Public License 3.0 (below). + +------------------------------------------------------------------------------- + + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +<http://www.gnu.org/licenses/>. diff --git a/civicrm/ext/riverlea/README.md b/civicrm/ext/riverlea/README.md new file mode 100755 index 0000000000..3535ca5f98 --- /dev/null +++ b/civicrm/ext/riverlea/README.md @@ -0,0 +1,151 @@ +# RiverLea Theme Framework + +This Framework separates CiviCRM's visual/UI CSS from structural CSS, using CSS variables. Installing it provides you with four subthemes or 'Streams' which are entirely created with CSS variables (other than Thames, which uses a little bit of CSS as well): + - Minetta, named after the river that runs under Greenwich, NYC. It is based on Civi's default 'Greenwich' theme. + - Walbrook, named after the river that runs under Shoreditch, London. It is based on Shoreditch/TheIsland theme. + - Hackney, named after the river that runs under Finsbury Park, based on Finsbury Park theme. + - Thames, named after the river that runs close to Artful Robot HQ, based on their Aah theme. + You can chose between these subthemes via Display Settings, where you can also set dark-mode preferences. + + The extension is licensed under [AGPL-3.0](LICENSE.txt). + + ## Use in Front-End CiviCRM + +**USE WITH CAUTION AND TESTING** While RiverLea has been widely tested in the backend of CiviCRM, be very careful to use in front-end. Given the wide number of themes and scenarios for front-end pages, for existing sites we recommend only applying it to an existing web front-end after comprehensive testing on a dev site. + +Overwriting CSS variables for the front is straightforward (they can be nested within `.crm-container.crm-public` and there's a number of front-end specific variables, prefixed `--crm-f-`), but **testing is essential**. + +## [Changelog](CHANGELOG.md) + +- 1.80 (5.80) - Release for packaging with CiviCRM core, v5.80 (see note on numbering below) +- 1.0 - **Release candidate**, with ongoing testing and fixes. +- 0.10 - **Adds fourth stream**. Thames (Aah), as well as extensive fixes & adjustments. +- 0.9 - **Overwrites civi core CSS**. 5.75 only - overwrites core css like SearchKit & FormBuilder with extensive work on both. D7 Garland support. +- 0.8 - **Front-end layouts**. Front-end support for each stream. +- 0.7 - **Dark-mode**. Dark-mode working across all three streams. +- 0.6 - **Adds third stream** Hackney Brook (Finsbury Park). +- 0.5 - **Extensive UI and accessibility fixes** following testing in/around CiviCamp Hamburg. +- 0.4 - **CSS files restructure** core and stream directories, version numbering of variables files with new variables. +- 0.3 - **Two streams, 6 CMS setups tested:** adds Minetta and Walbrook streams. Backdrop, D7 (Seven), D9 (Claro + Seven), Joomla 4, Standalone & WordPress. +- 0.2 - **Establishes structure**, adds Bootstrap3, components - accordion. +- 0.1 - **Proof-of-concept**, basic variables. + +### Version numbering +RiverLea has its own version number and confusingly this has changed a few times while we figured out the best approach. It is also different in the core-extension info.xml which in core will always match the Civi version its shipped with, but as a standalone extension has its own numbering. + +The pattern is `1.x.y` where x = the CiviCRM version it is developed against and y = the version number of of RiverLea for that Civi version. So `1.80.11` is the 11th version of RiverLea v1 built against CiviCRM `5.80.x`. Some previous versions tried to match the CiviCRM core version number and build on that (ie RiverLea 5.80.11), but this caused problems with upgrade prompts. + +## Installation + +### With (CLI, Zip) + +Sysadmins and developers may download the `.zip` file for this extension and +install it with the command-line tool [cv](https://github.com/civicrm/cv). + +```bash +cd <extension-dir> +wget https://lab.civicrm.org/extensions/riverlea/-/archive/main/riverlea-main.zip +unzip riverlea-main.zip +``` + +### With (CLI, Git) + +Sysadmins and developers may clone the [Git](https://en.wikipedia.org/wiki/Git) repo for this extension and +install it with the command-line tool [cv](https://github.com/civicrm/cv). + +```bash +git clone https://lab.civicrm.org/extensions/riverlea.git +cv en riverlea +``` + +### After installation + +After installing the extension, go to Nav menu > Administer > Customize Data and Screens > Display Preferences, and select which subtheme/stream you want. + +## Extension Structure + +### Core variables +A list of all base variables used on all streams is at `core/css/_variables.css`. + +### Stream/subtheme directories +Each ‘stream’ or subtheme directory must contain a further directory `css` with a `_variables.css`file and a `_dark.css` if darkmode is supported. Variables in this `_variables.css` file will overrule any variables in the core list above. The subtheme can also include fonts, images and other CSS files, which can be loaded from the `_variables.css` file as an import. + +### Core directory +Contains CSS files in: +- In the **core/css** directory are theme files marked with an underscore: + - core/css/_base.css – resets, basic type, colours, links, positioning + - core/css/_bootstrap.css – a Bootstrap subset + - core/css/_cms.css – resets and fixes specific to different CMSs + - core/css/_core.css - links to the UI components in the components directory: + - core/css/_fixes.css - CSS that’s necessary *for now* but one day could go. + - core/css/_variables.css - a list of all base variables +- in the **components** directory are reusable UI elements, such as `_accordions` or `_tables.css`; +- civicrm.css - the core theme css file which loads the other files +- other files here without underscore (`admin.css`, `api4-explorer.css`, `contactSummary.css` etc) overrides civicrm's CSS core directory with files of the same name that are called by templates and only load in certain parts of Civi. E.g. `dashboard.css` loads on the CiviCRM main dashboard, and no-where else. +- three directories: `org.civicrm.afform-ang` for Afform output, `org.civicrm.afform_admin-ang` for FormBuilder and `org.civicrm.search_kit-css` for SearchKit replace css files in core Civi extensions. + +## Customising + +Adding a customiser is on the roadmap, with a working prototype, but until its issues are resolved customising can be done through one of the three following methods: + +### 1. Add CSS variables to your parent theme + +For instance, to give all contribution page buttons rounded corners, you could add to your CMS theme: + +``` +--crm-btn-radius: 2rem; +``` + +Exploring the _variables.css file will give you idea of how much can be overwritten. + +### 2. Create a subtheme 'stream' + +1. Inside the `/streams/` directory is an example stream called `empty`. Duplicate this and rename it the name of your stream. +2. In riverlea.php add a theme array to the function `riverlea_civicrm_themes(&$themes)`. +3. Edit `/streams/[streamname]/css/_variables.css` with your custom css variables. You can link to other CSS files, fonts or images in this file - inside the stream. + +E.g. to add a stream called "Vimur", you would name the directory 'vimur', and add the following: + +``` + function riverlea_civicrm_themes(&$themes) { + $themes['vimur'] = array( + 'ext' => 'riverlea', + 'title' => 'Riverlea: Vimur', + 'prefix' => 'streams/vimur/', + ); + $themes['minetta'] = array( + 'ext' => 'riverlea', + 'title' => 'Riverlea: Minetta (~Greenwich)', + 'prefix' => 'streams/minetta/', + ); + … + } +``` + +Use of the [ThemeTest extension](https://lab.civicrm.org/extensions/themetest) is recommended to more quickly identify which CSS variables match which UI element, and test multiple variations for each. + +IMPORTANT NOTE: Every time you upgrade RiverLea you will need to add your Stream again. This is obviously less than ideal, so for produciton you may prefer option 3: + +### 3. Create a subtheme extension + +NB: this approach has had very limited testing + +1. Create a theme extension using Civix, following the [instructions in the CiviCRM Developer Guide](https://docs.civicrm.org/dev/en/latest/framework/theme/). +2. Create a subtheme of RiverLea using the instructions in **2. Create a subtheme 'stream'** above. +3. Copy the subtheme into the root of your new theme extenion. +4. Edit its main php file, enable both extensions and select your stream. +E.g. for a stream called 'styx', with a theme extension called 'ocean', then in ocean.php you would write: + +``` +function ocean_civicrm_themes(&$themes) { + $themes['styx'] = array( + 'ext' => 'ocean', + 'title' => 'River Styx', + 'prefix' => 'styx/', + 'search_order' => array('_riverlea_core_', 'styx', '_fallback_'), + ); +} + +## Troubleshooting +- Unless you really need it (e.g. applying an urgent fix, or running a test), delete the custom/ext version of RiverLea, once you are on CiviCRM 5.80 or later. +- After removing the custom/ext RiverLea directory, the civicrm/ext version should load automatically. It may appear to be enabled, but normally you will need to disable and re-enable it before RiverLea streams appear in Display Settings. \ No newline at end of file diff --git a/civicrm/ext/riverlea/composer.json b/civicrm/ext/riverlea/composer.json new file mode 100644 index 0000000000..7de13c491a --- /dev/null +++ b/civicrm/ext/riverlea/composer.json @@ -0,0 +1,5 @@ +{ + "name": "civicrm/riverlea", + "description": "CiviCRM Theme Framework", + "type": "civicrm-ext" +} diff --git a/civicrm/ext/riverlea/core/ang/crmStatusPage.css b/civicrm/ext/riverlea/core/ang/crmStatusPage.css new file mode 100644 index 0000000000..acaa65c3aa --- /dev/null +++ b/civicrm/ext/riverlea/core/ang/crmStatusPage.css @@ -0,0 +1,91 @@ +/* CSS rules for Angular module "statuspage" */ + +#crm-status-list h3 { + color: inherit; + opacity: .85; + display: flex; + justify-content: space-between; + gap: var(--crm-r); + align-items: center; + padding: var(--crm-padding-small) var(--crm-padding-small) var(--crm-padding-small) var(--crm-r); +} +#crm-status-list h3:hover, +#crm-status-list h3.menuopen { + opacity: 1; +} +/* Error Severity */ +#crm-status-list .crm-severity-emergency, +#crm-status-list .crm-severity-alert, +#crm-status-list .crm-severity-critical, +#crm-status-list .crm-severity-error { + background-color: var(--crm-c-alert); + color: var(--crm-c-alert-text); +} +/* Warning Severity */ +#crm-status-list .crm-severity-warning { + background-color: var(--crm-c-warning); + color: var(--crm-c-warning-text); +} +/* Not Okay - Not Warning */ +#crm-status-list .crm-severity-notice { + background-color: var(--crm-c-info); + color: var(--crm-c-info-text); +} +/* All OK Severity */ +#crm-status-list .crm-severity-info, +#crm-status-list .crm-severity-debug { + background-color: var(--crm-c-success); + color: var(--crm-c-success-text); +} +#crm-status-list .crm-status-message-body { + margin: var(--crm-r) 0; +} +#crm-status-list .hidden-until { + font-weight: normal; + font-size: var(--crm-small-font-size); + margin-right: var(--crm-r); +} +#crm-status-list .hush-menu { + margin-left: auto; +} +#crm-status-list .hush-menu > div { + position: relative; +} +#crm-status-list .hush-menu button { + background-color: rgba(256,256,256,0.6); + color: var(--crm-c-text); + font-size: initial; + border-color: transparent; +} +#crm-status-list .hush-menu ul { + position: absolute; + top: 1.5em; + right: 0; + width: calc(1.5 * var(--crm-dropdown-width)); + margin: 0; + padding: 0; + z-index: 99; + background: var(--crm-dropdown-bg); + padding: var(--crm-dropdown-padding); + border-radius: var(--crm-dropdown-radius); + font-size: var(--crm-font-size); + box-shadow: var(--crm-popup-shadow); +} +#crm-status-list .hush-menu li { + padding: var(--crm-dropdown-padding); + color: var(--crm-dropdown-col); + background-color: var(--crm-dropdown-bg); + font-weight: normal; + border-radius: var(--crm-dropdown-radius); +} +#crm-status-list .hush-menu li:hover, +#crm-status-list .hush-menu li:focus { + background-color: var(--crm-dropdown-hover-bg); + color: var(--crm-dropdown-hover); +} +.status-debug-information { + font-size: var(--crm-small-font-size); +} +.crm-status-message-body ul { + list-style: inherit; +} diff --git a/civicrm/ext/riverlea/core/civi_mail-ang/crmMailing.css b/civicrm/ext/riverlea/core/civi_mail-ang/crmMailing.css new file mode 100644 index 0000000000..1e592a5dae --- /dev/null +++ b/civicrm/ext/riverlea/core/civi_mail-ang/crmMailing.css @@ -0,0 +1,62 @@ +.crmMailing select, +.crmMailing input[type=text] { + width: 36em; +} +.crmMailing textarea { + height: 20em; +} +.crmMailing-recip-est { + background: var(--crm-c-yellow-less-light); + font-size: var(--crm-small-font-size); + padding: var(--crm-padding-small); + margin: 0 0 0 var(--crm-m); + width: var(--crm-big-input); + text-align: center; +} +.crmMailing input.crm-form-date, +.crmMailing input[name=preview_test_email], +.crmMailing-preview select[name=preview_test_group] { + width: var(--crm-big-input); +} +.crmMailing .crmMailing-preview { + display: grid; + grid-template-columns: repeat(3, 1fr); +} +.crm-container .crmMailing-preview .preview-popup, +.crm-container .crmMailing-preview .preview-contact, +.crm-container .crmMailing-preview .preview-group { + display: flex; + flex-direction: column; + height: auto; + align-items: center; + gap: var(--crm-m); + width: 100%; +} +.crmMailing .preview-popup, +.crmMailing .preview-contact { + border-right: var(--crm-c-divider); +} +.crmMailing .preview-popup, +.crmMailing .preview-contact { + text-align: center; + border-right: var(--crm-c-divider); +} +.crmMailing .crmMailing-schedule-inner { + width: var(--crm-huge-input); + margin: auto; +} +input[name=preview_test_email]::placeholder { + text-align: center; +} +.crmMailing-inactive { + text-decoration: line-through; +} +.crm-container #crm-main-content-wrapper a.crmMailing-submit-button { + margin-top: var(--crm-r); + font-size: var(--crm-r1); +} +.crm-container a.crmMailing-submit-button.disabled, +.crm-container a.crmMailing-submit-button.blocking { + opacity: .6; + cursor: default; +} diff --git a/civicrm/ext/riverlea/core/css/_base.css b/civicrm/ext/riverlea/core/css/_base.css new file mode 100755 index 0000000000..d5d1e81e73 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/_base.css @@ -0,0 +1,436 @@ +/****************** + VARIABLES +*******************/ + +@import url(_variables.css); /* default variables */ + +/****************** + RESETS +*******************/ + +body { + min-height: 100vh; +} +.crm-container *, +.crm-container *::before, +.crm-container *::after { + box-sizing: border-box; +} +#crm-container .hiddenElement, +.crm-container .hiddenElement, +#bootstrap-theme .collapse { + display: none +} +#bootstrap-theme .collapse.in, +#bootstrap-theme .collapse.show /* BS4 */ { + display: block; +} +.crm-container .clear { + clear: both; +} +.crm-container table, +.crm-container th, +.crm-container tr, +.crm-container td, +.crm-container details { + background-color: transparent; + background: transparent; + border: 0; + padding: 0; + margin: 0; + border-radius: unset; + height: unset; + color: inherit; + line-height: inherit; + font-family: inherit; + font: inherit; + font-size: inherit; +} +.crm-container tr:hover, +.crm-container tr:focus, +.crm-container table.dataTable.hover tbody tr:hover, +.crm-container table.dataTable.display tbody tr:hover { + background-color: transparent; +} +/* Remove list styles (bullets/numbers) */ +.crm-container ol, +.crm-container ul, +.crm-container menu { + list-style: none; +} +/* For images to not be able to exceed their container */ +.crm-container img { + max-inline-size: 100%; + max-block-size: 100%; +} +.crm-container img.olTileImage { + max-block-size: unset; /* open street map exception */ +} +.crm-container table { + border-collapse: collapse; +} + +/* JQueryUI resets (!important vs JQuery UI css) */ + +.crm-container .ui-tabs .ui-tabs-panel, +.crm-container .ui-tabs { + padding: 0; +} +.crm-container .ui-widget, +.crm-container .ui-widget input, +.crm-container.ui-widget input, +.crm-container .ui-widget select, +.crm-container.ui-widget select, +.crm-container .ui-widget textarea, +.crm-container .ui-widget select, +.crm-container.ui-widget button, +.crm-container .ui-widget button, +.ui-widget.ui-autocomplete, +.crm-quickSearch-results .ui-widget { + font-family: inherit !important; + font-size: inherit; +} +.crm-container .ui-icon { + width: inherit; + background-image: none !important; +} +.crm-container .ui-icon:hover { + background-image: none; +} +.crm-container .ui-corner-all { + border-radius: 0; +} +.crm-container .ui-button-icon-only .ui-icon { + position: initial; + top: auto; + left: auto; + margin-top: auto; + margin-left: auto; + float: right; +} +.crm-container .ui-widget-content { + color: inherit; +} +.crm-container .ui-widget, +.crm-container .ui-widget-content, +.ui-tabs .ui-tabs-nav li { + border: 0; + background: transparent; + white-space: unset; +} +.crm-container .ui-helper-clearfix::before, +.crm-container .ui-helper-clearfix::after { + display: none; +} + +/****************** + ACCESSIBILITY +*******************/ + +.sr-only { /* text exclusively for screen readers */ + border: 0; + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + width: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; +} +.crm-container .crm-draggable { + cursor: move; +} + +/****************** + TYPE +*******************/ + +/* Set Default Type */ + +.crm-container { + font-family: var(--crm-font); + font-size: var(--crm-font-size); + line-height: 1.4; + color: var(--crm-c-text); + background: var(--crm-c-page-background); +} +.crm-container table, +.crm-container tr, +.crm-container tr td, +.crm-container p, +.crm-container ul { + font-size: var(--crm-font-size); + line-height: var(--crm-type-line-height); + color: var(--crm-c-text); +} + +/* Core type */ + +.crm-container strong, +.crm-container b, +.crm-container .bold, +.crm-container .font-bold { + font-family: var(--crm-font-bold); + font-weight: bold; +} +.crm-container em, +.crm-container .font-italic { + font-family: var(--crm-font-italic); + font-style: italic; +} +.crm-container strong em, +.crm-container em strong { + font-family: var(--crm-font-bold-italic); + font-weight: bold; + font-style: italic; +} +.crm-container .strikethrough { + text-decoration: line-through; +} +.crm-container .upper { + text-transform: uppercase; +} +.crm-container h3, +#bootstrap-theme h3 { + background-color: var(--crm-heading-bg); + font-size: var(--crm-r1); + font-family: var(--crm-font-bold); + font-weight: bold; + color: var(--crm-heading-col); + padding: var(--crm-heading-padding); + border-radius: var(--crm-heading-radius); + margin: var(--crm-heading-margin); +} + +/* Definition lists */ + +dl dd, +dl dl { + margin-block-end: var(--crm-m1); + margin-inline-start: var(--crm-r1); +} + +/* Practical colors */ + +.crm-container .del, +.crm-container .crm-is_deleted, +.crm-container table.caseSelector td.status-urgent, +.crm-container p.error, +.crm-container .status-removed, +.crm-container .status-overdue, +.crm-container .status-fatal, +.crm-container .status-hold, +.crm-container .status-past, +.crm-container .crmMailing-error-link .crm-contact-deceased, +.crm-container .status-warning, +.crm-container .crm-error, +.crm-container td.tasklist a:link, +#bootstrap-theme .has-error .help-block, +#bootstrap-theme .has-error .control-label, +#bootstrap-theme .has-error .radio, +#bootstrap-theme .has-error .checkbox, +#bootstrap-theme .has-error .radio-inline, +#bootstrap-theme .has-error .checkbox-inline, +#bootstrap-theme .has-error.radio label, +#bootstrap-theme .has-error.checkbox label, +#bootstrap-theme .has-error.radio-inline label, +#bootstrap-theme .has-error.checkbox-inline label { + color: var(--crm-c-alert); +} +.crm-container .font-red { + color: var(--crm-c-red-dark); +} +.crm-container td.tasklist a:visited, +#bootstrap-theme .has-success .help-block, +#bootstrap-theme .has-success .control-label, +#bootstrap-theme .has-success .radio, +#bootstrap-theme .has-success .checkbox, +#bootstrap-theme .has-success .radio-inline, +#bootstrap-theme .has-success .checkbox-inline, +#bootstrap-theme .has-success.radio label, +#bootstrap-theme .has-success.checkbox label, +#bootstrap-theme .has-success.radio-inline label, +#bootstrap-theme .has-success.checkbox-inline label { + color: var(--crm-c-success); +} +#bootstrap-theme .has-warning .help-block, +#bootstrap-theme .has-warning .control-label, +#bootstrap-theme .has-warning .radio, +#bootstrap-theme .has-warning .checkbox, +#bootstrap-theme .has-warning .radio-inline, +#bootstrap-theme .has-warning .checkbox-inline, +#bootstrap-theme .has-warning.radio label, +#bootstrap-theme .has-warning.checkbox label, +#bootstrap-theme .has-warning.radio-inline label, +#bootstrap-theme .has-warning.checkbox-inline label { + color: var(--crm-c-warning); +} +.crm-container .disabled, +.crm-container .crm-disabled, +.crm-container .disabled *, +.crm-container .cancelled, +.crm-container .cancelled td, +.crm-container li.disabled a.ui-tabs-anchor { + color: var(--crm-c-inactive); +} + +/* BS3 type styles */ + +.crm-container .text-left { + text-align: left; +} +.crm-container .text-right, +.crm-container td.right { + text-align: right; +} +.crm-container .text-center { + text-align: center; +} +.crm-container .text-justify { + text-align: justify; +} +.crm-container .text-nowrap { + white-space: nowrap; +} +.crm-container .text-lowercase { + text-transform: lowercase; +} +.crm-container .text-uppercase, +.crm-container .initialism { + text-transform: uppercase; +} +.crm-container .text-capitalize { + text-transform: capitalize; +} +.crm-container .text-muted, +.crm-container .diasbled { + color: var(--crm-c-inactive); +} +.crm-container .text-primary { + color: var(--crm-c-primary); +} +.crm-container a.text-primary:hover, +.crm-container a.text-primary:focus { + color: var(--crm-c-primary-hover); +} +.crm-container .text-success { + color: var(--crm-c-success); +} +.crm-container .text-info { + color: var(--crm-c-info); +} +.crm-container .text-warning { + color: var(--crm-c-warning); +} +.crm-container .text-danger { + color: var(--crm-c-alert); +} +.crm-container h1, +.crm-container h2, +.crm-container h4, +.crm-container h5, +.crm-container h6 { + color: var(--crm-c-text); +} +.crm-container code, +.crm-container kbd, +.crm-container samp, +.crm-container pre { + display: block; + padding: var(--crm-padding-small); + margin: 0 0 var(--crm-padding-small); + font-size: var(--crm-font-size) !important /* vs inline css on api3 */; + line-height: 1.4 !important /* vs inline css on api3 */; + color: var(--crm-c-text); + word-break: break-all; + word-wrap: break-word; + background-color: var(--crm-c-code-background); + border: 1px solid var(--crm-c-background4); + border-radius: var(--crm-roundness); +} +.crm-container pre { + white-space: normal; + word-break: normal; +} +.crm-container pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.crm-container p code { + display: inline-block; +} +.crm-container .pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +/****************** + LINK +*******************/ + +.crm-container a { + color: var(--crm-c-link); + text-decoration: var(--crm-link-decoration); +} +.crm-container a:hover, +.crm-container a:focus { + color: var(--crm-c-link-hover); + text-decoration: var(--crm-link-decoration-hover); +} +.crm-container a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +/****************** + POSITION +*******************/ + +#crm-container /* applied to #crm not .crm to apply only once */ { + max-width: 100%; + min-height: 100vh; + padding: var(--crm-page-padding); +} +.crm-container .crm-flex-box { + display: flex; + flex-wrap: wrap; +} +.crm-container .crm-flex-box > * { + gap: var(--crm-flex-gap); + flex: 1; + min-width: 0; +} +.crm-container .crm-flex-1 { + flex: 1; +} +.crm-container .crm-flex-2 { + flex: 2; +} +.crm-container .crm-flex-3 { + flex: 3; +} +.crm-container .crm-flex-4 { + flex: 4; +} +.crm-container .crm-flex-5 { + flex: 5; +} +.crm-container .css_right, +.crm-container .float-right, +.crm-container .pull-right, +.crm-container .element-right { + float: right; +} +/* Responsive */ + +@media (max-width: 989px) { + .crm-container .crm-flex-box, + .api4-input /* sections/api4-explorer */ { + flex-direction: column; + } +} diff --git a/civicrm/ext/riverlea/core/css/_bootstrap.css b/civicrm/ext/riverlea/core/css/_bootstrap.css new file mode 100644 index 0000000000..3f6182d1ec --- /dev/null +++ b/civicrm/ext/riverlea/core/css/_bootstrap.css @@ -0,0 +1,3886 @@ +/* The Bootstrap typically bundled has been re-structured in River Lea: + - Some of it that wasn't being used (e.g. Glyphicons, Carousels) is deleted / commented out + - Some of it is taken out of the #bootstrap-theme namespace and added to /components/ typically marked, e.g. 'BS buttons' + - Some of it has been taken out and put below with as much integration with the rest of River Lea's CSS variables. + It is structured as: + - Type + - Print + - Image + - Alerts + - Screenreader + - Lists + - Definition lists + - Blockquote + - Various HTML elements + - Container + - Column system + - Table + - Input + - Buttons + - Nav + - Breadcrumb + - Pager + - Jumbotron + - Media + - List group + - Embed + - Well + - Close + - Modal + - Tooltip + - Popover + - Labels + - Panels (with tables & list elements) + - Hiding elements + */ + +/* Type */ + +#bootstrap-theme p { + margin: 0 0 10px; +} +#bootstrap-theme .lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +#bootstrap-theme small, +#bootstrap-theme .small { + font-size: 85%; +} +#bootstrap-theme sub, +#bootstrap-theme sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +#bootstrap-theme sup { + top: -.5em; +} +#bootstrap-theme sub { + bottom: -.25em; +} +#bootstrap-theme h1 { + font-size: 2em; + margin: .67em 0; +} +#bootstrap-theme .help-block { + display: block; + color: var(--crm-c-text); + font-style: italic; + font-family: var(--crm-font-italic); + margin: var(--crm-s) 0 var(--crm-m); + font-size: var(--crm-font-small-size); +} +#bootstrap-theme h4, +#bootstrap-theme .h4, +#bootstrap-theme h5, +#bootstrap-theme .h5, +#bootstrap-theme h6, +#bootstrap-theme .h6 { + margin-top: var(--crm-m1); + margin-bottom: var(--crm-m1); + font-weight: bold; + font-family: var(--crm-font-bold); + color: var(--crm-c-text); + line-height: 1.2; +} +#bootstrap-theme h1, +#bootstrap-theme h2, +#bootstrap-theme h3, +#bootstrap-theme .h1, +#bootstrap-theme .h2, +#bootstrap-theme .h3 { + line-height: 1.2; +} +#bootstrap-theme h1 small, +#bootstrap-theme h1 .small, +#bootstrap-theme .h1 small, +#bootstrap-theme .h1 .small, +#bootstrap-theme h2 small, +#bootstrap-theme h2 .small, +#bootstrap-theme .h2 small, +#bootstrap-theme .h2 .small, +#bootstrap-theme h3 small, +#bootstrap-theme h3 .small, +#bootstrap-theme .h3 small, +#bootstrap-theme .h3 .small { + font-size: 65%; + line-height: 1; +} +#bootstrap-theme h4 small, +#bootstrap-theme h4 .small, +#bootstrap-theme .h4 small, +#bootstrap-theme .h4 .small, +#bootstrap-theme h5 small, +#bootstrap-theme h5 .small, +#bootstrap-theme .h5 small, +#bootstrap-theme .h5 .small, +#bootstrap-theme h6 small, +#bootstrap-theme h6 .small, +#bootstrap-theme .h6 small, +#bootstrap-theme .h6 .small { + font-size: 75%; + line-height: 1; +} +#bootstrap-theme mark, +#bootstrap-theme .mark { + background: var(--crm-c-yellow); + color: var(--crm-c-text); + padding: .2rem; +} +@media (min-width: 768px) { + #bootstrap-theme .lead { + font-size: 21px; + } +} + +/* Print */ + +@media print { + #bootstrap-theme *, + #bootstrap-theme *:before, + #bootstrap-theme *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + #bootstrap-theme a, + #bootstrap-theme a:visited { + text-decoration: underline; + } + #bootstrap-theme a[href]:after { + content: " (" attr(href) ")"; + } + #bootstrap-theme abbr[title]:after { + content: " (" attr(title) ")"; + } + #bootstrap-theme a[href^="#"]:after, + #bootstrap-theme a[href^="javascript:"]:after { + content: ""; + } + #bootstrap-theme pre, + #bootstrap-theme blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + #bootstrap-theme thead { + display: table-header-group; + } + #bootstrap-theme tr, + #bootstrap-theme img { + page-break-inside: avoid; + } + #bootstrap-theme img { + max-width: 100% !important; + } + #bootstrap-theme p, + #bootstrap-theme h2, + #bootstrap-theme h3 { + orphans: 3; + widows: 3; + } + #bootstrap-theme h2, + #bootstrap-theme h3 { + page-break-after: avoid; + } + #bootstrap-theme .navbar { + display: none; + } + #bootstrap-theme .btn > .caret, + #bootstrap-theme .dropup > .btn > .caret { + border-top-color: #000 !important; + } + #bootstrap-theme .label { + border: 1px solid #000; + } + #bootstrap-theme .table { + border-collapse: collapse !important; + } + #bootstrap-theme .table td, + #bootstrap-theme .table th { + background-color: #fff !important; + } + #bootstrap-theme .table-bordered th, + #bootstrap-theme .table-bordered td { + border: 1px solid #ddd !important; + } +} + +/* Image */ + +#bootstrap-theme svg:not(:root) { + overflow: hidden; +} +#bootstrap-theme img { + vertical-align: middle; +} +#bootstrap-theme .img-responsive { + display: block; + max-width: 100%; + height: auto; +} +#bootstrap-theme .img-rounded { + border-radius: 6px; +} +#bootstrap-theme .img-thumbnail { + padding: 4px; + line-height: 1.428571429; + background-color: white; + border: var(--crm-c-divider); + border-radius: var(--crm-c-roundness); + transition: all .2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +#bootstrap-theme .img-circle { + border-radius: 50%; +} + +/* Alerts */ + +#bootstrap-theme .alert h4 { + margin-top: 0; + color: inherit; +} +#bootstrap-theme .alert .alert-link { + font-weight: bold; +} +#bootstrap-theme .alert > p, +#bootstrap-theme .alert > ul { + margin-bottom: 0; +} +#bootstrap-theme .alert > p + p { + margin-top: 5px; +} +#bootstrap-theme .alert-success hr { + border-top-color: var(--crm-alert-border-help); +} +#bootstrap-theme .alert-success .alert-link { + color: var(--crm-alert-text-help); +} +#bootstrap-theme .alert-info hr { + border-top-color: var(--crm-alert-border-info); +} +#bootstrap-theme .alert-info .alert-link { + color: var(--crm-alert-text-info); +} +#bootstrap-theme .alert-warning hr { + border-top-color: var(--crm-alert-border-warning); +} +#bootstrap-theme .alert-warning .alert-link { + color: var(--crm-alert-text-warning); +} +#bootstrap-theme .alert-danger hr { + border-top-color: var(--crm-alert-border-danger); +} +#bootstrap-theme .alert-danger .alert-link { + color: var(--crm-alert-text-danger); +} + +/* Screen reader */ + +#bootstrap-theme .sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +#bootstrap-theme .sr-only-focusable:active, +#bootstrap-theme .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} + +/* List */ + +#bootstrap-theme ul ul, +#bootstrap-theme ul ol, +#bootstrap-theme ol ul, +#bootstrap-theme ol ol { + margin-bottom: 0; +} +#bootstrap-theme .list-unstyled { + padding-left: 0; + list-style: none; +} +#bootstrap-theme .list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +#bootstrap-theme .list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} + +/* Definition lists */ + +#bootstrap-theme dl { + margin-top: 0; + margin-bottom: 20px; +} +#bootstrap-theme dt, +#bootstrap-theme dd { + line-height: 1.428571429; +} +#bootstrap-theme dt { + font-weight: 700; +} +#bootstrap-theme dd { + margin-left: 0; +} +#bootstrap-theme .dl-horizontal dd:before, +#bootstrap-theme .dl-horizontal dd:after { + display: table; + content: " "; +} +#bootstrap-theme .dl-horizontal dd:after { + clear: both; +} +@media (min-width: 768px) { + #bootstrap-theme .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + #bootstrap-theme .dl-horizontal dd { + margin-left: 180px; + } +} + +/* Blockquote */ + +#bootstrap-theme blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +#bootstrap-theme blockquote p:last-child, +#bootstrap-theme blockquote ul:last-child, +#bootstrap-theme blockquote ol:last-child { + margin-bottom: 0; +} +#bootstrap-theme blockquote footer, +#bootstrap-theme blockquote small, +#bootstrap-theme blockquote .small { + display: block; + font-size: 80%; + line-height: 1.428571429; + color: #999; +} +#bootstrap-theme blockquote footer:before, +#bootstrap-theme blockquote small:before, +#bootstrap-theme blockquote .small:before { + content: "— "; +} +#bootstrap-theme .blockquote-reverse, +#bootstrap-theme blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +#bootstrap-theme .blockquote-reverse footer:before, +#bootstrap-theme .blockquote-reverse small:before, +#bootstrap-theme .blockquote-reverse .small:before, +#bootstrap-theme blockquote.pull-right footer:before, +#bootstrap-theme blockquote.pull-right small:before, +#bootstrap-theme blockquote.pull-right .small:before { + content: ""; +} +#bootstrap-theme .blockquote-reverse footer:after, +#bootstrap-theme .blockquote-reverse small:after, +#bootstrap-theme .blockquote-reverse .small:after, +#bootstrap-theme blockquote.pull-right footer:after, +#bootstrap-theme blockquote.pull-right small:after, +#bootstrap-theme blockquote.pull-right .small:after { + content: " —"; +} + +/* Various Html elements */ + +#bootstrap-theme abbr[title], +#bootstrap-theme abbr[data-original-title] { + cursor: help; + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; +} +#bootstrap-theme .initialism { + font-size: 90%; +} +#bootstrap-theme dfn { + font-family: var(--crm-font-italic); + font-style: italic; +} +#bootstrap-theme hr { + box-sizing: content-box; + height: 0; + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: var(--crm-c-divider); +} +#bootstrap-theme address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.428571429; +} +#bootstrap-theme kbd { + padding: 2px 4px; + font-size: 90%; + color: white; + background-color: #333; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +#bootstrap-theme kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; + box-shadow: none; +} + +/* Container */ + +#bootstrap-theme .container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +#bootstrap-theme .container:before, +#bootstrap-theme .container:after { + display: table; + content: " "; +} +#bootstrap-theme .container:after { + clear: both; +} +@media (min-width: 768px) { + #bootstrap-theme .container { + width: 750px; + } +} +@media (min-width: 992px) { + #bootstrap-theme .container { + width: 970px; + } +} +@media (min-width: 1200px) { + #bootstrap-theme .container { + width: 1170px; + } +} +#bootstrap-theme .container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +#bootstrap-theme .container-fluid:before, +#bootstrap-theme .container-fluid:after { + display: table; + content: " "; +} +#bootstrap-theme .container-fluid:after { + clear: both; +} +#bootstrap-theme .row { + margin-right: -15px; + margin-left: -15px; +} +#bootstrap-theme .row:before, +#bootstrap-theme .row:after { + display: table; + content: " "; +} +#bootstrap-theme .row:after { + clear: both; +} +#bootstrap-theme .row-no-gutters { + margin-right: 0; + margin-left: 0; +} +#bootstrap-theme .row-no-gutters [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +/* Column system */ + +#bootstrap-theme .col-xs-1, +#bootstrap-theme .col-sm-1, +#bootstrap-theme .col-md-1, +#bootstrap-theme .col-lg-1, +#bootstrap-theme .col-xs-2, +#bootstrap-theme .col-sm-2, +#bootstrap-theme .col-md-2, +#bootstrap-theme .col-lg-2, +#bootstrap-theme .col-xs-3, +#bootstrap-theme .col-sm-3, +#bootstrap-theme .col-md-3, +#bootstrap-theme .col-lg-3, +#bootstrap-theme .col-xs-4, +#bootstrap-theme .col-sm-4, +#bootstrap-theme .col-md-4, +#bootstrap-theme .col-lg-4, +#bootstrap-theme .col-xs-5, +#bootstrap-theme .col-sm-5, +#bootstrap-theme .col-md-5, +#bootstrap-theme .col-lg-5, +#bootstrap-theme .col-xs-6, +#bootstrap-theme .col-sm-6, +#bootstrap-theme .col-md-6, +#bootstrap-theme .col-lg-6, +#bootstrap-theme .col-xs-7, +#bootstrap-theme .col-sm-7, +#bootstrap-theme .col-md-7, +#bootstrap-theme .col-lg-7, +#bootstrap-theme .col-xs-8, +#bootstrap-theme .col-sm-8, +#bootstrap-theme .col-md-8, +#bootstrap-theme .col-lg-8, +#bootstrap-theme .col-xs-9, +#bootstrap-theme .col-sm-9, +#bootstrap-theme .col-md-9, +#bootstrap-theme .col-lg-9, +#bootstrap-theme .col-xs-10, +#bootstrap-theme .col-sm-10, +#bootstrap-theme .col-md-10, +#bootstrap-theme .col-lg-10, +#bootstrap-theme .col-xs-11, +#bootstrap-theme .col-sm-11, +#bootstrap-theme .col-md-11, +#bootstrap-theme .col-lg-11, +#bootstrap-theme .col-xs-12, +#bootstrap-theme .col-sm-12, +#bootstrap-theme .col-md-12, +#bootstrap-theme .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +#bootstrap-theme .col-xs-1, +#bootstrap-theme .col-xs-2, +#bootstrap-theme .col-xs-3, +#bootstrap-theme .col-xs-4, +#bootstrap-theme .col-xs-5, +#bootstrap-theme .col-xs-6, +#bootstrap-theme .col-xs-7, +#bootstrap-theme .col-xs-8, +#bootstrap-theme .col-xs-9, +#bootstrap-theme .col-xs-10, +#bootstrap-theme .col-xs-11, +#bootstrap-theme .col-xs-12 { + float: left; +} +#bootstrap-theme .col-xs-1 { + width: 8.3333333333%; +} +#bootstrap-theme .col-xs-2 { + width: 16.6666666667%; +} +#bootstrap-theme .col-xs-3 { + width: 25%; +} +#bootstrap-theme .col-xs-4 { + width: 33.3333333333%; +} +#bootstrap-theme .col-xs-5 { + width: 41.6666666667%; +} +#bootstrap-theme .col-xs-6 { + width: 50%; +} +#bootstrap-theme .col-xs-7 { + width: 58.3333333333%; +} +#bootstrap-theme .col-xs-8 { + width: 66.6666666667%; +} +#bootstrap-theme .col-xs-9 { + width: 75%; +} +#bootstrap-theme .col-xs-10 { + width: 83.3333333333%; +} +#bootstrap-theme .col-xs-11 { + width: 91.6666666667%; +} +#bootstrap-theme .col-xs-12 { + width: 100%; +} +#bootstrap-theme .col-xs-pull-0 { + right: auto; +} +#bootstrap-theme .col-xs-pull-1 { + right: 8.3333333333%; +} +#bootstrap-theme .col-xs-pull-2 { + right: 16.6666666667%; +} +#bootstrap-theme .col-xs-pull-3 { + right: 25%; +} +#bootstrap-theme .col-xs-pull-4 { + right: 33.3333333333%; +} +#bootstrap-theme .col-xs-pull-5 { + right: 41.6666666667%; +} +#bootstrap-theme .col-xs-pull-6 { + right: 50%; +} +#bootstrap-theme .col-xs-pull-7 { + right: 58.3333333333%; +} +#bootstrap-theme .col-xs-pull-8 { + right: 66.6666666667%; +} +#bootstrap-theme .col-xs-pull-9 { + right: 75%; +} +#bootstrap-theme .col-xs-pull-10 { + right: 83.3333333333%; +} +#bootstrap-theme .col-xs-pull-11 { + right: 91.6666666667%; +} +#bootstrap-theme .col-xs-pull-12 { + right: 100%; +} +#bootstrap-theme .col-xs-push-0 { + left: auto; +} +#bootstrap-theme .col-xs-push-1 { + left: 8.3333333333%; +} +#bootstrap-theme .col-xs-push-2 { + left: 16.6666666667%; +} +#bootstrap-theme .col-xs-push-3 { + left: 25%; +} +#bootstrap-theme .col-xs-push-4 { + left: 33.3333333333%; +} +#bootstrap-theme .col-xs-push-5 { + left: 41.6666666667%; +} +#bootstrap-theme .col-xs-push-6 { + left: 50%; +} +#bootstrap-theme .col-xs-push-7 { + left: 58.3333333333%; +} +#bootstrap-theme .col-xs-push-8 { + left: 66.6666666667%; +} +#bootstrap-theme .col-xs-push-9 { + left: 75%; +} +#bootstrap-theme .col-xs-push-10 { + left: 83.3333333333%; +} +#bootstrap-theme .col-xs-push-11 { + left: 91.6666666667%; +} +#bootstrap-theme .col-xs-push-12 { + left: 100%; +} +#bootstrap-theme .col-xs-offset-0 { + margin-left: 0%; +} +#bootstrap-theme .col-xs-offset-1 { + margin-left: 8.3333333333%; +} +#bootstrap-theme .col-xs-offset-2 { + margin-left: 16.6666666667%; +} +#bootstrap-theme .col-xs-offset-3 { + margin-left: 25%; +} +#bootstrap-theme .col-xs-offset-4 { + margin-left: 33.3333333333%; +} +#bootstrap-theme .col-xs-offset-5 { + margin-left: 41.6666666667%; +} +#bootstrap-theme .col-xs-offset-6 { + margin-left: 50%; +} +#bootstrap-theme .col-xs-offset-7 { + margin-left: 58.3333333333%; +} +#bootstrap-theme .col-xs-offset-8 { + margin-left: 66.6666666667%; +} +#bootstrap-theme .col-xs-offset-9 { + margin-left: 75%; +} +#bootstrap-theme .col-xs-offset-10 { + margin-left: 83.3333333333%; +} +#bootstrap-theme .col-xs-offset-11 { + margin-left: 91.6666666667%; +} +#bootstrap-theme .col-xs-offset-12 { + margin-left: 100%; +} +@media (min-width: 768px) { + #bootstrap-theme .col-sm-1, + #bootstrap-theme .col-sm-2, + #bootstrap-theme .col-sm-3, + #bootstrap-theme .col-sm-4, + #bootstrap-theme .col-sm-5, + #bootstrap-theme .col-sm-6, + #bootstrap-theme .col-sm-7, + #bootstrap-theme .col-sm-8, + #bootstrap-theme .col-sm-9, + #bootstrap-theme .col-sm-10, + #bootstrap-theme .col-sm-11, + #bootstrap-theme .col-sm-12 { + float: left; + } + #bootstrap-theme .col-sm-1 { + width: 8.3333333333%; + } + #bootstrap-theme .col-sm-2 { + width: 16.6666666667%; + } + #bootstrap-theme .col-sm-3 { + width: 25%; + } + #bootstrap-theme .col-sm-4 { + width: 33.3333333333%; + } + #bootstrap-theme .col-sm-5 { + width: 41.6666666667%; + } + #bootstrap-theme .col-sm-6 { + width: 50%; + } + #bootstrap-theme .col-sm-7 { + width: 58.3333333333%; + } + #bootstrap-theme .col-sm-8 { + width: 66.6666666667%; + } + #bootstrap-theme .col-sm-9 { + width: 75%; + } + #bootstrap-theme .col-sm-10 { + width: 83.3333333333%; + } + #bootstrap-theme .col-sm-11 { + width: 91.6666666667%; + } + #bootstrap-theme .col-sm-12 { + width: 100%; + } + #bootstrap-theme .col-sm-pull-0 { + right: auto; + } + #bootstrap-theme .col-sm-pull-1 { + right: 8.3333333333%; + } + #bootstrap-theme .col-sm-pull-2 { + right: 16.6666666667%; + } + #bootstrap-theme .col-sm-pull-3 { + right: 25%; + } + #bootstrap-theme .col-sm-pull-4 { + right: 33.3333333333%; + } + #bootstrap-theme .col-sm-pull-5 { + right: 41.6666666667%; + } + #bootstrap-theme .col-sm-pull-6 { + right: 50%; + } + #bootstrap-theme .col-sm-pull-7 { + right: 58.3333333333%; + } + #bootstrap-theme .col-sm-pull-8 { + right: 66.6666666667%; + } + #bootstrap-theme .col-sm-pull-9 { + right: 75%; + } + #bootstrap-theme .col-sm-pull-10 { + right: 83.3333333333%; + } + #bootstrap-theme .col-sm-pull-11 { + right: 91.6666666667%; + } + #bootstrap-theme .col-sm-pull-12 { + right: 100%; + } + #bootstrap-theme .col-sm-push-0 { + left: auto; + } + #bootstrap-theme .col-sm-push-1 { + left: 8.3333333333%; + } + #bootstrap-theme .col-sm-push-2 { + left: 16.6666666667%; + } + #bootstrap-theme .col-sm-push-3 { + left: 25%; + } + #bootstrap-theme .col-sm-push-4 { + left: 33.3333333333%; + } + #bootstrap-theme .col-sm-push-5 { + left: 41.6666666667%; + } + #bootstrap-theme .col-sm-push-6 { + left: 50%; + } + #bootstrap-theme .col-sm-push-7 { + left: 58.3333333333%; + } + #bootstrap-theme .col-sm-push-8 { + left: 66.6666666667%; + } + #bootstrap-theme .col-sm-push-9 { + left: 75%; + } + #bootstrap-theme .col-sm-push-10 { + left: 83.3333333333%; + } + #bootstrap-theme .col-sm-push-11 { + left: 91.6666666667%; + } + #bootstrap-theme .col-sm-push-12 { + left: 100%; + } + #bootstrap-theme .col-sm-offset-0 { + margin-left: 0%; + } + #bootstrap-theme .col-sm-offset-1 { + margin-left: 8.3333333333%; + } + #bootstrap-theme .col-sm-offset-2 { + margin-left: 16.6666666667%; + } + #bootstrap-theme .col-sm-offset-3 { + margin-left: 25%; + } + #bootstrap-theme .col-sm-offset-4 { + margin-left: 33.3333333333%; + } + #bootstrap-theme .col-sm-offset-5 { + margin-left: 41.6666666667%; + } + #bootstrap-theme .col-sm-offset-6 { + margin-left: 50%; + } + #bootstrap-theme .col-sm-offset-7 { + margin-left: 58.3333333333%; + } + #bootstrap-theme .col-sm-offset-8 { + margin-left: 66.6666666667%; + } + #bootstrap-theme .col-sm-offset-9 { + margin-left: 75%; + } + #bootstrap-theme .col-sm-offset-10 { + margin-left: 83.3333333333%; + } + #bootstrap-theme .col-sm-offset-11 { + margin-left: 91.6666666667%; + } + #bootstrap-theme .col-sm-offset-12 { + margin-left: 100%; + } +} +@media (min-width: 992px) { + #bootstrap-theme .col-md-1, + #bootstrap-theme .col-md-2, + #bootstrap-theme .col-md-3, + #bootstrap-theme .col-md-4, + #bootstrap-theme .col-md-5, + #bootstrap-theme .col-md-6, + #bootstrap-theme .col-md-7, + #bootstrap-theme .col-md-8, + #bootstrap-theme .col-md-9, + #bootstrap-theme .col-md-10, + #bootstrap-theme .col-md-11, + #bootstrap-theme .col-md-12 { + float: left; + } + #bootstrap-theme .col-md-1 { + width: 8.3333333333%; + } + #bootstrap-theme .col-md-2 { + width: 16.6666666667%; + } + #bootstrap-theme .col-md-3 { + width: 25%; + } + #bootstrap-theme .col-md-4 { + width: 33.3333333333%; + } + #bootstrap-theme .col-md-5 { + width: 41.6666666667%; + } + #bootstrap-theme .col-md-6 { + width: 50%; + } + #bootstrap-theme .col-md-7 { + width: 58.3333333333%; + } + #bootstrap-theme .col-md-8 { + width: 66.6666666667%; + } + #bootstrap-theme .col-md-9 { + width: 75%; + } + #bootstrap-theme .col-md-10 { + width: 83.3333333333%; + } + #bootstrap-theme .col-md-11 { + width: 91.6666666667%; + } + #bootstrap-theme .col-md-12 { + width: 100%; + } + #bootstrap-theme .col-md-pull-0 { + right: auto; + } + #bootstrap-theme .col-md-pull-1 { + right: 8.3333333333%; + } + #bootstrap-theme .col-md-pull-2 { + right: 16.6666666667%; + } + #bootstrap-theme .col-md-pull-3 { + right: 25%; + } + #bootstrap-theme .col-md-pull-4 { + right: 33.3333333333%; + } + #bootstrap-theme .col-md-pull-5 { + right: 41.6666666667%; + } + #bootstrap-theme .col-md-pull-6 { + right: 50%; + } + #bootstrap-theme .col-md-pull-7 { + right: 58.3333333333%; + } + #bootstrap-theme .col-md-pull-8 { + right: 66.6666666667%; + } + #bootstrap-theme .col-md-pull-9 { + right: 75%; + } + #bootstrap-theme .col-md-pull-10 { + right: 83.3333333333%; + } + #bootstrap-theme .col-md-pull-11 { + right: 91.6666666667%; + } + #bootstrap-theme .col-md-pull-12 { + right: 100%; + } + #bootstrap-theme .col-md-push-0 { + left: auto; + } + #bootstrap-theme .col-md-push-1 { + left: 8.3333333333%; + } + #bootstrap-theme .col-md-push-2 { + left: 16.6666666667%; + } + #bootstrap-theme .col-md-push-3 { + left: 25%; + } + #bootstrap-theme .col-md-push-4 { + left: 33.3333333333%; + } + #bootstrap-theme .col-md-push-5 { + left: 41.6666666667%; + } + #bootstrap-theme .col-md-push-6 { + left: 50%; + } + #bootstrap-theme .col-md-push-7 { + left: 58.3333333333%; + } + #bootstrap-theme .col-md-push-8 { + left: 66.6666666667%; + } + #bootstrap-theme .col-md-push-9 { + left: 75%; + } + #bootstrap-theme .col-md-push-10 { + left: 83.3333333333%; + } + #bootstrap-theme .col-md-push-11 { + left: 91.6666666667%; + } + #bootstrap-theme .col-md-push-12 { + left: 100%; + } + #bootstrap-theme .col-md-offset-0 { + margin-left: 0%; + } + #bootstrap-theme .col-md-offset-1 { + margin-left: 8.3333333333%; + } + #bootstrap-theme .col-md-offset-2 { + margin-left: 16.6666666667%; + } + #bootstrap-theme .col-md-offset-3 { + margin-left: 25%; + } + #bootstrap-theme .col-md-offset-4 { + margin-left: 33.3333333333%; + } + #bootstrap-theme .col-md-offset-5 { + margin-left: 41.6666666667%; + } + #bootstrap-theme .col-md-offset-6 { + margin-left: 50%; + } + #bootstrap-theme .col-md-offset-7 { + margin-left: 58.3333333333%; + } + #bootstrap-theme .col-md-offset-8 { + margin-left: 66.6666666667%; + } + #bootstrap-theme .col-md-offset-9 { + margin-left: 75%; + } + #bootstrap-theme .col-md-offset-10 { + margin-left: 83.3333333333%; + } + #bootstrap-theme .col-md-offset-11 { + margin-left: 91.6666666667%; + } + #bootstrap-theme .col-md-offset-12 { + margin-left: 100%; + } +} +@media (min-width: 1200px) { + #bootstrap-theme .col-lg-1, + #bootstrap-theme .col-lg-2, + #bootstrap-theme .col-lg-3, + #bootstrap-theme .col-lg-4, + #bootstrap-theme .col-lg-5, + #bootstrap-theme .col-lg-6, + #bootstrap-theme .col-lg-7, + #bootstrap-theme .col-lg-8, + #bootstrap-theme .col-lg-9, + #bootstrap-theme .col-lg-10, + #bootstrap-theme .col-lg-11, + #bootstrap-theme .col-lg-12 { + float: left; + } + #bootstrap-theme .col-lg-1 { + width: 8.3333333333%; + } + #bootstrap-theme .col-lg-2 { + width: 16.6666666667%; + } + #bootstrap-theme .col-lg-3 { + width: 25%; + } + #bootstrap-theme .col-lg-4 { + width: 33.3333333333%; + } + #bootstrap-theme .col-lg-5 { + width: 41.6666666667%; + } + #bootstrap-theme .col-lg-6 { + width: 50%; + } + #bootstrap-theme .col-lg-7 { + width: 58.3333333333%; + } + #bootstrap-theme .col-lg-8 { + width: 66.6666666667%; + } + #bootstrap-theme .col-lg-9 { + width: 75%; + } + #bootstrap-theme .col-lg-10 { + width: 83.3333333333%; + } + #bootstrap-theme .col-lg-11 { + width: 91.6666666667%; + } + #bootstrap-theme .col-lg-12 { + width: 100%; + } + #bootstrap-theme .col-lg-pull-0 { + right: auto; + } + #bootstrap-theme .col-lg-pull-1 { + right: 8.3333333333%; + } + #bootstrap-theme .col-lg-pull-2 { + right: 16.6666666667%; + } + #bootstrap-theme .col-lg-pull-3 { + right: 25%; + } + #bootstrap-theme .col-lg-pull-4 { + right: 33.3333333333%; + } + #bootstrap-theme .col-lg-pull-5 { + right: 41.6666666667%; + } + #bootstrap-theme .col-lg-pull-6 { + right: 50%; + } + #bootstrap-theme .col-lg-pull-7 { + right: 58.3333333333%; + } + #bootstrap-theme .col-lg-pull-8 { + right: 66.6666666667%; + } + #bootstrap-theme .col-lg-pull-9 { + right: 75%; + } + #bootstrap-theme .col-lg-pull-10 { + right: 83.3333333333%; + } + #bootstrap-theme .col-lg-pull-11 { + right: 91.6666666667%; + } + #bootstrap-theme .col-lg-pull-12 { + right: 100%; + } + #bootstrap-theme .col-lg-push-0 { + left: auto; + } + #bootstrap-theme .col-lg-push-1 { + left: 8.3333333333%; + } + #bootstrap-theme .col-lg-push-2 { + left: 16.6666666667%; + } + #bootstrap-theme .col-lg-push-3 { + left: 25%; + } + #bootstrap-theme .col-lg-push-4 { + left: 33.3333333333%; + } + #bootstrap-theme .col-lg-push-5 { + left: 41.6666666667%; + } + #bootstrap-theme .col-lg-push-6 { + left: 50%; + } + #bootstrap-theme .col-lg-push-7 { + left: 58.3333333333%; + } + #bootstrap-theme .col-lg-push-8 { + left: 66.6666666667%; + } + #bootstrap-theme .col-lg-push-9 { + left: 75%; + } + #bootstrap-theme .col-lg-push-10 { + left: 83.3333333333%; + } + #bootstrap-theme .col-lg-push-11 { + left: 91.6666666667%; + } + #bootstrap-theme .col-lg-push-12 { + left: 100%; + } + #bootstrap-theme .col-lg-offset-0 { + margin-left: 0%; + } + #bootstrap-theme .col-lg-offset-1 { + margin-left: 8.3333333333%; + } + #bootstrap-theme .col-lg-offset-2 { + margin-left: 16.6666666667%; + } + #bootstrap-theme .col-lg-offset-3 { + margin-left: 25%; + } + #bootstrap-theme .col-lg-offset-4 { + margin-left: 33.3333333333%; + } + #bootstrap-theme .col-lg-offset-5 { + margin-left: 41.6666666667%; + } + #bootstrap-theme .col-lg-offset-6 { + margin-left: 50%; + } + #bootstrap-theme .col-lg-offset-7 { + margin-left: 58.3333333333%; + } + #bootstrap-theme .col-lg-offset-8 { + margin-left: 66.6666666667%; + } + #bootstrap-theme .col-lg-offset-9 { + margin-left: 75%; + } + #bootstrap-theme .col-lg-offset-10 { + margin-left: 83.3333333333%; + } + #bootstrap-theme .col-lg-offset-11 { + margin-left: 91.6666666667%; + } + #bootstrap-theme .col-lg-offset-12 { + margin-left: 100%; + } +} + +/* Table */ + +#bootstrap-theme caption { + padding-top: 8px; + padding-bottom: 8px; + color: #999; + text-align: left; +} + +/* Input */ + +#bootstrap-theme legend { + position: initial; + text-transform: inherit; + float: none; +} +#bootstrap-theme input { + line-height: normal; +} +#bootstrap-theme input[type="number"]::-webkit-inner-spin-button, +#bootstrap-theme input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +#bootstrap-theme input[type="search"]::-webkit-search-cancel-button, +#bootstrap-theme input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +#bootstrap-theme textarea { + overflow: auto; +} +#bootstrap-theme optgroup { + font-weight: bold; +} +#bootstrap-theme .form-control[disabled], +#bootstrap-theme .form-control[readonly], +fieldset[disabled] #bootstrap-theme .form-control { + background-color: #eee; + opacity: 1; +} +#bootstrap-theme .form-control[disabled], +fieldset[disabled] #bootstrap-theme .form-control { + cursor: not-allowed; +} +#bootstrap-theme textarea.form-control { + height: auto; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + #bootstrap-theme input[type="date"].form-control, + #bootstrap-theme input[type="time"].form-control, + #bootstrap-theme input[type="datetime-local"].form-control, + #bootstrap-theme input[type="month"].form-control { + line-height: 30px; + } + #bootstrap-theme input[type="date"].input-sm, + #bootstrap-theme .input-group-sm > input.form-control[type="date"], + #bootstrap-theme .input-group-sm > input.input-group-addon[type="date"], + #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="date"], + .input-group-sm #bootstrap-theme input[type="date"], + #bootstrap-theme input[type="time"].input-sm, + #bootstrap-theme .input-group-sm > input.form-control[type="time"], + #bootstrap-theme .input-group-sm > input.input-group-addon[type="time"], + #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="time"], + .input-group-sm #bootstrap-theme input[type="time"], + #bootstrap-theme input[type="datetime-local"].input-sm, + #bootstrap-theme .input-group-sm > input.form-control[type="datetime-local"], + #bootstrap-theme .input-group-sm > input.input-group-addon[type="datetime-local"], + #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="datetime-local"], + .input-group-sm #bootstrap-theme input[type="datetime-local"], + #bootstrap-theme input[type="month"].input-sm, + #bootstrap-theme .input-group-sm > input.form-control[type="month"], + #bootstrap-theme .input-group-sm > input.input-group-addon[type="month"], + #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="month"], + .input-group-sm #bootstrap-theme input[type="month"] { + line-height: 30px; + } + #bootstrap-theme input[type="date"].input-lg, + #bootstrap-theme .input-group-lg > input.form-control[type="date"], + #bootstrap-theme .input-group-lg > input.input-group-addon[type="date"], + #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="date"], + .input-group-lg #bootstrap-theme input[type="date"], + #bootstrap-theme input[type="time"].input-lg, + #bootstrap-theme .input-group-lg > input.form-control[type="time"], + #bootstrap-theme .input-group-lg > input.input-group-addon[type="time"], + #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="time"], + .input-group-lg #bootstrap-theme input[type="time"], + #bootstrap-theme input[type="datetime-local"].input-lg, + #bootstrap-theme .input-group-lg > input.form-control[type="datetime-local"], + #bootstrap-theme .input-group-lg > input.input-group-addon[type="datetime-local"], + #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="datetime-local"], + .input-group-lg #bootstrap-theme input[type="datetime-local"], + #bootstrap-theme input[type="month"].input-lg, + #bootstrap-theme .input-group-lg > input.form-control[type="month"], + #bootstrap-theme .input-group-lg > input.input-group-addon[type="month"], + #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="month"], + .input-group-lg #bootstrap-theme input[type="month"] { + line-height: 54px; + } +} +#bootstrap-theme .form-group { + margin-bottom: 15px; +} +#bootstrap-theme .form-control-static { + min-height: 34px; + padding-top: 5px; + padding-bottom: 5px; + margin-bottom: 0; +} +#bootstrap-theme .form-control-static.input-lg, +#bootstrap-theme .input-group-lg > .form-control-static.form-control, +#bootstrap-theme .input-group-lg > .form-control-static.input-group-addon, +#bootstrap-theme .input-group-lg > .input-group-btn > .form-control-static.btn, +#bootstrap-theme .form-control-static.input-sm, +#bootstrap-theme .input-group-sm > .form-control-static.form-control, +#bootstrap-theme .input-group-sm > .form-control-static.input-group-addon, +#bootstrap-theme .input-group-sm > .input-group-btn > .form-control-static.btn { + padding-right: 0; + padding-left: 0; +} +#bootstrap-theme .input-sm, +#bootstrap-theme .input-group-sm > .form-control, +#bootstrap-theme .input-group-sm > .input-group-addon, +#bootstrap-theme .input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +#bootstrap-theme select.input-sm, +#bootstrap-theme .input-group-sm > select.form-control, +#bootstrap-theme .input-group-sm > select.input-group-addon, +#bootstrap-theme .input-group-sm > .input-group-btn > select.btn { + height: 30px; + line-height: 30px; +} +#bootstrap-theme textarea.input-sm, +#bootstrap-theme .input-group-sm > textarea.form-control, +#bootstrap-theme .input-group-sm > textarea.input-group-addon, +#bootstrap-theme .input-group-sm > .input-group-btn > textarea.btn, +#bootstrap-theme select[multiple].input-sm, +#bootstrap-theme .input-group-sm > select.form-control[multiple], +#bootstrap-theme .input-group-sm > select.input-group-addon[multiple], +#bootstrap-theme .input-group-sm > .input-group-btn > select.btn[multiple] { + height: auto; +} +#bootstrap-theme .form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +#bootstrap-theme .form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +#bootstrap-theme .form-group-sm textarea.form-control, +#bootstrap-theme .form-group-sm select[multiple].form-control { + height: auto; +} +#bootstrap-theme .form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +#bootstrap-theme .input-lg, +#bootstrap-theme .input-group-lg > .form-control, +#bootstrap-theme .input-group-lg > .input-group-addon, +#bootstrap-theme .input-group-lg > .input-group-btn > .btn { + height: 54px; + padding: 14px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +#bootstrap-theme select.input-lg, +#bootstrap-theme .input-group-lg > select.form-control, +#bootstrap-theme .input-group-lg > select.input-group-addon, +#bootstrap-theme .input-group-lg > .input-group-btn > select.btn { + height: 54px; + line-height: 54px; +} +#bootstrap-theme textarea.input-lg, +#bootstrap-theme .input-group-lg > textarea.form-control, +#bootstrap-theme .input-group-lg > textarea.input-group-addon, +#bootstrap-theme .input-group-lg > .input-group-btn > textarea.btn, +#bootstrap-theme select[multiple].input-lg, +#bootstrap-theme .input-group-lg > select.form-control[multiple], +#bootstrap-theme .input-group-lg > select.input-group-addon[multiple], +#bootstrap-theme .input-group-lg > .input-group-btn > select.btn[multiple] { + height: auto; +} +#bootstrap-theme .form-group-lg .form-control { + height: 54px; + padding: 14px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +#bootstrap-theme .form-group-lg select.form-control { + height: 54px; + line-height: 54px; +} +#bootstrap-theme .form-group-lg textarea.form-control, +#bootstrap-theme .form-group-lg select[multiple].form-control { + height: auto; +} +#bootstrap-theme .form-group-lg .form-control-static { + height: 54px; + min-height: 38px; + padding: 15px 16px; + font-size: 18px; + line-height: 1.3333333; +} +#bootstrap-theme .has-feedback { + position: relative; +} +#bootstrap-theme .has-feedback .form-control { + padding-right: 37.5px; +} +#bootstrap-theme .form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 30px; + height: 30px; + line-height: 30px; + text-align: center; + pointer-events: none; +} +#bootstrap-theme .input-lg + .form-control-feedback, +#bootstrap-theme .input-group-lg > .form-control + .form-control-feedback, +#bootstrap-theme .input-group-lg > .input-group-addon + .form-control-feedback, +#bootstrap-theme .input-group-lg > .input-group-btn > .btn + .form-control-feedback, +#bootstrap-theme .input-group-lg + .form-control-feedback, +#bootstrap-theme .form-group-lg .form-control + .form-control-feedback { + width: 54px; + height: 54px; + line-height: 54px; +} +#bootstrap-theme .input-sm + .form-control-feedback, +#bootstrap-theme .input-group-sm > .form-control + .form-control-feedback, +#bootstrap-theme .input-group-sm > .input-group-addon + .form-control-feedback, +#bootstrap-theme .input-group-sm > .input-group-btn > .btn + .form-control-feedback, +#bootstrap-theme .input-group-sm + .form-control-feedback, +#bootstrap-theme .form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +#bootstrap-theme .has-feedback label ~ .form-control-feedback { + top: 25px; +} +#bootstrap-theme .has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +@media (min-width: 768px) { + #bootstrap-theme .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + #bootstrap-theme .form-inline .form-control { + display: inline-block; + vertical-align: middle; + } + #bootstrap-theme .form-inline .form-control-static { + display: inline-block; + } + #bootstrap-theme .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + #bootstrap-theme .form-inline .input-group .input-group-addon, + #bootstrap-theme .form-inline .input-group .input-group-btn, + #bootstrap-theme .form-inline .input-group .form-control { + width: auto; + } + #bootstrap-theme .form-inline .input-group > .form-control { + width: 100%; + } + #bootstrap-theme .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + #bootstrap-theme .form-inline .radio, + #bootstrap-theme .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + #bootstrap-theme .form-inline .radio label, + #bootstrap-theme .form-inline .checkbox label { + padding-left: 0; + } + #bootstrap-theme .form-inline .radio input[type="radio"], + #bootstrap-theme .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + #bootstrap-theme .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +#bootstrap-theme .form-horizontal .radio, +#bootstrap-theme .form-horizontal .checkbox, +#bootstrap-theme .form-horizontal .radio-inline, +#bootstrap-theme .form-horizontal .checkbox-inline { + padding-top: 5px; + margin-top: 0; + margin-bottom: 0; +} +#bootstrap-theme .form-horizontal .radio, +#bootstrap-theme .form-horizontal .checkbox { + min-height: 25px; +} +#bootstrap-theme .form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +#bootstrap-theme .form-horizontal .form-group:before, +#bootstrap-theme .form-horizontal .form-group:after { + display: table; + content: " "; +} +#bootstrap-theme .form-horizontal .form-group:after { + clear: both; +} +@media (min-width: 768px) { + #bootstrap-theme .form-horizontal .control-label { + padding-top: 5px; + margin-bottom: 0; + text-align: right; + } +} +#bootstrap-theme .form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + #bootstrap-theme .form-horizontal .form-group-lg .control-label { + padding-top: 15px; + font-size: 18px; + } +} +@media (min-width: 768px) { + #bootstrap-theme .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +#bootstrap-theme .fade { + opacity: 0; + transition: opacity .15s linear; +} +#bootstrap-theme .fade.in { + opacity: 1; +} +#bootstrap-theme [data-toggle="buttons"] > .btn input[type="radio"], +#bootstrap-theme [data-toggle="buttons"] > .btn input[type="checkbox"], +#bootstrap-theme [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +#bootstrap-theme [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +#bootstrap-theme .input-group { + position: relative; + display: table; + border-collapse: separate; +} +#bootstrap-theme .input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +#bootstrap-theme .input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +#bootstrap-theme .input-group .form-control:focus { + z-index: 3; +} +#bootstrap-theme .input-group-addon, +#bootstrap-theme .input-group-btn, +#bootstrap-theme .input-group .form-control { + display: table-cell; +} +#bootstrap-theme .input-group-addon:not(:first-child):not(:last-child), +#bootstrap-theme .input-group-btn:not(:first-child):not(:last-child), +#bootstrap-theme .input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +#bootstrap-theme .input-group-addon, +#bootstrap-theme .input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +#bootstrap-theme .input-group-addon.input-sm, +#bootstrap-theme .input-group-sm > .input-group-addon.form-control, +#bootstrap-theme .input-group-sm > .input-group-addon, +#bootstrap-theme .input-group-sm > .input-group-btn > .input-group-addon.btn { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +#bootstrap-theme .input-group-addon.input-lg, +#bootstrap-theme .input-group-lg > .input-group-addon.form-control, +#bootstrap-theme .input-group-lg > .input-group-addon, +#bootstrap-theme .input-group-lg > .input-group-btn > .input-group-addon.btn { + padding: 14px 16px; + font-size: 18px; + border-radius: 6px; +} +#bootstrap-theme .input-group-addon input[type="radio"], +#bootstrap-theme .input-group-addon input[type="checkbox"] { + margin-top: 0; +} +#bootstrap-theme .input-group .form-control:first-child, +#bootstrap-theme .input-group-addon:first-child, +#bootstrap-theme .input-group-btn:first-child > .btn, +#bootstrap-theme .input-group-btn:first-child > .btn-group > .btn, +#bootstrap-theme .input-group-btn:first-child > .dropdown-toggle, +#bootstrap-theme .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +#bootstrap-theme .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +#bootstrap-theme .input-group-addon:first-child { + border-right: 0; +} +#bootstrap-theme .input-group .form-control:last-child, +#bootstrap-theme .input-group-addon:last-child, +#bootstrap-theme .input-group-btn:last-child > .btn, +#bootstrap-theme .input-group-btn:last-child > .btn-group > .btn, +#bootstrap-theme .input-group-btn:last-child > .dropdown-toggle, +#bootstrap-theme .input-group-btn:first-child > .btn:not(:first-child), +#bootstrap-theme .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +#bootstrap-theme .input-group-addon:last-child { + border-left: 0; +} + +/* Button */ + +#bootstrap-theme button, +#bootstrap-theme html input[type="button"], +#bootstrap-theme input[type="reset"], +#bootstrap-theme input[type="submit"] { + -webkit-appearance: button; + cursor: var(--crm-hover-clickable); +} +#bootstrap-theme button[disabled], +#bootstrap-theme html input[disabled] { + cursor: default; +} +#bootstrap-theme button::-moz-focus-inner, +#bootstrap-theme input::-moz-focus-inner { + border: 0; + padding: 0; +} +#bootstrap-theme [role="button"] { + cursor: var(--crm-hover-clickable); +} +#bootstrap-theme .input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +#bootstrap-theme .input-group-btn > .btn { + position: relative; +} +#bootstrap-theme .input-group-btn > .btn + .btn { + margin-left: -1px; +} +#bootstrap-theme .input-group-btn > .btn:hover, +#bootstrap-theme .input-group-btn > .btn:focus, +#bootstrap-theme .input-group-btn > .btn:active { + z-index: 2; +} +#bootstrap-theme .input-group-btn:first-child > .btn, +#bootstrap-theme .input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +#bootstrap-theme .input-group-btn:last-child > .btn, +#bootstrap-theme .input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +#bootstrap-theme .btn-link { + font-weight: 400; + color: var(--crm-c-link); + border-radius: 0; +} +#bootstrap-theme .btn-link, +#bootstrap-theme .btn-link:active, +#bootstrap-theme .btn-link.active, +#bootstrap-theme .btn-link[disabled], +fieldset[disabled] #bootstrap-theme .btn-link { + background-color: transparent; + box-shadow: none; +} +#bootstrap-theme .btn-link, +#bootstrap-theme .btn-link:hover, +#bootstrap-theme .btn-link:focus, +#bootstrap-theme .btn-link:active { + border-color: transparent; +} +#bootstrap-theme .btn-link:hover, +#bootstrap-theme .btn-link:focus { + color: var(--crm-c-link-hover); + text-decoration: var(--crm-link-decoration); + background-color: transparent; +} +#bootstrap-theme .btn-link[disabled]:hover, +#bootstrap-theme .btn-link[disabled]:focus, +fieldset[disabled] #bootstrap-theme .btn-link:hover, +fieldset[disabled] #bootstrap-theme .btn-link:focus { + color: var(--crm-c-gray-800); + text-decoration: none; +} +#bootstrap-theme .input-group-addon { + padding: var(--crm-input-padding); + font-size: var(--crm-input-font-size); + font-weight: normal; + line-height: inherit; + color: var(--crm-input-color); + text-align: left; + background-color: var(--crm-input-background); + /* width: 100%; */ + border-radius: var(--crm-roundness); +} +#bootstrap-theme .has-success .form-control { + border-color: var(--crm-c-green-dark); +} +#bootstrap-theme .has-success .form-control:focus { + border-color: var(--crm-c-green-dark); +} +#bootstrap-theme .has-success .input-group-addon { + color: var(--crm-c-green-dark); + background-color: var(--crm-c-green-light); + border-color: var(--crm-c-green); +} +#bootstrap-theme .has-success .form-control-feedback { + color: var(--crm-c-green); +} +#bootstrap-theme .has-warning .form-control { + border-color: var(--crm-c-warning); +} +#bootstrap-theme .has-warning .form-control:focus { + border-color: var(--crm-c-warning); +} +#bootstrap-theme .has-warning .input-group-addon { + color: var(--crm-c-warning); + background-color: var(--crm-c-amber-light); + border-color: var(--crm-c-warning); +} +#bootstrap-theme .has-warning .form-control-feedback { + color: var(--crm-c-warning); +} +#bootstrap-theme .has-error .form-control, +#bootstrap-theme .has-error .form-control a.select2-default { + border-color: var(--crm-c-alert); +} +#bootstrap-theme .has-error .form-control:focus { + border-color: var(--crm-c-alert); +} +#bootstrap-theme .has-error .input-group-addon { + color: var(--crm-c-alert); + background-color: # var(--crm-c-red-light); + border-color: var(--crm-c-alert); +} +#bootstrap-theme .has-error .form-control-feedback { + color: var(--crm-c-alert); +} + +/* Nav */ + +#bootstrap-theme .navbar-default { + background-color: var(--crm-c-darkest); + border-color: var(--crm-c-darkest); + color: var(--crm-c-light-text); +} +#bootstrap-theme .nav-justified, +#bootstrap-theme .nav-tabs.nav-justified { + width: 100%; +} +#bootstrap-theme .nav-justified > li, +#bootstrap-theme .nav-tabs.nav-justified > li { + float: none; +} +#bootstrap-theme .nav-justified > li > a, +#bootstrap-theme .nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +#bootstrap-theme .nav-justified > .dropdown .dropdown-menu, +#bootstrap-theme .nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + #bootstrap-theme .nav-justified > li, + #bootstrap-theme .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + #bootstrap-theme .nav-justified > li > a, + #bootstrap-theme .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +#bootstrap-theme .nav-tabs-justified, +#bootstrap-theme .nav-tabs.nav-justified { + border-bottom: 0; +} +#bootstrap-theme .nav-tabs-justified > li > a, +#bootstrap-theme .nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +#bootstrap-theme .nav-tabs-justified > .active > a, +#bootstrap-theme .nav-tabs.nav-justified > .active > a, +#bootstrap-theme .nav-tabs-justified > .active > a:hover, +#bootstrap-theme .nav-tabs.nav-justified > .active > a:hover, +#bootstrap-theme .nav-tabs-justified > .active > a:focus, +#bootstrap-theme .nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + #bootstrap-theme .nav-tabs-justified > li > a, + #bootstrap-theme .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + #bootstrap-theme .nav-tabs-justified > .active > a, + #bootstrap-theme .nav-tabs.nav-justified > .active > a, + #bootstrap-theme .nav-tabs-justified > .active > a:hover, + #bootstrap-theme .nav-tabs.nav-justified > .active > a:hover, + #bootstrap-theme .nav-tabs-justified > .active > a:focus, + #bootstrap-theme .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: white; + } +} +#bootstrap-theme .tab-content > .tab-pane { + display: none; +} +#bootstrap-theme .tab-content > .active { + display: block; +} +#bootstrap-theme .nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +#bootstrap-theme .navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +#bootstrap-theme .navbar:before, +#bootstrap-theme .navbar:after { + display: table; + content: " "; +} +#bootstrap-theme .navbar:after { + clear: both; +} +@media (min-width: 768px) { + #bootstrap-theme .navbar { + border-radius: 4px; + } +} +#bootstrap-theme .navbar-header:before, +#bootstrap-theme .navbar-header:after { + display: table; + content: " "; +} +#bootstrap-theme .navbar-header:after { + clear: both; +} +@media (min-width: 768px) { + #bootstrap-theme .navbar-header { + float: left; + } +} +#bootstrap-theme .navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + -webkit-overflow-scrolling: touch; +} +#bootstrap-theme .navbar-collapse:before, +#bootstrap-theme .navbar-collapse:after { + display: table; + content: " "; +} +#bootstrap-theme .navbar-collapse:after { + clear: both; +} +#bootstrap-theme .navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + #bootstrap-theme .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + #bootstrap-theme .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + #bootstrap-theme .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top #bootstrap-theme .navbar-collapse, + .navbar-static-top #bootstrap-theme .navbar-collapse, + .navbar-fixed-bottom #bootstrap-theme .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +#bootstrap-theme .navbar-fixed-top, +#bootstrap-theme .navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +#bootstrap-theme .navbar-fixed-top .navbar-collapse, +#bootstrap-theme .navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + #bootstrap-theme .navbar-fixed-top .navbar-collapse, + #bootstrap-theme .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +@media (min-width: 768px) { + #bootstrap-theme .navbar-fixed-top, + #bootstrap-theme .navbar-fixed-bottom { + border-radius: 0; + } +} +#bootstrap-theme .navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +#bootstrap-theme .navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +#bootstrap-theme .container > .navbar-header, +#bootstrap-theme .container > .navbar-collapse, +#bootstrap-theme .container-fluid > .navbar-header, +#bootstrap-theme .container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + #bootstrap-theme .container > .navbar-header, + #bootstrap-theme .container > .navbar-collapse, + #bootstrap-theme .container-fluid > .navbar-header, + #bootstrap-theme .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +#bootstrap-theme .navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + #bootstrap-theme .navbar-static-top { + border-radius: 0; + } +} +#bootstrap-theme .navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +#bootstrap-theme .navbar-brand:hover, +#bootstrap-theme .navbar-brand:focus { + text-decoration: none; +} +#bootstrap-theme .navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container #bootstrap-theme .navbar-brand, + .navbar > .container-fluid #bootstrap-theme .navbar-brand { + margin-left: -15px; + } +} +#bootstrap-theme .navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-right: 15px; + margin-top: 8px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +#bootstrap-theme .navbar-toggle:focus { + outline: 0; +} +#bootstrap-theme .navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +#bootstrap-theme .navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + #bootstrap-theme .navbar-toggle { + display: none; + } +} +#bootstrap-theme .navbar-nav { + margin: 7.5px -15px; +} +#bootstrap-theme .navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + #bootstrap-theme .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + #bootstrap-theme .navbar-nav .open .dropdown-menu > li > a, + #bootstrap-theme .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + #bootstrap-theme .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + #bootstrap-theme .navbar-nav .open .dropdown-menu > li > a:hover, + #bootstrap-theme .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + #bootstrap-theme .navbar-nav { + float: left; + margin: 0; + } + #bootstrap-theme .navbar-nav > li { + float: left; + } + #bootstrap-theme .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +#bootstrap-theme .navbar-form { + padding: 10px 15px; + margin-right: -15px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + margin-top: 10px; + margin-bottom: 10px; +} +@media (min-width: 768px) { + #bootstrap-theme .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + #bootstrap-theme .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + #bootstrap-theme .navbar-form .form-control-static { + display: inline-block; + } + #bootstrap-theme .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + #bootstrap-theme .navbar-form .input-group .input-group-addon, + #bootstrap-theme .navbar-form .input-group .input-group-btn, + #bootstrap-theme .navbar-form .input-group .form-control { + width: auto; + } + #bootstrap-theme .navbar-form .input-group > .form-control { + width: 100%; + } + #bootstrap-theme .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + #bootstrap-theme .navbar-form .radio, + #bootstrap-theme .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + #bootstrap-theme .navbar-form .radio label, + #bootstrap-theme .navbar-form .checkbox label { + padding-left: 0; + } + #bootstrap-theme .navbar-form .radio input[type="radio"], + #bootstrap-theme .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + #bootstrap-theme .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + #bootstrap-theme .navbar-form .form-group { + margin-bottom: 5px; + } + #bootstrap-theme .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + #bootstrap-theme .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + box-shadow: none; + } +} +#bootstrap-theme .navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +#bootstrap-theme .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +#bootstrap-theme .navbar-btn { + margin-top: 10px; + margin-bottom: 10px; +} +#bootstrap-theme .navbar-btn.btn-sm, +#bootstrap-theme .btn-group-sm > .navbar-btn.btn { + margin-top: 10px; + margin-bottom: 10px; +} +#bootstrap-theme .navbar-btn.btn-xs, +#bootstrap-theme .btn-group-xs > .navbar-btn.btn { + margin-top: 14px; + margin-bottom: 14px; +} +#bootstrap-theme .navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + #bootstrap-theme .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + #bootstrap-theme .navbar-left { + float: left !important; + } + #bootstrap-theme .navbar-right { + float: right !important; + margin-right: -15px; + } + #bootstrap-theme .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +#bootstrap-theme .navbar-default .navbar-brand { + color: white; +} +#bootstrap-theme .navbar-default .navbar-brand:hover, +#bootstrap-theme .navbar-default .navbar-brand:focus { + color: white; + background-color: none; +} +#bootstrap-theme .navbar-default .navbar-text { + color: #ddd; +} +#bootstrap-theme .navbar-default .navbar-nav > li > a { + color: white; +} +#bootstrap-theme .navbar-default .navbar-nav > li > a:hover, +#bootstrap-theme .navbar-default .navbar-nav > li > a:focus { + color: white; + background-color: black; +} +#bootstrap-theme .navbar-default .navbar-nav > .active > a, +#bootstrap-theme .navbar-default .navbar-nav > .active > a:hover, +#bootstrap-theme .navbar-default .navbar-nav > .active > a:focus { + color: white; + background-color: black; +} +#bootstrap-theme .navbar-default .navbar-nav > .disabled > a, +#bootstrap-theme .navbar-default .navbar-nav > .disabled > a:hover, +#bootstrap-theme .navbar-default .navbar-nav > .disabled > a:focus { + color: #ddd; + background-color: transparent; +} +#bootstrap-theme .navbar-default .navbar-nav > .open > a, +#bootstrap-theme .navbar-default .navbar-nav > .open > a:hover, +#bootstrap-theme .navbar-default .navbar-nav > .open > a:focus { + color: white; + background-color: black; +} +@media (max-width: 767px) { + #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: white; + } + #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: white; + background-color: black; + } + #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: white; + background-color: black; + } + #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ddd; + background-color: transparent; + } +} +#bootstrap-theme .navbar-default .navbar-toggle { + border-color: black; +} +#bootstrap-theme .navbar-default .navbar-toggle:hover, +#bootstrap-theme .navbar-default .navbar-toggle:focus { + background-color: black; +} +#bootstrap-theme .navbar-default .navbar-toggle .icon-bar { + background-color: white; +} +#bootstrap-theme .navbar-default .navbar-collapse, +#bootstrap-theme .navbar-default .navbar-form { + border-color: black; +} +#bootstrap-theme .navbar-default .navbar-link { + color: white; +} +#bootstrap-theme .navbar-default .navbar-link:hover { + color: white; +} +#bootstrap-theme .navbar-default .btn-link { + color: white; +} +#bootstrap-theme .navbar-default .btn-link:hover, +#bootstrap-theme .navbar-default .btn-link:focus { + color: white; +} +#bootstrap-theme .navbar-default .btn-link[disabled]:hover, +#bootstrap-theme .navbar-default .btn-link[disabled]:focus, +fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:hover, +fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:focus { + color: #ddd; +} +#bootstrap-theme .navbar-inverse { + background-color: #cde8fe; + border-color: #b4ddfe; +} +#bootstrap-theme .navbar-inverse .navbar-brand { + color: white; +} +#bootstrap-theme .navbar-inverse .navbar-brand:hover, +#bootstrap-theme .navbar-inverse .navbar-brand:focus { + color: white; + background-color: none; +} +#bootstrap-theme .navbar-inverse .navbar-text { + color: white; +} +#bootstrap-theme .navbar-inverse .navbar-nav > li > a { + color: white; +} +#bootstrap-theme .navbar-inverse .navbar-nav > li > a:hover, +#bootstrap-theme .navbar-inverse .navbar-nav > li > a:focus { + color: white; + background-color: #b4ddfe; +} +#bootstrap-theme .navbar-inverse .navbar-nav > .active > a, +#bootstrap-theme .navbar-inverse .navbar-nav > .active > a:hover, +#bootstrap-theme .navbar-inverse .navbar-nav > .active > a:focus { + color: white; + background-color: #b4ddfe; +} +#bootstrap-theme .navbar-inverse .navbar-nav > .disabled > a, +#bootstrap-theme .navbar-inverse .navbar-nav > .disabled > a:hover, +#bootstrap-theme .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +#bootstrap-theme .navbar-inverse .navbar-nav > .open > a, +#bootstrap-theme .navbar-inverse .navbar-nav > .open > a:hover, +#bootstrap-theme .navbar-inverse .navbar-nav > .open > a:focus { + color: white; + background-color: #b4ddfe; +} +@media (max-width: 767px) { + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #b4ddfe; + } + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #b4ddfe; + } + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: white; + } + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: white; + background-color: #b4ddfe; + } + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: white; + background-color: #b4ddfe; + } + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +#bootstrap-theme .navbar-inverse .navbar-toggle { + border-color: #b4ddfe; +} +#bootstrap-theme .navbar-inverse .navbar-toggle:hover, +#bootstrap-theme .navbar-inverse .navbar-toggle:focus { + background-color: #b4ddfe; +} +#bootstrap-theme .navbar-inverse .navbar-toggle .icon-bar { + background-color: white; +} +#bootstrap-theme .navbar-inverse .navbar-collapse, +#bootstrap-theme .navbar-inverse .navbar-form { + border-color: #aad8fd; +} +#bootstrap-theme .navbar-inverse .navbar-link { + color: white; +} +#bootstrap-theme .navbar-inverse .navbar-link:hover { + color: white; +} +#bootstrap-theme .navbar-inverse .btn-link { + color: white; +} +#bootstrap-theme .navbar-inverse .btn-link:hover, +#bootstrap-theme .navbar-inverse .btn-link:focus { + color: white; +} +#bootstrap-theme .navbar-inverse .btn-link[disabled]:hover, +#bootstrap-theme .navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:hover, +fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:focus { + color: #ccc; +} + +/* Breadcrumb */ + +#bootstrap-theme .breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: whitesmoke; + border-radius: 4px; +} +#bootstrap-theme .breadcrumb > li { + display: inline-block; +} +#bootstrap-theme .breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/ "; +} +#bootstrap-theme .breadcrumb > .active { + color: #999; +} + +/* Pager */ + +#bootstrap-theme .pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +#bootstrap-theme .pager:before, +#bootstrap-theme .pager:after { + display: table; + content: " "; +} +#bootstrap-theme .pager:after { + clear: both; +} +#bootstrap-theme .pager li { + display: inline; +} +#bootstrap-theme .pager li > a, +#bootstrap-theme .pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: white; + border: 1px solid #ddd; + border-radius: 15px; +} +#bootstrap-theme .pager li > a:hover, +#bootstrap-theme .pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +#bootstrap-theme .pager .next > a, +#bootstrap-theme .pager .next > span { + float: right; +} +#bootstrap-theme .pager .previous > a, +#bootstrap-theme .pager .previous > span { + float: left; +} +#bootstrap-theme .pager .disabled > a, +#bootstrap-theme .pager .disabled > a:hover, +#bootstrap-theme .pager .disabled > a:focus, +#bootstrap-theme .pager .disabled > span { + color: #999; + cursor: not-allowed; + background-color: white; +} + +/* Jumbotron */ + +#bootstrap-theme .jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: var(--crm-c-background); +} +#bootstrap-theme .jumbotron h1, +#bootstrap-theme .jumbotron .h1 { + color: inherit; +} +#bootstrap-theme .jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +#bootstrap-theme .jumbotron > hr { + border-top-color: #d5d5d5; +} +.container #bootstrap-theme .jumbotron, +.container-fluid #bootstrap-theme .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +#bootstrap-theme .jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + #bootstrap-theme .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container #bootstrap-theme .jumbotron, + .container-fluid #bootstrap-theme .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + #bootstrap-theme .jumbotron h1, + #bootstrap-theme .jumbotron .h1 { + font-size: 63px; + } +} + +/* Progress bar */ + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +#bootstrap-theme .progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: whitesmoke; + border-radius: var(--crm-c-roundness); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +#bootstrap-theme .progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: white; + text-align: center; + background-color: black; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + transition: width .6s ease; +} +#bootstrap-theme .progress-striped .progress-bar, +#bootstrap-theme .progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} +#bootstrap-theme .progress.active .progress-bar, +#bootstrap-theme .progress-bar.active { + animation: progress-bar-stripes 2s linear infinite; +} +#bootstrap-theme .progress-bar-success { + background-color: var(--crm-c-success); +} +.progress-striped #bootstrap-theme .progress-bar-success { + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +#bootstrap-theme .progress-bar-info { + background-color: var(--crm-c-info); +} +.progress-striped #bootstrap-theme .progress-bar-info { + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +#bootstrap-theme .progress-bar-warning { + background-color: var(--crm-c-warning); +} +.progress-striped #bootstrap-theme .progress-bar-warning { + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +#bootstrap-theme .progress-bar-danger { + background-color: var(--crm-c-alert); +} +.progress-striped #bootstrap-theme .progress-bar-danger { + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} + +/* Media */ + +#bootstrap-theme .media { + margin-top: 15px; +} +#bootstrap-theme .media:first-child { + margin-top: 0; +} +#bootstrap-theme .media, +#bootstrap-theme .media-body { + overflow: hidden; + zoom: 1; +} +#bootstrap-theme .media-body { + width: 10000px; +} +#bootstrap-theme .media-object { + display: block; +} +#bootstrap-theme .media-object.img-thumbnail { + max-width: none; +} +#bootstrap-theme .media-right, +#bootstrap-theme .media > .pull-right { + padding-left: 10px; +} +#bootstrap-theme .media-left, +#bootstrap-theme .media > .pull-left { + padding-right: 10px; +} +#bootstrap-theme .media-left, +#bootstrap-theme .media-right, +#bootstrap-theme .media-body { + display: table-cell; + vertical-align: top; +} +#bootstrap-theme .media-middle { + vertical-align: middle; +} +#bootstrap-theme .media-bottom { + vertical-align: bottom; +} +#bootstrap-theme .media-heading { + margin-top: 0; + margin-bottom: 5px; +} +#bootstrap-theme .media-list { + padding-left: 0; + list-style: none; +} +#bootstrap-theme audio, +#bootstrap-theme canvas, +#bootstrap-theme progress, +#bootstrap-theme video { + display: inline-block; + vertical-align: baseline; +} +#bootstrap-theme audio:not([controls]) { + display: none; + height: 0; +} + +/* List group */ + +#bootstrap-theme .list-group { + padding-left: 0; + margin-bottom: 20px; +} +#bootstrap-theme .list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: white; + border: 1px solid #ddd; +} +#bootstrap-theme .list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +#bootstrap-theme .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +#bootstrap-theme .list-group-item.disabled, +#bootstrap-theme .list-group-item.disabled:hover, +#bootstrap-theme .list-group-item.disabled:focus { + color: #999; + cursor: not-allowed; + background-color: #eee; +} +#bootstrap-theme .list-group-item.disabled .list-group-item-heading, +#bootstrap-theme .list-group-item.disabled:hover .list-group-item-heading, +#bootstrap-theme .list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +#bootstrap-theme .list-group-item.disabled .list-group-item-text, +#bootstrap-theme .list-group-item.disabled:hover .list-group-item-text, +#bootstrap-theme .list-group-item.disabled:focus .list-group-item-text { + color: #999; +} +#bootstrap-theme .list-group-item.active, +#bootstrap-theme .list-group-item.active:hover, +#bootstrap-theme .list-group-item.active:focus { + z-index: 2; + color: white; + background-color: black; + border-color: black; +} +#bootstrap-theme .list-group-item.active .list-group-item-heading, +#bootstrap-theme .list-group-item.active .list-group-item-heading > small, +#bootstrap-theme .list-group-item.active .list-group-item-heading > .small, +#bootstrap-theme .list-group-item.active:hover .list-group-item-heading, +#bootstrap-theme .list-group-item.active:hover .list-group-item-heading > small, +#bootstrap-theme .list-group-item.active:hover .list-group-item-heading > .small, +#bootstrap-theme .list-group-item.active:focus .list-group-item-heading, +#bootstrap-theme .list-group-item.active:focus .list-group-item-heading > small, +#bootstrap-theme .list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +#bootstrap-theme .list-group-item.active .list-group-item-text, +#bootstrap-theme .list-group-item.active:hover .list-group-item-text, +#bootstrap-theme .list-group-item.active:focus .list-group-item-text { + color: #666; +} +#bootstrap-theme a.list-group-item, +#bootstrap-theme button.list-group-item { + color: #555; +} +#bootstrap-theme a.list-group-item .list-group-item-heading, +#bootstrap-theme button.list-group-item .list-group-item-heading { + color: #333; +} +#bootstrap-theme a.list-group-item:hover, +#bootstrap-theme a.list-group-item:focus, +#bootstrap-theme button.list-group-item:hover, +#bootstrap-theme button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: var(--crm-c-background); +} +#bootstrap-theme button.list-group-item { + width: 100%; + text-align: left; +} +#bootstrap-theme a.list-group-item-success, +#bootstrap-theme button.list-group-item-success { + color: var(--crm-alert-text-help); +} +#bootstrap-theme a.list-group-item-success .list-group-item-heading, +#bootstrap-theme button.list-group-item-success .list-group-item-heading { + color: inherit; +} +#bootstrap-theme .list-group-item-success, +#bootstrap-theme a.list-group-item-success:hover, +#bootstrap-theme a.list-group-item-success:focus, +#bootstrap-theme button.list-group-item-success:hover, +#bootstrap-theme button.list-group-item-success:focus { + color: var(--crm-alert-text-help); + background-color: var(--crm-alert-background-help); +} +#bootstrap-theme a.list-group-item-success.active, +#bootstrap-theme a.list-group-item-success.active:hover, +#bootstrap-theme a.list-group-item-success.active:focus, +#bootstrap-theme button.list-group-item-success.active, +#bootstrap-theme button.list-group-item-success.active:hover, +#bootstrap-theme button.list-group-item-success.active:focus { + color: var(--crm-c-success-text); + background-color: var(--crm-c-success); + border-color: var(--crm-c-success); +} +#bootstrap-theme .list-group-item-info { + color: var(--crm-alert-text-info); + background-color: var(--crm-alert-background-info); +} +#bootstrap-theme a.list-group-item-info, +#bootstrap-theme button.list-group-item-info { + color: var(--crm-alert-text-info); +} +#bootstrap-theme a.list-group-item-info .list-group-item-heading, +#bootstrap-theme button.list-group-item-info .list-group-item-heading { + color: inherit; +} +#bootstrap-theme a.list-group-item-info:hover, +#bootstrap-theme a.list-group-item-info:focus, +#bootstrap-theme button.list-group-item-info:hover, +#bootstrap-theme button.list-group-item-info:focus { + color: var(--crm-alert-text-info); + background-color: var(--crm-alert-background-info); +} +#bootstrap-theme a.list-group-item-info.active, +#bootstrap-theme a.list-group-item-info.active:hover, +#bootstrap-theme a.list-group-item-info.active:focus, +#bootstrap-theme button.list-group-item-info.active, +#bootstrap-theme button.list-group-item-info.active:hover, +#bootstrap-theme button.list-group-item-info.active:focus { + color: var(--crm-c-info-text); + background-color: var(--crm-c-info); + border-color: var(--crm-c-info); +} +#bootstrap-theme .list-group-item-warning { + color: var(--crm-alert-text-warning); + background-color: var(--crm-alert-background-warning); +} +#bootstrap-theme a.list-group-item-warning, +#bootstrap-theme button.list-group-item-warning { + color: var(--crm-alert-text-warning); +} +#bootstrap-theme a.list-group-item-warning .list-group-item-heading, +#bootstrap-theme button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +#bootstrap-theme a.list-group-item-warning:hover, +#bootstrap-theme a.list-group-item-warning:focus, +#bootstrap-theme button.list-group-item-warning:hover, +#bootstrap-theme button.list-group-item-warning:focus { + color: var(--crm-alert-text-warning); + background-color: var(--crm-alert-background-warning); +} +#bootstrap-theme a.list-group-item-warning.active, +#bootstrap-theme a.list-group-item-warning.active:hover, +#bootstrap-theme a.list-group-item-warning.active:focus, +#bootstrap-theme button.list-group-item-warning.active, +#bootstrap-theme button.list-group-item-warning.active:hover, +#bootstrap-theme button.list-group-item-warning.active:focus { + color: var(--crm-c-warning-text); + background-color: var(--crm-c-warning); + border-color: var(--crm-c-warning); +} +#bootstrap-theme .list-group-item-danger { + color: var(--crm-alert-text-danger); + background-color: var(--crm-alert-background-danger); +} +#bootstrap-theme a.list-group-item-danger, +#bootstrap-theme button.list-group-item-danger { + color: var(--crm-alert-text-danger); +} +#bootstrap-theme a.list-group-item-danger .list-group-item-heading, +#bootstrap-theme button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +#bootstrap-theme a.list-group-item-danger:hover, +#bootstrap-theme a.list-group-item-danger:focus, +#bootstrap-theme button.list-group-item-danger:hover, +#bootstrap-theme button.list-group-item-danger:focus { + color: var(--crm-alert-text-danger); + background-color: var(--crm-alert-background-danger); +} +#bootstrap-theme a.list-group-item-danger.active, +#bootstrap-theme a.list-group-item-danger.active:hover, +#bootstrap-theme a.list-group-item-danger.active:focus, +#bootstrap-theme button.list-group-item-danger.active, +#bootstrap-theme button.list-group-item-danger.active:hover, +#bootstrap-theme button.list-group-item-danger.active:focus { + color: var(--crm-c-alert-text); + background-color: var(--crm-c-alert); + border-color: var(--crm-c-alert); +} +#bootstrap-theme .list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +#bootstrap-theme .list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +/* Embed */ + +#bootstrap-theme .embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +#bootstrap-theme .embed-responsive .embed-responsive-item, +#bootstrap-theme .embed-responsive iframe, +#bootstrap-theme .embed-responsive embed, +#bootstrap-theme .embed-responsive object, +#bootstrap-theme .embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +#bootstrap-theme .embed-responsive-16by9 { + padding-bottom: 56.25%; +} +#bootstrap-theme .embed-responsive-4by3 { + padding-bottom: 75%; +} + +/* Well */ + +#bootstrap-theme .well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: var(--crm-c-background); + border: var(--crm-c-divider); + border-radius: var(--crm-c-roundness); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +#bootstrap-theme .well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +#bootstrap-theme .well-lg { + padding: 24px; + border-radius: 6px; +} +#bootstrap-theme .well-sm { + padding: 9px; + border-radius: 3px; +} + +/* Close */ + +#bootstrap-theme .close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: black; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +#bootstrap-theme .close:hover, +#bootstrap-theme .close:focus { + color: black; + text-decoration: none; + cursor: var(--crm-hover-clickable); + filter: alpha(opacity=50); + opacity: .5; +} +#bootstrap-theme button.close { + padding: 0; + cursor: var(--crm-hover-clickable); + background: transparent; + border: 0; + appearance: none; +} + +/* Modal */ + +#bootstrap-theme .modal-open { + overflow: hidden; +} +#bootstrap-theme .modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +#bootstrap-theme .modal.fade .modal-dialog { + transform: translate(0, -25%); + transition: transform .3s ease-out; +} +#bootstrap-theme .modal.in .modal-dialog { + transform: translate(0, 0); +} +#bootstrap-theme .modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +#bootstrap-theme .modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +#bootstrap-theme .modal-content { + position: relative; + background-color: white; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + outline: 0; +} +#bootstrap-theme .modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: black; +} +#bootstrap-theme .modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +#bootstrap-theme .modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +#bootstrap-theme .modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +#bootstrap-theme .modal-header:before, +#bootstrap-theme .modal-header:after { + display: table; + content: " "; +} +#bootstrap-theme .modal-header:after { + clear: both; +} +#bootstrap-theme .modal-header .close { + margin-top: -2px; +} +#bootstrap-theme .modal-title { + margin: 0; + line-height: 1.428571429; +} +#bootstrap-theme .modal-body { + position: relative; + padding: 20px; +} +#bootstrap-theme .modal-footer { + padding: 20px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +#bootstrap-theme .modal-footer:before, +#bootstrap-theme .modal-footer:after { + display: table; + content: " "; +} +#bootstrap-theme .modal-footer:after { + clear: both; +} +#bootstrap-theme .modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +#bootstrap-theme .modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +#bootstrap-theme .modal-footer .btn-block + .btn-block { + margin-left: 0; +} +#bootstrap-theme .modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + #bootstrap-theme .modal-dialog { + width: 600px; + margin: 30px auto; + } + #bootstrap-theme .modal-content { + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + #bootstrap-theme .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + #bootstrap-theme .modal-lg { + width: 900px; + } +} + +/* Tooltip */ + +#bootstrap-theme .tooltip { + position: absolute; + z-index: 1070; + display: block; + font-style: normal; + font-weight: 400; + line-height: 1.428571429; + line-break: auto; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + -ms-word-break: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + font-size: 12px; + filter: alpha(opacity=0); + opacity: 0; +} +#bootstrap-theme .tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +#bootstrap-theme .tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +#bootstrap-theme .tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +#bootstrap-theme .tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +#bootstrap-theme .tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +#bootstrap-theme .tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: black; +} +#bootstrap-theme .tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: black; +} +#bootstrap-theme .tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: black; +} +#bootstrap-theme .tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: black; +} +#bootstrap-theme .tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: black; +} +#bootstrap-theme .tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: black; +} +#bootstrap-theme .tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: black; +} +#bootstrap-theme .tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: black; +} +#bootstrap-theme .tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: white; + text-align: center; + background-color: black; + border-radius: 4px; +} +#bootstrap-theme .tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +/* Popover */ +#bootstrap-theme .popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-style: normal; + line-height: 1.428571429; + line-break: auto; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + font-size: 14px; + background-color: white; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); +} +#bootstrap-theme .popover.top { + margin-top: -10px; +} +#bootstrap-theme .popover.right { + margin-left: 10px; +} +#bootstrap-theme .popover.bottom { + margin-top: 10px; +} +#bootstrap-theme .popover.left { + margin-left: -10px; +} +#bootstrap-theme .popover > .arrow { + border-width: 11px; +} +#bootstrap-theme .popover > .arrow, +#bootstrap-theme .popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +#bootstrap-theme .popover > .arrow:after { + content: ""; + border-width: 10px; +} +#bootstrap-theme .popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +#bootstrap-theme .popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: white; + border-bottom-width: 0; +} +#bootstrap-theme .popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +#bootstrap-theme .popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: white; + border-left-width: 0; +} +#bootstrap-theme .popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +#bootstrap-theme .popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: white; +} +#bootstrap-theme .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, .25); +} +#bootstrap-theme .popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: white; +} +#bootstrap-theme .popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +#bootstrap-theme .popover-content { + padding: 9px 14px; +} + +/* Labels */ + +#bootstrap-theme .label-primary, +#bootstrap-theme .label-warning, +#bootstrap-theme .label-success, +#bootstrap-theme .label-default, +#bootstrap-theme .label-info, +#bootstrap-theme .label-danger { + display: inline; + padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline); + font-weight: normal; + color: var(--crm-c-light-text); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--crm-roundness); +} +#bootstrap-theme .label:empty { + display: none; +} +.btn #bootstrap-theme .label { + position: relative; + top: -1px; +} +#bootstrap-theme a.label:hover, +#bootstrap-theme a.label:focus { + color: var(--crm-c-light-text); + text-decoration: none; + cursor: var(--crm-hover-clickable); +} +#bootstrap-theme .label-default { + background-color: var(--crm-c-text); + color: var(--crm-c-light-text); +} +#bootstrap-theme .label-default[href]:hover, +#bootstrap-theme .label-default[href]:focus { + background-color: var(--crm-c-background4); +} +#bootstrap-theme .label-primary { + background: var(--crm-c-primary); + color: var(--crm-c-primary-text); +} +#bootstrap-theme .label-primary[href]:hover, +#bootstrap-theme .label-primary[href]:focus { + background: var(--crm-c-primary-hover); +} +#bootstrap-theme .label-success { + background: var(--crm-c-success); + color: var(--crm-c-success-text); +} +#bootstrap-theme .label-success[href]:hover, +#bootstrap-theme .label-success[href]:focus { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-success); +} +#bootstrap-theme .label-info { + background: var(--crm-c-info); + color: var(--crm-c-info-text); +} +#bootstrap-theme .label-info[href]:hover, +#bootstrap-theme .label-info[href]:focus { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-info); +} +#bootstrap-theme .label-warning { + background: var(--crm-c-warning); + color: var(--crm-c-warning-text); +} +#bootstrap-theme .label-warning[href]:hover, +#bootstrap-theme .label-warning[href]:focus { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-warning); +} +#bootstrap-theme .label-danger { + background: var(--crm-c-alert); + color: var(--crm-c-alert-text); +} +#bootstrap-theme .label-danger[href]:hover, +#bootstrap-theme .label-danger[href]:focus { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-alert); +} + +/* Panels */ + +/* With list groups - https://getbootstrap.com/docs/3.4/components/#panels-list-group */ + +#bootstrap-theme .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +#bootstrap-theme .panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +#bootstrap-theme .list-group + .panel-footer { + border-top-width: 0; +} +#bootstrap-theme .panel > .list-group, +#bootstrap-theme .panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +#bootstrap-theme .panel > .list-group .list-group-item, +#bootstrap-theme .panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +#bootstrap-theme .panel > .list-group:first-child .list-group-item:first-child, +#bootstrap-theme .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +#bootstrap-theme .panel > .list-group:last-child .list-group-item:last-child, +#bootstrap-theme .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +/* With tables - https://getbootstrap.com/docs/3.4/components/#panels-tables */ + +#bootstrap-theme .panel > .table, +#bootstrap-theme .panel > .table-responsive > .table, +#bootstrap-theme .panel > .panel-collapse > .table { + margin-bottom: 0; +} +#bootstrap-theme .panel > .table caption, +#bootstrap-theme .panel > .table-responsive > .table caption, +#bootstrap-theme .panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +#bootstrap-theme .panel > .table:first-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child, +#bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +#bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +#bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +#bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +#bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +#bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +#bootstrap-theme .panel > .table:last-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child, +#bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +#bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +#bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +#bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +#bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +#bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +#bootstrap-theme .panel > .panel-body + .table, +#bootstrap-theme .panel > .panel-body + .table-responsive, +#bootstrap-theme .panel > .table + .panel-body, +#bootstrap-theme .panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +#bootstrap-theme .panel > .table > tbody:first-child > tr:first-child th, +#bootstrap-theme .panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +#bootstrap-theme .panel > .table-bordered, +#bootstrap-theme .panel > .table-responsive > .table-bordered { + border: 0; +} +#bootstrap-theme .panel > .table-bordered > thead > tr > th:first-child, +#bootstrap-theme .panel > .table-bordered > thead > tr > td:first-child, +#bootstrap-theme .panel > .table-bordered > tbody > tr > th:first-child, +#bootstrap-theme .panel > .table-bordered > tbody > tr > td:first-child, +#bootstrap-theme .panel > .table-bordered > tfoot > tr > th:first-child, +#bootstrap-theme .panel > .table-bordered > tfoot > tr > td:first-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +#bootstrap-theme .panel > .table-bordered > thead > tr > th:last-child, +#bootstrap-theme .panel > .table-bordered > thead > tr > td:last-child, +#bootstrap-theme .panel > .table-bordered > tbody > tr > th:last-child, +#bootstrap-theme .panel > .table-bordered > tbody > tr > td:last-child, +#bootstrap-theme .panel > .table-bordered > tfoot > tr > th:last-child, +#bootstrap-theme .panel > .table-bordered > tfoot > tr > td:last-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +#bootstrap-theme .panel > .table-bordered > thead > tr:first-child > td, +#bootstrap-theme .panel > .table-bordered > thead > tr:first-child > th, +#bootstrap-theme .panel > .table-bordered > tbody > tr:first-child > td, +#bootstrap-theme .panel > .table-bordered > tbody > tr:first-child > th, +#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +#bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th, +#bootstrap-theme .panel > .table-bordered > tbody > tr:last-child > td, +#bootstrap-theme .panel > .table-bordered > tbody > tr:last-child > th, +#bootstrap-theme .panel > .table-bordered > tfoot > tr:last-child > td, +#bootstrap-theme .panel > .table-bordered > tfoot > tr:last-child > th, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +#bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +#bootstrap-theme .panel > .table-responsive { + margin-bottom: 0; + border: 0; +} + +/* Hidiing elements */ + +#bootstrap-theme [hidden], +#bootstrap-theme template { + display: none; +} +#bootstrap-theme .clearfix:before, +#bootstrap-theme .clearfix:after { + display: table; + content: " "; +} +#bootstrap-theme .clearfix:after { + clear: both; +} +#bootstrap-theme .center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +#bootstrap-theme .hide { + display: none !important; +} +#bootstrap-theme .show { + display: block !important; +} +#bootstrap-theme .invisible { + visibility: hidden; +} +#bootstrap-theme .text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +#bootstrap-theme .hidden { + display: none !important; +} +#bootstrap-theme .affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +#bootstrap-theme .visible-sm { + display: none !important; +} +#bootstrap-theme .visible-md { + display: none !important; +} +#bootstrap-theme .visible-lg { + display: none !important; +} +#bootstrap-theme .visible-xs-block, +#bootstrap-theme .visible-xs-inline, +#bootstrap-theme .visible-xs-inline-block, +#bootstrap-theme .visible-sm-block, +#bootstrap-theme .visible-sm-inline, +#bootstrap-theme .visible-sm-inline-block, +#bootstrap-theme .visible-md-block, +#bootstrap-theme .visible-md-inline, +#bootstrap-theme .visible-md-inline-block, +#bootstrap-theme .visible-lg-block, +#bootstrap-theme .visible-lg-inline, +#bootstrap-theme .visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + #bootstrap-theme .visible-xs { + display: block !important; + } + #bootstrap-theme table.visible-xs { + display: table !important; + } + #bootstrap-theme tr.visible-xs { + display: table-row !important; + } + #bootstrap-theme th.visible-xs, + #bootstrap-theme td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + #bootstrap-theme .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + #bootstrap-theme .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + #bootstrap-theme .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + #bootstrap-theme .visible-sm { + display: block !important; + } + #bootstrap-theme table.visible-sm { + display: table !important; + } + #bootstrap-theme tr.visible-sm { + display: table-row !important; + } + #bootstrap-theme th.visible-sm, + #bootstrap-theme td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + #bootstrap-theme .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + #bootstrap-theme .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + #bootstrap-theme .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + #bootstrap-theme .visible-md { + display: block !important; + } + #bootstrap-theme table.visible-md { + display: table !important; + } + #bootstrap-theme tr.visible-md { + display: table-row !important; + } + #bootstrap-theme th.visible-md, + #bootstrap-theme td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + #bootstrap-theme .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + #bootstrap-theme .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + #bootstrap-theme .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + #bootstrap-theme .visible-lg { + display: block !important; + } + #bootstrap-theme table.visible-lg { + display: table !important; + } + #bootstrap-theme tr.visible-lg { + display: table-row !important; + } + #bootstrap-theme th.visible-lg, + #bootstrap-theme td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + #bootstrap-theme .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + #bootstrap-theme .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + #bootstrap-theme .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + #bootstrap-theme .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + #bootstrap-theme .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + #bootstrap-theme .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + #bootstrap-theme .hidden-lg { + display: none !important; + } +} +#bootstrap-theme .visible-print { + display: none !important; +} +@media print { + #bootstrap-theme .visible-print { + display: block !important; + } + #bootstrap-theme table.visible-print { + display: table !important; + } + #bootstrap-theme tr.visible-print { + display: table-row !important; + } + #bootstrap-theme th.visible-print, + #bootstrap-theme td.visible-print { + display: table-cell !important; + } +} +#bootstrap-theme .visible-print-block { + display: none !important; +} +@media print { + #bootstrap-theme .visible-print-block { + display: block !important; + } +} +#bootstrap-theme .visible-print-inline { + display: none !important; +} +@media print { + #bootstrap-theme .visible-print-inline { + display: inline !important; + } +} +#bootstrap-theme .visible-print-inline-block { + display: none !important; +} +@media print { + #bootstrap-theme .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + #bootstrap-theme .hidden-print { + display: none !important; + } +} diff --git a/civicrm/ext/riverlea/core/css/_cms.css b/civicrm/ext/riverlea/core/css/_cms.css new file mode 100755 index 0000000000..6bd0ba14f1 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/_cms.css @@ -0,0 +1,211 @@ +/* NB: CMS-specific changes should be name-spaced to the CMS *and* .crm-container, with exception of default font-size resets */ + +/****************** + BACKDROP +*******************/ + +/* Backdrop - html.admin-bar */ + +html.admin-bar body { + background-color: var(--crm-c-page-background); +} +html.admin-bar .crm-container { + --crm-page-padding: 0; +} +html.admin-bar #admin-bar-menu a.civicrm { + padding-left: 1.75rem !important; +} +html.admin-bar #admin-bar-menu .civicrm .admin-bar-link-icon { + display: none; +} + +/****************** + DRUPAL +*******************/ + +/* Drupal - body.page-civicrm */ + +/* D7 Garland */ +body.page-civicrm > #page { + padding: 0; + margin: 0; + --crm-page-padding: 1rem 3rem; +} +body.page-civicrm .crm-container div.status { + background-image: none; +} + +/* D8+ */ +body.page-civicrm header.content-header { + margin-bottom: 0; + background-color: var(--crm-c-background); +} +body.page-civicrm main.page-content { + margin-top: 0; +} +body.page-civicrm header + div.layout-container { + background-color: var(--crm-c-page-background) !important; + margin: 0 !important; /* use of important vs some themes */ +} +body.page-civicrm .button { + -webkit-font-smoothing: initial; +} +body.page-civicrm .page-title { + color: var(--crm-c-text); +} + +/* D7 Garland */ +body.page-civicrm #squeeze #crm-container, +.region-sidebar-first .block-civicrm { + padding: 0; + --crm-page-padding: 0; + --crm-c-page-background: transparent; + --crm-input-label-width: 12em; +} +body.page-civicrm #squeeze .crm-container ul li:not(.ui-tab) { + margin: 0; + padding: 0; +} + +/* D7 Seven */ +body.page-civicrm > #branding { + background-color: var(--crm-c-page-background); +} +body.page-civicrm > #branding + #page { + --crm-page-padding: 0.5rem 1.25rem; +} + +/* D9 Claro */ +body.page-civicrm { + color: unset; +} +body.page-civicrm .breadcrumb__item, +body.page-civicrm .breadcrumb__link { + color: var(--crm-c-text); +} +#block-claro-content { + --crm-page-padding: 3rem; + --crm-page-width: calc(100% - var(--crm-page-padding) - var(--crm-page-padding)); +} +#block-claro-content .crm-container:not(.crm-public) .form-item, +#block-claro-content .crm-container p, +#block-claro-content .crm-container .help p, +#block-claro-content .crm-container .button { + margin: 0; +} +body.page-civicrm .page-content:has(#block-claro-content) { + margin-top: 0; +} +#block-claro-content .button:not(:focus) { + box-shadow: none; +} +#block-claro-content .required-mark::after { + background-image: unset; + display: inherit; +} +#block-claro-content .action-link + .action-link { + margin-inline-start: unset; +} +@media (max-width: 959px) { + #block-claro-content { + --crm-page-padding: 1rem; + } +} + +/* D9 Seven */ +#block-seven-content { + --crm-page-padding: 2rem; +} +#block-seven-breadcrumbs { + --crm-page-padding: 2rem; + padding: 0 var(--crm-page-padding); +} +#block-seven-content .button { + text-shadow: none; + margin-left: 0; +} +#block-seven-content .form-composite > legend, +#block-seven-content .label { + font-weight: inherit; +} + +/* Bootstrap 4 */ +body.page-civicrm main > .container:has(#block-bootstrap4-content) { + max-width: 100%; + background: var(--crm-c-page-background); +} + +/****************** + WORDPRESS +*******************/ + +body.toplevel_page_CiviCRM.wp-admin { + background: var(--crm-c-page-background); +} +body.toplevel_page_CiviCRM #wpcontent { + padding-left: 0; /* resets WP padding */ +} +body.wp-admin .crm-container { + --crm-page-padding: 1rem 2rem; +} +body.wp-admin .crm-title { + line-height: 1.1; + margin-bottom: 8px; +} +body.wp-admin .crm-container input:not([type=checkbox]):not([type=radio]):not(.crm-form-time) { + margin: 0; +} +body.wp-admin .crm-container p, +body.wp-admin .crm-container li { + margin: 0; /* resets WP li bottom margin */ + list-style: none; + white-space: inherit; +} +body.wp-admin .crm-container div.ui-notify-message .notify-content li { + list-style: unset; +} +body.wp-admin .crm-container .button { + line-height: inherit; + font-size: inherit; +} +body.wp-admin .breadcrumb .crm-i { + font-size: smaller; +} +body.wp-admin.page-civicrm-contact .breadcrumb { + display: none; /* Hides breadcrumb on contact dashboard */ +} +body.wp-admin.wp-core-ui .crm-container select { + margin: 0; + appearance: auto; + background-image: none; +} +body.wp-admin.wp-core-ui.toplevel_page_CiviCRM select:hover { + color: var(--crm-input-color); +} +body.wp-admin .crm-container input[type="checkbox"], +body.wp-admin .crm-container input[type="radio"] { + appearance: none; + border-radius: var(--crm-s); + background: #fff; + height: var(--crm-r); + width: var(--crm-r); +} +body.wp-admin .crm-container input[type="radio"] { + border-radius: 50%; +} + +/****************** + STANDALONE +*******************/ + +html.crm-standalone { + --crm-page-width: 94vw; + --crm-page-padding: 1px 3vw 1rem; +} +html.crm-standalone body { + margin: unset; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue",sans-serif; /* Adds fallback for base font */ +} +html.crm-standalone #crm-container:has(.standalone-auth-form) { + background: var(--crm-c-background); +} diff --git a/civicrm/ext/riverlea/core/css/_core.css b/civicrm/ext/riverlea/core/css/_core.css new file mode 100755 index 0000000000..4e89d1cffe --- /dev/null +++ b/civicrm/ext/riverlea/core/css/_core.css @@ -0,0 +1,8 @@ +/* Civi CSS Framework (civicrm.css), the core CSS to make Civi UI behave + coherently in a neutral, clean, responsive and accessible way with as little + css as possible. For dev purposes each components is its own file, these + can be merged later. */ + +@import url(components/_accordion.css); @import url(components/_alerts.css); @import url(components/_buttons.css); @import url(components/_form.css); @import url(components/_icons.css); @import url(components/_nav.css); @import url(components/_tabs.css); @import url(components/_dropdowns.css); @import url(components/_tables.css); @import url(components/_dialogs.css); @import url(components/_page.css); @import url(components/_components.css); @import url(components/_front.css); :root { + --crm-release: '1.80.14'; +} diff --git a/civicrm/ext/riverlea/core/css/_fixes.css b/civicrm/ext/riverlea/core/css/_fixes.css new file mode 100755 index 0000000000..6571e7d6b8 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/_fixes.css @@ -0,0 +1,888 @@ +/* CSS hacks to accommodate quirks and inconsistencies in the markup. + The end goal would be to remove these once the markup is + consistent, and another */ + +/****************** + ACCORDIONS + From Civi 5.72 these are only needed for extensions +*******************/ + +/* Reset */ + +.crm-container .widget-content .crm-accordion-wrapper.collapsed .crm-accordion-header, +.crm-container .widget-content .crm-accordion-header, +.crm-container .crm-accordion-inner .crm-accordion-header, +.crm-container .crm-accordion-wrapper .crm-master-accordion-header, +.crm-container .crm-collapsible .collapsible-title, +.crm-container .collapsed .crm-accordion-header, +.crm-container .crm-accordion-header { + background-image: none; + text-indent: 0; +} +.crm-container div.collapsed .crm-accordion-body, +.crm-container div.crm-collapsible.collapsed .collapsible-title+*, +.crm-container tr.hiddenElement { + display: none; +} +.accordion.ui-accordion.ui-widget.ui-helper-reset { + border: 0 solid transparent; + box-shadow: var(--crm-block-shadow); +} + +/* Expand/collapse icons */ + +.crm-container .crm-accordion-header::before, +details.af-collapsible > .af-title::before, +.crm-dashlet-header .crm-dashlet-collapse.fa-caret-down::before, +.crm-dashlet-header .crm-dashlet-collapse.fa-caret-right::before, +.crm-container .crm-master-accordion-header:before, +.crm-container .expanded::before, +.crm-container a.collapsed::before, +.crm-container .crm-collapsible .collapsible-title::before, +.crm-container a.crm-expand-row:not(.expanded)::before, +.crm-container .civicrm-community-messages .crm-collapsible .collapsible-title::before, +.crm-container .show-children.collapsed::before { + font-size: var(--crm-font-size); + font-style: normal; + text-rendering: auto; + text-indent: inherit; + font-family: FontAwesome; + color: var(--crm-expand-icon-color); + margin-right: var(--crm-expand-icon-spacing); + display: inline-block; + transform-origin: center center; + content: var(--crm-expand-icon); + cursor: var(--crm-hover-clickable); +} +.crm-container .collapsed .crm-accordion-header::before, +.crm-accordion-wrapper.collapsed .crm-master-accordion-header:before, +.crm-dashlet-header .crm-dashlet-collapse.fa-caret-right::before, +details.af-collapsible.af-collapsed > .af-title::before, +.crm-container a.collapsed:not(.expanded)::before, +.crm-container a.crm-expand-row::before, +.crm-container .crm-collapsible.collapsed .collapsible-title::before, +.crm-container .civicrm-community-messages .crm-collapsible.collapsed .collapsible-title::before { + transform: none; + transform-origin: center center; + transition: var(--crm-expand-transition); +} +.crm-container .crm-accordion-header::before, +details.af-collapsible[open] > .af-title::before, +.crm-container .crm-collapsible .collapsible-title::before, +.crm-dashlet-header .crm-dashlet-collapse.fa-caret-down::before, +.crm-container .crm-master-accordion-header:before, +.crm-container a.collapsed::before, +.crm-container a.expanded::before, +.crm-container a.crm-expand-row.expanded::before, +.crm-container .civicrm-community-messages .crm-collapsible .collapsible-title::before, +.crm-container .show-children.expanded::before { + content: var(--crm-expand-icon); + transform: var(--crm-expand-transform); + transform-origin: center center; + transition: var(--crm-expand-transition); + float: left; +} +.crm-container a.crm-expand-row:not(.expanded)::before, +.crm-container a.crm-expand-row.expanded::before { + margin-right: 0; +} +a.crm-expand-row:hover, +a.crm-expand-row:focus { + text-decoration: none; + color: inherit; +} + +/* Header */ + +.crm-container .crm-accordion-header, +.crm-container .crm-collapsible .collapsible-title, +.af-collapsible > summary.af-title, +.crm-container span.collapsed:not(.show-children) { + cursor: var(--crm-hover-clickable); + padding: var(--crm-expand-header-padding); + border-radius: var(--crm-expand-radius) var(--crm-expand-radius) 0 0; + background-color: var(--crm-expand-header-bg); + font-weight: var(--crm-expand-header-weight); + color: var(--crm-expand-header-color); +} +.crm-container .crm-accordion-wrapper.collapsed .crm-accordion-header, +.crm-container .crm-collapsible.collapsed .collapsible-title { + border-radius: var(--crm-expand-radius); +} +.crm-container .widget-content .crm-accordion-header, +.crm-container .crm-accordion-inner .crm-accordion-header, +.crm-container .crm-collapsible .collapsible-title { + background-color: transparent; + color: var(--crm-c-text); + font-size: var(--crm-font-size); +} +.crm-accordion-wrapper .crm-accordion-header.active, +.crm-accordion-wrapper .crm-accordion-wrapper.collapsed:hover, +.crm-accordion-wrapper .crm-accordion-wrapper.collapsed:focus, +.crm-accordion-wrapper .crm-accordion-header:hover, +.crm-accordion-wrapper .crm-accordion-header.active:hover { + background-color: var(--crm-expand-header-bg-active); +} +.crm-container .crm-accordion-wrapper .crm-master-accordion-header { + font-family: var(--crm-expand2-header-font); + font-weight: var(--crm-expand2-header-weight); + background-color: var(--crm-expand2-header-bg); + color: var(--crm-expand2-header-color); + border: var(--crm-expand2-header-border); + border-width: var(--crm-expand2-header-border-width); + padding: var(--crm-expand2-header-padding); +} +.crm-container .crm-accordion-wrapper .crm-master-accordion-header:hover, +.crm-container .crm-accordion-wrapper .crm-master-accordion-header:focus { + background-color: var(--crm-expand2-header-bg-active); +} +/* Body */ + +.crm-container .crm-accordion-wrapper .crm-accordion-body { + border-radius: 0 0 var(--crm-expand-radius) var(--crm-expand-radius); + border: var(--crm-expand-border); + padding: var(--crm-expand-body-padding); + background-color: var(--crm-expand-body-bg); + box-shadow: var(--crm-expand-body-box-shadow); +} +.crm-container .widget-content .crm-accordion-body, +.crm-container .crm-collapsible .crm-summary-block { + padding: var(--crm-expand-body-padding); +} +.crm-container .crm-master-accordion-header + .crm-accordion-body { + padding: var(--crm-expand2-body-padding); + background: var(--crm-expand2-body-bg); + border: var(--crm-expand2-border); + border-width: var(--crm-expand2-border-width); + border-radius: 0 0 var(--crm-expand-radius) var(--crm-expand-radius); +} +.crm-container summary label { + color: inherit !important; /* all vs .crm-container .form-item label */ + font-size: inherit !important; + margin: 0 !important; +} +.crm-container details table.dataTable { + width: 100% !important; /* dev/user-interface/-/issues/73 */ + box-sizing: border-box; +} + +/****************** + ALERTS +*******************/ + +.crm-container del, +.crm-container .ui-icons_deleted, +.crm-container table.caseSelector td.status-urgent, +.crm-container .font-red, +.crm-container .status-removed, +.crm-container .status-overdue, +.crm-container .status-fatal, +.crm-container .status-hold, +.crm-container .status-past, +.crm-contact-deceased, +.crm-container .status-warning { + color: var(--crm-c-alert); +} +.crm-container .alert.alert-info.font-red { /* for when an info alert wants to be a danger alert! */ + background-color: var(--crm-alert-background-danger); + border-color: var(--crm-alert-border-danger); +} + +/****************** + BUTTONS + For buttons not using .crm-button or .btn or <button> +*******************/ + +.crm-container .ui-button:not(.ui-button-icon-only) { + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: var(--crm-hover-clickable); + background-image: none; + border: var(--crm-btn-border); + padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline); + font-size: var(--crm-font-size); + border-radius: var(--crm-btn-radius); + user-select: none; + margin: var(--crm-btn-margin); + background-color: var(--crm-c-primary); + color: var(--crm-c-primary-text); + line-height: 1.5; + display: flex; + height: var(--crm-btn-height); + width: fit-content; + gap: var(--crm-btn-icon-spacing); +} +.crm-container .ui-button:hover, +.crm-container .ui-button:focus { + background: var(--crm-c-primary-hover); + color: var(--crm-c-primary-text); + text-decoration: none; +} +.crm-button > input[type="button"], +.crm-button > input[type="submit"] { + background: transparent; + color: inherit; + padding: 0; + border: 0; + box-shadow: none; +} +.crm-container a.button, +.crm-container a.button:link, +.crm-container a.button:visited { + background: var(--crm-c-secondary); + color: var(--crm-c-secondary-text); + border: var(--crm-btn-border); + padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline); + font-weight: normal; + text-decoration: none; + line-height: initial; + min-height: var(--crm-btn-height); + border-radius: var(--crm-btn-radius); + display: flex !important; /* vs contact dashboard edit */ + gap: var(--crm-btn-icon-spacing); + align-items: center; + margin: var(--crm-btn-margin); +} +.crm-container a.button span { + display: flex; + align-items: center; + justify-content: center; + height: 100%; +} +.crm-container a.button:hover, +.crm-container a.button:focus { + background: var(--crm-c-secondary-hover); + color: var(--crm-c-secondary-hover-text); +} +.crm-actions-ribbon a.button, +.crm-container .action-link a.button { + background: var(--crm-c-primary); + color: var(--crm-c-primary-text); + font-weight: normal; + text-decoration: none; +} +.crm-container a.button i.crm-i, +.crm-container a.button:visited i.crm-i { + padding: 0 var(--crm-btn-icon-spacing) 0 var(--crm-btn-padding-inline); + min-height: calc(var(--crm-btn-height) - 2px - var(--crm-btn-icon-padding) - var(--crm-btn-icon-padding)); +} +.crm-container .crm-actions-ribbon a.button:not(.delete):hover, +.crm-container .crm-actions-ribbon a.button:not(.delete):focus, +.crm-container .action-link a.button:hover, +.crm-container .action-link a.button:focus { + background: var(--crm-c-primary-hover); + text-decoration: none; +} +.crm-config-backend-form-block > div { /* makes cleanup cache buttons flow inline */ + display: flex; + gap: var(--crm-flex-gap); +} +#ckeditor_config { + display: flex !important; /* odd inline styled button on display preferences page */ +} + +/* Small buttons */ + +.crm-container .btn-xs, +.crm-container button.dropdown-toggle.btn-xs, +.crm-container .crm-accordion-header a.crm-hover-button, +.crm-container .crm-form-date-wrapper a.crm-hover-button, +.crm-container .btn-group-xs > .btn, +body[class*="page-civicrm-report-"] #report-tab-order-by-elements #optionFieldLink.btn-group-xs > .form-link, +.crm-container .crm-search-form-block.btn-group-xs > a, +.crm-container .crm-search-form-block.btn-group-xs > span, +.page-civicrm-admin.page-civicrm-a .crmCaseType .btn-group-xs > .crm-button, +.page-civicrm-a.page-civicrm-a .crmCaseType .btn-group-xs > .crm-button, +.crm-container #crm-submit-buttons .btn-group-xs > button.crm-form-submit, +.crm-container .btn-group-xs > button.crm-button.crm-form-submit, +.crm-container .btn-group-xs > .crm-hover-button, +.crm-container .ui-dialog-buttonset .btn-group-xs > .ui-button, +.crm-container .btn-group-xs > a.button, +.crm-container .btn-group-xs > input[type="button"] { + padding: var(--crm-btn-small-padding); + font-size: var(--crm-small-font-size); + border-radius: var(--crm-roundness); + height: auto; +} +.crm-container .btn-group-xs button { + padding: var(--crm-xs) var(--crm-s); + font-size: var(--crm-small-font-size); +} +/* select all 'checkbox' on table th */ +.crm-container button.btn:has(.fa-square-o), +.crm-container button.btn:has(.fa-check-square-o) { + padding-inline: 0; + border-right: 0; +} +.crm-container i.ui-icon.fa-square-o, +.crm-container i.ui-icon.fa-check-square-o, +.crm-container .btn i.fa-square-o, +.crm-container .btn i.fa-check-square-o { + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; +} + +/****************** + FORM + Inline labels/inputs with a 17% width? +*******************/ + +@media (min-width: 480px) { + .crm-container .crm-section .label { + float: left; + width: 17%; + text-align: right; + } + .crm-container .crm-section .content { + margin-left: 19%; + } +} + +/****************** + TABS +*******************/ + +/* Bootstrap tabs */ + +.crm-container .panel-default > .panel-heading:has(.nav-tabs) { /* Fix for default panel heading bg */ + background-color: var(--crm-tabs-bg); +} +.crm-container .panel-heading:has(.nav-tabs) .pull-right { + margin-right: var(--crm-m); +} +.crm-container .afadmin-list .nav.nav-tabs { /* Fix for AForm tabs border */ + border-radius: var(--crm-roundness) var(--crm-roundness) 0 0; + margin-bottom: 0; +} +.crm-container .crm-search-nav-tabs { /* Fix for SK tabs border */ + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + margin-bottom: 0; + border-bottom: 0; +} +.crm-container .panel-heading:has(.nav-tabs) { + padding: 0; + border-bottom: 0; + background-color: var(--crm-tabs-bg); +} +.crm-container .panel-heading .nav.nav-tabs { + background-color: transparent; +} +.crm-container .afadmin-list > table, +.crm-search:has(.crm-search-nav-tabs) .crm-search-display.crm-search-display-table { + border: var(--crm-tabs-border); + box-shadow: none; + border-radius: 0 0 var(--crm-roundness) var(--crm-roundness); + background: var(--crm-tab-bg-active); + overflow-x: auto; +} +.crm-search:has(.crm-search-nav-tabs) .crm-search-display.crm-search-display-table table { + border-width: 1px 0 0 0; + border-top-left-radius: 0; + border-top-right-radius: 0; + box-shadow: none; + margin-bottom: 0; +} +.crm-container .afadmin-list > .form-inline, +.crm-search > .ng-scope > .form-inline { + border: var(--crm-tabs-border); + border-radius: 0; + border-top-width: 0; + border-bottom-width: 0; +} +.afadmin-list > .form-inline { + border-radius: 0; + border-bottom: 0; +} +.afadmin-list .nav-tabs + .form-inline, +.crm-search-nav-tabs ~ .ng-scope > .form-inline { + padding: var(--crm-r); + background: var(--crm-tab-bg-active); +} +.crm-container .ui-tabs ul.crm-extensions-tabs-list a em { + display: none; +} +#crm-status-list { + box-shadow: var(--crm-block-shadow); +} + +/****************** + PAGES +*******************/ + +/* Contacts - New */ + +.CRM_Contact_Form_Contact > .crm-form-block > details, +.CRM_Contact_Form_Contact > .crm-form-block > div > details { + margin-inline: calc(-1 * var(--crm-form-block-padding)); + padding-inline: var(--crm-expand-2-body-padding); + margin-bottom: var(--crm-expand-2-body-padding); +} +.crm-container .crm-add-address-wrapper { + height: auto; +} + +/* Tag mgmt page */ + +#mainTabContainer #tagtree { + max-height: 100%; + overflow: inherit; +} +.crm-container .tag-tree-wrapper { + display: grid; + grid-template-columns: 2fr 1fr; + margin: var(--crm-m) 0; +} +.crm-container .tag-tree-wrapper div.tag-tree { + width: auto; +} +.crm-container .tag-tree-wrapper div.tag-info { + width: auto; + position: relative; + background: var(--crm-c-background); + border: 0 solid transparent; + box-shadow: var(--crm-block-shadow); + padding: var(--crm-padding-reg); + font-family: var(--crm-font); + border-radius: var(--crm-roundness); + top: 0;; +} +.crm-container .tag-tree-wrapper div.tag-info .tdl { + font-weight: var(--crm-bold-weight); + font-family: var(--crm-font-bold); + color: var(--crm-c-text); +} +.crm-container .tag-tree-wrapper div.tag-info .crm-submit-buttons { + margin: var(--crm-m) 0 0; + padding: 0; +} +.crm-container .tag-tree-wrapper .tag-tree a.crm-tag-item { + font-size: var(--crm-font-size); + font-family: var(--crm-font); + height: auto; + padding: var(--crm-padding-small); + border-radius: var(--crm-btn-radius); +} +@media (max-width: 768px) { + .crm-container .tag-tree-wrapper { + display: block; + } +} +/* Dedupe change usage */ +.crm-container label:has(.dedupe-rules-dialog-desc) input { + float: left; + margin: var(--crm-s) var(--crm-m) 0 0; +} +.crm-container .dedupe-rules-dialog-desc { + font-weight: normal; + font-family: var(--crm-font); +} +/* CiviContribute dashboard */ +.crm-container #ContributionCharts #mainTabContainer { + box-shadow: var(--crm-block-shadow); +} +.crm-container #ContributionCharts .ui-tabs-nav { + align-items: center; + gap: 1px; /* to handle white space in markup */ +} +.crm-container #ContributionCharts .ui-tabs-nav .float-right td { + padding: 0 var(--crm-s); +} +#ContributionCharts ul.ui-tabs-nav li.crm-tab-button { + padding: var(--crm-tab-padding); + border-radius: var(--crm-tab-roundness); +} +#ContributionCharts ul.ui-tabs-nav li.crm-tab-button a { + padding: 0; +} +#ContributionCharts ul.ui-tabs-nav li.crm-tab-button a span { + display: none; +} +#ContributionCharts ul.ui-tabs-nav .float-right { + position: absolute; + right: var(--crm-s); + top: var(--crm-s); +} +#ContributionCharts ul.ui-tabs-nav .float-right table, +#ContributionCharts ul.ui-tabs-nav .float-right table tr { + background: none; + margin: 0; + border: 0 solid transparent; + box-shadow: none; +} +#ContributionCharts ul.ui-tabs-nav .float-right table a.button { + max-height: 36px; +} +#ContributionCharts #chartData { + padding: var(--crm-padding-reg); + box-shadow: none; + background: var(--crm-tab-bg-active); +} +/* Include profile (contribtuion page and events */ +.crm-contribution-contributionpage-custom-form-block-custom_pre_id td.html-adjust > div > div, +.crm-contribution-contributionpage-custom-form-block-custom_post_id td.html-adjust > div > div, +.crm-event-manage-registration-form-block-custom_pre_id td > div > div, +.crm-event-manage-registration-form-block-custom_post_id td > div > div { + display: flex; + gap: var(--crm-s); +} +/* Event dashboard */ +.CRM_Event_Form_Search .button { + float: left; + margin-right: var(--crm-m); +} +#crm-event-dashboard-heading + div a, +.CRM_Event_Form_SearchEvent .crm-content-block .float-right a { + display: flex; + padding: 0 0 var(--crm-m) 0; + gap: var(--crm-m); + align-items: center; +} +/* Dedupe page */ +#browseValues_Individual > div:last-of-type, +#browseValues_Household > div:last-of-type, +#browseValues_Organization > div:last-of-type { + float: none !important; /* overwrites inline 'float' that breaks page wrapper */ + display: flex; + justify-content: flex-end; + padding: 0 0 var(--crm-l) 0; +} + +/* CiviCase */ +.crm-container .crm-case-dashboard-switch-view-buttons { + margin-left: auto; + display: flex; +} +.crm-container .crm-case-caseview-form-block table#searchOptions { + width: auto !important; +} +.crm-case-form-block h3, +.crm-case-caseview-form-block h3 { + background: transparent; + padding: 0; +} +.crm-case-activity-form-block-followup_activity_type_id .crm-form-date-wrapper { + display: inline-block; +} +.crm-case-activity-form-block table.form-layout-compressed { + width: 100%; +} +.crm-case-form-block-medium_id td.view-value label { + width: auto; +} +/* API3 explorer */ + +#api-generated caption { + font-weight: var(--crm-bold-weight); + font-family: var(--crm-font-bold); +} +#api-generated tr td:first-of-type { + width: var(--crm-input-label-width); +} +/* Display Preferences */ + +tr.crm-preferences-display-form-block-contact_edit_options td:has(table) { + padding: 0; +} + +tr.crm-preferences-display-form-block-contact_edit_options td table { + width: auto !important; +} +/****************** + SEARCH +*******************/ + +.crm-container div#searchForm table.form-layout { + background: transparent; + box-shadow: none; +} +/* Advanced Search */ +.crm-container .adv-search-top-submit { + display: flex; + float: right; + gap: 1rem; + align-items: center; +} +.crm-container .form-layout td:has(#_qf_Advanced_refresh-bottom) { + display: flex; + gap: var(--crm-m); + align-items: center; +} +.crm-container .adv-search-top-submit .crm-submit-buttons, +.crm-container .form-layout td:has(#_qf_Advanced_refresh-bottom) .crm-submit-buttons { + padding: 0; +} +/* Full Text */ +#searchForm table.form-layout-compressed td { + padding: var(--crm-padding-reg); +} +/* Case */ +.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child, +.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr, +.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr > td { + display: block; +} +.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr:nth-of-type(1) > td:nth-of-type(2) { + display: none !important; +} +.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr #s2id_case_status_id { + margin-bottom: var(--crm-r1); +} +.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr:nth-of-type(1) > td:nth-of-type(1) label { + display: block; +} +.crm-case_search-accordion .crm-accordion-body .form-layout > tbody:first-child > tr:nth-of-type(1) > td:nth-of-type(1) label + input { + margin-left: -0.6rem; +} +/* Member */ +.page-civicrm-member-search .CRM_Member_Form_Search .crm-accordion-body tr:last-child td { + padding-top: var(--crm-r); +} +/* Find Participants */ +.crm-container div#searchForm table.form-layout td { + border: 0 solid transparent; +} +/* Custom searches */ +.crm-container > #crm-main-content-wrapper > fieldset { + display: grid; + background: var(--crm-c-background); + border: 0 solid transparent; + box-shadow: var(--crm-block-shadow); + padding: var(--crm-padding-reg); + gap: var(--crm-m); + margin-bottom: var(--crm-r); +} +.crm-container > #crm-main-content-wrapper > fieldset > * { + margin: 0; +} + +/****************** + PADDING FIXES +*******************/ + +/* General */ +.crm-container .crm-form-block .crm-form-block { + padding: var(--crm-form-block-padding); + margin-bottom: var(--crm-r); +} +/* Save as template text on new email form */ +.crm-container #editMessageDetails { + padding: var(--crm-padding-reg); +} +/* Contact dashboard page */ +.crm-contact-page { + padding: 0; +} +#mainTabContainer .form-group.pull-right > .btn-group { + margin-bottom: var(--crm-m2); +} +/* Contact dashboard page */ +.crm-actions-ribbon .crm-next-action, +.crm-actions-ribbon .crm-previous-action { + margin-left: auto; +} +.crm-container .view-contact-groups .description { + margin: var(--crm-r) 0; +} +/* Contacts - new */ +.CRM_Contact_Form_Contact > .crm-form-block .crm-submit-buttons:first-of-type { + margin-bottom: var(--crm-padding-reg); + padding: 0; +} +.CRM_Contact_Form_Contact > .crm-form-block .crm-submit-buttons:last-of-type { + margin-top: var(--crm-padding-reg); + padding: 0; +} +/* Imports */ +.crm-form-block.ui-iconmport-mapfield-form-block .help, +.crm-form-block.ui-iconmport-preview-form-block .help, +.crm-activity-import-preview-form-block .help { + background-color: transparent; + border: 0; +} +/* Manage groups */ +.crm-group-search-form-block details table, +.crm-group-search-form-block details table tr { + border: 0 solid transparent; +} +/* Group contents / contact listing */ +.crm-container .crm-form-block #searchForm .crm-form-block { + padding: 0; + margin-bottom: 0; +} +.crm-search-form .crm-submit-buttons { + padding: 0 0 var(--crm-m); +} +.crm-search-form .crm-search-form-block { + margin-bottom: var(--crm-r); +} +/* Dedupe exceptions */ +details + .crm-content-block:has(.dataTables_wrapper) { + margin-top: var(--crm-r); +} +/* Contribution page edit/create */ +.crm-container .crm-premium-settings-accordion { + margin-bottom: var(--crm-padding-reg); +} +/* Personal Campaign pages */ +.CRM_PCP_Form_PCP .messages.status { + margin: var(--crm-padding-reg) 0; +} +/* Manage cases */ +.crm-container table.report.case-summary { + margin-top: var(--crm-padding-reg); + width: 100%; +} +.crm-container table.report.case-summary table.form-layout-compressed { + box-shadow: none; + border: 0; + margin: 0; + width: 100%; +} +.crm-container .case-control-panel, +.crm-container .crm-case-filter-upcoming { + padding-bottom: var(--crm-padding-reg); +} + +/****************** + RESPONSIVE +*******************/ + +/* Contact dashboard */ + +@media (max-width: 768px) { + .crm-container div.contact_panel { + display: block; + } +} + +/****************** + AFFORM layouts +*******************/ + +/* padding fixes */ + +.crm-container .af-layout-inline ~ .btn-group.pull-right { + margin: var(--crm-padding-reg) 0; +} +.crm-container .crm-search-display-table .form-inline .form-group.pull-right { + margin-left: auto; +} + +/* CiviCampaign dashboard */ + +.crm-container #tab-campaigns, +.crm-container #tab-surveys, +.crm-container #tab-petitions { + padding: var(--crm-tab-padding); +} + +/****************** + COMMON EXTENSIONS +*******************/ + +/* Contact Dashboard Editor */ + +.crm-actions-ribbon ul#actions:has(.crm-contact-summary-edit-layout) { + grid-template-columns: min-content min-content min-content auto min-content min-content; +} +.crm-container .crm-contact-summary-edit-layout a.crm-hover-button { + background: var(--crm-c-primary); + color: var(--crm-c-primary-text) !important; + padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline) var(--crm-btn-padding-block) 0; + border: var(--crm-btn-border); +} +.crm-container .crm-contact-summary-edit-layout a.crm-hover-button i.crm-i { + padding: 0 var(--crm-btn-icon-spacing) 0 var(--crm-btn-padding-inline); +} +.crm-container .crm-contact-summary-edit-layout a.crm-hover-button:hover, +.crm-container .crm-contact-summary-edit-layout a.crm-hover-button:focus { + background: var(--crm-c-primary-hover); + color: var(--crm-c-primary-text) !important; + padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline) var(--crm-btn-padding-block) 0; +} +.crm-previous-action { + order: 3; +} +.crm-next-action { + order: 4; +} +#contactLayoutEditor .panel-heading .btn { + padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline); +} + +/* Mosaico (all importants vs the extension css) */ + +.crm-mosaico-wizard .crm_wizard__title .panel-body { + padding: 0 1rem; +} +.crm-mosaico-wizard .crm_wizard__body .form-group { + max-width: 100% !important; +} +.crm-mosaico-page .from-group .btn { + padding: var(--crm-padding-small); + height: auto; +} +.crm-mosaico-page .select2-container { + min-width: var(--crm-big-input); +} +.mosaico-templates-wrapper { + margin: 0 !important; +} +.mosaico-templates-wrapper .form-inline { + padding: var(--crm-padding-reg) 0 0 var(--crm-padding-reg); +} +.crm-mosaico-modal-panel { + margin: 0 !important; +} +.modal-dialog:has(.crm-mosaico-page) { + width: 100% !important; +} +.ui-widget-content.modal-dialog .crm-mosaico-page .panel { + border: 0; +} +.ui-widget-content.modal-dialog .crm-mosaico-page .panel .tab-pane { + border: var(--crm-tab-border); + border-top: 0; + padding: var(--crm-tab-padding); + background-color: var(--crm-tab-bg-active); + border-radius: 0 0 var(--crm-tab-roundness) var(--crm-tab-roundness); +} +.select2-drop.select2-drop-active.crm-container { + max-width: var(--crm-huge-input); /* Mosaico fix - https://lab.civicrm.org/extensions/riverlea/-/issues/23 */ +} +.crmb-wizard-button-right { + display: flex; + justify-content: end; +} +.crm-mosaico-wizard .from-group { + display: flex; + gap: var(--crm-flex-gap); +} +.crm-mosaico-wizard .crm-mosaico-template-item.thumbnail { + background: var(--crm-c-background2) !important /* vs _template-item.scss */; + border: var(--crm-c-divider) !important /* vs _template-item.scss */; + border-radius: var(--crm-roundness) !important /* vs _template-item.scss */; +} +.crm-mosaico-wizard .crm_wizard__title .nav-pills li.disabled a { + color: var(--crm-c-inactive) !important /* vs _template-item.scss */; +} +#bootstrap-theme .crm-mosaico-template-item .crm-mosaico-template-actions { + display: flex !important /* vs _template-item.scss */; + opacity: 1 !important /* vs _template-item.scss */; + justify-content: center; + flex-direction: column; + padding-top: 50%; + align-items: center; +} +/****************** + CORE EXTENSIONS +*******************/ + +.af-container.af-layout-cols { /* vs afCore */ + column-gap: var(--crm-m); +} diff --git a/civicrm/ext/riverlea/core/css/_variables.css b/civicrm/ext/riverlea/core/css/_variables.css new file mode 100644 index 0000000000..3e79fd15ca --- /dev/null +++ b/civicrm/ext/riverlea/core/css/_variables.css @@ -0,0 +1,430 @@ +/*************************** + CORE VARIABLES + override in each stream +****************************/ + +:root { + --crm-version: 'v' var(--crm-release); +/* Fonts */ + --crm-system-fonts: unset; + --crm-font: unset; + --crm-font-bold: unset; + --crm-font-italic: unset; + --crm-font-bold-italic: unset; +/* Colour names */ + --crm-c-darkest: #0a0a0a; + --crm-c-gray-900: #2f2f2e; + --crm-c-gray-800: #3e3e3e; + --crm-c-gray-700: #696969; + --crm-c-gray-600: #828388; + --crm-c-gray-500: #919297; + --crm-c-gray-400: #adaeb3; + --crm-c-gray-300: #c2c0c0; + --crm-c-gray-200: #d5d5d5; + --crm-c-gray-100: #e2e1e1; + --crm-c-gray-050: #eaeaea; + --crm-c-gray-025: #fbfafa; + --crm-c-blue: #bce8f1; + --crm-c-blue-light: #d9edf7; + --crm-c-blue-dark: #297292; + --crm-c-blue-darker: #215c76; + --crm-c-purple: #4d4d69; + --crm-c-purple-dark: #3e3e54; + --crm-c-green: #d6e9c6; + --crm-c-green-light: #dff0d8; + --crm-c-green-dark: #468847; + --crm-c-red: #eed3d7; + --crm-c-red-light: #f2dede; + --crm-c-red-dark: #b94a48; + --crm-c-amber: #dd5600; + --crm-c-amber-light: #fbf0e2; + --crm-c-yellow: #fcfc5a; + --crm-c-yellow-light: #ffffcc; + --crm-c-yellow-less-light: #fffdb2; + --crm-c-teal: #63c4b9; + --crm-c-dark-teal: #3e8079; +/* Practical colours */ + --crm-c-text: #464354; + --crm-c-light-text: #fff; + --crm-c-dark-text: var(--crm-c-text); + --crm-c-link: var(--crm-c-blue-dark); + --crm-c-link-hover: var(--crm-c-blue-darker); + --crm-c-divider: 1px solid var(--crm-c-gray-300); + --crm-c-page-background: #fff; /* background to page body */ + --crm-c-background: #f4f4ed; /* background to page header, often form block & dialog bg */ + --crm-c-background2: var(--crm-c-gray-050); /* 2-5 = progressively darker backgrounds */ + --crm-c-background3: var(--crm-c-gray-100); + --crm-c-background4: var(--crm-c-gray-200); + --crm-c-background5: var(--crm-c-gray-700); + --crm-c-drag-background: var(--crm-c-background3); /* background for drag/drop regions, select2 highlight */ + --crm-c-code-background: var(--crm-c-background2); /* background for code regions */ + --crm-c-primary: var(--crm-c-gray-700); + --crm-c-primary-hover: var(--crm-c-gray-800); + --crm-c-primary-text: var(--crm-c-light-text); + --crm-c-primary-hover-text: var(--crm-c-light-text); + --crm-c-secondary: #5d677b; + --crm-c-secondary-hover: #3e485b; + --crm-c-secondary-text: var(--crm-c-light-text); + --crm-c-secondary-hover-text: var(--crm-c-light-text); + --crm-c-success: var(--crm-c-green-dark); + --crm-c-success-text: var(--crm-c-light-text); + --crm-c-alert: var(--crm-c-red-dark); + --crm-c-alert-text: var(--crm-c-light-text); + --crm-c-warning: var(--crm-c-amber); + --crm-c-warning-text: var(--crm-c-light-text); + --crm-c-info: var(--crm-c-blue-dark); + --crm-c-info-text: var(--crm-c-light-text); + --crm-c-focus: var(--crm-c-blue-dark); + --crm-c-inactive: #696969; +/* Shadows */ + --crm-block-shadow: unset; + --crm-popup-shadow: 0 3px 18px 0 rgba(48,40,40,.25); + --crm-bottom-shadow: 0 0 16px 1px rgba(0,0,0,.1); + --crm-body-inset: unset; +/* Sizes */ + --crm-roundness: 0.25rem; + --crm-xs: 0.1rem; + --crm-xs1: 0.125rem; + --crm-xs2: 0.15rem; + --crm-s: 0.25rem; + --crm-s1: 0.275rem; + --crm-s2: 0.325rem; + --crm-s3: 0.375rem; + --crm-m: 0.5rem; + --crm-m1: 0.625rem; + --crm-m2: 0.75rem; + --crm-m3: 0.875rem; + --crm-r: 1rem; + --crm-r1: 1.125rem; + --crm-r2: 1.25rem; + --crm-r3: 1.375rem; + --crm-r4: 1.5rem; + --crm-l: 2rem; + --crm-xl: 3rem; + --crm-xxl: 4rem; + --crm-big-input: 15em; + --crm-huge-input: 25em; + --crm-padding-reg: var(--crm-r); + --crm-padding-small: var(--crm-s); + --crm-padding-inset: var(--crm-m); + --crm-page-padding: var(--crm-xl); /* Margin left/right */ + --crm-page-width: 100%; /* Default that CMS can overwrite */ + --crm-flex-gap: 0.5rem; +/* Type */ + --crm-font-size: var(--crm-r); + --crm-small-font-size: var(--crm-m2); + --crm-type-line-height: 1.5; + --crm-link-decoration: none; + --crm-link-decoration-hover: underline; + --crm-heading-bg: var(--crm-c-blue-light); + --crm-heading-col: var(--crm-c-text); + --crm-heading-padding: var(--crm-s1) var(--crm-m1); + --crm-heading-margin: var(--crm-m) 0; + --crm-heading-radius: var(--crm-roundness); +/* Mouse events */ + --crm-hover-clickable: pointer; +/* Buttons */ + --crm-btn-box-shadow: none; + --crm-btn-border: 0 solid transparent; + --crm-btn-txt-transform: inherit; + --crm-btn-radius: 3px; + --crm-btn-padding-block: var(--crm-xs1); /* padding for top and bottom, one value */ + --crm-btn-padding-inline: var(--crm-m1); /* padding for left and right, one value */ + --crm-btn-small-padding: var(--crm-xs) var(--crm-s); + --crm-btn-large-padding: var(--crm-m) var(--crm-r); + --crm-btn-align: center; + --crm-btn-height: 28px; + --crm-btn-icon-spacing: var(--crm-s); + --crm-btn-icon-size: auto; + --crm-btn-cancel-bg: var(--crm-c-alert); + --crm-btn-cancel-text: var(--crm-c-alert-text); + --crm-btn-info-bg: var(--crm-c-info); + --crm-btn-info-text: var(--crm-c-info-text); + --crm-btn-warning-bg: var(--crm-c-warning); + --crm-btn-warning-text: var(--crm-c-warning-text); + --crm-btn-success-bg: var(--crm-c-success); + --crm-btn-success-text: var(--crm-c-success-text); + --crm-btn-alert-bg: var(--crm-c-alert); + --crm-btn-alert-text: var(--crm-c-alert-text); + --crm-btn-icon-bg: unset; /* btn-icon-* supports distinct border/bg for icons. If applied, set btn-icon-padding to 0px to make the icon bg stretch to the button */ + --crm-btn-icon-border: unset; + --crm-btn-icon-padding: var(--crm-btn-padding-block); + --crm-btn-margin: 0; /* used to add padding block between multiple stacked buttons */ +/* Tables */ + --crm-table-outside-border: 1px solid var(--crm-c-background3); + --crm-table-background: var(--crm-c-page-background); + --crm-table-row-border: var(--crm-c-divider); + --crm-table-column-border: 0 solid transparent; + --crm-table-font-size: var(--crm-font-size); + --crm-table-padding: var(--crm-m); + --crm-table-header-border: 1px solid transparent; + --crm-table-header-bottom: 2px solid var(--crm-c-gray-300); + --crm-table-header-bg: var(--crm-c-page-background); + --crm-table-header-col: var(--crm-c-text); + --crm-table-header-txt: inherit; + --crm-table-even-row: var(--crm-c-background2); + --crm-table-even-hover: var(--crm-c-yellow-less-light); + --crm-table-odd-row: var(--crm-c-gray-025); + --crm-table-odd-hover: var(--crm-c-yellow-light); + --crm-table-sort-col: var(--crm-c-gray-300); + --crm-table-sort-float: left; /* 'left', 'right' or 'none' */ + --crm-table-sort-active-col: var(--crm-c-link); + --crm-table-compressed-width: auto; + --crm-table-nested-padding: var(--crm-r) var(--crm-m); + --crm-table-nested-head-border: 0 solid transparent; + --crm-table-nested-border: var(--crm-c-divider); + --crm-table-inset-bg: var(--crm-c-background3); +/* Panels */ + --crm-panel-shadow: var(--crm-block-shadow); + --crm-panel-background: var(--crm-c-page-background); + --crm-panel-border: var(--crm-c-divider); + --crm-panel-head-margin: 0px; +/* Accordions */ + --crm-expand-icon: "\f0da"; /* unicode value for FontAwesome icon */ + --crm-expand-icon-color: var(--text); + --crm-expand-icon-spacing: var(--crm-m); + --crm-expand-transform: rotate(90deg); + --crm-expand-transition: transform .3s; + --crm-expand-radius: var(--crm-roundness); + --crm-expand-gap: var(--crm-xs2) 0 0; /* space between multiple accordions */ +/* .crm-accordion-bold */ + --crm-expand-header-bg: var(--crm-c-secondary); + --crm-expand-header-bg-active: var(--crm-c-gray-900); + --crm-expand-header-color: var(--crm-c-light-text); + --crm-expand-header-padding: var(--crm-s) var(--crm-m); + --crm-expand-header-weight: bold; + --crm-expand-header-font: var(--crm-font-bold); + --crm-expand-header-border: var(--crm-c-divider); + --crm-expand-header-border-width: 0 0 1px 0; + --crm-expand-border: var(--crm-c-divider); + --crm-expand-border-width: 0 1px 1px 1px; + --crm-expand-body-bg: unset; + --crm-expand-body-box-shadow: unset; + --crm-expand-body-padding: var(--crm-padding-reg); +/* .crm-accordion-light */ + --crm-expand2-header-bg: unset; + --crm-expand2-header-bg-active: var(--crm-c-background-2); + --crm-expand2-header-weight: normal; + --crm-expand2-header-font: unset; + --crm-expand2-header-color: var(--crm-c-text); + --crm-expand2-header-border: unset; + --crm-expand2-header-border-width: unset; + --crm-expand2-header-padding: var(--crm-s) var(--crm-m); + --crm-expand2-border: unset; + --crm-expand2-border-width: unset; + --crm-expand2-body-bg: unset; + --crm-expand2-body-padding: var(--crm-s); +/* Alerts */ + --crm-alert-padding: var(--crm-m) var(--crm-m2); + --crm-alert-margin: 0 0 var(--crm-m); + --crm-alert-border-width: 1px; + --crm-alert-background-help: var(--crm-c-green-light); + --crm-alert-border-help: var(--crm-c-green); + --crm-alert-text-help: var(--crm-c-green-dark); + --crm-alert-background-warning: var(--crm-c-yellow-light); + --crm-alert-border-warning: var(--crm-c-yellow); + --crm-alert-text-warning: var(--crm-c-text); + --crm-alert-background-info: var(--crm-c-blue-light); + --crm-alert-border-info: var(--crm-c-blue); + --crm-alert-text-info: var(--crm-c-blue-dark); + --crm-alert-background-danger: var(--crm-c-red-light); + --crm-alert-border-danger: var(--crm-c-red); + --crm-alert-text-danger: var(--crm-c-red-dark); +/* Form */ + --crm-form-block-box-shadow: var(--crm-block-shadow); + --crm-form-block-background: var(--crm-c-background); + --crm-form-block-padding: var(--crm-m); + --crm-form-block-border-radius: var(--crm-roundness); + --crm-input-background: var(--crm-c-page-background); + --crm-input-background-image: linear-gradient(top, #eee 1%, #fff 15%); + --crm-input-color: var(--crm-c-text); + --crm-input-border-color: var(--crm-c-gray-400); + --crm-input-border-radius: 3px; + --crm-input-active-ani: border-color .15s ease-in-out 0s; + --crm-input-box-shadow: inset 0 1px 2px 0 rgba(0,0,0,.1); + --crm-input-padding: var(--crm-xs1) var(--crm-s2); + --crm-input-padding-large: var(--crm-s) var(--crm-m1); + --crm-input-height: var(--crm-l); + --crm-input-font-size: var(--crm-m3); + --crm-input-label-weight: 600; + --crm-input-label-font: var(--crm-font); + --crm-input-label-size: var(--crm-font-size); + --crm-input-label-width: var(--crm-big-input); + --crm-input-label-align: right; + --crm-input-label-color: var(--crm-c-text); + --crm-input-description: var(--crm-c-gray-700); + --crm-input-dropdown-icon: "\f107"; + --crm-input-radio-color: var(--crm-c-focus); + --crm-form-select-bg: var(--crm-c-background2); + --crm-inline-edit-border: 0 solid transparent; + --crm-inline-edit-bg: var(--crm-c-background); + --crm-fieldset-border-color: var(--crm-c-gray-400); + --crm-fieldset-border: 1px 0 0 0; + --crm-fieldset-padding: var(--crm-padding-reg) var(--crm-padding-small); + --crm-checkbox-list-col: var(--crm-c-text); +/* Tabs */ + --crm-tabs-bg: var(--crm-c-background4); + --crm-tabs-padding: var(--crm-s); + --crm-tabs-border: var(--crm-dash-border); + --crm-tabs-radius: var(--crm-roundness); + --crm-tabs-gap: var(--crm-s); + --crm-tab-bg: var(--crm-c-background2); + --crm-tab-bg-hover: var(--crm-c-background); + --crm-tab-bg-active: var(--crm-c-page-background); + --crm-tab-hang: 0; /* lip to extend tab flush with active region - set to 0 for no lip */ + --crm-tab-padding: var(--crm-s3) var(--crm-m) var(--crm-s) var(--crm-m); + --crm-tab-col: var(--crm-c-text); + --crm-tab-weight: normal; + --crm-tab-font: unset; + --crm-tab-count-bg: var(--crm-c-info-text); + --crm-tab-count-col: var(--crm-c-info); + --crm-tab-roundness: var(--crm-roundness); + --crm-tab-border: var(--crm-c-divider); + --crm-tab-border-width: 0; + --crm-tab-border-active: 0 solid transparent; +/* Contact dashboard */ + --crm-dash-border: var(--crm-tab-border); + --crm-dash-roundness: var(--crm-roundness); + --crm-dash-direction: flex; /* choose 'flex' for tabs at top, or 'grid' for tabs at side */ + --crm-side-tabs-width: unset; + --crm-dash-tabs-flow: row; /* choose 'row' for tabs at top, or 'column' for tabs at side */ + --crm-dash-tabs-gap: var(--crm-tabs-gap); + --crm-dash-tabs-bg: var(--crm-tabs-bg); + --crm-dash-tabs-padding: var(--crm-tabs-padding); + --crm-dash-tabs-roundness: var(--crm-dash-roundness) var(--crm-dash-roundness) 0 0; + --crm-dash-tab-bg: var(--crm-tab-bg); + --crm-dash-tab-bg-hover: var(--crm-tab-bg-hover); + --crm-dash-tab-padding: var(--crm-s3) var(--crm-m2); + --crm-dash-tab-border: 0 solid transparent; + --crm-dash-tab-border-hover: 0 solid transparent; + --crm-dash-tab-border-width: 0; /* to remove border on one side for hanging tabs */ + --crm-dash-tab-col: var(--crm-tab-col); + --crm-dash-tab-count-bg: rgba(0,0,0,0.1); + --crm-dash-tab-count-col: var(--crm-c-text); + --crm-dash-tab-width: 100%; + --crm-dash-tab-align: none; + --crm-dash-tab-hang: 0; /* lip to extend tab flush with active region - set to 0 for no lip */ + --crm-dash-tab-radius: var(--crm-dash-roundness); + --crm-dash-icon-size: var(--crm-r); + --crm-dash-summary-row-bg: var(--crm-c-background); + --crm-dash-heading-inset: 0; + --crm-dash-box-shadow: 0; + --crm-dash-panel-padding: var(--crm-m); + --crm-dash-panel-bg: #fff; + --crm-dash-panel-border: 0; + --crm-dash-panel-radius: 0 0 var(--crm-dash-roundness) var(--crm-dash-roundness); + --crm-dash-edit-border: 2px dashed var(--crm-c-gray-300); + --crm-dash-block-padding: 0; + --crm-dash-block-bg: unset; + --crm-dash-block-radius: var(--crm-roundness); + --crm-dash-label-bg: var(--crm-c-background2); + --crm-dash-header-bg: var(--crm-c-page-background); + --crm-dash-header-bg2: transparent; + --crm-dash-header-col: var(--crm-c-text); + --crm-dash-header-size: var(--crm-r3); + --crm-dash-header-padding: 0 0 var(--crm-r) 0; + --crm-dash-image-size: 100px; + --crm-dash-image-radius: 0; + --crm-dash-image-right: 10px; /* distance from right of dashboard */ + --crm-dash-image-top: unset; /* distance from top of dashboard */ + --crm-dash-image-border: 0; +/* Dialog */ + --crm-dialog-bg: var(--crm-c-page-background); + --crm-dialog-padding: var(--crm-s); + --crm-dialog-radius: var(--crm-roundness); + --crm-dialog-line: unset; + --crm-dialog-inner-shadow: var(--crm-bottom-shadow); + --crm-dialog-header-bg: var(--crm-c-secondary); + --crm-dialog-header-col: var(--crm-c-light-text); + --crm-dialog-header-size: var(--crm-r1); + --crm-dialog-header-padding: var(--crm-m1) var(--crm-r); + --crm-dialog-header-radius: var(--crm-dialog-radius); + --crm-dialog-header-border-col: transparent transparent var(--crm-c-gray-300) transparent; /* set a border color for each side of the header */ + --crm-dialog-body-bg: var(--crm-c-background); + --crm-dialog-body-padding: var(--crm-m); +/* Dashlet */ + --crm-dashlet-border: unset; + --crm-dashlet-bg: var(--crm-c-page-background); + --crm-dashlet-padding: var(--crm-s2); + --crm-dashlet-box-shadow: var(--crm-popup-shadow); + --crm-dashlet-dashlets-bg: var(--crm-c-background); + --crm-dashlet-header-bg: var(--crm-expand-header-bg); + --crm-dashlet-header-col: var(--crm-expand-header-color); + --crm-dashlet-header-border: unset; + --crm-dashlet-header-border-width: unset; + --crm-dashlet-header-font-size: var(--crm-font-size); + --crm-dashlet-header-padding: var(--crm-s); + --crm-dashlet-content-padding: var(--crm-dashlet-padding) 0; + --crm-dashlet-tabs-border: 0; + --crm-dashlet-radius: var(--crm-roundness); +/* Button dropdowns */ + --crm-dropdown-padding: var(--crm-s); + --crm-dropdown-radius: var(--crm-roundness); + --crm-dropdown-bg: var(--crm-c-secondary-hover); + --crm-dropdown-col: var(--crm-c-light-text); + --crm-dropdown-hover: var(--crm-c-text); + --crm-dropdown-hover-bg: var(--crm-c-page-background); + --crm-dropdown-border: 0; + --crm-dropdown-width: 180px; + --crm-dropdown-alert-bg: var(--crm-c-alert); /* for delete links in dropdowns */ + --crm-dropdown-2-bg: var(--crm-c-secondary); + --crm-dropdown-2-col: var(--crm-c-text); + --crm-dropdown-2-padding: var(--crm-padding-small); +/* Notifications */ + --crm-notify-background: rgba(0,0,0,0.85); + --crm-notify-padding: var(--crm-m2); + --crm-notify-col: var(--crm-c-light-text); + --crm-notify-accent-border: 2px 0 0 0; /* adds a border to one/several sides of the notification - set to 0 for none */ + --crm-notify-radius: var(--crm-roundness); +/* Icons */ + --crm-icon-alert: "\f06a"; + --crm-icon-success: "\f058"; + --crm-icon-info: "\f05a"; + --crm-icon-close: "\f00d"; + --crm-icon-sort: "\f0dc"; + --crm-icon-sort-desc: "\f0dd"; + --crm-icon-sort-asc: "\f0de"; + --crm-icon-alert-color: inherit; + --crm-icon-success-color: inherit; + --crm-icon-warning-color: inherit; + --crm-icon-info-color: inherit; +/* Wizard */ + --crm-wizard-width: fit-content; + --crm-wizard-margin: 0.5rem auto; + --crm-wizard-height: 30px; + --crm-wizard-radius: var(--crm-l); + --crm-wizard-angle: 0px; + --crm-wizard-active-col: var(--crm-c-light-text); + --crm-wizard-active-bg: var(--crm-c-link); + --crm-wizard-border: var(--crm-c-divider); + --crm-wizard-bg: var(--crm-c-page-background); +/* Alpha filter */ + --crm-filter-bg: var(--crm-c-blue-light); + --crm-filter-padding: var(--crm-m); + --crm-filter-item-bg: #fafafa; + --crm-filter-item-shadow: 0px 0px 3px rgba(0,0,0,0.1); + --crm-filter-spacing: space-between; /* choose 'space-between' to spread out evenly, 'start' for left align, or 'end' for right. */ +/* Frontend */ + --crm-f-form-width: unset; + --crm-f-box-shadow: var(--crm-block-shadow); + --crm-f-fieldset-bg: #f8f8f8; + --crm-f-fieldset-padding: var(--crm-r); + --crm-f-fieldset-margin: 0 0 var(--crm-padding-reg) 0; + --crm-f-fieldset-border: 0; + --crm-f-legend-align: center; + --crm-f-legend-size: var(--crm-r3); + --crm-f-form-padding: var(--crm-padding-reg); + --crm-f-form-layout: block; /* 'grid' = inline, 'block' = stacked */ + --crm-f-label-position: unset; + --crm-f-label-align: left; + --crm-f-label-width: 200px; + --crm-f-label-weight: bold; + --crm-f-input-radius: var(--crm-roundness); + --crm-f-input-padding: var(--crm-r2) var(--crm-m2); + --crm-f-input-font-size: var(--crm-r1); + --crm-f-input-width: 300px; + --crm-f-form-focus-bg: var(--crm-c-green); + --crm-f-form-error-bg: var(--crm-c-red); + --crm-f-logo-height: 40px; + --crm-f-logo-align: center; /* left, right or center */ +} diff --git a/civicrm/ext/riverlea/core/css/admin.css b/civicrm/ext/riverlea/core/css/admin.css new file mode 100644 index 0000000000..729b786d87 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/admin.css @@ -0,0 +1,103 @@ +/* civicrm-core/css/admin.css - branched on 7 Jun 24 + Styles specific to certain admin pages/forms + Status: merged. */ + +/* Config Task List */ +.crm-container td.tasklist a { + font-weight: bold; + font-family: var(--crm-font-bold); +} +.crm-container table.selector td.tasklist { + border-right: var(--crm-table-row-border); + width: 20%; +} +.crm-container td.tasklist a:visited { + color: var(--crm-c-success); +} + +/* Class for successful upgrade */ +.crm-container .upgrade-success { + background-color: var(--crm-alert-background-help); + color: var(--crm-alert-text-help); +} + +/* Extension management */ +.crm-container #mainTabContainer:has(.crm-extensions-tabs-list) { + box-shadow: var(--crm-block-shadow); + margin-top: var(--crm-padding-reg); +} +.crm-container #extensions-main, +.crm-container #extensions-addnew.ui-tabs-panel { + padding: 0; + border-top: 0; +} +.crm-container #extensions-main table.dataTable, +.crm-container #extensions-addnew table.dataTable { + box-shadow: none; + border: 0 solid transparent; +} +.crm-container #extensions-main table.dataTable th, +.crm-container #extensions-addnew table.dataTable th { + background-color: var(--crm-tab-bg-active); + min-width: max-content; + white-space: nowrap; /* prevents wrapping of sort icons with oversized descriptions */ +} +.crm-container #extensions-main table.dataTable summary, +.crm-container #extensions-addnew table.dataTable summary { + padding: 0; + background-color: unset; + color: var(--crm-c-text); + font-weight: unset; + font-family: var(--crm-font); +} +.crm-container #extensions table.dataTable summary a, +.crm-container #extensions-addnew table.dataTable summary a { + color: var(--crm-c-link); +} +.crm-container #extensions table.dataTable a.crm-hover-button, +.crm-container #extensions-addnew table.dataTable a.crm-hover-button { + padding: 0 var(--crm-m1); +} +.crm-container .disabled .crm-hover-button:hover, +.crm-container .disabled .crm-hover-button:focus { + color: var(--crm-c-secondary-text); +} +.crm-container .extension-missing { + color: var(--crm-c-warning); +} +.crm-container .crm-extensions-upgrade { + background: var(--crm-alert-background-warning); + border: 1px solid var(--crm-alert-border-warning); + padding: var(--crm-padding-small); + border-radius: var(--crm-roundness); + color: var(--crm-alert-text-warning); +} +.crm-container .crm-extensions-version { + white-space: nowrap; +} +.crm-container .crm-extensions-stage { + margin-left: var(--crm-s); +} +.crm-container .crm-extensions-stage.fa-flask { + color: var(--crm-c-warning); +} +.crm-container .crm-extensions-stage.fa-check-circle { + color: var(--crm-c-success); +} + +@media screen and (min-width: 480px) { + .crm-container .admin-section-items { + column-count: 2; + column-gap: var(--crm-padding-reg); + } + .crm-container .admin-section-items dl { + -webkit-column-break-inside: avoid; + page-break-inside: avoid; + break-inside: avoid; + margin: 0 var(--crm-padding-reg); + } + .crm-container .admin-section-items dt { + font-weight: bold; + font-family: var(--crm-font-bold); + } +} diff --git a/civicrm/ext/riverlea/core/css/api4-explorer.css b/civicrm/ext/riverlea/core/css/api4-explorer.css new file mode 100644 index 0000000000..e978bb90d9 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/api4-explorer.css @@ -0,0 +1,179 @@ +/* Style rules for Api4 Explorer + Forked on 12 June 24. Called on API4Explorer page only. + Status: merged. */ + +.api4-explorer-row.crm-flex-box { + gap: var(--crm-padding-reg); + margin-bottom: var(--crm-padding-reg); + min-height: 500px; +} +.api4-explorer-row .explorer-params-panel, +.api4-explorer-row .explorer-code-panel { + flex: 2; +} +.api4-explorer-row > .panel { + margin: 0; + background: var(--crm-panel-background); +} +.api4-explorer-page .panel-heading { + /* height: 48px; */ + display: flex; + align-items: center; + padding: var(--crm-m); +} +.api4-explorer-row .panel-heading h3 { + background: transparent; + margin: 0 !important /* vs bootstrap3 */; + padding: 0 !important /* vs bootstrap3 */; +} +.api4-explorer-row .panel-heading .form-inline { + width: 100%; + padding: 0; + display: flex; + align-items: center; + gap: var(--crm-m); + flex-wrap: wrap; +} +.api4-explorer-row .panel-heading .form-inline .pull-right { + margin-left: auto; +} +.api4-explorer-row .panel-body { + background: var(--crm-tab-bg-active); +} + +/* General form */ +.api4-explorer-page form label, +.api4-explorer-page fieldset legend { + text-transform: capitalize; +} +.api4-explorer-page .api4-input-group { + display: inline-block; +} +.api4-explorer-page i.fa-arrows { + cursor: move; +} +.api4-input { + display: flex; + gap: var(--crm-m); + margin-bottom: var(--crm-m); +} +.api4-input label { + display: flex; +} +.api4-explorer-page form label { + min-width: var(--crm-input-label-width); +} +.api4-explorer-page form .checkbox-inline > label { + min-width: unset; +} +.api4-explorer-page .form-control.huge { + width: 25em; +} +.api4-explorer-page .form-control.twenty { + width: 20em; +} + +/* Code panel */ +.api4-explorer-page .explorer-code-panel pre { + word-break: break-all; + white-space: pre-wrap; + min-height: var(--crm-xxl); +} +.api4-explorer-page .explorer-code-panel .panel-heading > .nav li a { + text-transform: uppercase; +} +.api4-explorer-page .explorer-code-panel .alert-warning i.crm-i { + font-family: inherit; /* Fix for unclosed icon tag */ +} +.api4-explorer-page .explorer-code-panel .alert-warning i.crm-i::before { + font: normal normal normal 14px/1 FontAwesome; /* Fix for unclosed icon tag */ +} + +/* Results panel */ +.crm-container .explorer-result-panel > .panel-heading { + border-bottom: var(--crm-tabs-border); +} +.explorer-result-panel .form-inline.pull-right { + order: 2; + justify-content: end; +} +.explorer-result-panel .panel-heading .nav-tabs { + width: 100%; + align-self: end; + border-bottom: 0; +} +.explorer-result-panel .nav-tabs i.fa-circle-o { + display: none; +} + +/* From original file, unsure of use, leaving intact for now */ +#bootstrap-theme.api4-explorer-page crm-api4-clause > .btn-group { + position: absolute; + right: 0; + top: 0; +} +#bootstrap-theme.api4-explorer-page crm-api4-clause > .btn-group .btn { + border: 0 none; +} +.api4-explorer-page fieldset div.api4-input.ui-sortable-helper { + background-color: rgba(255, 255, 255, .9); +} +.api4-explorer-page fieldset div.api4-input.ui-sortable-helper { + background-color: rgba(255, 255, 255, .9); +} +.api4-explorer-page .api4-clause-fieldset fieldset { + float: right; + width: calc(100% - 58px); + margin-top: -8px; +} +.api4-explorer-page .api4-clause-fieldset.api4-sorting fieldset .api4-clause-group-sortable { + min-height: 3.5em; +} +.api4-explorer-page .api4-clause-badge { + width: 55px; + display: inline-block; + cursor: move; +} +.api4-explorer-page .api4-clause-badge .badge { + opacity: .5; + position: relative; +} +.api4-explorer-page .api4-clause-badge .caret { + margin: 0; +} +.api4-explorer-page .api4-clause-badge .crm-i { + display: none; + padding: 0 6px; +} +.api4-explorer-page .ui-sortable-helper .api4-clause-badge .badge span { + display: none; +} +.api4-explorer-page .ui-sortable-helper .api4-clause-badge .crm-i { + display: inline-block; +} +.api4-explorer-page .api4-operator, +.api4-explorer-page .api4-sets-action, +.api4-explorer-page .api4-sets-type, +.api4-explorer-page .api4-chain-index, +.api4-explorer-page .api4-chain-action { + width: 90px; +} +.api4-explorer-page .api4-sets-params, +.api4-explorer-page .api4-chain-params { + width: calc(100% - 390px); +} +.api4-explorer-page .api4-add-where-group-menu { + min-width: 80px; + background-color: rgba(186, 225, 251, 0.94); +} +.api4-explorer-page .api4-add-where-group-menu a { + padding: var(--crm-s) var(--crm-m); +} +/* Responsive (move to own file at some point) */ + +@media (max-width: 989px) { + /* base/position */ .crm-container .crm-flex-box, + /* sections/api4-explorer */ .api4-input { + flex-direction: column; + } +} diff --git a/civicrm/ext/riverlea/core/css/civicrm.css b/civicrm/ext/riverlea/core/css/civicrm.css new file mode 100644 index 0000000000..01f588409a --- /dev/null +++ b/civicrm/ext/riverlea/core/css/civicrm.css @@ -0,0 +1,4 @@ +@import url(_base.css); /* resets and civi wide styles */ +@import url(_cms.css); /* CMS-specific hacks/workarounds */ +@import url(_core.css); /* components and utility classes */ +@import url(_fixes.css); /* deprecated-Civi handling, hacks/workarounds. one day this will go. */ diff --git a/civicrm/ext/riverlea/core/css/components/_accordion.css b/civicrm/ext/riverlea/core/css/components/_accordion.css new file mode 100644 index 0000000000..b1023bc0bb --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_accordion.css @@ -0,0 +1,155 @@ +.crm-container details { + background-color: unset; + border-radius: var(--crm-expand-radius); + margin: var(--crm-expand-gap); +} +.crm-container summary { + display: list-item; + list-style: none; + cursor: var(--crm-hover-clickable); + font-size: var(--crm-font-size); + font-family: var(--crm-expand-header-font); + font-weight: var(--crm-expand-header-weight); + color: var(--crm-c-text); + border-radius: var(--crm-expand-radius); + padding: var(--crm-expand-header-padding); +} +.crm-container details[open] > summary { /* open version of that */ + border-radius: var(--crm-expand-radius) var(--crm-expand-radius) 0 0; +} +.crm-container table summary { /* Makes summary match the size of the rest of the table it's in */ + font-size: inherit; +} +.crm-container summary::-webkit-details-marker { /* Safari fix to remove summary icon */ + display: none; +} +.crm-container details ~ details { + margin: var(--crm-expand-gap); +} +.crm-container details:has(input.crm-inline-error) summary, +.crm-container details:has(input.crm-inline-error) summary.active { + background-color: var(--crm-alert-background-danger); + color: var(--crm-alert-text-danger); + border-color: var(--crm-alert-border-danger); +} + +/* Expand/collapse icons */ +.crm-container details > summary::before { + font-size: var(--crm-font-size); + content: var(--crm-expand-icon); + color: var(--crm-expand-icon-color); + font-style: normal; + line-height: 1.35; + font-family: FontAwesome; + text-rendering: auto; + text-indent: inherit; + margin-right: var(--crm-expand-icon-spacing); + display: inline-block; + transform-origin: center center; + transition: var(--crm-expand-transition); +} +.crm-container details[open] > summary::before { + transform: var(--crm-expand-transform); + transition: var(--crm-expand-transition); +} + +/* Style 1 'bold' */ +.crm-container .crm-accordion-bold { + background-color: var(--crm-expand-body-bg); +} +.crm-container .crm-accordion-bold > summary { + background-color: var(--crm-expand-header-bg); + color: var(--crm-expand-header-color); + border: var(--crm-expand-header-border); + border-width: var(--crm-expand-header-border-width); + font-weight: var(--crm-expand-header-weight); + font-family: var(--crm-expand-header-font); +} +.crm-container .crm-accordion-bold > summary a { + color: var(--crm-expand-header-color); +} +.crm-container .crm-accordion-bold > summary.active, +.crm-container .crm-accordion-bold > summary:hover, +.crm-container .crm-accordion-bold > summary:focus { /* hover version of that */ + background-color: var(--crm-expand-header-bg-active); +} +.crm-container .crm-accordion-bold > .crm-accordion-body { + padding: var(--crm-expand-body-padding); + border: var(--crm-expand-border); + border-width: var(--crm-expand-border-width); + border-radius: 0 0 var(--crm-expand-radius) var(--crm-expand-radius); + box-shadow: var(--crm-expand-body-box-shadow); +} +.crm-container details.crm-accordion-bold:not( > summary) { + border: var(--crm-expand-border); + padding: var(--crm-expand-body-padding); +} + +/* Style 2 'light' */ +.crm-container .crm-accordion-light { + background-color: var(--crm-expand2-body-bg); +} +.crm-container .crm-accordion-light > summary { + font-family: var(--crm-expand2-header-font); + font-weight: var(--crm-expand2-header-weight); + background-color: var(--crm-expand2-header-bg); + color: var(--crm-expand2-header-color); + border: var(--crm-expand2-header-border); + border-width: var(--crm-expand2-header-border-width); + padding: var(--crm-expand2-header-padding); +} +.crm-container .crm-accordion-light > summary.active, +.crm-container .crm-accordion-light > summary:hover, +.crm-container .crm-accordion-light > summary:focus { /* hover version of that */ + background-color: var(--crm-expand2-header-bg-active); +} +.crm-container .crm-accordion-light > summary a { + color: var(--crm-expand2-header-color); +} +.crm-container .crm-accordion-light > .crm-accordion-body { + padding: var(--crm-expand2-body-padding); + background: var(--crm-expand2-body-bg); + border: var(--crm-expand2-border); + border-width: var(--crm-expand2-border-width); + border-radius: 0 0 var(--crm-expand-radius) var(--crm-expand-radius); +} +.crm-container details.crm-accordion-light:not( > summary) { + border: 0; + padding: 0; +} + +/* Style 3 'settings' */ +.crm-container details.crm-accordion-settings summary { + text-align: right; +} +.crm-container details.crm-accordion-settings summary::before { + content: '\f013'; +} +.crm-container details.crm-accordion-settings > .crm-accordion-body { + padding: var(--crm-expand2-header-padding); +} + +/* Contact dashboard */ +#contact-summary details, +#contact-summary .crm-accordion-light > summary, +#contact-summary .crm-accordion-light > summary.active, +#contact-summary .crm-accordion-light > summary:hover, +#contact-summary .crm-accordion-light > summary:focus, +#Contact .crm-accordion-light > summary, +#Contact .crm-accordion-light > summary:hover, +#Contact .crm-accordion-light > summary:focus { + box-shadow: none; + border: 0 solid transparent; + background-color: transparent; + color: var(--crm-c-text); +} +#contact-summary details .crm-summary-block { + box-shadow: var(--crm-block-shadow); + margin-bottom: 0; +} +#contact-summary summary { + padding: var(--crm-m) !important; +} +#contact-summary details .crm-accordion-body { + box-shadow: none; +} diff --git a/civicrm/ext/riverlea/core/css/components/_alerts.css b/civicrm/ext/riverlea/core/css/components/_alerts.css new file mode 100644 index 0000000000..f14c502586 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_alerts.css @@ -0,0 +1,109 @@ +.crm-container .help, +.crm-container #help, +.crm-container .status, +.crm-container .messages, +.crm-container .alert, +.crm-container .alert-success { + background-color: var(--crm-alert-background-help); + border: var(--crm-alert-border-width) solid var(--crm-alert-border-help); + color: var(--crm-alert-text-help); + margin: var(--crm-alert-margin); + padding: var(--crm-alert-padding); + border-radius: var(--crm-roundness); +} +.crm-container .help > *:first-child { + margin-top: 0; +} +.crm-container .help p, +.crm-container .status p, +.crm-container .messages p, +.crm-container .alert p { + color: var(--crm-alert-text-help); +} +.crm-container .help li, +.crm-container .status li, +.crm-container .messages li { + color: var(--crm-alert-text-help); + list-style: initial; +} +.crm-container .status.alert, +.crm-container .alert-warning, +.crm-container .messages.warning { + background-color: var(--crm-alert-background-warning); + border-color: var(--crm-alert-border-warning); + color: var(--crm-alert-text-warning); +} +.crm-container .status.error { + background-color: var(--crm-alert-background-danger); + border-color: var(--crm-alert-border-danger); + color: var(--crm-alert-text-danger); +} +.crm-container .status.alert li, +.crm-container .alert-warning li, +.crm-container .messages.warning li { + color: var(--crm-alert-text-warning); +} +.crm-container .status.crm-ok { + background-color: var(--crm-alert-background-help); + color: var(--crm-alert-text-info); +} +.crm-container .alert-info, +.crm-container .messages.crm-empty-table { + background-color: var(--crm-alert-background-info); + border-color: var(--crm-alert-border-info); + color: var(--crm-alert-text-info); +} +.crm-container .alert-danger { + background-color: var(--crm-alert-background-danger); + border-color: var(--crm-alert-border-danger); + color: var(--crm-alert-text-danger); +} +.crm-container .help a, +.crm-container .messages a { + color: inherit; + text-decoration: underline; +} +.crm-container .help a:hover, +.crm-container .messages a:hover, +.crm-container .help a:focus, +.crm-container .messages a:focus { + color: inherit; + text-decoration: none; +} + +/* BS alert close */ + +.crm-container button.close, +#bootstra-theme button.close { + float: right; + padding: 0; + border: 0; + cursor: var(--crm-hover-clickable); + background: transparent; + appearance: none; + font-size: var(--crm-r1); + line-height: 1; + color: var(--crm-c-darkest) !important; + text-shadow: 0 1px 0 #fff; + font-family: var(--crm-font-bold); + font-weight: bold; + opacity: .2; +} +.crm-container button.close:hover, +.crm-container button.close:focus, +#bootstra-theme button.close:hover, +#bootstra-theme button.close:focus { + background: transparent; + opacity: 0.4; +} +.crm-container .alert-dismissable, +.crm-container .alert-dismissible { + padding-right: 35px; +} +.crm-container .alert-dismissable .close, +.crm-container .alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} diff --git a/civicrm/ext/riverlea/core/css/components/_buttons.css b/civicrm/ext/riverlea/core/css/components/_buttons.css new file mode 100644 index 0000000000..cbaac1d2e4 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_buttons.css @@ -0,0 +1,593 @@ +.crm-container .btn, +#bootstrap-theme .btn, +.crm-container button, +.crm-container .crm-button, +.crm-container [type="button"], +.crm-container [type="reset"], +.crm-container [type="submit"], +.crm-container .nav.nav-pills li.navitem a { + white-space: nowrap; + touch-action: manipulation; + cursor: var(--crm-hover-clickable); + background-image: none; + border: var(--crm-btn-border); + padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline); + font-size: var(--crm-font-size); + border-radius: var(--crm-btn-radius); + user-select: none; + margin: var(--crm-btn-margin); + background: var(--crm-c-primary); + color: var(--crm-c-primary-text); + text-transform: var(--crm-btn-txt-transform); + height: var(--crm-btn-height); + display: inline-flex; + max-width: fit-content; + align-items: center; + gap: var(--crm-btn-icon-spacing); + width: auto; + box-shadow: none; + text-decoration: none; +} +.crm-container .btn:hover, +.crm-container .btn:focus, +#bootstrap-theme .btn:hover, +#bootstrap-theme .btn:focus, +.crm-container .crm-button:hover, +.crm-container .crm-button:focus, +[type="button"]:hover, +[type="reset"]:hover, +[type="submit"]:hover, +[type="button"]:focus, +[type="reset"]:focus, +[type="submit"]:focus { + background: var(--crm-c-primary-hover); + color: var(--crm-c-primary-hover-text); + text-decoration: none; +} +.crm-container .nav.nav-pills li.navitem:not(.active) a { + background-color: transparent; + border-color: transparent; + color: var(--crm-c-link); +} +.crm-container .nav.nav-pills li.navitem:not(.active) a:hover, +.crm-container .nav.nav-pills li.navitem:not(.active) a:focus { + background-color: transparent; + color: var(--crm-c-link-hover); +} +.crm-button:focus, +.crm-container .btn:focus, +#bootstrap-theme .btn:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.crm-button:active, +.crm-container .btn:active, +.crm-container .btn.active, +#bootstrap-theme .btn:active, +#bootstrap-theme .btn.active { + box-shadow: inset 0 0 100px 100px rgba(255, 255, 255, 0.3); +} +.crm-button[disabled], +.crm-button.disabled, +.crm-container .btn.disabled, +.crm-container .btn[disabled], +#bootstrap-theme .btn.disabled, +#bootstrap-theme .btn[disabled], +#bootstrap-theme fieldset[disabled] .btn, +.crm-container button.disabled { + cursor: not-allowed; + filter: alpha(opacity=65); + opacity: .65; + pointer-events: none; + box-shadow: none; +} +.crm-container button.disabled * { + color: var(--crm-c-primary-text); +} +.crm-container .crm-button-type-cancel, +.crm-form-submit .cancel.crm-button, +.crm-container button.ui-button:has(.fa-times) { + background: var(--crm-c-secondary); + color: var(--crm-c-secondary-text); +} +.crm-container a.button.delete-button, +.crm-container a.button.delete-button:link, +.crm-container a.button.delete, +.crm-container a.button.delete:link { + background: var(--crm-btn-cancel-bg); + color: var(--crm-btn-cancel-text); +} +.crm-container a.button.delete-button:hover, +.crm-container a.button.delete-button:focus, +.crm-container a.button.delete:hover { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-btn-cancel-bg); +} +.crm-container .crm-button-type-cancel:hover, +.crm-container .crm-button-type-cancel:focus, +.crm-container button.ui-button:has(.fa-times):hover, +.crm-container button.ui-button:has(.fa-times):focus { + background: var(--crm-c-secondary-hover); + color: var(--crm-c-secondary-hover-text); +} + +/* BS3 colour options */ + +#bootstrap-theme .btn-secondary { + background: var(--crm-c-secondary); + color: var(--crm-c-secondary-text); +} +#bootstrap-theme .btn.btn-secondary:hover, +#bootstrap-theme .btn.btn-secondary:focus { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-secondary); /* darkening fallback if hover state not set */ + background: var(--crm-c-secondary-hover); + color: var(--crm-c-secondary-text); +} +#bootstrap-theme .btn-info { + background: var(--crm-btn-info-bg); + color: var(--crm-btn-info-text); +} +#bootstrap-theme .btn.btn-info:hover, +#bootstrap-theme .btn.btn-info:focus { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-btn-info-bg); + color: var(--crm-btn-info-text); +} +#bootstrap-theme .btn-warning { + background: var(--crm-btn-warning-bg); + color: var(--crm-btn-warning-text); +} +#bootstrap-theme .btn.btn-warning:hover, +#bootstrap-theme .btn.btn-warning:focus { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-btn-warning-bg); + color: var(--crm-btn-warning-text); +} +#bootstrap-theme .btn-success { + background: var(--crm-btn-success-bg); + color: var(--crm-btn-success-text); +} +#bootstrap-theme .btn.btn-success:hover, +#bootstrap-theme .btn.btn-success:focus { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-btn-success-bg); + color: var(--crm-btn-success-text); +} +#bootstrap-theme .btn-danger { + background: var(--crm-btn-alert-bg); + color: var(--crm-btn-alert-text); +} +#bootstrap-theme .btn.btn-danger:hover, +#bootstrap-theme .btn.btn-danger:focus { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-btn-alert-bg); + color: var(--crm-btn-alert-text); +} + +/* BS3 size options */ + +#bootstrap-theme .btn-lg, +#bootstrap-theme .btn-group-lg > .btn { + padding: var(--crm-m3) var(--crm-r); + font-size: var(--crm-r1); + line-height: 1.3; + border-radius: calc(var(--crm-btn-radius) * 2); +} +#bootstrap-theme.btn-sm, +#bootstrap-theme .btn-group-sm > .btn { + padding: var(--crm-s2) var(--crm-m1); + font-size: var(--crm-m2); + line-height: 1.5; + border-radius: var(--crm-btn-radius); + height: auto; +} +#bootstrap-theme .btn-xs, +#bootstrap-theme .btn-group-xs > .btn { + padding: var(--crm-xs) var(--crm-s2); + font-size: var(--crm-m2); + border-radius: var(--crm-btn-radius); + height: auto; +} +#bootstrap-theme .btn-block { + display: block; + width: 100%; +} +#bootstrap-theme .btn-block + .btn-block { + margin-top: 5px; +} +#bootstrap-theme input[type="submit"].btn-block, +#bootstrap-theme input[type="reset"].btn-block, +#bootstrap-theme input[type="button"].btn-block { + width: 100%; +} +.crm-submit-buttons { + padding: var(--crm-s); + display: inline-flex; + align-items: center; + gap: var(--crm-flex-gap); +} + +/* Hover buttons (plain text, button shows on hover) */ +.crm-container a.crm-hover-button { + border-radius: var(--crm-btn-radius); + color: var(--crm-c-link); + cursor: var(--crm-hover-clickable); + padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline); + background-color: var(--crm-c-primary); + color: var(--crm-c-primary-text); +} +.crm-container a.crm-hover-button.action-item, +.crm-container .crm-hover-button.btn-slide, +.crm-container .crm-submit-buttons .crm-hover-button { + background-color: transparent; + color: var(--crm-c-text); + padding: var(--crm-btn-small-padding); + margin: 0; + cursor: var(--crm-hover-clickable); + border-radius: var(--crm-btn-radius); + display: inline; + line-height: 1.5; + white-space: nowrap; +} +.crm-container td a.crm-hover-button + .crm-hover-button:not(:last-of-type) { + margin-inline: var(--crm-m); +} +.crm-container td:has(.btn-slide) a.crm-hover-button + .crm-hover-button { + margin-inline: var(--crm-m); +} +.crm-container .crm-submit-buttons .crm-hover-button { + padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline); +} +.crm-container .crm-hover-button.crm-clear-link, +.crm-container .crm-hover-button.crm-close-accordion { + color: var(--crm-c-link); + padding: 0; + background: unset; +} +.crm-container .crm-hover-button:hover, +.crm-container a.crm-hover-button:hover, +.crm-container a.crm-hover-button:focus, +.crm-container a.crm-hover-button:active, +.crm-container .crm-submit-buttons .crm-hover-button:hover, +.crm-container .crm-submit-buttons .crm-hover-button:focus { + background: var(--crm-c-secondary-hover); + color: var(--crm-c-secondary-text); + text-decoration: none; +} + +/* Action links */ + +.crm-container .ui-widget-content .action-link .button { + box-shadow: var(--crm-block-shadow) !important; + margin: var(--crm-m) 0; +} + +/* Modal buttons */ + +.crm-container.ui-dialog .ui-dialog-buttonset button { + background: var(--crm-c-primary); + color: var(--crm-c-primary-text); +} +.crm-container.ui-dialog .ui-dialog-buttonset button:hover, +.crm-container.ui-dialog .ui-dialog-buttonset button:focus { + background: var(--crm-c-primary-hover); +} + +/* BS3 button dropdowns */ + +#bootstrap-theme .btn-primary.dropdown-toggle { + background: var(--crm-c-primary); + color: var(--crm-c-primary-text); +} +#bootstrap-theme .btn-primary.dropdown-toggle:hover, +#bootstrap-theme .btn-primary.dropdown-toggle:focus { + background: var(--crm-c-primary-hover); +} +#bootstrap-theme .btn-secondary.dropdown-toggle { + background: var(--crm-c-secondary); + color: var(--crm-c-secondary-text); +} +#bootstrap-theme .btn-secondary.dropdown-toggle:hover, +#bootstrap-theme .btn-secondary.dropdown-toggle:focus { + background: var(--crm-c-secondary-hover); +} +.crm-container .crm-search-display button.dropdown-toggle:not(.btn-default):not(.btn-secondary), +#bootstrap-theme .crm-search-display th .btn-group .btn { + background-color: var(--crm-c-background4); + color: var(--crm-c-text); +} + +/* BS3 Button groups and dropdowns */ + +.crm-search-col-type-buttons, +#bootstrap-theme td.text-right:has(.btn + .btn) { + display: flex; + gap: var(--crm-s); +} +#bootstrap-theme td.text-right:has(.btn + .btn) { + justify-content: end; +} +.crm-container a.button + a.button { + margin-left: var(--crm-flex-gap); +} +.crm-actions-ribbon #actions { + padding: 0; + margin: 0 0 var(--crm-padding-reg); + display: flex; + gap: var(--crm-flex-gap); + align-items: center; +} +#bootstrap-theme .btn-group, +#bootstrap-theme .btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +#bootstrap-theme .btn-group > .btn, +#bootstrap-theme .btn-group-vertical > .btn { + position: relative; + float: left; +} +#bootstrap-theme .btn-group > .btn:hover, +#bootstrap-theme .btn-group > .btn:focus, +#bootstrap-theme .btn-group > .btn:active, +#bootstrap-theme .btn-group > .btn.active, +#bootstrap-theme .btn-group-vertical > .btn:hover, +#bootstrap-theme .btn-group-vertical > .btn:focus, +#bootstrap-theme .btn-group-vertical > .btn:active, +#bootstrap-theme .btn-group-vertical > .btn.active { + z-index: 2; +} +#bootstrap-theme .btn-group .btn + .btn, +#bootstrap-theme .btn-group .btn + .btn-group, +#bootstrap-theme .btn-group .btn-group + .btn, +#bootstrap-theme .btn-group .btn-group + .btn-group { + margin-left: -1px; +} +#bootstrap-theme .btn-toolbar { + margin-left: -5px; +} +#bootstrap-theme .btn-toolbar:before, +#bootstrap-theme .btn-toolbar:after { + display: table; + content: " "; +} +#bootstrap-theme .btn-toolbar:after { + clear: both; +} +#bootstrap-theme .btn-toolbar .btn, +#bootstrap-theme .btn-toolbar .btn-group, +#bootstrap-theme .btn-toolbar .input-group { + float: left; +} +#bootstrap-theme .btn-toolbar > .btn, +#bootstrap-theme .btn-toolbar > .btn-group, +#bootstrap-theme .btn-toolbar > .input-group { + margin-left: 5px; +} +#bootstrap-theme .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +#bootstrap-theme .btn-group > .btn:first-child { + margin-left: 0; +} +#bootstrap-theme .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +#bootstrap-theme .btn-group > .btn:last-child:not(:first-child), +#bootstrap-theme .btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +#bootstrap-theme .btn-group > .btn-group { + float: left; +} +#bootstrap-theme .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +#bootstrap-theme .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +#bootstrap-theme .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +#bootstrap-theme .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +#bootstrap-theme .btn-group .dropdown-toggle:active, +#bootstrap-theme .btn-group.open .dropdown-toggle { + outline: 0; +} +#bootstrap-theme .btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +#bootstrap-theme .btn-group > .btn-lg + .dropdown-toggle, +#bootstrap-theme .btn-group-lg.btn-group > .btn + .dropdown-toggle, +#bootstrap-theme .btn-group-lg > .btn-group > .btn + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +#bootstrap-theme .btn-group.open .dropdown-toggle { + box-shadow: var(--crm-popup-shadow); +} +#bootstrap-theme .btn-group.open .dropdown-toggle.btn-link { + box-shadow: none; +} +#bootstrap-theme .btn-lg .caret, +#bootstrap-theme .btn-group-lg > .btn .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +#bootstrap-theme .dropup .btn-lg .caret, +#bootstrap-theme .dropup .btn-group-lg > .btn .caret { + border-width: 0 5px 5px; +} +#bootstrap-theme .btn-group-vertical > .btn, +#bootstrap-theme .btn-group-vertical > .btn-group, +#bootstrap-theme .btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +#bootstrap-theme .btn-group-vertical > .btn-group:before, +#bootstrap-theme .btn-group-vertical > .btn-group:after { + display: table; + content: " "; +} +#bootstrap-theme .btn-group-vertical > .btn-group:after { + clear: both; +} +#bootstrap-theme .btn-group-vertical > .btn-group > .btn { + float: none; +} +#bootstrap-theme .btn-group-vertical > .btn + .btn, +#bootstrap-theme .btn-group-vertical > .btn + .btn-group, +#bootstrap-theme .btn-group-vertical > .btn-group + .btn, +#bootstrap-theme .btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +#bootstrap-theme .btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +#bootstrap-theme .btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: var(--crm-btn-radius); + border-top-right-radius: var(--crm-btn-radius); + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +#bootstrap-theme .btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: var(--crm-btn-radius); + border-bottom-left-radius: var(--crm-btn-radius); +} +#bootstrap-theme .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +#bootstrap-theme .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +#bootstrap-theme .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +#bootstrap-theme .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +#bootstrap-theme .btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +#bootstrap-theme .btn-group-justified > .btn, +#bootstrap-theme .btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +#bootstrap-theme .btn-group-justified > .btn-group .btn { + width: 100%; +} +#bootstrap-theme .btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +#bootstrap-theme .btn-group .btn + .btn.dropdown-toggle { + border-left: 1px solid var(--crm-c-page-background); +} + +/* Icons (for ease, include .button & .ui-button icons) */ + +.crm-container .crm-button i.crm-i, +.crm-container a.button i.crm-i, +.crm-container button i.crm-i, +.crm-container a.button:visited i.crm-i, +.crm-container input.form-submit i.crm-i, +.crm-container input[type="button"] i.crm-i, +.crm-container input[type="submit"] i.crm-i, +.crm-container input.form-submit-inline i.crm-i, +.crm-container .ui-dialog-buttonset .ui-button .ui-icon, +.crm-container .btn i.crm-i, +#bootstrap-theme .btn i.crm-i { + background-color: var(--crm-btn-icon-bg); + border-radius: var(--crm-btn-radius) 0 0 var(--crm-btn-radius); + border-right: var(--crm-btn-icon-border); + line-height: inherit; + opacity: 1; + text-shadow: none; + padding: var(--crm-btn-padding-block) var(--crm-btn-icon-spacing) var(--crm-btn-padding-block) var(--crm-btn-padding-inline); + height: 100%; + min-width: var(--crm-btn-height); + display: flex; + align-items: center; + justify-content: center; +} +.crm-container a.button i.crm-i, +.crm-container .crm-button:not(.btn) i.crm-i { + display: flex; + align-items: center; +} +#bootstrap-theme .btn:has(i.crm-i), +#bootstrap-theme .btn-group > .btn + .dropdown-toggle:has(i.crm-i), +.crm-container button.ui-button:has(.ui-button-icon) { + padding: var(--crm-btn-icon-padding) var(--crm-btn-padding-inline) var(--crm-btn-icon-padding) 0; +} +.crm-container a.button:has(i.crm-i), +.crm-container button:has(i.crm-i), +.crm-button:has(i.crm-i), +.crm-button > input[type="button"]:has(i.crm-i), +.crm-button > input[type="submit"]:has(i.crm-i), +.form-inline .btn-success.pull-right:has(i.crm-i) /* Api4exp */ { + padding: var(--crm-btn-icon-padding) var(--crm-btn-padding-inline) var(--crm-btn-icon-padding) 0; + width: fit-content; + justify-content: center; + align-items: center; +} +.crm-button > input[type="button"]:has(i.crm-i), +.crm-button > input[type="submit"]:has(i.crm-i) { + padding: var(--crm-btn-icon-padding) 0; +} +#bootstrap-theme .form-inline .btn-group button:has(i.crm-i), +.crm-search-admin-main-tabs li .btn.btn-secondary.dropdown-toggle, +#bootstrap-theme .form-inline .btn-group button i.crm-i, +.form-inline .btn-success.pull-right i.crm-i, +.crm-search-admin-main-tabs li .btn.btn-secondary.dropdown-toggle i.crm-i { + display: flex; + justify-content: center; + align-items: center; +} +.crm-container .ui-button-icon-space { + display: none; +} +#bootstrap-theme .btn-group-xs button .caret, +#bootstrap-theme .btn-group button.btn-xs .caret { + margin: 0 8px 0 0; +} +.crm-container .button span i.crm-i { + margin-right: var(--crm-btn-icon-spacing); +} + +/* Small buttons with icons */ +#bootstrap-theme .btn-sm:has(i.crm-i), +#bootstrap-theme .btn-group-sm > .btn:has(i.crm-i) { + padding: 0 var(--crm-m1) 0 0; +} +#bootstrap-theme .btn-sm i.crm-i, +#bootstrap-theme .btn-group-sm > .btn i.crm-i { + min-width: fit-content; + height: auto; + padding: var(--crm-s2) var(--crm-btn-icon-spacing) var(--crm-s2) var(--crm-m1); +} +#bootstrap-theme .btn-group-xs > .btn:has(i.crm-i), +#bootstrap-theme .btn-group-xs > .btn + .dropdown-toggle:has(i.crm-i), +.crm-container button.dropdown-toggle.btn-xs:has(i.crm-i) { + padding: 0; +} +#bootstrap-theme .btn-group-xs button:has(i.crm-i) { + padding: 0 var(--crm-s2) 0 0; +} +#bootstrap-theme .btn-xs i.crm-i, +#bootstrap-theme .btn-group-xs > .btn i.crm-i { + width: auto; + padding: var(--crm-btn-small-padding); + min-width: 1rem; + height: 1.5rem; +} diff --git a/civicrm/ext/riverlea/core/css/components/_components.css b/civicrm/ext/riverlea/core/css/components/_components.css new file mode 100644 index 0000000000..8515e0ca2e --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_components.css @@ -0,0 +1,643 @@ +/* Checkbox lists */ + +.crm-container .listing-box, +.crm-container .listing-box-tall, +.crm-container ul.crm-checkbox-list { + width: auto; + border-radius: var(--crm-roundness); + max-width: 30rem; + height: 7.25rem; + overflow: auto; + border: 1px solid var(--crm-c-gray-500); +} +.crm-container ul.crm-checkbox-list { + list-style: none; + margin: 0; + padding: 0; + background-color: var(--crm-c-page-background); + width: 300px; + max-width: 100%; + max-height: 300px; + overflow-y: auto; +} +.crm-container ul.crm-checkbox-list li { + margin: 0; + display: grid; + grid-template-columns: var(--crm-r) 100%; + gap: var(--crm-xs); + background-color: var(--crm-c-background2); + padding-inline: var(--crm-s) var(--crm-m2); + word-break: break-all; + align-items: center; +} +.crm-container ul.crm-checkbox-list li input { + margin: 0; +} +.crm-container ul.crm-checkbox-list li:has(input:checked) label { + color: var(--crm-checkbox-list-col); +} +.listing-box input.crm-form-checkbox { + margin: 0 0 0 var(--crm-s); +} +tbody.scrollContent tr.alternateRow { + background-color: var(--crm-c-background3); + padding-inline: var(--crm-s) var(--crm-m2); +} +.crm-container ul.crm-checkbox-list li:nth-child(2n) { + background-color: var(--crm-c-background3); +} +.crm-container ul.crm-checkbox-list li:has(input:checked) { + background-color: var(--crm-c-yellow-light); +} +.crm-container ul.crm-checkbox-list li:nth-child(2n):has(input:checked) { + background-color: var(--crm-c-yellow-less-light); +} + +/* Action Links */ + +.crm-container .action-link, +.crm-container .action-link:hover { + line-height: 1; + background: unset; + display: flex; + gap: var(--crm-m); + padding: var(--crm-padding-reg) 0; +} +.crm-container .CRM_Event_Form_SearchEvent .action-link { + padding: 0 0 var(--crm-padding-reg) 0; +} +.crm-container .action-link:has(.crm-uplang-refresh) { + padding-top: 0; +} +.crm-container .action-link.css_right.crm-link-credit-card-mode { + margin-top: -20px; /* prevents narrow screen wrapping */ +} + +/* Advanced multi-select */ + +.crm-container table.advmultiselect { + border: 0 solid transparent; +} +.crm-container table.advmultiselect td:nth-of-type(2n) { + display: flex; + gap: var(--crm-m); + border: 0; + align-items: center; + height: 125px; +} +table.advmultiselect { + width: auto; +} + +/* Wizard steps. + .crm_wizard__title is from Mosaico, to be removed someday */ + +.crm-container ul.wizard-bar, +.crm_wizard__title ul { + border-collapse: collapse; + white-space: nowrap; + list-style: none; + margin: 0 0 20px; + line-height: normal; + background-color: var(--crm-c-background); + border: var(--crm-wizard-border); + border-radius: var(--crm-wizard-radius); + overflow: hidden; + padding: 0; + text-align: left; + width: 100%; +} +.crm-container #wizard-steps, +.crm-container ul.crm-wizard-nav, +.crm-container .crm-mosaico-wizard .crm_wizard__title ul { + margin: var(--crm-wizard-margin) !important; + width: var(--crm-wizard-width); + gap: initial; /* resets .nav.nav-pills gap */ +} +.crm-container ul.crm-wizard-nav { + margin-bottom: var(--crm-r); +} +.crm-wizard-step .ui-tabs { + margin-bottom: var(--crm-m); +} +.crm-container ul.wizard-bar li, +.crm_wizard__title ul > li { + margin: -2px; + text-decoration: none; + background-image: none; + background-color: var(--crm-wizard-bg); + border: 0; + border-radius: 0; + color: var(--crm-c-text); + display: inline-block; + font-weight: bold; + font-family: var(--crm-font-bold); + line-height: var(--crm-wizard-height); + padding: 0 var(--crm-l) 0 var(--crm-xl); + position: relative; +} +.crm-container ul.wizard-bar > li:first-child, +.crm_wizard__title ul > li:first-child { + padding-left: var(--crm-l); +} +.crm-container ul.wizard-bar > li::after, +.crm_wizard__title ul > li::after { + border-bottom: var(--crm-wizard-height) solid rgba(0,0,0,0); + border-left: calc(1px + var(--crm-wizard-angle)) solid var(--crm-wizard-active-bg); + border-top: var(--crm-wizard-height) solid rgba(0,0,0,0); + content: ""; + height: 0; + position: absolute; + right: -21px; + top: calc(-0.5 * var(--crm-wizard-height)); + width: 20px; + z-index: 10; +} +.crm-container ul.crm-wizard-nav > li::after, +.crm_wizard__title ul > li::after { + border-left: calc(1.25 * var(--crm-wizard-angle)) solid var(--crm-wizard-active-bg); +} +.crm-container ul.wizard-bar > li::before, +.crm_wizard__title ul > li::before { + border-bottom: var(--crm-wizard-height) solid rgba(0,0,0,0); + border-left: var(--crm-wizard-angle) solid var(--crm-wizard-bg); + border-top: var(--crm-wizard-height) solid rgba(0,0,0,0); + content: ""; + height: 0; + position: absolute; + right: -20px; + top: calc(-0.5 * var(--crm-wizard-height)); + width: 0; + z-index: 11; +} +.crm-container ul.crm-wizard-nav > li::before, +.crm_wizard__title ul > li::before { + border-left: calc(1.25 * var(--crm-wizard-angle)) solid var(--crm-wizard-bg); +} +.crm-container ul.wizard-bar > li.current-step, +.crm_wizard__title ul > li.active, +.crm_wizard__title ul > li.active a { + background-color: var(--crm-wizard-active-bg); + color: var(--crm-wizard-active-col); +} +.crm-container ul.wizard-bar > li.current-step::before, +.crm_wizard__title ul > li.active::before { + border-left-color: var(--crm-wizard-active-bg); +} +.crm-container ul.wizard-bar > li:not(:first-child), +.crm_wizard__title ul > li:not(:first-child) { + padding-left: calc(var(--crm-l) + var(--crm-wizard-angle)) !important; +} +.crm-wizard-buttons { + margin-top: var(--crm-padding-reg); + display: flex; + justify-content: space-between; +} +.crm-wizard-buttons > span > span { + display: flex; + gap: var(--crm-flex-gap); +} + +/* Panels (taken from Bootstrap3) */ + +.crm-container .panel { + box-shadow: var(--crm-panel-shadow); + border: var(--crm-panel-border); + border-radius: var(--crm-roundness); + margin-bottom: calc(var(--crm-r) + var(--crm-panel-head-margin)); + background: transparent; +} +.crm-container .panel-heading { + padding: var(--crm-m2) var(--crm-padding-reg); + border-radius: var(--crm-roundness) var(--crm-roundness) 0 0; + border-bottom: var(--crm-panel-border); +} +.crm-container .panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.crm-container .panel-body { + padding: var(--crm-padding-reg); + background: var(--crm-panel-background); + box-shadow: none; + border-radius: var(--crm-roundness); +} +.crm-container .panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: var(--crm-font-size); + color: inherit; +} +.crm-container .panel-title > a, +.crm-container .panel-title > small, +.crm-container .panel-title > .small, +.crm-container .panel-title > small > a, +.crm-container .panel-title > .small > a { + color: inherit; +} +.crm-container .panel-footer { + padding: var(--crm-padding-reg); + background: var(--crm-panel-background); + border-top: var(--crm-c-divider); + border-radius: 0 0 var(--crm-roundness) var(--crm-roundness); + box-shadow: var(--crm-panel-shadow); +} +.crm-container .panel > .panel-heading + .panel-collapse > .panel-body { + border-top-color: var(--crm-c-gray-300); +} +.crm-container .panel > .panel-footer + .panel-collapse > .panel-body { + border-color: var(--crm-c-gray-300); +} +.crm-container .panel-default > .panel-heading { + color: var(--crm-c-text); + background-color: var(--crm-c-background2); + border-bottom: var(--crm-panel-border); +} +.crm-container .panel-title { + font-size: 1rem; + color: inherit; + margin: 0; +} +.crm-container .panel-default { + border: var(--crm-c-divider); +} +.crm-container .panel-default > .panel-heading .badge { + color: var(--crm-text-light); + background-color: var(--crm-c-gray-500); +} +.crm-container .panel-primary > .panel-heading { + color: var(--crm-c-primary-text); + background-color: var(--crm-c-primary); +} +.crm-container .panel-primary > .panel-heading .badge, +.crm-container .panel-primary > .panel-heading a { + color: var(--crm-c-primary-text); +} +.crm-container .panel-success > .panel-heading { + color: var(--crm-c-success); + background-color: var(--crm-c-green-light); +} +.crm-container .panel-success > .panel-heading .badge, +.crm-container .panel-success > .panel-heading a { + color: var(--crm-c-success); +} +.crm-container .panel-info > .panel-heading { + color: var(--crm-alert-text-info); + background-color: var(--crm-alert-background-info); +} +.crm-container .panel-info > .panel-heading .badge, +.crm-container .panel-info > .panel-heading a { + color: var(--crm-alert-text-info); +} +.crm-container .panel-warning > .panel-heading { + color: var(--crm-c-warning-text); + background-color: var(--crm-c-warning); +} +.crm-container .panel-warning > .panel-heading .badge, +.crm-container .panel-warning > .panel-heading a { + color: var(--crm-c-warning-text); +} +.crm-container .panel-danger > .panel-heading { + color: var(--crm-c-alert); + background-color: var(--crm-c-red-light); +} +.crm-container .panel-danger > .panel-heading .badge, +.crm-container .panel-danger > .panel-heading a { + color: var(--crm-c-alert); +} +.crm-container .panel:has(.nav.nav-tabs) { + border: var(--crm-tabs-border); + border-radius: var(--crm-tabs-radius); +} +.crm-container .panel .panel { + box-shadow: none; +} + +/* Badges - from BS3 */ + +.crm-container .badge { + display: inline-block; + min-width: 10px; + padding: var(--crm-s) var(--crm-m); + line-height: 1; + color: var(--crm-c-page-background); + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: var(--crm-c-primary); + border-radius: var(--crm-m2); + position: relative; + top: -1px; +} +.crm-container .btn-group .badge { + margin-inline: var(--crm-xs); +} +.crm-container .badge:empty { + display: none; +} +.crm-container .btn-xs .badge, +.crm-container .btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: var(--crm-c-link); + background-color: var(--crm-c-page-background); +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.crm-container a.badge:hover, +.crm-container a.badge:focus { + color: white; + text-decoration: none; + cursor: var(--crm-hover-clickable); +} + +/* Footer */ + +.crm-container #access { + text-align: right; +} +#crm-record-log { + font-size: var(--crm-m3); + padding: var(--crm-m3) 0; +} +#crm-record-log .col1 { + float: left; +} +#civicrm-footer { + margin-top: var(--crm-l); + padding: var(--crm-m2); + text-align: center; + font-size: var(--crm-m2); +} +#civicrm-footer::after { + content: var(--crm-version); + float: right; +} +.crm-container #civicrm-footer .status { + border-radius: var(--crm-roundness); + padding: var(--crm-btn-small-padding); + border-color: transparent; +} +.crm-container #civicrm-footer .status.crm-error { + background-color: var(--crm-c-alert); + color: var(--crm-c-alert-text); +} +#civicrm-footer .status a { + color: inherit; +} +.crm-container #civicrm-footer .status.crm-error a { + color: var(--crm-c-alert-text); +} + +/* Upgrade screen (overwrites inline css) */ + +.crm-container.crm-upgrade-box-outer, +.page-civicrm-upgrade .crm-queue-runner-form-block { + margin: var(--crm-page-padding); /* Padding on upgrade screen */ +} +.crm-upgrade-box-outer.crm-upgrade-success { + margin: var(--crm-page-padding); + background: var(--crm-alert-background-help); + border: 1px solid var(--crm-alert-border-help); +} +.crm-upgrade-box-inner { + padding: 1rem; + display: grid; + grid-template-columns: 1fr auto; + row-gap: 1rem; + background-color: transparent; +} +p.crm-upgrade-large-text { + grid-column: 2; + color: var(--crm-c-success); +} +.crm-upgrade-box-inner a { + color: var(--crm-c-link) !important /* vs inline */; +} +p.crm-upgrade-large-text:first-of-type { + font-size: var(--crm-r1); + color: var(--crm-c-success); + font-family: var(--crm-font-bold); + font-weight: bold; +} +.crm-success-flex { + display: unset; + padding: 0 2rem 0 0 !important /* vs inline */; + font-size: var(--crm-l); + line-height: 1.35; + color: var(--crm-c-success); + grid-column: 1; + grid-row: 1 / span 3; +} + +/* Upgrade extensions runner */ + +#crm-queue-runner-progress { + width: 100%; + background: var(--crm-c-background3); +} +#crm-queue-runner-desc { + background: var(--crm-c-background2); + padding: var(--crm-padding-reg); + margin-block: var(--crm-r); + border-radius: var(--crm-roundness); + display: inline-flex; + flex-direction: row-reverse; + justify-content: space-between; + align-items: center; +} +#crm-queue-runner-buttonset { + position: inherit !important; +} +#crm-queue-runner-buttonset button { + background: transparent; + height: inherit; + padding: 0 0 0 var(--crm-r); + color: var(--crm-c-text); +} +#crm-queue-runner-buttonset button:hover, +#crm-queue-runner-buttonset button:focus { + color: var(--crm-c-text); +} + +/* Community message */ + +div.civicrm-community-messages { + border: 2px solid var(--crm-alert-border-help); + background: var(--crm-alert-background-help); + padding: var(--crm-padding-inset); +} +div.civicrm-community-messages .crm-collapsible .collapsible-title, +div.civicrm-community-messages a.civicrm-community-message-dismiss::before { + color: var(--crm-alert-text-help) !important /* vs inline */; +} + +/* Status box (for mailsending) */ + +.crm-status-box-outer { + position: fixed; + z-index: 99999; + right: 0; + top: 0; +} +.progress-bar-striped { + background-image: linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-size: 1rem 1rem; +} +.crm-status-box-outer.status-start { + animation: progress-bar-stripes 1s linear infinite; +} +.crm-status-box-outer .crm-status-box-inner { + padding: var(--crm-s) var(--crm-r); + font-size: var(--crm-font-size); + color: var(--crm-c-text-light); + font-weight: bold; + font-family: var(--crm-font-bold); + text-align: center; + background: var(--crm-c-background2); +} +.crm-status-box-outer.status-success .crm-status-box-inner { + background: var(--crm-c-success); +} +.crm-status-box-outer.status-error .crm-status-box-inner { + background: var(--crm-c-alert); +} + +/* Background regions */ + +#bootstrap-theme .bg-primary { + background-color: var(--crm-c-primary); + color: var(--crm-c-primary-text); +} +#bootstrap-theme .bg-primary a { + color: var(--crm-c-primary-text); +} +#bootstrap-theme a.bg-primary:hover, +#bootstrap-theme a.bg-primary:focus { + background-color: var(--crm-c-primary-hover); +} +#bootstrap-theme .bg-secondary { + background-color: var(--crm-c-secondary); + color: var(--crm-c-secondary-text); +} +#bootstrap-theme .bg-secondary a { + color: var(--crm-c-secondary-text); +} +#bootstrap-theme a.bg-secondary:hover, +#bootstrap-theme a.bg-secondary:focus { + background-color: var(--crm-c-secondary-hover); +} +#bootstrap-theme .dropdown-menu .bg-success a, +#bootstrap-theme .dropdown-menu a.bg-success, +#bootstrap-theme .bg-success { + background-color: var(--crm-c-success); + color: var(--crm-c-success-text); +} +#bootstrap-theme a.bg-success:hover, +#bootstrap-theme a.bg-success:focus, +#bootstrap-theme .dropdown-menu a.bg-success:hover, +#bootstrap-theme .dropdown-menu .bg-success a:hover { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-success); + color: var(--crm-c-success-text); +} +#bootstrap-theme .dropdown-menu .bg-info a, +#bootstrap-theme .dropdown-menu a.bg-info, +#bootstrap-theme .bg-info { + background-color: var(--crm-c-info); + color: var(--crm-c-info-text); +} +#bootstrap-theme a.bg-info:hover, +#bootstrap-theme a.bg-info:focus, +#bootstrap-theme .dropdown-menu .bg-info a:hover, +#bootstrap-theme .dropdown-menu a.bg-info:hover { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-info); + color: var(--crm-c-info-text); +} +#bootstrap-theme .bg-warning, +#bootstrap-theme .dropdown-menu .bg-warning a, +#bootstrap-theme .dropdown-menu a.bg-warning { + background-color: var(--crm-c-warning); + color: var(--crm-c-warning-text) !important /* FormBuilder vs .disabled */; +} +#bootstrap-theme a.bg-warning:hover, +#bootstrap-theme a.bg-warning:focus, +#bootstrap-theme .dropdown-menu .bg-warning a:hover, +#bootstrap-theme .dropdown-menu a.bg-warning:hover { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-warning); + color: var(--crm-c-warning-text); +} +#bootstrap-theme .bg-danger, +#bootstrap-theme .dropdown-menu .bg-danger a, +#bootstrap-theme .dropdown-menu a.bg-danger { + background-color: var(--crm-c-alert); + color: var(--crm-c-alert-text); +} +#bootstrap-theme a.bg-danger:hover, +#bootstrap-theme a.bg-danger:focus, +#bootstrap-theme .dropdown-menu .bg-danger a:hover, +#bootstrap-theme .dropdown-menu a.bg-danger:hover { + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-alert); + color: var(--crm-c-alert-text); +} +#bootstrap-theme .dropdown-menu .bg-danger .crm-i::before { + color: var(--crm-c-alert-text); +} +#bootstrap-theme .dropdown-menu .bg-warning .crm-i::before { + color: var(--crm-c-warning-text); +} +#bootstrap-theme .dropdown-menu .bg-success .crm-i::before { + color: var(--crm-c-success-text); +} +#bootstrap-theme .dropdown-menu .bg-info .crm-i::before { + color: var(--crm-c-info-text); +} + +/* CKEditor Config */ + +#CKEditorConfig .cke_ltr.cke_button.cke_toolgroup { + width: 30px; + height: 30px; + border-radius: var(--crm-roundness); + background: var(--crm-c-background); +} +#CKEditorConfig .move { + background-color: var(--crm-c-primary); + color: var(--crm-c-primary-text); + border: 0; + margin-block: 1px; +} +#CKEditorConfig .move:focus, +#CKEditorConfig .move:hover { + background-color: var(--crm-c-primary-hover); + border: 0; +} +/* Blocks (D7/Joomla) */ + +#crm-recently-viewed ul, +#crm-recently-viewed li { + padding: 0; + margin: 0; + font-size: 0.9rem; +} +#crm-recently-viewed li.crm-recently-viewed { + margin-block: var(--crm-xs); + padding: var(--crm-s); + border: var(--crm-c-divider); + background-color: var(--crm-input-background); + list-style-type: none; + position: relative; + border-radius: var(--crm-roundness); +} +#crm-recently-viewed .crm-recentview-wrapper a { + opacity: 0.6; +} +#crm-recently-viewed .crm-recentview-wrapper a:hover, +#crm-recently-viewed .crm-recentview-wrapper a:focus { + opacity: 1; +} +#crm-quick-create input { + max-width: 100%; +} diff --git a/civicrm/ext/riverlea/core/css/components/_dialogs.css b/civicrm/ext/riverlea/core/css/components/_dialogs.css new file mode 100644 index 0000000000..5e7758186c --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_dialogs.css @@ -0,0 +1,225 @@ +/* Main modal */ +/* Header */ +.crm-container.ui-dialog { + background: var(--crm-dialog-bg); + border: 0; + border-radius: var(--crm-dialog-radius); + box-shadow: var(--crm-popup-shadow); + color: var(--crm-c-text); + max-height: 90%; + padding: var(--crm-dialog-padding); +} +.crm-container.ui-dialog .ui-dialog-header, +.crm-container.ui-dialog .ui-dialog-titlebar, +.crm-container .modal-header, +.crm-container .ui-dialog .ui-dialog-titlebar { + border: 0; + border: 1px solid transparent; + border-color: var(--crm-dialog-header-border-col); + box-shadow: var(--crm-dialog-inner-shadow); + color: var(--crm-dialog-header-col); + background: var(--crm-dialog-header-bg); + font-size: var(--crm-dialog-header-size); + border-radius: var(--crm-dialog-header-radius); + padding: var(--crm-dialog-header-padding); + position: relative; + overflow: auto; + display: flex; + flex-wrap: nowrap; + align-items: center; + gap: var(--crm-m3); +} +.crm-container.ui-dialog .ui-dialog-header .ui-dialog-title, +.crm-container.ui-dialog .ui-dialog-titlebar .ui-dialog-title { + font-weight: bold; + font-family: var(--crm-font-bold); + padding: 0; + float: none; + flex: 1; + margin: 0; + width: auto; +} +.crm-container.ui-dialog .ui-dialog-header .ui-button, +.crm-container.ui-dialog .ui-dialog-titlebar .ui-button { + background: transparent; + color: var(--crm-dialog-header-col); + display: block; + font-size: var(--crm-dialog-header-size); + padding: 0; + position: relative !important; + margin: 0; + right: unset !important /* vs inline - ie CiviCase Actiity View */; + top: unset; +} +.crm-container.ui-dialog .ui-dialog-titlebar .ui-state-hover .ui-icon, +.crm-container.ui-dialog .ui-dialog-titlebar .ui-state-focus .ui-icon, +.crm-container.ui-dialog .ui-dialog-titlebar .ui-button:hover, +.crm-container.ui-dialog .ui-dialog-titlebar .ui-button:focus { + background: transparent; +} +.crm-container.ui-dialog .ui-button:has(.fa-times) { + order: 1; +} +.crm-container.ui-dialog .ui-dialog-header .ui-button-icon.ui-icon[class*=" fa-"], +.crm-container.ui-dialog .ui-dialog-titlebar .ui-button-icon.ui-icon[class*=" fa-"] { + font-size: var(--crm-dialog-header-size); + height: 2ch; + color: var(--crm-dialog-header-col); + opacity: 0.8; + width: auto; +} +.crm-container.ui-dialog .ui-dialog-titlebar .ui-button-icon.ui-icon[class*=" fa-"]:hover, +.crm-container.ui-dialog .ui-dialog-titlebar .ui-button-icon.ui-icon[class*=" fa-"]:focus { + color: var(--crm-dialog-header-col); + opacity: 1; +} + +/* Body */ +.crm-container.ui-dialog .ui-dialog-content[id*="crm-ajax-dialog"] { + background: var(--crm-dialog-body-bg); +} +.crm-container.ui-dialog .ui-dialog-content { + max-height: calc(100vh - 280px) !important; + border-radius: var(--crm-dialog-radius); + background: var(--crm-dialog-body-bg); + color: var(--crm-c-text); + height: auto !important; + margin: var(--crm-dialog-padding) 0 calc(var(--crm-btn-height) + var(--crm-m) + var(--crm-m)); + position: static; + z-index: 1; + padding: var(--crm-dialog-body-padding); +} +.crm-container.ui-dialog .ui-dialog-content .crm-container { + background: var(--crm-dialog-bg); +} +.crm-container.ui-dialog .ui-dialog-content .crm-block, +.crm-container.ui-dialog details table { + box-shadow: none; + padding: var(--crm-dialog-body-padding); +} +.crm-container.ui-dialog .form-layout-compressed { + background: transparent; + box-shadow: none; + border: 0 solid transparent; +} +.crm-container.ui-dialog .ui-dialog-content tr, +.crm-container.ui-dialog .ui-dialog-content td, +.crm-container.ui-dialog .ui-dialog-content th { + border-bottom: 0; +} +.crm-container.ui-dialog details { + margin: var(--crm-dialog-body-padding) 0; +} +.crm-container.ui-dialog .help, +.crm-container.ui-dialog .status, +.crm-container.ui-dialog .alert, +.crm-container.ui-dialog .alert-success { + margin: var(--crm-dialog-body-padding); +} +/* Footer */ +.crm-container.ui-dialog .ui-dialog-buttonpane, +.crm-container.ui-dialog .modal-dialog .modal-footer { + background: var(--crm-dialog-bg); + border-radius: 0 0 var(--crm-dialog-radius) var(--crm-dialog-radius); + border-top: var(--crm-dialog-line) !important; + box-shadow: var(--crm-dialog-inner-shadow); + display: flex; + padding: 0; + margin: 0; + position: absolute; + width: 100%; + bottom: 0; + left: 0; +} +.crm-container.ui-dialog .ui-dialog-buttonset { + width: 100%; + display: flex; + gap: var(--crm-m); + padding: var(--crm-m); + justify-content: flex-end; + flex-wrap: wrap; +} +.crm-container.ui-dialog .buttons.pull-right { + display: flex; + gap: var(--crm-flex-gap); +} +.crm-container.ui-dialog .ui-dialog-buttonpane button { + margin: 0; +} + +/* System notifications */ + +#crm-notification-container { + width: 350px; + position: fixed; + top: 64px; + right: var(--crm-r2); + z-index: 999999; +} +#crm-notification-container div.ui-notify-message-style { + background: var(--crm-notify-background); + box-shadow: var(--crm-popup-shadow); + color: var(--crm-notify-col); + border-radius: var(--crm-notify-radius); + padding: var(--crm-notify-padding); + margin-bottom: var(--crm-r); + max-height: 600px; + overflow: auto; + border-width: var(--crm-notify-accent-border); + border-style: solid; + border-color: transparent; +} +#crm-notification-container div.ui-notify-message-style a { + color: var(--crm-notify-col); + text-decoration: underline; +} +#crm-notification-container div.ui-notify-message-style.error { + border-color: var(--crm-c-alert); +} +#crm-notification-container div.ui-notify-message-style.alert, +#crm-notification-container div.ui-notify-message-style.warning { + border-color: var(--crm-c-warning); +} +#crm-notification-container div.ui-notify-message-style.success { + border-color: var(--crm-c-success); +} +#crm-notification-container div.ui-notify-message-style.info { + border-color: var(--crm-c-info); +} +#crm-notification-container div.ui-notify-message:last-child { + margin-bottom: 0; +} +#crm-notification-container div.ui-notify-message h1 { + font-size: var(--crm-font-size); + font-weight: bold; + font-family: var(--crm-font-bold); + margin: 0 2ch var(--m) 0; + color: var(--crm-notify-col); +} +#crm-notification-container div.ui-notify-message h1:empty { + float: left; + margin: 0; +} +#crm-notification-container div.ui-notify-message-style { + color: var(--crm-notify-col); +} +#crm-notification-container div.ui-notify-message .notify-content ul, +#crm-notification-container div.ui-notify-message .alert.notify-content ul { + margin: 0 var(--crm-r); + padding: var(--crm-m) 0 var(--crm-m) var(--crm-m); + color: var(--crm-notify-col); + list-style: unset; +} +#crm-notification-container div.ui-notify-message .notify-content ul li, +#crm-notification-container div.ui-notify-message.alert .notify-content ul li { + color: var(--crm-notify-col); +} +#crm-notification-container div.ui-notify-message .notify-content p { + color: var(--crm-notify-col); +} +#crm-notification-container div.ui-notify-message-style a.ui-button.ui-widget, +#crm-notification-container div.ui-notify-message-style a.ui-button.ui-widget:hover, +#crm-notification-container div.ui-notify-message-style a.ui-button.ui-widget:focus { + background: var(--crm-c-alert); + border: 0; +} diff --git a/civicrm/ext/riverlea/core/css/components/_dropdowns.css b/civicrm/ext/riverlea/core/css/components/_dropdowns.css new file mode 100644 index 0000000000..aa59c45aa6 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_dropdowns.css @@ -0,0 +1,459 @@ +/* Actions dropdowns */ + +#crm-create-new-list { + position: absolute; + display: none; + width: 220px; + left: 0; + z-index: 2; +} +#crm-contribpage-links-wrapper, +#crm-event-links-wrapper, +#crm-participant-wrapper, +#crm-contact-actions-wrapper { + position: relative; +} +#crm-contribpage-links-list, +#crm-event-links-list, +#crm-participant-list, +#crm-contact-actions-list { + top: calc(var(--crm-btn-height) + 5px); + position: absolute; + display: none; + left: 0; + z-index: 5; +} +.ac_results-inner, +.crm-participant-list-inner, +.crm-event-links-list-inner, +.crm-contribpage-links-list-inner, +.crm-contact-actions-list-inner, +.crm-participant-list-inner, +.crm-create-new-list-inner ul.ui-widget, +.vakata-context { + background-color: var(--crm-dropdown-2-bg); + color: var(--crm-dropdown-2-col); + border-radius: var(--crm-roundness); + box-shadow: var(--crm-popup-shadow); + padding: var(--crm-dropdown-2-padding); + min-width: var(--crm-dropdown-width); +} +.ac_results::before, +.crm-create-new-list-inner::before { + content: ''; + display: inline-block; + position: absolute; + width: 0px; + height: 0px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid var(--crm-dropdown-2-bg); + top: -5px; + left: 12px; +} +.crm-create-new-list-inner::before { + top: 3px; +} +#crm-contact-actions-list ul, +.crm-contribpage-links-list-inner ul, +.crm-event-links-list-inner ul, +.crm-participant-list-inner ul { + list-style: none; + margin: 0; + padding: 0; +} +#crm-contact-actions-list ul li, +.crm-contribpage-links-list-inner ul li, +.crm-event-links-list-inner ul li, +.crm-participant-list-inner ul li { + padding: 0; +} +#crm-contact-actions-list ul a, +.crm-contribpage-links-list-inner ul a, +.crm-event-links-list-inner ul a, +.crm-participant-list-inner ul a, +#crm-create-new-list ul a { + color: var(--crm-c-secondary-text); + padding: var(--crm-xs2) var(--crm-s); + border-radius: var(--crm-roundness); + display: block; +} +#crm-contact-actions-list ul a:hover, +#crm-contact-actions-list ul a:focus, +.crm-contribpage-links-list-inner ul a:hover, +.crm-contribpage-links-list-inner ul a:focus, +.crm-event-links-list-inner ul a:hover, +.crm-event-links-list-inner ul a:focus, +.crm-participant-list-inner ul a:hover, +.crm-participant-list-inner ul a:focus, +#crm-create-new-list ul a:hover, +#crm-create-new-list ul a:focus { + text-decoration: none; + color: var(--crm-c-text); + background-color: var(--crm-c-page-background); +} + +/* In-table dropdown */ + +.crm-container .btn-slide::after { + font-family: "FontAwesome"; + content: "\f0da"; + padding-left: 0.5ch; +} +.crm-container .btn-slide { + position: relative; +} +.crm-container .btn-slide ul.panel { + display: none; + z-index: 9999; + position: absolute; + right: 0; + padding: 0; + margin: var(--crm-m) 0; + min-width: var(--crm-dropdown-width); + background: var(--crm-dropdown-bg); + border-radius: var(--crm-roundness); + border: var(--crm-dropdown-border); + box-shadow: var(--crm-popup-shadow); +} +.crm-container .btn-slide ul.panel::before, +.crm-container .btn-group .dropdown-menu::before { + content: ''; + display: inline-block; + position: absolute; + width: 0px; + height: 0px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid var(--crm-dropdown-bg); + top: -5px; + right: var(--crm-r); +} +.crm-container .btn-group .dropdown-menu::before { + left: var(--crm-l); + right: auto; +} +.crm-container .btn-group .dropdown-menu-right::before, +.crm-container .btn-group.pull-right .dropdown-menu::before { + right: var(--crm-r); + left: auto; +} +.crm-container .btn-slide ul.panel li { + padding: var(--crm-dropdown-padding); + list-style: none; + width: auto; +} +.crm-container .btn-slide ul.panel li a { + text-decoration: none; + padding: var(--crm-s); + display: block; + cursor: var(--crm-hover-clickable); + color: var(--crm-dropdown-col); + text-align: left; +} +.crm-container .btn-slide ul.panel li a:hover, +.crm-container .btn-slide ul.panel li a:focus { + color: var(--crm-dropdown-hover); + background-color: var(--crm-dropdown-hover-bg); +} + +/* Tooltip - used on the contact dashboard but no-where else? */ + +.crm-container .crm-tooltip-wrapper { + position: absolute; + z-index: 10000; + background: none; + padding-bottom: 0; + margin: -12px; + display: none; +} +.crm-container .crm-summary-display_name .crm-tooltip-wrapper { + margin: -10px -5px; +} +.crm-container .crm-tooltip-active .crm-tooltip-wrapper { + display: block; +} +.crm-container .crm-tooltip-wrapper .crm-tooltip { + box-shadow: var(--crm-popup-shadow); + background: var(--crm-c-background); + border-radius: var(--crm-roundness); +} +.crm-container .crm-tooltip-wrapper::before { + border-bottom: 10px solid var(--crm-c-background2); + border-left: 10px solid rgba(0,0,0,0); + border-right: 10px solid rgba(0,0,0,0); + content: ""; + left: var(--crm-m2); + position: relative; + top: -7px; +} +.crm-container .crm-tooltip .crm-summary-group { + width: 700px; + padding-bottom: 1rem; +} +.crm-container .crm-tooltip table, +.crm-container .crm-tooltip table tr, +.crm-container .crm-tooltip table tr td { + background-color: var(--crm-c-background); + border: none; + color: var(--crm-c-text); + word-wrap: break-word; + width: 100%; +} +.crm-container .crm-tooltip-wrapper .crm-tooltip .crm-table-group-summary > tbody > tr > td { + vertical-align: top; + white-space: normal; +} +.crm-container .crm-tooltip-wrapper .crm-tooltip .crm-table-group-summary > tbody > tr > td.crm-section { + padding: var(--crm-s) 0; +} +.crm-container .crm-tooltip-wrapper .crm-tooltip .crm-table-group-summary > tbody > tr:nth-child(1) > td { + background: var(--crm-c-background2); + color: var(--crm-c-text); + font-size: var(--crm-r1); + padding: var(--crm-m2) var(--crm-r1); + font-weight: bold; + font-family: var(--crm-font-bold); +} +.crm-container .crm-tooltip-wrapper .crm-tooltip .crm-table-group-summary > tbody > tr:nth-child(2) > td { + border-top: var(--crm-c-divider) !important; + width: 50%; + padding: var(--crm-r1) var(--crm-m1) 0; +} +.crm-container .crm-tooltip-wrapper .crm-tooltip .crm-table-group-summary > tbody > tr:nth-child(2) > td:first-child { + padding-left: var(--crm-r1); +} + +/* BS3 Dropdowns */ + +.crm-container .caret { + display: inline-block; + width: 0; + height: 0; + margin: -2px 1px 0 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.crm-container .dropup, +.crm-container .dropdown { + position: relative; +} +.crm-container .dropdown-toggle:focus { + outline: 0; +} +.crm-container .btn-group .dropdown-menu, +.crm-container .btn.dropdown-toggle + .dropdown-menu { + position: absolute; + top: 100%; + z-index: 1000; + display: none; + min-width: var(--crm-dropdown-width); + padding: var(--crm-dropdown-padding) !important; + margin-top: var(--crm-s); + text-align: left; + list-style: none; + background-color: var(--crm-dropdown-bg); + background-clip: padding-box; + border: var(--crm-dropdown-border); + border-radius: var(--crm-roundness); + box-shadow: var(--crm-popup-shadow); +} +.crm-container .crm-search .api4-add-where-group-menu { + min-width: 80px; + background-color: var(--crm-dropdown-bg) !important; +} +.crm-container .dropdown-menu.pull-right { + right: 0; + left: auto; +} +.crm-container .dropdown-menu .divider { + height: 1px; + margin: var(--crm-m) 0; + overflow: hidden; + background-color: var(--crm-c-background3); +} +#bootstrap-theme .dropdown-menu li .form-inline, +#bootstrap-theme .dropdown-menu li .form-inline a { + color: var(--crm-dropdown-col); +} +.crm-container .dropdown-menu > li { + border-radius: var(--crm-roundness); +} +.crm-container .dropdown-menu > li > a { + display: block; + padding: var(--crm-dropdown-padding); + clear: both; + color: var(--crm-dropdown-col); + border-radius: var(--crm-roundness); + white-space: nowrap; +} +.crm-container .dropdown-menu > li:not(.disabled) > a i.crm-i { + padding-right: var(--crm-s); + color: var(--crm-dropdown-col); +} +.crm-container .dropdown-menu > li > a:hover, +.crm-container .dropdown-menu > li > a:focus, +.crm-container .dropdown-menu > .active > a, +.crm-container .dropdown-menu > .active > a:hover, +.crm-container .dropdown-menu > .active > a:focus { + color: var(--crm-dropdown-hover); + background-color: var(--crm-dropdown-hover-bg); + text-decoration: none; + border-radius: var(--crm-roundness); +} +.crm-container .dropdown-menu > li:not(.disabled) > a:hover i.crm-i, +.crm-container .dropdown-menu > li:not(.disabled) > a:focus i.crm-i { + color: var(--crm-dropdown-hover); +} +.crm-container .dropdown-menu > .disabled > a, +.crm-container .dropdown-menu > .disabled > a:hover, +.crm-container .dropdown-menu > .disabled > a:focus { + color: var(--crm-c-inactive); +} +.crm-container .dropdown-menu > .disabled > a:hover, +.crm-container .dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} +.crm-container .open > .dropdown-menu, +.crm-container .open .btn.dropdown-toggle + .dropdown-menu { + display: flex; + flex-direction: column; + gap: var(--crm-s); +} +.crm-container .open > a { + outline: 0; +} +.crm-container .dropdown-menu-right { + right: 0; + left: auto; +} +.crm-container .dropdown-menu-left { + right: auto; + left: 0; +} +.crm-container li.dropdown-header { + display: block; + padding: var(--crm-dropdown-padding); + white-space: nowrap; + color: var(--crm-dropdown-col); + font-family: var(--crm-font-bold); + font-weight: bold; + padding: var(--crm-m) var(--crm-xs) var(--crm-xs) !important; + border-bottom: 1px solid var(--crm-dropdown-col); + border-radius: 0; +} +.crm-container .pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.crm-container .dropup .caret, +.crm-container .navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; +} +.crm-container .dropup .dropdown-menu, +.crm-container .navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +.crm-container .nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.crm-container .open > .dropdown-menu { + display: block; +} +.crm-container .dropdown-menu { + position: absolute; + top: 100%; + /* left: 0; */ + z-index: 1000; + display: none; + float: left; + min-width: var(--crm-dropdown-width); + padding: var(--crm-dropdown-padding); + margin: 2px 0 0; + text-align: left; + list-style: none; + background-color: var(--crm-dropdown-bg); + background-clip: padding-box; + border: 1px solid var(--crm-dropdown-border); + border: 1px solid rgba(0, 0, 0, .15); + border-radius: var(--crm-roundness); + box-shadow: var(--crm-popup-shadow); +} +.crm-container .dropdown-menu.dropdown-menu-right { + right: 0; + left: unset; +} +.crm-container .dropdown-menu li input { + width: -moz-available; +} +@media (min-width: 768px) { + .crm-container .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .crm-container .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} + +/* Dropdown alert links */ + +#afGuiEditor .af-gui-bar .dropdown-menu a:has(.text-danger) { + display: flex; + justify-content: center; + background: var(--crm-dropdown-alert-bg); +} +#afGuiEditor .af-gui-bar .dropdown-menu .text-danger { + color: var(--crm-c-alert-text); +} + +/* JsTree Dropdown - all of Vakata Context, from jstree/dist has to be overwritten with !important */ + +.vakata-context { + min-width: var(--crm-dropdown-width); + background-color: var(--crm-dropdown-bg) !important; + border: 1px solid var(--crm-dropdown-border) !important; + border-radius: var(--crm-roundness); + box-shadow: var(--crm-popup-shadow) !important; + padding: var(--crm-dropdown-padding) !important; +} +.vakata-context li > a { + line-height: unset !important; + color: var(--crm-dropdown-col) !important; + text-shadow: none !important; + font-weight: normal !important; + padding: 0 !important; + border: 0 !important; + border-radius: var(--crm-roundness) !important; +} +.vakata-context li > a:hover, +.vakata-context .vakata-context-hover > a { + background-color: var(--crm-dropdown-hover-bg) !important; + box-shadow: none !important; + color: var(--crm-dropdown-hover) !important; +} +.vakata-context li > a > i { + margin: 0 !important; + line-height: inherit !important; + height: inherit !important; +} +.vakata-context li > a .vakata-contextmenu-sep { + border-left: 0 !important; + background: transparent !important; + height: auto !important; + width: auto !important; + margin: 0 !important; +} diff --git a/civicrm/ext/riverlea/core/css/components/_form.css b/civicrm/ext/riverlea/core/css/components/_form.css new file mode 100644 index 0000000000..ecf6793d02 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_form.css @@ -0,0 +1,834 @@ +/* Form parts */ +.crm-container div.crm-field-wrapper { + margin-bottom: var(--crm-r); +} +.crm-section { + padding: var(--crm-s); +} +.crm-container table.form-layout td, +.crm-container table.form-layout-compressed td, +.crm-form-block .crm-section { + padding: var(--crm-m) var(--crm-s2); + border: none !important /* vs contactSummary.css */; + height: auto; + vertical-align: top; +} +.crm-container div.form-layout-compressed { + display: flex; + gap: var(--crm-s); + padding: var(--crm-r) 0; + align-items: center; +} +.crm-container .crm-results-block-empty { + margin: var(--crm-padding-reg) 0; +} + +/* Labels */ +.crm-container .form-layout td.label, +.crm-container .form-layout-compressed td.label, +.crm-container .selector td.label, +.crm-container .form-layout-compressed th.label { + width: var(--crm-input-label-width); + text-align: var(--crm-input-label-align); + margin: var(--crm-m) var(--crm-m2) 0 0; + font-family: var(--crm-input-label-font); + font-weight: var(--crm-input-label-weight); + display: table-cell; +} +.crm-container .crm-summary-group .crm-section .label, +.crm-container label { + text-align: left; + font-family: var(--crm-input-label-font); + font-weight: var(--crm-input-label-weight); + padding-right: var(--crm-m2); +} +.crm-container .label > label { /* Fix for dble label specification */ + padding-right: 0; + text-align: unset; +} +.crm-container .crm-summary-group .crm-section .label { + width: 40%; +} +.crm-container .radio-inline label, +.crm-container .checkbox-inline label { + font-family: inherit; + font-weight: inherit; +} +.crm-container .form-layout label, +.crm-container .form-layout-compressed label, +.crm-container .form-item label, +.crm-container .crm-accordion-body label, +.crm-container .crm-form-block label, +.crm-container #task-section label { + color: var(--crm-input-label-color); + font-family: var(--crm-input-label-font); + font-weight: var(--crm-input-label-weight); + font-size: var(--crm-input-label-size); + display: inline-block; + margin-bottom: var(--crm-s); +} +.crm-container .form-layout td.label label { + margin-bottom: 0; +} +.crm-container .form-layout label:not(+ .helpicon) { + width: var(--crm-input-label-width); +} +.crm-contribution_search_form-accordion .form-layout label, +.crm-advanced_search_form-accordion .form-layout label, +.crm-search-form-block .form-layout label { + width: auto; +} +.crm-container .description:not(#help), +.crm-container td.description { + color: var(--crm-input-description); + font-size: var(--crm-input-label-size); + margin-bottom: var(--crm-flex-gap); +} +.crm-container .crm-marker { + color: var(--crm-c-alert); +} +.crm-container .form-inline { + padding: var(--crm-s) 0; +} +.crm-search-display .form-inline { + padding: var(--crm-padding-reg) 0; +} +/* Fieldset */ +.crm-container fieldset { + border: var(--crm-c-divider); +} +.crm-container fieldset:not(.collapsed, +.crm-inactive-dashlet-fieldset, +.crm-search-admin-edit-columns) { + padding: var(--crm-fieldset-padding); + margin: var(--crm-padding-reg) 0; + border: 1px solid var(--crm-fieldset-border-color); + border-width: var(--crm-fieldset-border); +} +.crm-container fieldset legend { + font-weight: bold; + font-family: var(--crm-font-bold); + padding-inline: var(--crm-s); + color: var(--crm-c-text); +} + +/* Required Mark */ +.crm-container .required-mark::after { + color: var(--crm-c-alert); + content: "*"; + margin-left: var(--crm-s); +} +/* Input */ + +.crm-container input.dateplugin, +.crm-container input.form-control, +input.crm-form-text, +input.crm-form-password, +.crm-icon-picker-button, +.crm-container .replace-plain, +.crm-container input, +.crm-container textarea, +select.crm-form-multiselect, +select.crm-form-select, +.crm-container .ui-widget input, +.crm-container select, +.ui-datepicker .ui-datepicker-header select { + transition: var(--crm-input-active-ani); + font-size: var(--crm-input-font-size); + background-color: var(--crm-input-background); + border-radius: var(--crm-input-border-radius); + box-shadow: var(--crm-input-box-shadow); + color: var(--crm-input-color); + border: 1px solid var(--crm-input-border-color); + padding: var(--crm-input-padding); + height: var(--crm-input-height); + width: var(--crm-big-input); + font-family: inherit; /* for extra JQuery UI protection */ +} +.crm-container .replace-plain, +.crm-container textarea, +select.crm-form-multiselect { + padding: var(--crm-input-padding-large); + height: auto; + min-height: var(--crm-input-height); + width: 100%; +} +.crm-container input.crm-form-color { + width: var(--crm-input-height); + padding: 0; + border: 1px solid var(--crm-c-darkest); +} +.crm-container .replace-plain { + background-color: var(--crm-c-background3); + min-width: var(--crm-huge-input); +} +input.crm-form-text:focus, +input.crm-form-password:focus, +select.crm-form-multiselect:focus, +select.crm-form-select:focus, +.crm-icon-picker-button:focus, +.crm-container input.form-control:focus, +.crm-container input.dateplugin:focus, +.crm-container .replace-plain:focus, +.crm-container textarea:focus, +.crm-container select[aria-controls]:focus, +.crm-container .select2-container-active *:focus, +.crm-container .select2-container-active a.select2-choice { + border-color: var(--crm-c-focus); + outline: 0; + box-shadow: none; +} +.crm-container input.error, +input.crm-error, +select.crm-error { + border-color: var(--crm-c-alert); +} +.crm-container :focus, +.crm-container .ui-dialog :focus { + border-color: var(--crm-c-focus); + box-shadow: none; +} +.crm-container input.crm-placeholder-icon::placeholder { + font-family: "FontAwesome"; + text-align: right; +} +.crm-icon-picker-button { + margin: 0 0 var(--crm-s); + display: flex; + align-items: center; + justify-content: center; + float: left; +} +.crm-container .crm-form-number { + width: auto; /* resets fixed width on input field with browser default */ +} + +/* Input size modifiers */ + +.crm-container .two { + width: 3rem; /* .two is used on number inputs that need 1rem for the controls */ +} +.crm-container .four { + width: 4rem; +} +.crm-container .six { + width: 6rem; +} +.crm-container .eight { + width: 8rem; +} +.crm-container .twelve, +.crm-container .medium { + width: 12rem; +} +.crm-container .twenty { + width: 20rem; +} +.crm-container .big { + width: var(--crm-big-input); +} +.crm-container .huge, +input.crm-form-autocomplete, +input.crm-form-entityref { + width: var(--crm-huge-input); +} + +/* Inline edit */ + +.crm-inline-edit { + border: var(--crm-dash-edit-border); + border-color: transparent; + background: none; + position: relative; +} +.crm-container .crm-editable-form { + display: flex; +} +.crm-container .crm-editable-form input { + height: var(--crm-input-height); + box-shadow: var(--crm-input-box-shadow); + padding: var(--crm-input-padding); + font-size: var(--crm-input-font-size); +} +.crm-container .crm-editable-form button { + background: transparent; + padding: var(--crm-padding-small); +} +.crm-container .crm-editable-form [type="submit"] { + color: var(--crm-c-success) !important; +} +.crm-container .crm-editable-form [type="cancel"] { + color: var(--crm-c-alert) !important; +} +/* in place edit */ +.crm-container .crm-inline-edit, +.crm-container .crm-editable-disabled, +.crm-container .crm-editable-enabled { + border: var(--crm-dash-edit-border); + border-color: transparent; +} +.crm-container .crm-editable-textarea-enabled { + white-space: normal; +} +.crm-container .crm-inline-edit:hover, +.crm-container .crm-editable-enabled:hover { + border: var(--crm-dash-edit-border); + cursor: var(--crm-hover-clickable); +} +.crm-container .crm-editable-enabled.crm-editable-editing:hover { + border-color: transparent; + cursor: auto; +} +.crm-container span.crm-editable-disabled, +.crm-container span.crm-editable-enabled { + display: inline-block; + padding-right: var(--crm-s); + min-height: var(--crm-r); + min-width: 3em; +} +.crm-container .crm-editable-enabled .crm-i { + opacity: .5; +} +.crm-container .replace-plain a:active:before, +.crm-container .replace-plain:focus:before, +.crm-container .replace-plain:hover:before, +.crm-container .crm-editable-enabled:hover .crm-i { + opacity: 1; +} +.crm-container .crm-editable-saving { + background: #ffffcc!important; + opacity: 0.8; +} +.crm-editable-form { + margin: 0; + padding: 0; + width: auto !important; + /* position: relative; */ + overflow: visible; + display: flex; + gap: 0; + flex-direction: row; +} +.crm-editable-form > * { + margin: 0; +} +.crm-editable-form input { + min-width: 14ch; +} +.crm-container .crm-editable-form button { + padding: 0 !important; +} +.crm-container .crm-editable-form button i.crm-i { + margin: 0; + border: 0; +} + +/* Checkboxes & radios */ + +input.crm-form-radio + label, +input.crm-form-checkbox + label, +.crm-container input[type="checkbox"] + label[for], +.crm-container input[type="radio"] + label[for] { + margin: 0 var(--crm-m) 0 var(--crm-s); + cursor: var(--crm-hover-clickable); + width: unset; + font-weight: normal; + font-family: var(--crm-font); +} +.crm-container input[type="checkbox"], +.crm-container input[type="radio"] { + accent-color: var(--crm-input-radio-color); + margin: -2px 4px 0 0; + width: auto; + appearance: auto; + height: auto; + box-shadow: none; +} +/* Checkbox/radio fields with n-per-line. See https://lab.civicrm.org/dev/core/-/issues/4985 */ +.crm-container .crm-multiple-checkbox-radio-options { + --gap: 1em; + --checkbox-width: 2em; + display: flex; + flex-wrap: wrap; + gap: var(--gap); +} +/* Override more general styling */ +.crm-container .crm-multiple-checkbox-radio-options :where(input.crm-form-radio, +input.crm-form-checkbox) + label { + margin-left: 0; +} +.crm-container .crm-multiple-checkbox-radio-options .crm-option-label-pair { + display: grid; + grid-template-columns: var(--checkbox-width) 1fr; + align-items: baseline; +} +.crm-container .crm-multiple-checkbox-radio-options.crm-options-per-line .crm-option-label-pair { + flex: 0 0 calc((100% - (var(--crm-opts-per-line) - 1) * var(--gap)) / var(--crm-opts-per-line)); +} +/* Slider */ +.crm-container .ui-slider { + background: var(--crm-c-background4); +} +.crm-container .ui-slider .ui-slider-handle { + border: 0; + background: var(--crm-c-background5); +} + +/* Input types */ + +.crm-container input[type="file"] { + height: auto; + padding: var(--crm-s); +} + +/* Select2 */ + +.crm-container .select2-container:not(.select2-container-multi, +.collapsible-optgroups) { + width: auto; + max-width: 100%; +} +.crm-container .select2-container { + width: var(--crm-big-input) !important /* vs inline fixed width */; +} +.crm-container .select2-container-multi { + min-width: 96px; + max-width: 100%; +} +.crm-container select.form-control, +.crm-container .select2-container-multi .select2-choices, +.crm-container .select2-container .select2-choice { + background: var(--crm-input-background); + border: 1px solid var(--crm-input-border-color); + border-radius: var(--crm-input-border-radius); + box-shadow: var(--crm-input-box-shadow); + height: var(--crm-input-height) !important /* vs select2.min.css */; + padding: var(--crm-input-padding); + font-size: var(--crm-input-font-size); + color: var(--crm-input-color); + display: flex; + align-items: center; + margin-right: 0; +} +.crm-container .select2-container .select2-choice .select2-arrow { + background: transparent; + border-left: 0; + border-radius: 0 var(--crm-input-border-radius) var(--crm-input-border-radius) 0; + width: var(--crm-r3); + display: flex; + justify-content: center; + align-items: center; +} +.crm-container .select2-container .select2-choice .select2-arrow b { + display: none; +} +.select2-container.select2-allowclear .select2-choice abbr { + position: relative; + margin-left: auto; + right: var(--crm-r); + top: auto; +} +.crm-container .select2-container-multi .select2-choices::before, +.crm-container .select2-container .select2-choice .select2-arrow::before { + font-family: "Font Awesome 6 Free", "Font Awesome 6 Brands", "FontAwesome"; + font-style: normal; + text-rendering: auto; + color: var(--crm-c-text); + background: none; + content: var(--crm-input-dropdown-icon); +} +.crm-container .select2-container-multi .select2-choices::before { + margin-left: auto; + order: 1; +} +.crm-container .select2-dropdown-open .select2-choice, +.crm-container .select2-dropdown-open .select2-choices { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-color: var(--crm-c-focus); + box-shadow: none; +} +.crm-container .select2-container-multi .select2-choices .select2-search-field input { + font-family: var(--crm-font); + line-height: normal; + margin: 0; + padding: 0; + min-height: unset; + height: unset; + color: var(--crm-input-color); +} +.crm-container .select2-default { + color: var(--crm-input-color) !important /* vs important in select2.min.css */; +} +.crm-container .select2-container-multi .select2-choices .select2-search-field input.select2-default { + color: var(--crm-input-color); +} +.select2-container-disabled a { + box-shadow: none; + background: var(--crm-c-page-background); +} +.select2-container-disabled .select2-arrow { + background: transparent; +} +.crm-container .select2-container.select2-container-disabled .select2-choice { + background-color: var(--crm-c-background); + border: 1px dotted var(--crm-c-inactive); + cursor: default; +} +.select2-container.select2-container-disabled .select2-choice .select2-arrow { + border-left: 0; + background: var(--crm-c-background); +} +.crm-container .select2-container-multi .select2-choices { + display: flex; + flex-flow: wrap; + gap: var(--crm-s); + padding: 2px var(--crm-s); + align-items: center; + font-size: var(--crm-input-font-size); + min-height: var(--crm-input-height); + height: auto !important; +} +.select2-container-multi .select2-choices .select2-search-field { + max-width: calc(100% - 2rem); +} +.select2-container-multi .select2-choices .select2-search-choice { + padding: 1px var(--crm-m) 1px var(--crm-r1); + margin: 0; + position: relative; + line-height: unset; + color: var(--crm-c-text); + cursor: default; + border: var(--crm-c-divider); + border-radius: var(--crm-roundness); + background-clip: padding-box; + user-select: none; + background-color: var(--crm-form-select-bg); + background-image: none; + box-shadow: none; +} +.select2-container-multi .select2-choices .select2-search-choice p { + margin: 0; +} +.select2-container .crm-select2-row-description { + display: none; +} +.select2-input.select2-default { + width: auto; +} +.select2-container-multi.loading .select2-choices::before, +.select2-container.loading .select2-choice .select2-arrow b { + content: "\f110"; + position: absolute; + right: var(--crm-m); + top: var(--crm-s); + animation-name: fa-spin; + animation-duration: var(--fa-animation-duration,2s); + animation-iteration-count: var(--fa-animation-iteration-count,infinite); + animation-timing-function: var(--fa-animation-timing,linear); +} + +/* Select dropdown */ + +.select2-drop.select2-drop-active.crm-container { + background: var(--crm-input-background); + border-bottom-left-radius: var(--crm-roundness); + border-bottom-right-radius: var(--crm-roundness); + border-color: var(--crm-c-focus); + right: -1px; +} +.select2-drop.select2-drop-active.crm-container.select2-drop-above { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.select2-search::after { + font-family: "FontAwesome"; + font-style: normal; + text-rendering: auto; + font-size: .8em; + color: #4d4d69; + color: #464354; + content: ""; + font-size: 14px; + position: relative; + right: 20px; +} +.select2-search input { + background-image: none !important; + border-color: #66afe9; + font-family: var(--crm-font); + line-height: 20px; + max-width: 100%; +} +.crm-container .select2-results { + font-size: var(--crm-m2); + padding: 0; + margin: 0; +} +.select2-drop.select2-drop-active.crm-container .select2-results li { + color: var(--crm-c-text); + padding-block: var(--crm-s); + border-top: 1px solid var(--crm-c-background4); + margin: 0; +} +.select2-results .select2-ajax-error, +.select2-results .select2-no-results, +.select2-results .select2-searching, +.select2-results .select2-selection-limit { + background: var(--crm-input-background); +} +.select2-drop.select2-drop-active.crm-container .select2-results .select2-highlighted { + background: var(--crm-c-drag-background); +} +.select2-drop.select2-drop-active.crm-container .crm-entityref-filters select, +.select2-drop.select2-drop-active.crm-container .crm-entityref-filters input { + background: var(--crm-c-background); + border: 1px solid var(--crm-input-border-color); + border-radius: var(--crm-roundness); + box-sizing: border-box; + height: var(--crm-l); + margin-top: var(--crm-s); +} +.select2-drop.select2-drop-active.crm-container .select2-results > li { + color: var(--crm-c-text); + padding: var(--crm-m); + border-top: 0; +} +.select2-drop .crm-entityref-links { + border-top: 1px solid var(--crm-input-border-color); + margin-top: var(--crm-m); +} +.crm-container .select2-results .select2-result-label { + font-size: var(--crm-input-font-size); + padding: var(--crm-s) var(--crm-m); + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; +} +.crm-container .select2-results > li .select2-result-label { + padding: 0; +} +.select2-results li.select2-result-with-children > .select2-result-label { + font-weight: bold; + font-family: var(--crm-font-bold); + background: var(--crm-c-background3); + padding: var(--crm-s); +} +.crm-container .crm-select2-row-description p { + font-weight: normal; + font-family: var(--crm-font); + font-size: var(--crm-m2); + margin: 0; + padding: 0; +} + +/* Dates */ + +.form-inline:has(.crm-form-date-wrapper) { + display: flex; + align-items: center; + gap: var(--crm-xs); +} +.crm-form-date-wrapper { + display: flex; + align-items: center; + flex-flow: wrap; + gap: var(--crm-flex-gap); +} +.crm-container input.crm-form-time { + width: 9ch; +} +.crm-container input.dateplugin, +.crm-container input.crm-form-date, +#bootstrap-theme input.dateplugin, +#bootstrap-theme .input-group input.crm-form-date { + width: 14ch; +} +.crm-form-date-wrapper a.crm-clear-link { + display: flex; + align-items: center; +} +.crm-container input.crm-placeholder-icon { + padding-right: var(--crm-m); +} +.ui-datepicker, +.ui-datepicker * { + border-radius: 0; + font-family: var(--crm-font); + height: unset; +} +.ui-datepicker { + background: var(--crm-input-background) !important; + border-radius: 0; + box-shadow: var(--crm-popup-shadow); + min-width: 30ch; + padding: var(--crm-m1); + width: auto; + z-index: 100003 !important; /* vs menubar for datepickers in modals */ +} +.ui-datepicker .ui-datepicker-header { + border: 0; + margin-bottom: var(--crm-s); +} +.ui-datepicker :not(b) { + background: none !important; + border: 0 solid transparent !important; +} +.ui-datepicker .ui-datepicker-header .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-header .ui-datepicker-next { + border-radius: var(--crm-roundness); + box-shadow: none !important; + cursor: var(--crm-hover-clickable); + text-align: center; + top: var(--crm-s3); + border: 0 solid transparent; +} +.ui-datepicker-next.ui-corner-all:hover, +.ui-datepicker-prev.ui-corner-all:hover { + background: var(--crm-c-gray-100) !important; + border: 0 solid transparent; +} +.ui-datepicker .ui-datepicker-header .ui-datepicker-prev::before, +.ui-datepicker .ui-datepicker-header .ui-datepicker-next::before { + font-family: "FontAwesome"; + color: var(--crm-c-text); + font-size: var(--crm-small-font-size); + line-height: var(--crm-l); + padding: 0; +} +.ui-datepicker .ui-datepicker-prev::before { + content: ""; +} +.ui-datepicker .ui-datepicker-next::before { + content: ""; +} +.ui-datepicker .ui-datepicker-header select { + font-family: var(--crm-font); + margin: 0 var(--crm-m1); + padding-left: 5px !important; + font-size: var(--crm-m3); + width: 7ch; +} +.ui-datepicker-calendar thead tr { + border-top: 1px solid var(--crm-c-gray-300); +} +.ui-datepicker-calendar thead th { + color: var(--crm-c-text); + font-size: var(--crm-small-font-size); +} +.ui-datepicker-calendar tr { + border-bottom: none; +} +.ui-datepicker-calendar [data-handler], +.ui-datepicker-calendar .ui-state-disabled { + background-color: var(--crm-gray-50) !important; + border: 0; + font-size: var(--crm-small-font-size); + opacity: 1; + padding: var(--crm-s); +} +.ui-datepicker-calendar .ui-state-disabled { + opacity: 0.35; +} +.ui-datepicker-calendar [data-handler] .ui-state-active, +.ui-datepicker-calendar .ui-state-disabled .ui-state-active { + background-color: var(--crm-c-primary) !important; + color: var(--crm-c-primary-text) !important; +} +.ui-datepicker-calendar [data-handler] a, +.ui-datepicker-calendar .ui-state-disabled a { + border: 0; + border-radius: 20px; + cursor: var(--crm-hover-clickable); + padding: var(--crm-s); + text-align: center; +} + +/* JQ spinner */ + +.crm-container .ui-spinner input, +#crm-search-results-page-size /* SK pagination */ { + width: 8ch; +} +.crm-container .ui-spinner a.ui-spinner-button { + width: var(--crm-r2); + margin: 1px; + cursor: var(--crm-hover-clickable); + color: var(--crm-c-link); + border-radius: 0; + border-left: 1px solid var(--crm-input-border-color); +} +.crm-container .ui-spinner a.ui-spinner-button:hover, +.crm-container .ui-spinner a.ui-spinner-button:focus { + color: var(--crm-c-light-text); +} +.crm-container .ui-spinner a.ui-spinner-button span::before { + font-family: "FontAwesome"; + font-style: normal; + font-weight: normal; + font-size: var(--crm-m3); + text-indent: 0; + display: block; +} +.crm-container .ui-spinner a.ui-spinner-up { + border-top-right-radius: var(--crm-input-border-radius); +} +.crm-container .ui-spinner a.ui-spinner-down { + border-bottom-right-radius: var(--crm-input-border-radius); +} +.crm-container .ui-spinner a.ui-spinner-up span::before { + content: var(--crm-icon-sort-asc); + margin-top: 3px; +} +.crm-container .ui-spinner a.ui-spinner-down span::before { + content: var(--crm-icon-sort-desc); + margin-top: -4px; +} + +/* BS3 radio/checklbox */ + +#bootstrap-theme .radio, +#bootstrap-theme .checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +#bootstrap-theme .radio.disabled label, +#bootstrap-theme fieldset[disabled].radio label, +#bootstrap-theme .checkbox.disabled label, +#bootstrap-theme fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +#bootstrap-theme .radio label, +#bootstrap-theme .checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + cursor: var(--crm-hover-clickable); +} +#bootstrap-theme .radio + .radio, +#bootstrap-theme .checkbox + .checkbox { + margin-top: -5px; +} +#bootstrap-theme .radio-inline, +#bootstrap-theme .checkbox-inline { + position: relative; + display: inline-block; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: var(--crm-hover-clickable); +} +#bootstrap-theme .radio-inline.disabled, +fieldset[disabled] #bootstrap-theme .radio-inline, +#bootstrap-theme .checkbox-inline.disabled, +fieldset[disabled] #bootstrap-theme .checkbox-inline { + cursor: not-allowed; +} +#bootstrap-theme .radio-inline + .radio-inline, +#bootstrap-theme .checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: var(--crm-m); +} diff --git a/civicrm/ext/riverlea/core/css/components/_front.css b/civicrm/ext/riverlea/core/css/components/_front.css new file mode 100644 index 0000000000..390095effb --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_front.css @@ -0,0 +1,219 @@ +/* Front-end specific */ + +/* General */ + +.crm-container.crm-public { + --crm-font: inherit; + --crm-font-bold: inherit; + --crm-font-italic: inherit; + --crm-font-bold-italic: inherit; +} +.crm-container.crm-public #crm-main-content-wrapper { + margin-inline: auto; + width: clamp(calc(var(--crm-f-form-width) / 2),100%,var(--crm-f-form-width)); +} +.crm-container.crm-public fieldset:not(.collapsed, +.crm-inactive-dashlet-fieldset, +.af-container-style-pane), +.crm-container.crm-public .crm-event-info-form-block, +.crm-container.crm-public #crm-profile-block, +.crm-container.crm-public .crm-container.crm-public .af-container:not(.af-container-style-pane), +.crm-container.crm-public .email-5-section { + background-color: var(--crm-f-fieldset-bg); + margin: var(--crm-f-fieldset-margin); + padding: var(--crm-f-fieldset-padding); + border: var(--crm-f-fieldset-border); + box-shadow: var(--crm-f-box-shadow); +} +.crm-container.crm-public fieldset legend { + padding-block: var(--crm-f-fieldset-padding); + font-size: var(--crm-f-legend-size); + text-align: var(--crm-f-legend-align); +} +af-form > fieldset > legend { + position: relative; + top: calc(2 * var(--crm-f-fieldset-padding)); + margin-bottom: var(--crm-f-fieldset-padding); + width: 100%; + float: none; +} +.crm-container.crm-public .header-dark { + background: var(--crm-c-secondary); + color: var(--crm-c-light-text); + padding: var(--crm-m1) var(--crm-f-fieldset-padding); + font-family: var(--crm-font-bold); + font-weight: bold; + font-size: var(--crm-r1); + border-radius: var(--crm-roundness); +} +.crm-contribution-confirm-form-block fieldset legend:has(~ .header-dark) { + display: none; /* fix for duplication on confirmation screen of legend text with Header Dark text */ +} +.crm-container.crm-public .crm-section { + padding: 0; +} +.crm-container.crm-public fieldset > fieldset, +.crm-container.crm-public fieldset:has(> fieldset) { + padding-top: 0; +} +.crm-container.crm-public .af-container:not(.af-container-style-pane) .af-container:not(.af-container-style-pane), +.crm-container.crm-public fieldset .crm-form-block { + box-shadow: none !important; /* vs _page.css */ +} +.crm-container.crm-public h3 { + background: transparent; + padding: 0; +} +.crm-container.crm-public .form-layout-compressed { + display: block; +} +.crm-container.crm-public span#msgbox { + border-radius: var(--crm-roundness); + padding: var(--crm-padding-small); +} +.crm-container.crm-public #civicrm-footer::after { + display: none; +} +/* Input */ +.crm-container.crm-public .crm-section:has( > .label) { + padding: var(--crm-f-form-padding); + display: var(--crm-f-form-layout); + grid-template-columns: var(--crm-f-label-width) 1fr 0; + margin: 0 calc(-1 * var(--crm-f-form-padding)); +} +.crm-container.crm-public .crm-section:has( > .content input:focus), +.crm-container.crm-public .crm-section:has( > .content select:focus), +.crm-container.crm-public .crm-section:has( > .content textarea:focus) { + background-color: var(--crm-f-form-focus-bg); +} +.crm-container.crm-public .crm-section:has( > .content input.error), +.crm-container.crm-public .crm-section:has( > .content textarea.error), +.crm-container.crm-public .crm-section:has( > .content select.error), +.crm-container.crm-public .crm-section:has( > .content input.crm-inline-error), +.crm-container.crm-public .crm-section:has( > .content textarea.crm-inline-error), +.crm-container.crm-public .crm-section:has( > .content select.crm-inline-error) { + background-color: var(--crm-f-form-error-bg); +} +.crm-container.crm-public input[type="text"], +.crm-container.crm-public input[type="password"], +.crm-container.crm-public input[type="email"], +.crm-container.crm-public input, +.crm-container.crm-public select, +.crm-container.crm-public textarea, +.crm-container.crm-public .select2-container .select2-choice { + border-radius: var(--crm-f-input-radius); + padding: var(--crm-f-input-padding); + font-size: var(--crm-f-input-font-size); + min-width: var(--crm-f-input-width); +} +.crm-container.crm-public .select2-search input[type="text"] { + min-width: unset; +} +.crm-container.crm-public input[type="radio"] { + margin: var(--crm-s2) var(--crm-s3) 0 0; + min-width: auto; +} +.crm-container.crm-public input[type="checkbox"] { + margin: var(--crm-s2) var(--crm-s3) 0 0; + float: left; + min-width: auto; +} +.crm-container.crm-public .crm-checkbox-list input[type="checkbox"] { + margin: inherit; /* resets margin in checkbox list grids */ +} +.crm-container.crm-public .big { + width: var(--crm-f-input-width); +} +.crm-container.crm-public .select2-search input, +.crm-container.crm-public .select2-results select, +.crm-container.crm-public .select2-results input { + padding: var(--crm-s) var(--crm-r1) var(--crm-s); +} +.crm-container.crm-public .select2-dropdown-open .select2-choice, +.crm-container.crm-public .select2-dropdown-open .select2-choices { + border-radius: var(--crm-f-input-radius) var(--crm-f-input-radius) 0 0; +} +.crm-container.crm-public .crm-submit-buttons { + padding-inline: 0; +} +/* Afform */ +.crm-container.crm-public af-field { + padding-block: var(--crm-f-form-padding); + display: block; +} +.crm-container.crm-public .af-container.af-layout-inline, +.crm-container.crm-public .af-container.af-layout-cols { + padding: var(--crm-f-form-padding); +} +/* Contribution pages */ +.crm-container.crm-public .other_amount-section { + padding-top: 0; +} +.crm-container.crm-public table#membership-listings { + border: 0; +} +.crm-container.crm-public .amount_display-group .display-block, +.crm-container.crm-public .event_fees-group > .crm-section { + padding: var(--crm-f-form-padding); +} +.crm-container.crm-public #attachments table.form-layout-compressed { + margin-block: var(--crm-m) 0; +} +.crm-container.crm-public #attachments table.form-layout-compressed tr { + display: flex; + flex-direction: column; + gap: var(--crm-s); +} +.crm-container.crm-public #attachments table.form-layout-compressed td { + width: 100%; + padding: 0; + text-align: var(--crm-f-label-align); +} +.crm-container.crm-public .crm-profile-view-title { + padding-inline: var(--crm-f-form-padding); + font-size: var(--crm-r1); +} +/* Empowered by logo */ + +.crm-public-footer { + display: flex; + align-items: center; + justify-content: var(--crm-f-logo-align); + gap: var(--crm-s); + width: var(--crm-f-form-width); + margin: 0 auto; +} +.crm-container a.empowered-by-link { + background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg id='Layer_1' data-name='Layer 1' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 229.76 59.78'%3E%3Cdefs%3E%3Cstyle%3E .cls-1 %7B fill: %23086287; %7D .cls-2 %7B fill: %2381c459; %7D %3C/style%3E%3C/defs%3E%3Cg%3E%3Cpath class='cls-1' d='m191.47,59.78h0c-3.77-.07-5.2-4.43-5.35-4.92l-12.85-42.11c-.76-2.47-.58-4.46.51-5.92.71-.94,2.12-2.04,4.83-1.99.99.02,1.77.19,1.85.21l42.78,9.97c2.75.64,4.44,1.94,5.02,3.85.93,3.04-1.65,5.92-1.95,6.24l-29.94,32.12c-1.59,1.72-3.25,2.58-4.9,2.55Zm-13.07-50.53c-.77,0-1.02.19-1.06.26-.22.31-.26.44.19,1.93l12.85,42.11c.29.9.76,1.74,1.18,1.77h0s.52,0,1.57-1.13l29.94-32.12c.55-.61,1.06-1.6.95-1.9-.08-.22-.43-.5-1.77-.81l-42.78-9.97h0s-.56-.13-1.07-.14Z'/%3E%3Cpath class='cls-2' d='m186.66,56.35c-1.38.51-2.83.61-3.96.24h0c-3.57-1.17-3.68-5.74-3.68-6.26V9.33l4.21.94.02,40.15c0,.94.25,1.84.83,1.94h0s.3.09,1.15-.3l1.43,4.29Zm2.57-6.52l34.62-20.03c.7-.42,1.53-1.04,1.46-1.54,0-.07-.17-.52-.92-1.05l2.9-3.3c1.64,1.25,2.47,2.71,2.47,4.35,0,3.17-3.3,5.17-3.68,5.39l-35.51,20.4-1.34-4.22Zm31.12-24.89l-34.02-19.79s-.85-.54-1.34-.7c-.73-.24-1.08,0-1.15.05-.2.14-.27.24-.35,1.24l-4.38-.82c.24-1.82.95-3.17,2.12-4.03.95-.69,2.62-1.33,5.19-.5.94.31,1.63.7,1.71.74l35.39,20.42-3.17,3.39Z'/%3E%3C/g%3E%3Cpath class='cls-1' d='m158.23,22.34c-.48-.28-.86-.67-1.15-1.15-.28-.48-.42-1-.42-1.57s.14-1.09.42-1.57.66-.86,1.15-1.15,1-.42,1.57-.42,1.09.14,1.57.42.86.66,1.15,1.15.42,1,.42,1.57-.14,1.09-.42,1.57-.66.86-1.15,1.15-1,.42-1.57.42-1.09-.14-1.57-.42Zm2.91-.4c.41-.24.74-.57.98-.98.24-.41.36-.86.36-1.35s-.12-.93-.36-1.34-.57-.73-.98-.98c-.41-.24-.86-.36-1.35-.36s-.93.12-1.34.36-.73.57-.98.98c-.24.41-.36.85-.36,1.34s.12.94.36,1.35c.24.41.57.74.98.98s.85.36,1.34.36c.49.01.94-.12,1.35-.36Zm-2.56-.62c-.06-.05-.08-.12-.08-.21v-2.83c0-.11.04-.21.11-.28s.17-.12.28-.12h1.05c.46,0,.8.1,1.03.29s.34.45.34.76c0,.21-.06.39-.18.53s-.28.25-.46.32c.16.06.3.18.42.35.12.18.18.42.18.74v.24c0,.08-.03.15-.09.21s-.13.09-.21.09-.15-.03-.21-.09c-.06-.06-.09-.13-.09-.21v-.16c0-.25-.04-.46-.11-.63s-.25-.26-.53-.26h-.95v1.06c0,.08-.03.15-.09.21s-.13.08-.21.08c-.08,0-.15-.03-.2-.09Zm1.33-1.78c.25,0,.45-.05.6-.15.15-.1.22-.25.22-.44,0-.18-.06-.32-.19-.42s-.34-.14-.65-.14h-.81v1.15h.83Z'/%3E%3Cg%3E%3Cpath class='cls-1' d='m6.93,44.07c-2.15-1.18-3.85-2.87-5.08-5.08s-1.85-4.79-1.85-7.74.62-5.53,1.85-7.74,2.93-3.9,5.08-5.08,4.58-1.77,7.29-1.77c1.84,0,3.49.22,4.94.65,1.45.43,2.89,1.06,4.33,1.87.6.32.89.84.89,1.54,0,.41-.15.77-.45,1.08-.3.31-.69.47-1.18.47-.27,0-.51-.05-.73-.16-1.19-.62-2.36-1.1-3.49-1.42-1.14-.32-2.45-.49-3.94-.49-2.33,0-4.31.48-5.95,1.44s-2.87,2.28-3.7,3.94c-.83,1.67-1.24,3.55-1.24,5.67s.41,4,1.24,5.67,2.06,2.98,3.7,3.94c1.64.96,3.62,1.44,5.95,1.44,1.49,0,2.8-.16,3.94-.49,1.14-.32,2.3-.8,3.49-1.42.22-.11.46-.16.73-.16.49,0,.88.15,1.18.45.3.3.45.66.45,1.1,0,.7-.3,1.22-.89,1.54-1.44.81-2.88,1.44-4.33,1.87s-3.09.65-4.94.65c-2.71,0-5.14-.59-7.29-1.77Z'/%3E%3Cpath class='cls-1' d='m28.68,19.87c-.41-.41-.61-.89-.61-1.46v-.16c0-.57.2-1.06.61-1.46.41-.41.89-.61,1.46-.61h.24c.57,0,1.06.2,1.46.61s.61.89.61,1.46v.16c0,.57-.2,1.06-.61,1.46-.41.41-.89.61-1.46.61h-.24c-.56,0-1.05-.2-1.46-.61Zm.25,25.23c-.35-.35-.53-.79-.53-1.3v-17.42c0-.51.18-.96.53-1.32.35-.37.79-.55,1.3-.55.54,0,.99.18,1.34.53s.53.8.53,1.34v17.43c0,.51-.18.95-.55,1.3-.37.35-.81.53-1.32.53-.52,0-.95-.18-1.3-.54Z'/%3E%3Cpath class='cls-1' d='m43.71,45.21c-.41-.28-.7-.64-.89-1.08l-7.07-16.9c-.14-.32-.2-.61-.2-.85,0-.51.18-.96.53-1.32.35-.37.79-.55,1.3-.55.35,0,.68.1,1,.3.31.2.53.45.67.75l6.22,15.76,6.22-15.76c.14-.3.36-.55.67-.75s.64-.3,1-.3c.51,0,.95.18,1.3.55.35.37.53.81.53,1.32,0,.24-.07.53-.2.85l-7.07,16.9c-.19.43-.49.79-.89,1.08s-.85.43-1.34.43h-.41c-.51-.01-.96-.15-1.37-.43Z'/%3E%3Cpath class='cls-1' d='m58.71,19.87c-.41-.41-.61-.89-.61-1.46v-.16c0-.57.2-1.06.61-1.46.41-.41.89-.61,1.46-.61h.24c.57,0,1.06.2,1.46.61s.61.89.61,1.46v.16c0,.57-.2,1.06-.61,1.46-.41.41-.89.61-1.46.61h-.24c-.57,0-1.06-.2-1.46-.61Zm.24,25.23c-.35-.35-.53-.79-.53-1.3v-17.42c0-.51.18-.96.53-1.32.35-.37.79-.55,1.3-.55.54,0,.99.18,1.34.53s.53.8.53,1.34v17.43c0,.51-.18.95-.55,1.3-.37.35-.81.53-1.32.53-.51,0-.95-.18-1.3-.54Z'/%3E%3Cpath class='cls-1' d='m72.86,44.07c-2.15-1.18-3.85-2.87-5.08-5.08s-1.85-4.79-1.85-7.74.62-5.53,1.85-7.74c1.23-2.21,2.93-3.9,5.08-5.08s4.58-1.77,7.29-1.77c1.84,0,3.49.22,4.94.65,1.45.43,2.89,1.06,4.33,1.87.6.32.89.84.89,1.54,0,.41-.15.77-.45,1.08-.3.31-.69.47-1.18.47-.27,0-.51-.05-.73-.16-1.19-.62-2.36-1.1-3.49-1.42-1.14-.32-2.45-.49-3.94-.49-2.33,0-4.31.48-5.95,1.44s-2.87,2.28-3.7,3.94c-.83,1.67-1.24,3.55-1.24,5.67s.41,4,1.24,5.67c.83,1.67,2.06,2.98,3.7,3.94s3.62,1.44,5.95,1.44c1.49,0,2.8-.16,3.94-.49,1.14-.32,2.3-.8,3.49-1.42.22-.11.46-.16.73-.16.49,0,.88.15,1.18.45.3.3.45.66.45,1.1,0,.7-.3,1.22-.89,1.54-1.44.81-2.88,1.44-4.33,1.87-1.45.43-3.09.65-4.94.65-2.7,0-5.13-.59-7.29-1.77Z'/%3E%3Cpath class='cls-1' d='m95.11,45.1c-.35-.35-.53-.79-.53-1.3v-24.86c0-.51.18-.96.53-1.32s.79-.55,1.3-.55h9.47c3.68,0,6.45.76,8.29,2.28s2.76,3.51,2.76,5.97c0,1.62-.45,3.11-1.36,4.45s-2.23,2.31-3.96,2.9c1.95.51,3.28,1.73,4,3.64.72,1.91,1.08,3.79,1.08,5.63v1.87c0,.51-.18.95-.53,1.3-.35.35-.79.53-1.3.53-.57,0-1.02-.17-1.36-.51-.34-.34-.51-.78-.51-1.32v-1.22c0-1.35-.12-2.61-.37-3.76s-.83-2.18-1.75-3.09c-.92-.91-2.32-1.36-4.18-1.36h-8.41v9.43c0,.51-.18.95-.55,1.3s-.81.53-1.32.53c-.52,0-.95-.18-1.3-.54Zm10.52-14.21c2.33,0,4.18-.46,5.55-1.38,1.37-.92,2.05-2.22,2.05-3.9s-.59-2.87-1.77-3.74c-1.18-.87-3.19-1.3-6.03-1.3h-7.15v10.32h7.35Z'/%3E%3Cpath class='cls-1' d='m121.92,45.1c-.35-.35-.53-.79-.53-1.3v-24.25c0-.73.26-1.36.77-1.89.51-.53,1.14-.79,1.87-.79h1.34c.54,0,1.04.16,1.48.49.45.33.78.73,1,1.22l9.22,22.99,9.22-22.99c.22-.49.55-.89,1-1.22.45-.32.94-.49,1.48-.49h1.34c.73,0,1.35.26,1.87.79.51.53.77,1.16.77,1.89v24.25c0,.51-.18.95-.53,1.3-.35.35-.79.53-1.3.53s-.96-.18-1.32-.53c-.37-.35-.55-.79-.55-1.3v-23.07l-9.38,23.2c-.22.51-.56.93-1.04,1.24-.47.31-1,.47-1.56.47s-1.09-.16-1.56-.47-.82-.72-1.04-1.24l-9.38-23.2v23.08c0,.51-.18.95-.55,1.3s-.81.53-1.32.53c-.51-.01-.95-.18-1.3-.54Z'/%3E%3C/g%3E%3C/svg%3E"); + background-repeat: no-repeat; + display: inline-block; + height: var(--crm-f-logo-height); + width: calc(var(--crm-f-logo-height) * 3.5); +} +.crm-container div.empowered-by-logo span { + visibility: hidden; +} +@media (min-width: 480px) { + .crm-container.crm-public { + --crm-page-padding: var(--crm-f-form-padding); + } + .crm-container.crm-public .crm-section .label { + float: none; + width: inherit; + text-align: var(--crm-f-label-align); + font-weight: var(--crm-f-label-weight); + } + .crm-container.crm-public .crm-section .content { + margin-left: 0; + } +} +@media (max-width: 479px) { + .crm-container.crm-public { + --crm-f-input-width: 100%; + --crm-page-padding: 0; + width: 100%; + } + .crm-container af-field { + width: 100%; + } +} diff --git a/civicrm/ext/riverlea/core/css/components/_icons.css b/civicrm/ext/riverlea/core/css/components/_icons.css new file mode 100644 index 0000000000..3762eaaffa --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_icons.css @@ -0,0 +1,351 @@ +.crm-container .messages .crm-i { + padding: 0 var(--crm-m) var(--crm-s) 0; + float: left; +} +.crm-container div:not(.crm-search-display-editable-buttons) > button.btn-xs:has(.fa-times), +#bootstrap-theme button.btn-xs:has(.fa-times), +.crm-container .crm-hover-button:has(.crm-i), +.crm-container .crm-hover-button:has(.crm-i):hover, +.crm-container .crm-hover-button:has(.crm-i):focus { + background: transparent; + color: var(--crm-c-link) !important; + padding: var(--crm-btn-small-padding); +} +.crm-container .select2-container[class*=" fa-"]::before, +.crm-container .messages.crm-empty-table > img /* removes inform.gif icon */ { + display: none; +} +input#crm-qsearch-input::placeholder { + font-family: sans-serif, 'FontAwesome'; /* Fix for type in placeholders */ +} + +/* Notification icons */ +.crm-container #crm-notification-container div.ui-notify-message.error .notify-content .crm-i.fa-exclamation-triangle, +.crm-container #crm-notification-container div.ui-notify-message div.icon { + display: none; +} +#crm-notification-container .ui-notify-message a.ui-notify-cross::before, +.crm-container #crm-notification-container div.ui-notify-message h1::before, +div.civicrm-community-messages a.civicrm-community-message-dismiss::before, +.crm-container .delete-icon, +.crm-container span.batch-valid, +.crm-container span.batch-invalid, +.crm-container .messages.crm-empty-table::before { + font-family: "Font Awesome 6 Free", "FontAwesome"; + font-style: normal; + font-weight: normal; + text-rendering: auto; + font-size: var(--crm-font-size); + margin: 0 var(--crm-m) 0 0; +} +.crm-container #crm-notification-container div.ui-notify-message.error h1::before, +.crm-container span.batch-invalid::before { + content: var(--crm-icon-alert); + color: var(--crm-c-alert); +} +.crm-container #crm-notification-container div.ui-notify-message.success h1::before, +.crm-container span.batch-valid::before { + content: var(--crm-icon-success); + color: var(--crm-c-success); +} +.crm-container #crm-notification-container div.ui-notify-message.info h1::before, +.crm-container .messages.crm-empty-table::before { + content: var(--crm-icon-info); + color: var(--crm-c-info); +} +.crm-container .messages.crm-empty-table > i.crm-i { + display: none; /* removes double icon when markup uses both */ +} + +/* Help icon */ +.crm-container a.helpicon::before { + content: "\f059"; +} +.crm-container a.helpicon:hover, +.crm-container a.helpicon:focus { + text-decoration: none; +} + +/* Check icon */ +.crm-container .crm-i.fa-check, +.crm-container .crm-i.fa-check-circle, +.crm-container .btn-success .crm-i, +.crm-container .crm-i.fa-plus-circle { + color: var(--crm-icon-success-color); +} + +/* Close icon */ +#crm-notification-container .ui-notify-message a.ui-notify-cross, +div.civicrm-community-messages a.civicrm-community-message-dismiss, +.crm-container .ui-icon-circle-close { + font-size: 0; + float: right; + text-decoration: none; + padding: 0 0 0 0.5rem; + opacity: 0.5; /* matches Bootstrap */ + background-image: none; + position: relative !important; + text-indent: 0; + height: auto; + width: auto; +} +#crm-notification-container .ui-notify-message a.ui-notify-cross::before, +div.civicrm-community-messages a.civicrm-community-message-dismiss::before, +.crm-container .ui-icon-circle-close::before { + content: var(--crm-icon-close); + color: var(--crm-notify-col); +} +.crm-container .ui-icon-circle-close:hover, +.crm-container .ui-icon-circle-close:focus, +#crm-notification-container .ui-notify-message a.ui-notify-cross:hover, +#crm-notification-container .ui-notify-message a.ui-notify-cross:focus { + opacity: 1; + transition: 0.2s; +} +.crm-container .crm-i.fa-times, +.crm-container .btn-danger .crm-i, +.crm-container button .fa-times { + color: var(--crm-icon-alert-color); +} +.crm-container .crm-dashlet-header a.fa-times { + color: var(--crm-dashlet-header-col); +} + +/* Info icon */ +.crm-container .crm-i.fa-info, +.crm-container .btn-info .crm-i::before { + color: var(--crm-icon-info-color); +} + +/* Warning icon */ +.crm-container .crm-i.fa-warning, +.crm-container .btn-warning .crm-i::before { + color: var(--crm-icon-warning-color); +} + +/* Table sorting icons */ +.crm-container tr a.sorting, +.crm-container tr a.sorting_asc, +.crm-container tr a.sorting_desc, +.crm-search-display th.crm-sortable-col, +.crm-container table.dataTable thead th.sorting, +.crm-container table.dataTable thead th.sorting_asc, +.crm-container table.dataTable thead th.sorting_desc { + background-image: none; + color: var(--crm-table-header-col); + box-shadow: none; + line-height: 1; +} +.crm-container tr a.sorting, +.crm-container tr a.sorting_asc, +.crm-container tr a.sorting_desc { + display: flex; + flex-direction: row-reverse; + justify-content: start; + gap: var(--crm-flex-gap); + align-items: center; +} +.crm-container th a:hover, +.crm-container th a:focus { + text-decoration: none; +} +.crm-search-display-table > table.table > thead > tr > th i.crm-search-table-column-sort-icon { + /* Bootstrap & SearchKit sort resets */ + position: absolute; + margin-left: -1.5ch; + color: var(--crm-table-sort-col); + line-height: inherit; + font-style: normal; + text-rendering: auto; + font-family: "Font Awesome 6 Free", "FontAwesome"; + font-style: normal; + font-weight: normal; + cursor: var(--crm-hover-clickable); + opacity: 1; +} +.crm-container .table > thead > tr > th:has(.crm-search-table-column-sort-icon) { + padding-left: 2ch; +} +.crm-container a.sorting::after, +.crm-container a.sorting_asc::after, +.crm-container a.sorting_desc::after, +.crm-container th.crm-sortable-col i.crm-search-table-column-sort-icon::before, +.crm-container table.dataTable thead th.sorting::before, +.crm-container table.dataTable thead th.sorting_asc::before, +.crm-container table.dataTable thead th.sorting_desc::before, +.jstree-default .jstree-icon { + font-family: "Font Awesome 6 Free", "FontAwesome"; + font-style: normal; + text-rendering: auto; + font-size: var(--crm-dash-icon-size); + content: var(--crm-icon-sort); + color: var(--crm-table-sort-col); + cursor: var(--crm-hover-clickable); +} +.crm-container th.crm-sortable-col i.crm-search-table-column-sort-icon::before, +.crm-container table.dataTable thead th.sorting::before, +.crm-container table.dataTable thead th.sorting_asc::before, +.crm-container table.dataTable thead th.sorting_desc::before, +.jstree-default .jstree-icon { + margin-right: 0.5rem; +} +.crm-container a.sorting_asc::after, +.crm-container th.crm-sortable-col i.crm-search-table-column-sort-icon.fa-sort-asc::before, +.crm-search-display-table > table.table > thead > tr > th i.crm-search-table-column-sort-icon.fa-sort-asc::before, +.crm-container table.dataTable thead th.sorting_asc::before { + content: var(--crm-icon-sort-asc); + color: var(--crm-table-sort-active-col); +} +.crm-container a.sorting_desc::after, +.crm-container th.crm-sortable-col i.crm-search-table-column-sort-icon.fa-sort-desc::before, +.crm-search-display-table > table.table > thead > tr > th i.crm-search-table-column-sort-icon.fa-sort-desc::before, +.crm-container table.dataTable thead th.sorting_desc::before { + content: var(--crm-icon-sort-desc); + color: var(--crm-table-sort-active-col); +} + +/* Trash icons */ +.crm-container .delete-icon { + background-image: none; +} +.crm-container .delete-icon::before, +.crm-container .crm-i.fa-trash::before { + content: "\f1f8"; + color: var(--crm-icon-alert-color); +} +.crm-container .delete-icon:hover::before, +.crm-container .delete-icon:focus::before { + color: var(--crm-icon-alert-color); +} + +/* Jqueery UI icons (tags) */ +.crm-container .jstree-wholerow-ul { + display: flex; + flex-direction: column; + gap: var(--crm-xs); +} +.jstree-default > .jstree-wholerow-ul > li.jstree-node { + margin-inline: 0; +} +.jstree-default .jstree-wholerow-clicked, +.jstree-default .jstree-wholerow-hovered { + background: transparent !important; +} +.crm-container .jstree-default .jstree-icon { + background-image: inherit; + font-size: var(--crm-r1); + margin-right: var(--btn-icon-spacing); +} +.crm-container .jstree-default .jstree-checkbox::before { + content: '\f096'; +} +.crm-container .jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox::before, +.crm-container .jstree-default .jstree-checked > .jstree-checkbox::before { + content: '\f046'; + color: var(--crm-c-success); +} +.jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl::before, +.jstree .jstree-closed > .jstree-ocl::before { + display: block; + content: '\f105'; + color: var(--crm-c-text); +} +.jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl::before, +.jstree .jstree-open > .jstree-ocl::before { + display: block; + content: '\f107'; + color: var(--crm-c-text); +} +.crm-container .jstree-default .jstree-search { + color: var(--crm-c-alert); + font-weight: normal; +} +.crm-container #navigation-tree li.jstree-node { + background-image: none; +} + +/* Resets icons with unwanted backgrounds */ +.crm-container a.crm-hover-button:has(span.icon) { + background-color: transparent; + padding: 0; +} + +/* Spinners */ +.crm-container button i.crm-i.fa-spinner, +.crm-container #bootstrap-theme .btn i.crm-i.fa-spinner { + padding: 0; + background: transparent; + border: 0; +} + +/* Ban icon - lower opacity as it's double layered */ + +.crm-i.fa-ban.fa-stack-2x { + opacity: 0.5; +} + +/* Icon picker - vs crm-iconPicker.css */ +#crmIconPicker .icon-ctrls { + display: flex; +} +#crmIconPicker .icon-ctrls > button { + float: none; + margin-left: auto; + display: flex; +} +#crmIconPicker a.ui-button .ui-icon { + margin-top: 0; + font-size: var(--crm-r2); +} +#crmIconPicker .icons { + display: flex; + flex-wrap: wrap; + gap: var(--crm-m2); + margin-top: 1rem; +} +#crmIconPicker a.ui-button { + color: var(--crm-c-text) !important; + background: transparent; + width: var(--crm-r2); + height: var(--crm-r2); + border: 0; + padding: 0; + display: inline-block; +} +/* Credit Card Icons */ + +.crm-credit_card_type-icons { + display: flex; + gap: var(--crm-flex-gap); +} +.crm-credit_card_type-icons a::before { + font-family: "Font Awesome 6 Free", "FontAwesome"; + font-style: normal; + text-rendering: auto; + font-size: var(--crm-dash-icon-size); + display: inline-block; + content: '\f09d'; + font-size: 2.5rem; + line-height: 1; +} +.crm-credit_card_type-icons a span { + display: none; +} +.crm-credit_card_type-icons a.crm-credit_card_type-icon-visa::before { + content: '\f1f0'; +} +.crm-credit_card_type-icons a.crm-credit_card_type-icon-mastercard::before { + content: '\f1f1'; +} +.crm-credit_card_type-icons a.crm-credit_card_type-icon-amex::before { + content: '\f1f3'; +} +.crm-credit_card_type-icons a.crm-credit_card_type-icon-discover::before { + content: '\f1f2'; +} +.crm-credit_card_type-icons a.crm-credit_card_type-icon-jcb::before { + content: '\f24b'; +} +.crm-credit_card_type-icons a.crm-credit_card_type-icon-unionpay::before { + content: '\f09d'; /* uses generic, see https://github.com/FortAwesome/Font-Awesome/issues/4561 */ +} diff --git a/civicrm/ext/riverlea/core/css/components/_nav.css b/civicrm/ext/riverlea/core/css/components/_nav.css new file mode 100644 index 0000000000..d6bd5eca91 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_nav.css @@ -0,0 +1,62 @@ +/* Bootstrap Nav */ + +.crm-container .nav { + padding-left: 0; + margin: 0; + list-style: none; + display: flex; + flex-wrap: wrap; + cursor: var(--crm-hover-clickable); +} +.crm-container .nav > li { + position: relative; + display: block; +} +.crm-container .nav > li > a { + padding: var(--crm-m) var(--crm-r); +} +.crm-container .nav > li > a:hover, +.crm-container .nav > li > a:focus { + text-decoration: none; + background-color: var(--crm-c-background2); +} +.crm-container .nav > li.disabled > a { + color: var(--crm-c-inactive); +} +.crm-container .nav > li.disabled > a:hover, +.crm-container .nav > li.disabled > a:focus { + color: var(--crm-c-inactive); + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.crm-container .nav .open > a, +.crm-container .nav .open > a:hover, +.crm-container .nav .open > a:focus { + background-color: var(--crm-c-background2); + border-color: var(--crm-c-link); +} +.crm-container .nav .nav-divider { + height: 1px; + margin: var(--crm-m) 0; + overflow: hidden; + background-color: var(--crm-c-divider); +} +.crm-container .nav > li > a > img { + max-width: none; +} +.crm-container .nav.nav-stacked { + flex-direction: column; +} +#civicrm-menu-nav .crm-logo-sm { + background: url('data:image/svg+xml,<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 792 612" style="enable-background:new 0 0 792 612;" xml:space="preserve"><style type="text/css">.st0{fill:%23086287;}.st1{fill:%2381C459;}</style><g><g><path class="st0" d="M342.05,470.43C342.05,470.43,342.05,470.43,342.05,470.43c-20.72-0.4-28.62-24.34-29.45-27.07l-70.69-231.67c-4.16-13.61-3.21-24.56,2.83-32.55c3.9-5.16,11.67-11.25,26.56-10.96c5.45,0.1,9.72,1.07,10.19,1.17l235.37,54.83c15.13,3.52,24.43,10.66,27.64,21.21c5.09,16.72-9.08,32.57-10.72,34.32L369.09,456.41C360.25,465.89,351.15,470.61,342.05,470.43z M270.14,192.48c-4.21-0.08-5.58,1.07-5.84,1.44c-1.19,1.68-1.45,2.43,1.05,10.62l70.69,231.66c1.58,4.95,4.2,9.55,6.48,9.72l0,0c0.03,0,2.84-0.02,8.64-6.23l164.69-176.68c3.04-3.34,5.84-8.78,5.2-10.46c-0.46-1.19-2.35-2.75-9.76-4.48l-235.37-54.84l0,0C275.92,193.23,272.97,192.54,270.14,192.48z"/></g><g><path class="st1" d="M315.61,451.6c-7.61,2.82-15.56,3.37-21.8,1.34c0,0,0,0,0,0c-19.66-6.41-20.24-31.58-20.24-34.42l0.02-225.56l23.16,5.19L296.84,419c0.06,5.18,1.4,10.13,4.56,10.68l0,0c0.02,0.01,1.64,0.52,6.35-1.63L315.61,451.6z M329.71,415.68l190.44-110.19c3.87-2.3,8.39-5.74,8.01-8.48c-0.06-0.41-0.96-2.89-5.08-5.75l15.97-18.15c9.02,6.88,13.59,14.89,13.59,23.91c0,17.44-18.16,28.45-20.23,29.65L337.06,438.9L329.71,415.68z M500.93,278.76L313.77,169.87c0,0-4.67-2.98-7.36-3.86c-4-1.3-5.96,0.02-6.33,0.27c-1.12,0.75-1.48,1.34-1.95,6.84l-24.11-4.49c1.31-10.03,5.23-17.46,11.68-22.15c5.22-3.79,14.42-7.34,28.55-2.73c5.17,1.69,8.97,3.85,9.38,4.09l194.69,112.31L500.93,278.76z"/></g></g></svg>'); + background-repeat: no-repeat; + background-size: cover; + width: 2.25rem; + height: 2.25rem; + margin: 0; + background-position: center center; +} +.crm-container .nav.nav-pills { + gap: var(--crm-flex-gap); +} diff --git a/civicrm/ext/riverlea/core/css/components/_page.css b/civicrm/ext/riverlea/core/css/components/_page.css new file mode 100644 index 0000000000..9531da0ac8 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_page.css @@ -0,0 +1,216 @@ +/* For page edges, borders and structures */ + +/* Page backgrounds - default */ + +.crm-container .crm-form-block { /* darkened page bg style */ + box-shadow: var(--crm-form-block-box-shadow); + background-color: var(--crm-form-block-background); + border-radius: var(--crm-form-block-border-radius); + padding: var(--crm-form-block-padding); + margin: 0; +} +.crm-container .ui-tabs-panel .crm-form-block { + box-shadow: none; +} +/* Page backgrounds - potential for no padding */ +.crm-container .crm-group-search-form-block, +.CRM_Contact_Form_Search_Advanced .crm-form-block, +.CRM_Contact_Form_Search_Basic .crm-form-block, +.CRM_Case_Form_Search .crm-form-block, +.CRM_Contribute_Form_Search .crm-form-block, +.CRM_Member_Form_Search .crm-form-block, +.CRM_Event_Form_Search .crm-form-block, +.CRM_Pledge_Form_Search .crm-form-block, +.CRM_Activity_Form_Search .crm-form-block, +.crm-container .crm-report-instanceList-form-block, +.CRM_Financial_Form_Search .crm-form-block, +.CRM_Event_Form_SearchEvent .crm-form-block { + padding: var(--crm-padding-inset); + /* box-shadow: none; */ +} +/* Page backgrounds - potential for outset accordions */ +.crm-container .crm-contribution-contributionpage-premium-form-block details, +.crm-container .crm-contribution-contributionpage-widget-form-block details, +.crm-container .crm-activity-form-block details, +.crm-container .crm-contactEmail-form-block details, +.crm-container .crm-contribution-form-block details, +.crm-container .crm-pledge-form-block details, +.crm-container .crm-payment-form-block details, +.crm-container .crm-import-preview-form-block details, +.crm-container .crm-event-manage-eventinfo-form-block details, +.crm-container .crm-wizard-step, +.crm-container .CRM_Admin_Form_MessageTemplates details, +.crm-container .crm-case-caseview-form-block details, +.crm-container .crm-case-activity-form-block details { + margin: var(--crm-padding-inset) calc((-1 * var(--crm-form-block-padding)) + var(--crm-padding-inset)); +} +/* Page backgrounds - reset of elements cought up in outset accordions (!) */ +.crm-container .crm-payment-form-block details #payment_information { + margin: 0 var(--crm-form-block-padding); +} +/* Reset elements for potential no padding */ +.crm-group-search-form-block .crm-datatable-pager-top, +.crm-group-search-form-block .crm-datatable-pager-bottom { + margin-inline: var(--crm-form-block-padding); +} +.crm-contribution-contributionpage-premium-form-block .messages { + margin: calc(var(--crm-form-block-padding) - var(--crm-padding-inset)); +} +.crm-contact-block > .help, +.CRM_Mailing_Form_Search .messages { + margin: var(--crm-padding-reg) 0; +} +#crm-main-content-wrapper .newGroup { + margin: var(--crm-form-block-padding) calc(var(--crm-form-block-padding) - var(--crm-padding-inset)) 0; +} + +/* Pagination */ + +.crm-datatable-pager-top, +.crm-datatable-pager-bottom { + display: flex; + justify-content: space-between; + font-size: var(--crm-m3); + margin-inline: var(--crm-m); +} +.crm-datatable-pager-top { + margin-block: var(--crm-r); +} +.crm-datatable-pager-bottom { + margin-top: var(--crm-r); +} +.dataTables_wrapper .dataTables_paginate .paginate_button.current { + background: var(--crm-c-secondary); + color: var(--crm-c-secondary-text) !important; + border: 0 solid transparent; + padding: var(--crm-s); +} +.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + background: var(--crm-c-secondary-hover); +} + +/* Pagination quickforms */ + +.crm-pager { + display: flex; + flex-direction: row-reverse; + align-items: center; + margin-block: 1rem; +} +.crm-pager .crm-pager-nav { + margin: 0 auto; +} +.crm-container .crm-pager-nav a.crm-hover-button { + background: var(--crm-c-secondary); + color: var(--crm-c-secondary-text); + padding: var(--crm-btn-padding-block) var(--crm-btn-padding-inline); +} +.crm-container .crm-pager-nav a.crm-hover-button:hover, +.crm-container .crm-pager-nav a.crm-hover-button:focus { + background: var(--crm-c-secondary-hover); +} +.crm-search-results .form-item.float-right { + margin-bottom: 1rem; +} + +/* Pagination - from BS3 */ + +.crm-container .pagination { + display: inline-block; + padding-left: 0; + margin: var(--crm-padding-reg) 0; + border-radius: var(--crm-roundness); +} +.crm-container .pagination > li { + display: inline; +} +.crm-container .pagination > li > a, +.crm-container .pagination > li > span { + position: relative; + float: left; + padding: var(--crm-s) var(--crm-m); + margin-left: -1px; + line-height: 1.4; + color: var(--crm-c-link); + text-decoration: none; + background-color: var(--crm-c-page-background); + border: var(--crm-c-divider); +} +.crm-container .pagination > li > a:hover, +.crm-container .pagination > li > a:focus, +.crm-container .pagination > li > span:hover, +.crm-container .pagination > li > span:focus { + z-index: 2; + color: var(--crm-c-link-hover); + background-color: var(--crm-c-background); + border-color: var(--crm-c-background4); +} +.crm-container .pagination > li:first-child > a, +.crm-container .pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: var(--crm-roundness); + border-bottom-left-radius: var(--crm-roundness); +} +.crm-container .pagination > li:last-child > a, +.crm-container .pagination > li:last-child > span { + border-top-right-radius: var(--crm-roundness); + border-bottom-right-radius: var(--crm-roundness); +} +.crm-container .pagination > .active > a, +.crm-container .pagination > .active > a:hover, +.crm-container .pagination > .active > a:focus, +.crm-container .pagination > .active > span, +.crm-container .pagination > .active > span:hover, +.crm-container .pagination > .active > span:focus { + z-index: 3; + color: var(--crm-c-primary-text); + cursor: default; + background-color: var(--crm-c-primary); + border: var(--crm-c-divider); +} +.crm-container .pagination > .disabled > span, +.crm-container .pagination > .disabled > span:hover, +.crm-container .pagination > .disabled > span:focus, +.crm-container .pagination > .disabled > a, +.crm-container .pagination > .disabled > a:hover, +.crm-container .pagination > .disabled > a:focus { + color: var(--crm-c-inactive); + cursor: not-allowed; + background-color: transparent; + border: var(--crm-c-divider); +} +.crm-container .pagination-lg > li > a, +.crm-container .pagination-lg > li > span { + padding: var(--crm-m2) var(--crm-r); + font-size: var(--crm-r1); + line-height: 1.3; +} +.crm-container .pagination-lg > li:first-child > a, +.crm-container .pagination-lg > li:first-child > span { + border-top-left-radius: calc(1.5 * var(--crm-roundness)); + border-bottom-left-radius: calc(1.5 * var(--crm-roundness)); +} +.crm-container .pagination-lg > li:last-child > a, +.crm-container .pagination-lg > li:last-child > span { + border-top-right-radius: calc(1.5 * var(--crm-roundness)); + border-bottom-right-radius: calc(1.5 * var(--crm-roundness)); +} +.crm-container .pagination-sm > li > a, +.crm-container .pagination-sm > li > span { + padding: var(--crm-padding-small); + font-size: var(--crm-font-size-small); + line-height: 1.5; +} +.crm-container .pagination-sm > li:first-child > a, +.crm-container .pagination-sm > li:first-child > span { + border-top-left-radius: calc(0.75 * var(--crm-roundness)); + border-bottom-left-radius: calc(0.75 * var(--crm-roundness)); +} +.crm-container .pagination-sm > li:last-child > a, +.crm-container .pagination-sm > li:last-child > span { + border-top-right-radius: calc(0.75 * var(--crm-roundness)); + border-bottom-right-radius: calc(0.75 * var(--crm-roundness)); +} +.crm-search-display-pager { + padding-inline: var(--crm-padding-reg); +} diff --git a/civicrm/ext/riverlea/core/css/components/_tables.css b/civicrm/ext/riverlea/core/css/components/_tables.css new file mode 100644 index 0000000000..5f0cca8d31 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_tables.css @@ -0,0 +1,508 @@ +.crm-container table:not(.crm-inline-edit-form, +.crm-table-group-summary) { + border: var(--crm-table-outside-border); + background: var(--crm-table-background); + box-shadow: var(--crm-block-shadow); + margin: 0 0 var(--crm-r); + border-collapse: collapse; + width: 100%; + max-width: 100%; +} +.crm-container table thead { + background-color: var(--crm-table-header-bg); +} +.crm-container th, +.crm-container table thead.sticky th, +.crm-container table.dataTable thead th, +.crm-container tr.columnheader td { + background-color: var(--crm-table-header-bg); + border-bottom: var(--crm-table-header-bottom); + color: var(--crm-table-header-col); + font-family: var(--crm-font-bold); + font-weight: bold; + padding: var(--crm-table-padding); + text-align: left; +} +.crm-container table:not(thead) tr { + border-bottom: var(--crm-table-row-border); + background-color: transparent; +} +.crm-container .odd-row, +.crm-container .odd, +tbody.scrollContent, +.crm-container table.dataTable.stripe tbody tr.odd, +.crm-container table.dataTable.display tbody tr.odd { + background-color: var(--crm-table-odd-row); +} +.crm-container table.dataTable.hover tbody tr.odd:hover, +.crm-container table.dataTable.display tbody tr.odd:hover, +.crm-container table.row-highlight tr:hover, +.crm-container .crm-row-selected, +.crm-container .odd-row:hover, +.crm-container .odd:hover { + background-color: var(--crm-table-odd-hover); +} +table.dataTable.display tbody tr.odd > .sorting_1, +table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background: linear-gradient(to top,rgba(0, 0, 0, 0.05),rgba(0, 0, 0, 0.05)) var(--crm-table-odd-row); +} +.crm-container .even-row, +.crm-container .even, +tbody.scrollContent tr.alternateRow { + background-color: var(--crm-table-even-row); +} +.crm-container table.dataTable.hover tbody tr.even:hover, +.crm-container table.dataTable.display tbody tr.even:hover, +.crm-container table.row-highlight tr.even-row:hover, +.crm-container table.row-highlight tr.even:hover, +.crm-container .even-row.crm-row-selected, +.crm-container .even.crm-row-selected , +.crm-container .even-row:hover, +.crm-container .even:hover, +tbody.scrollContent tr.alternateRow:hover { + background-color: var(--crm-table-even-hover); +} +table.dataTable.display tbody tr.even > .sorting_1, +table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background: linear-gradient(to top,rgba(0, 0, 0, 0.05),rgba(0, 0, 0, 0.05)) var(--crm-table-even-row); +} +.crm-container .extension-installed { + background: var(--crm-c-green-light); + color: var(--crm-alert-text-help); +} +.crm-container .extension-installed summary { + color: var(--crm-alert-text-help); +} +table.dataTable.display tbody tr.extension-installed.odd { + background: linear-gradient(to top,rgba(256,256,256,0.25),rgba(256,256,256,0.25)) var(--crm-c-green-light); +} +table.dataTable.display tbody tr.extension-installed.odd:hover { + background-color: var(--crm-table-odd-hover); +} +table.dataTable.display tbody tr.extension-installed.odd > .sorting_1, +table.dataTable.order-column.stripe tbody tr.extension-installed.odd > .sorting_1 { + background: var(--crm-c-green-light) !important; +} +table.dataTable.display tbody tr.extension-installed.even > .sorting_1, +table.dataTable.order-column.stripe tbody tr.extension-installed.even > .sorting_1 { + background: linear-gradient(to top,rgba(0, 0, 0, 0.05),rgba(0, 0, 0, 0.05)) var(--crm-c-green-light); +} +.crm-container td, +.crm-container table.dataTable thead td { + padding: var(--crm-table-padding); +} +.crm-container table.selector td { + border-right: var(--crm-table-column-border); +} +.crm-container table td:has(.btn-slide), +.crm-container table td:not(.crm-case-date):has(.action-item) { + text-align: right; +} +.crm-container table.crm-mailing-ab-table td:has(.action-item) { + text-align: unset; +} +.crm-container table.form-layout td:has(details) { + padding: 0; +} +.crm-form-block .form-item table, +.crm-form-block .form-item table tr, +.crm-container .crm-form-block:not( .crm-report-field-form-block, +.crm-group-search-form-block, +#map-field, +#payLaterOptions, +.crm-membership-form-block, +.crm-contribution-form-block, +.crm-case-caseview-form-block, +.crm-case-activity-form-block) table:not(#preview-counts), +.crm-container .crm-form-block:not( .crm-report-field-form-block, +.crm-group-search-form-block, +.crm-membership-form-block, +.crm-contribution-form-block, +.crm-case-caseview-form-block, +.crm-case-activity-form-block) table:not(#preview-counts) tr, +.crm-container .crm-accordion-body table.form-layout-compressed, +.crm-container .crm-search-form-block table.form-layout-compressed, +.crm-container .crm-case-activity-form-block > table, +.crm-container table.no-border, +.crm-container table.no-border tr, +.crm-container table#crm-activity-view-table, +.crm-container .crm-report-form-block table.form-layout-compressed { + box-shadow: none; + border: 0 solid transparent; + background: transparent; +} +.crm-container .crm-form-block.crm-report-field-form-block table, +.crm-container .CRM_Contribute_Form_ContributionCharts #chartData table, +.crm-container .crm-case-caseview-form-block table { + box-shadow: none; +} +/*.crm-container .dataTables_wrapper, +.crm-container .form-item:has(> table), +.crm-container div:has(> table) { simple fix-all for making many tables scroll when needed + overflow-x: auto; + max-width: 100%; +}*/ +/* needed to reset the scroll in Thames but causes other problem - #91) +.crm-container div:has(td span > .panel), +.crm-container div:has(td > div > .dropdown-menu) { + overflow: initial; +}*/ +.crm-selection-reset { + padding: var(--crm-m) 0; + margin-bottom: var(--crm-m); + display: block; +} + +/* Data Tables */ +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: var(--crm-c-text); +} +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + color: var(--crm-c-text) !important; /* vs jqueery.dataTables.css */ +} + +/* Nested table */ +.crm-container .crm-child-row tr:first-child { + border: 1px solid var(--crm-c-page-background); +} +.crm-container .crm-child-row { + border-top: 1px solid var(--crm-c-gray-400); + border-bottom: 1px solid var(--crm-c-gray-025); +} +.crm-container .crm-child-row table { + box-shadow: none; + border: var(--crm-table-nested-border); +} +.crm-container .crm-child-row th { + opacity: 0.7; +} +.crm-container .crm-child-row > td:has(table) { + padding: var(--crm-table-nested-padding); +} +.crm-container tr.crm-child-row:hover { + background-color: transparent; +} +.crm-container tr.crm-child-row > td { + box-shadow: inset 0 10px 8px -10px rgba(0,0,0,.3), inset 0 -11px 8px -9px rgba(0,0,0,.15); + background: var(--crm-table-inset-bg); +} + +/* Nested, inset table - groups page */ +tbody .crm-row-child { + border-top: 1px solid var(--crm-c-gray-400); +} +tbody .crm-row-child ~ .crm-row-child { + border-top: 0; +} +tbody .crm-row-child:not(:has(~ .crm-row-child)) { + border-bottom: 1px solid var(--crm-c-gray-025); +} +tbody .crm-row-child td { + box-shadow: inset 0 10px 8px -10px rgba(0,0,0,.15); + background: var(--crm-table-inset-bg); +} +tbody .crm-row-child:hover td { + background: var(--crm-table-odd-hover); + cursor: var(--crm-hover-clickable); +} +tbody .crm-row-child ~ .crm-row-child td { + box-shadow: none; +} +tbody .crm-row-child:not(:has(~ .crm-row-child)) td { + box-shadow: inset 0 -11px 8px -9px rgba(0,0,0,.15); +} + +/* Compressed table */ +.crm-container table.form-layout-compressed { + width: var(--crm-table-compressed-width); + border: var(--crm-table-outside-border); + background: var(--crm-table-background); + box-shadow: var(--crm-block-shadow); + margin: var(--crm-m) 0 var(--crm-l); +} +.crm-container table.form-layout-compressed th { + background: transparent; + border: none; + padding: var(--crm-table-padding); +} +.crm-container .crm-form-block > .form-layout-compressed { + /* handles double box/border issue when table is in a form block, + e.g. civicrm/member/add?reset=1&action=add&context=standalone */ + box-shadow: none; + border: 0 solid transparent; + background: transparent; +} + +/* Advance search compressed table */ +#search-status table.form-layout-compressed { + border: 0; + background: var(--crm-c-background); + width: 100%; + border: 0; + padding: var(--crm-padding-reg); + border-radius: var(--crm-roundness); + margin: 0; +} +#search-status table.form-layout-compressed tr { + border: 0; +} +#search-status table.form-layout-compressed td { + padding-inline: var(--crm-padding-reg); +} +#search-status table.form-layout-compressed tr:first-of-type td, +#search-status table.form-layout-compressed tr:last-of-type td { + padding-block: var(--crm-padding-reg); +} + +/* Report table */ +.crm-container table.report { + width: auto; +} +.crm-container table.report td { + border: var(--crm-table-row-border); + background-color: var(--crm-table-even-row); +} +.crm-container tr.columnheader-dark th { + background-color: var(--crm-c-gray-700); + color: var(--crm-c-light-text); + border: 1px solid var(--crm-c-gray-800); +} + +/* Batch entry table */ +.crm-container .crm-grid-table { + display: table; + border-collapse: collapse; + border: var(--crm-table-outside-border); + background-color: var(--crm-table-background); +} +.crm-container .crm-grid-row, +.crm-container .crm-grid-header { + display: table-row; +} +.crm-container .crm-grid-header { + white-space: nowrap; +} +.crm-container .crm-grid-cell { + display: table-cell; + border-right: 1px solid var(--crm-table-column-border); + padding: var(--crm-table-padding); + vertical-align: top; +} + +/* Fees tables (contribs/events) */ +.crm-container table#map-field-table { + width: auto; + border: var(--crm-table-outside-border); + margin-top: var(--crm-padding-reg); +} + +/* Pay later table (nested inside another table) */ + +.crm-container table#payLater table#payLaterOptions.form-layout { + border: 1px solid #dedede; + background: var(--crm-c-page-background); +} + +/* Table bg colours */ + +.crm-container .table { + width: 100%; + max-width: 100%; + margin-bottom: var(--crm-r1); +} +.crm-container .table > thead > tr > th, +.crm-container .table > thead > tr > td, +.crm-container .table > tbody > tr > th, +.crm-container .table > tbody > tr > td, +.crm-container .table > tfoot > tr > th, +.crm-container .table > tfoot > tr > td { + padding: var(--crm-table-padding); +} +.crm-container .crm-search-display-table > table.table > thead > tr > th.crm-search-result-select { + padding-inline: 0.5em; +} +.crm-container .table > tbody + tbody { + border-top: var(--crm-table-header-bottom); +} +.crm-container .table-condensed > thead > tr > th, +.crm-container .table-condensed > thead > tr > td, +.crm-container .table-condensed > tbody > tr > th, +.crm-container .table-condensed > tbody > tr > td, +.crm-container .table-condensed > tfoot > tr > th, +.crm-container .table-condensed > tfoot > tr > td { + padding: var(--crm-s1); +} +.crm-container .table-bordered { + border: var(--crm-table-outside-border); +} +.crm-container .table-bordered > thead > tr > th, +.crm-container .table-bordered > thead > tr > td, +.crm-container .table-bordered > tbody > tr > th, +.crm-container .table-bordered > tbody > tr > td, +.crm-container .table-bordered > tfoot > tr > th, +.crm-container .table-bordered > tfoot > tr > td { + border: var(--crm-table-outside-border); +} +.crm-container .table-bordered > thead > tr > th, +.crm-container .table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.crm-container .table-striped > tbody > tr { + background-color: var(--crm-table-even-row); +} +.crm-container .table-striped > tbody > tr:nth-of-type(2n+1) { + background-color: var(--crm-table-odd-row); +} +.crm-container .table-striped > tbody > tr:hover { + background-color: var(--crm-table-even-hover); +} +.crm-container .table-striped > tbody > tr:nth-of-type(2n+1):hover { + background-color: var(--crm-table-odd-hover); +} +.crm-container .table > thead > tr > td.active, +.crm-container .table > thead > tr > th.active, +.crm-container .table > thead > tr.active > td, +.crm-container .table > thead > tr.active > th, +.crm-container .table > tbody > tr > td.active, +.crm-container .table > tbody > tr > th.active, +.crm-container .table > tbody > tr.active > td, +.crm-container .table > tbody > tr.active > th, +.crm-container .table > tfoot > tr > td.active, +.crm-container .table > tfoot > tr > th.active, +.crm-container .table > tfoot > tr.active > td, +.crm-container .table > tfoot > tr.active > th { + background-color: var(--crm-table-odd-row); +} +.crm-container .table-hover > tbody > tr > td.active:hover, +.crm-container .table-hover > tbody > tr > th.active:hover, +.crm-container .table-hover > tbody > tr.active:hover > td, +.crm-container .table-hover > tbody > tr:hover > .active, +.crm-container .table-hover > tbody > tr.active:hover > th { + background-color: var(--crm-table-odd-hover); +} +.crm-container .table td.success, +.crm-container .table th.success, +.crm-container .table tr.success > td, +.crm-container .table tr.success > th, +.crm-container table tr.crm-row-ok, +.crm-container table tr.crm-row-ok > td { + background-color: var(--crm-alert-background-help); +} +.crm-container .table-hover > tbody > tr > td.success:hover, +.crm-container .table-hover > tbody > tr > th.success:hover, +.crm-container .table-hover > tbody > tr.success:hover > td, +.crm-container .table-hover > tbody > tr:hover > .success, +.crm-container .table-hover > tbody > tr.success:hover > th, +.crm-container table tr.crm-row-ok:hover > td, +.crm-container table tr.crm-row-ok > td:hover { + background-color: var(--crm-alert-border-help); +} +.crm-container .table td.warning, +.crm-container .table th.warning, +.crm-container .table tr.warning > td, +.crm-container .table tr.warning > th { + background-color: var(--crm-alert-background-warning); +} +.crm-container .table-hover > tbody > tr > td.warning:hover, +.crm-container .table-hover > tbody > tr > th.warning:hover, +.crm-container .table-hover > tbody > tr.warning:hover > td, +.crm-container .table-hover > tbody > tr:hover > .warning, +.crm-container .table-hover > tbody > tr.warning:hover > th { + background-color: var(--crm-alert-border-warning); +} +.crm-container .table td.danger, +.crm-container .table th.danger, +.crm-container .table tr.danger > td, +.crm-container .table tr.danger > th, +.crm-container table tr.crm-row-error, +.crm-container table tr.crm-row-error > td { + background-color: var(--crm-alert-background-danger); +} +.crm-container .table-hover > tbody > tr > td.danger:hover, +.crm-container .table-hover > tbody > tr > th.danger:hover, +.crm-container .table-hover > tbody > tr.danger:hover > td, +.crm-container .table-hover > tbody > tr:hover > .danger, +.crm-container .table-hover > tbody > tr.danger:hover > th, +.crm-container table tr.crm-row-error:hover > td, +.crm-container table tr.crm-row-error > td:hover { + background-color: var(--crm-alert-border-danger); +} +.crm-container .table td.info, +.crm-container .table th.info, +.crm-container .table tr.info > td, +.crm-container .table tr.info > th, +.crm-container table tr.crm-row-selected, +.crm-container table tr.crm-row-selected > td { + background-color: var(--crm-alert-background-info); +} +.crm-container .table-hover > tbody > tr > td.info:hover, +.crm-container .table-hover > tbody > tr > th.info:hover, +.crm-container .table-hover > tbody > tr.info:hover > td, +.crm-container .table-hover > tbody > tr:hover > .info, +.crm-container .table-hover > tbody > tr.info:hover > th, +.crm-container table tr.crm-row-selected:hover > td, +.crm-container table tr.crm-row-selected > td:hover { + background-color: var(--crm-alert-border-info); +} +.crm-container .table-responsive { + min-height: .01%; + overflow-x: auto; +} + +/* Responsive table */ + +@media screen and (max-width: 767px) { + .crm-container .table-responsive, + .crm-container table { + width: 100%; + margin-bottom: var(--crm-r); + overflow-y: hidden; + border: var(--crm-table-outside-border); + display: contents; /* expirmental addition to provide more responsive behaviour */ + } + .crm-container .table-responsive > .table { + margin-bottom: 0; + } + .crm-container .table-responsive > .table > thead > tr > th, + .crm-container .table-responsive > .table > thead > tr > td, + .crm-container .table-responsive > .table > tbody > tr > th, + .crm-container .table-responsive > .table > tbody > tr > td, + .crm-container .table-responsive > .table > tfoot > tr > th, + .crm-container .table-responsive > .table > tfoot > tr > td, + .crm-container th, + .crm-container td { + white-space: nowrap; + } + .crm-container .table-responsive > .table-bordered { + border: 0; + } + .crm-container .table-responsive > .table-bordered > thead > tr > th:first-child, + .crm-container .table-responsive > .table-bordered > thead > tr > td:first-child, + .crm-container .table-responsive > .table-bordered > tbody > tr > th:first-child, + .crm-container .table-responsive > .table-bordered > tbody > tr > td:first-child, + .crm-container .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .crm-container .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + + .crm-container .table-responsive > .table-bordered > thead > tr > th:last-child, + .crm-container .table-responsive > .table-bordered > thead > tr > td:last-child, + .crm-container .table-responsive > .table-bordered > tbody > tr > th:last-child, + .crm-container .table-responsive > .table-bordered > tbody > tr > td:last-child, + .crm-container .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .crm-container .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .crm-container .table-responsive > .table-bordered > tbody > tr:last-child > th, + .crm-container .table-responsive > .table-bordered > tbody > tr:last-child > td, + .crm-container .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .crm-container .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} diff --git a/civicrm/ext/riverlea/core/css/components/_tabs.css b/civicrm/ext/riverlea/core/css/components/_tabs.css new file mode 100644 index 0000000000..287c1ecbf8 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/components/_tabs.css @@ -0,0 +1,179 @@ +/* JQuery UI tabs */ + +.crm-container .ui-tabs, +.crm-container .crm-search-nav-tabs, +.crm-container .afadmin-list .nav.nav-tabs { /* entire tab region */ + border: var(--crm-tabs-border); + border-radius: var(--crm-tabs-radius); + margin-bottom: var(--crm-r1); +} +.crm-container .ui-widget-header, +.crm-container .ui-tabs .ui-tabs-nav, +.crm-container .nav.nav-tabs { /* tab header */ + font-family: var(--crm-font); + background: var(--crm-tabs-bg); + border: 0 solid transparent; + border-radius: var(--crm-tabs-radius) var(--crm-tabs-radius) 0 0; + border-bottom: var(--crm-tabs-border); + margin: 0; + display: flex; + flex-wrap: wrap; + gap: var(--crm-tabs-gap); + padding: var(--crm-tabs-padding); + width: 100%; +} +.crm-container .ui-tabs .ui-tabs-nav li, +.crm-container .ui-button, +.crm-container .ui-button.ui-state-disabled:hover, +.crm-container .ui-button.ui-state-disabled:active, +.crm-container .nav-tabs > li { /* individual tab */ + background: var(--crm-tab-bg); + border-radius: var(--crm-tab-roundness); + border: 0 solid transparent; + font-family: inherit; + color: var(--crm-c-text); + padding: 0; +} +.crm-container .ui-tabs .ui-tabs-nav li:hover, +.crm-container .ui-tabs .ui-tabs-nav li:focus, +.crm-container .nav-tabs > li:hover, +.crm-container .nav-tabs > li:focus { /* individual tab hover */ + background: var(--crm-tab-bg-hover); +} +.crm-container .nav-tabs > li > a:hover, +.crm-container .nav-tabs > li > a:focus { /* reset from _nav.css */ + background-color: transparent; +} +.crm-container .ui-tabs ul.ui-tabs-nav li.ui-tabs-selected, +.crm-container .ui-tabs .ui-tabs-nav li.ui-tabs-active, +.crm-container .nav-tabs > li.active , /* using # to occlude BS */ +.crm-container .nav-tabs > li.active:hover, +.crm-container .nav-tabs > li.active:focus { /* individual tab active */ + background: var(--crm-tab-bg-active); + border: var(--crm-tab-border-active); + border-bottom: 0 solid transparent; + margin: var(--crm-tab-hang); +} +.crm-container .ui-tabs ul.ui-tabs-nav a:not(.button), +.crm-container .nav-tabs > li > a, +.crm-container .panel-heading .nav-tabs > li > a { + color: var(--crm-tab-col); + padding: var(--crm-tab-padding); + font-weight: var(--crm-tab-weight); + font-family: var(--crm-tab-font); + font-size: var(--crm-font-size); + line-height: var(--crm-r1); + text-decoration: none; + border-radius: var(--crm-tab-roundness); + display: block; +} +.crm-container .ui-tabs .ui-tabs-nav li.ui-tabs-selected a { + background: transparent; + color: var(--crm-tab-col); + padding: var(--crm-tab-padding); +} +.crm-container .ui-tabs ul.ui-tabs-nav a em, +.crm-container .nav-tabs a .badge { + font-family: inherit; + font-style: inherit; + background: var(--crm-tab-count-bg); + color: var(--crm-tab-count-col); + border-radius: var(--crm-m2); + min-width: var(--crm-r2); + display: inline-block; + text-align: center; + font-size: var(--crm-m2); + /* padding: 0; */ +} +.crm-container #mainTabContainer ul.ui-tabs-nav a em { + background: var(--crm-dash-tab-count-bg); + color: var(--crm-dash-tab-count-col); +} +.crm-container li.crm-count-0 a.ui-tabs-anchor, +.crm-container li.crm-count-0 a.ui-tabs-anchor em { + color: var(--crm-tab-col); +} +.crm-container .ui-tabs ul.ui-tabs-nav .crm-count-0 a em, +.crm-container #mainTabContainer ul.ui-tabs-nav .crm-count-0 a em { + background: var(--crm-c-background5); + color: var(--crm-c-light-text); +} +.crm-container .ui-tabs ul li em:empty, +.crm-container .nav-tabs .badge:empty { /* this is to keep the height of tabs with empty badges */ + min-width: 1px !important; + visibility: hidden; + width: 0 !important; + padding: 0; +} +.crm-container .ui-tabs .ui-tabs-panel { + background: var(--crm-tab-bg-active); + padding: var(--crm-tab-padding); + container-type: inline-size; +} + +/* Dashboard */ + +.crm-contact-page #mainTabContainer.ui-tabs { + border: var(--crm-dash-border); + display: var(--crm-dash-direction); + grid-template-columns: var(--crm-side-tabs-width) auto; + flex-direction: column; +} +.crm-contact-page #mainTabContainer .crm-contact-tabs-list { + background: var(--crm-dash-tabs-bg); + flex-direction: var(--crm-dash-tabs-flow); + border-radius: var(--crm-dash-tabs-roundness); + gap: var(--crm-dash-tabs-gap); + padding: var(--crm-dash-tabs-padding); + border: 0 solid transparent; + z-index: 1; +} +#mainTabContainer .crm-contact-tabs-list ~ .ui-tabs-panel { + box-shadow: var(--crm-dash-box-shadow); +} +.crm-contact-page #mainTabContainer .ui-tabs-nav li .ui-tabs-anchor:has(.crm-i) { + grid-template-columns: min-content auto min-content; +} +.crm-contact-page #mainTabContainer .ui-tabs-nav li .ui-tabs-anchor i { + font-size: var(--crm-dash-icon-size); +} +#mainTabContainer .crm-contact-tabs-list ~ .ui-tabs-panel { + flex-grow: 1; + padding: var(--crm-dash-panel-padding); + border: var(--crm-dash-panel-border); + border-radius: var(--crm-dash-panel-radius); +} +.crm-contact-page #mainTabContainer .crm-contact-tabs-list li { + background: var(--crm-dash-tab-bg); + margin: var(--crm-dash-tab-hang); +} +.crm-contact-page #mainTabContainer .crm-contact-tabs-list li .ui-tabs-anchor { + display: grid; + grid-template-columns: min-content auto; + width: var(--crm-dash-tab-width); + gap: var(--crm-m); + align-items: center; + float: var(--crm-dash-tab-align); + border-radius: var(--crm-dash-tab-radius); + padding: var(--crm-dash-tab-padding); + border: var(--crm-dash-tab-border); + text-align: var(--crm-dash-tab-align); + /* border-width: var(--crm-dash-tab-border-width); */ +} +.crm-contact-page #mainTabContainer .ui-tabs-nav.crm-contact-tabs-list li.ui-tabs-active a, +.crm-contact-page #mainTabContainer .ui-tabs-nav.crm-contact-tabs-list li:hover a, +.crm-contact-page #mainTabContainer .ui-tabs-nav.crm-contact-tabs-list li:focus a { + color: var(--crm-c-link); + background: var(--crm-dash-tab-bg-hover); + border: var(--crm-dash-tab-border-hover); + border-width: var(--crm-dash-tab-border-width); +} +.crm-contact-page #mainTabContainer .ui-tabs-nav.crm-contact-tabs-list li.ui-tabs-active { + border: 0 solid transparent; +} +.crm-container .crm-contact-page .ui-tabs-panel { + background: var(--crm-dash-panel-bg); +} +.crm-container .crm-contact-page .ui-tabs-panel .ui-tabs-panel { /* handles tabs inside a tab panel */ + background: var(--crm-tab-bg-active); +} diff --git a/civicrm/ext/riverlea/core/css/contactSummary.css b/civicrm/ext/riverlea/core/css/contactSummary.css new file mode 100644 index 0000000000..97c45c10ef --- /dev/null +++ b/civicrm/ext/riverlea/core/css/contactSummary.css @@ -0,0 +1,412 @@ +/* Style rules for Contact Summary. + Forked on 12 June 24. Called on contact Summary/Edit/Inline-Edit pages. + Status: merged */ + +.crm-container .primary .crm-label { + font-weight: bold; + font-family: var(--crm-font-bold); +} + +/* Contact name/header */ + +.crm-summary-contactname-block { + background: var(--crm-dash-header-bg); + color: var(--crm-dash-header-col); + padding: var(--crm-dash-header-padding); + margin-left: var(--crm-dash-heading-inset); +} + +/* Image */ + +#crm-main-content-wrapper { + position: relative; +} +#mainTabContainer { + position: inherit; +} +.crm-inline-edit-container .crm-contact_image { + position: absolute; + top: var(--crm-dash-image-top); + right: var(--crm-dash-image-right); + z-index: 1; +} +.crm-inline-edit-container .crm-image-popup { + width: var(--crm-dash-image-size); + height: var(--crm-dash-image-size); + display: block; + background-size: cover; + border-radius: var(--crm-dash-image-radius); + box-shadow: var(--crm-bottom-shadow); + overflow: hidden; + border: var(--crm-dash-image-border); +} +.crm-container div.contact_panel { + display: block; +} +.crm-container table.image_URL-section td { + text-align: inherit; + display: flex; + align-items: start; + gap: var(--crm-flex-gap); +} + +/* Inline edit */ + +.crm-inline-edit.form { + cursor: default; + border: 1px solid var(--crm-c-focus); + border-radius: var(--crm-roundness); + background: var(--crm-inline-edit-bg); + padding: var(--crm-r); + width: fit-content; + z-index: 99; + position: absolute; + left: 0; +} +#mainTabContainer:not(.narrowpage) .contactCardRight div.crm-inline-edit.form { + right: 0; + left: initial; + position: absolute; +} +.crm-container .crm-inline-edit.add-new { + min-height: 2.5em; +} +.crm-container div.crm-summary-block .crm-edit-help { + display: block; + position: absolute; + color: transparent; + right: 0; + top: 0; + opacity: .6; + padding: var(--crm-padding-small); +} +.crm-container .crm-address-block+.crm-address-block .add-new .crm-edit-help { + display: block; + background-color: transparent; +} +.crm-container #crm-contactname-content .crm-edit-help:hover, +.crm-edit-ready .crm-summary-block .crm-inline-edit:hover .crm-edit-help { + color: var(--crm-c-text); + display: block; + opacity: 1; + background-color: var(--crm-dash-summary-row-bg); + z-index: 3; +} +#contact-summary .crm-edit-help .crm-i.fa-pencil { + float: right; + color: var(--crm-c-text); + margin: var(--crm-xs) 0 0 var(--crm-m); +} +.crm-container div.crm-inline-edit.form .crm-edit-help { + display: none !important; +} +.crm-container .crm-address-block+.crm-address-block .add-new .crm-summary-row { + display: none; +} +.crm-container span.crm-custom-greeting { + font-size: var(--crm-small-font-size); +} +.crm-container table.crm-inline-edit-form td, +.crm-container div.crm-inline-edit-form { + background-color: transparent; + white-space: nowrap; + text-align: left !important /* vs _tables.css:95 */; +} +.crm-container table.crm-inline-edit-form td.crm-label, +.crm-container div.crm-inline-edit-form .crm-label, +.crm-container div.crm-inline-edit-form .messages { + white-space: normal; +} +.crm-container div.crm-inline-edit-field { + display: inline-block; + padding: 4px 5px; +} +.crm-inline-edit.form td { + background: transparent; + padding: var(--crm-m); + border-bottom: 0 solid transparent; +} +.CRM_Contact_Form_Inline_ContactName div.crm-inline-edit-form { + white-space: nowrap; + padding: var(--crm-dash-block-padding); + display: flex; + color: var(--crm-c-text); + background-color: var(--crm-inline-edit-bg); +} +div.crm-inline-edit-form div.crm-clear { + padding: var(--crm-m) 0 0; +} +#contactname-block, +#contactname-block .crm-inline-edit, +.crm-inline-edit-form div.crm-summary-row { + border: 0 solid transparent; + width: 100%; +} +#contactname-block .crm-inline-edit .crm-container { + overflow: scroll !important; /* vs inline css */ +} +.crm-inline-edit-form div.crm-summary-row div.crm-label, +.crm-inline-edit-form div.crm-summary-row .label { + background: transparent; +} +.crm-inline-edit-form div.crm-summary-row div.crm-content { + display: table-cell; + padding: 0; +} +#contact-summary .crm-inline-button, +#contact-summary .crm-submit-buttons { + margin-bottom: 0; + padding-bottom: var(--crm-m2); +} +.CRM_Contact_Form_Inline_ContactName .crm-inline-button { + margin-left: auto; + order: 2; + align-self: end; +} +#crm-contactname-content > .crm-inline-block-content { + display: flex; + gap: var(--crm-r); + align-items: center; + border: 2px dashed transparent; +} +#crm-contactname-content > .crm-inline-block-content:hover, +#crm-contactname-content > .crm-inline-block-content:focus { + border-color: var(--crm-c-gray-200); +} +#crm-contactname-content .crm-summary-display_name { + padding: var(--crm-dash-header-padding); + font-size: var(--crm-dash-header-size); + padding-inline: 0; +} +.crm-container div.contact_panel { + display: grid; + grid-template-columns: 1fr 1fr; + column-gap: var(--crm-dash-panel-padding); +} +.crm-container div.contactCardLeft, +.crm-container div.contactCardRight { + width: 100%; +} +.crm-container div.contact_panel table { + margin-bottom: 0; + width: auto; +} +.crm-container div.contact_panel td.last { + border-bottom: 0; +} +.crm-container #customFields { + width: 100%; +} +.crm-container #customFields div.contact_panel td.talabel { + padding: 4px 0 0 4px; + border: 0; +} +.crm-container #customFields .contact_panel .customFieldGroup { + line-height: 1.4em; + padding: 4px; + width: 100%; +} +.crm-container div.contact_panel td.grouplabel { + border-bottom: var(--crm-c-divider); + border-width: 2px; +} +.crm-container div.contact_panel .crm-address-block { + margin-bottom: 6px; +} +.crm-container .crm-add-address-wrapper { + height: 25px; +} +.crm-container .crm-summary-row:after { + clear: both; + content: "."; + display: block; + height: 0; + visibility: hidden; +} +.crm-container div.crm-summary-row { + background-color: var(--crm-dash-summary-row-bg); + border-top: 1px solid var(--crm-dash-summary-row-bg); + display: flex; +} +.crm-container div.crm-summary-row div.crm-label { + background-color: var(--crm-dash-label-bg); + color: var(--crm-input-label-color); + font-weight: var(--crm-input-label-weight); + font-family: var(--crm-input-label-font); + font-size: var(--crm-font-size); + padding: var(--crm-m); + min-width: var(--crm-input-label-width); + text-align: left; +} +.crm-container div.crm-summary-row div.crm-content { + padding: var(--crm-m); +} +.crm-container #customFields div.contact_panel td { + border-bottom: 1px solid #ffffff; + padding: 4px; + vertical-align: top; +} +#crm-record-log { + padding: 0.8em 0.8em 0 0; + text-align: right; +} + +/* contact actions menu */ + +#crm-contact-actions-list { + width: 495px; +} +.crm-contact-actions-list-inner { + display: grid; + grid-template-columns: 1fr 1fr 1fr 0; +} +#crm-contact-actions-list .crm-contact_print-list { + grid-column: 3; + grid-row: 1; +} +.crm-contact_print-list ul { + display: flex; + flex-direction: column; + height: 100%; +} +#crm-contact-actions-list ul a { + display: block; +} +.crm-contact-crm-contact-delete { + margin-top: auto; +} +#crm-contact-actions-list .crm-contact_activities-list select { + margin-top: 4px; +} +.crm-container table.crm-address-element { + border: none; + margin-bottom: .25em; +} +#crm-contact-actions-list a.delete { + background: var(--crm-dropdown-alert-bg); + color: var(--crm-c-alert-text); + border-radius: var(--crm-roundness); +} +#crm-contact-actions-list a.delete .crm-i.fa-trash::before { + color: var(--crm-c-alert-text); +} +#crm-contact-actions-list a.delete:hover, +#crm-contact-actions-list a.delete:focus { + color: var(--crm-c-alert-text); + background: linear-gradient(to top,rgba(0, 0, 0, 0.125),rgba(0, 0, 0, 0.125)) var(--crm-c-alert); +} + +/* Tags */ + +#tagtree { + max-height: 500px; + overflow: auto; +} +#tagtree li { + margin-top: 5px; +} +#tagtree ins.jstree-icon { + cursor: var(--crm-hover-clickable); + position: relative; + top: -3px; +} +#tagtree .jstree-disabled { + cursor: not-allowed; +} +#tagtree .jstree-disabled > .jstree-checkbox { + opacity: .2; +} +#tagGroup table .label { + color: #fff; +} +#tagGroup table { + color: #000; +} +.crm-contact-page #tags { + display: flex; + gap: var(--crm-s); + align-items: center; +} +.crm-contact-page .crm-tag-item { + border-radius: var(--crm-roundness); + padding: 0 var(--crm-m); + background-color: var(--crm-c-background2); +} +#crm-main-content-wrapper:has(.crm-contact-page) { + box-shadow: var(--crm-block-shadow); +} +#contact-summary .crm-summary-block { + background: var(--crm-dash-block-bg); + border-radius: var(--crm-roundness); + box-shadow: var(--crm-block-shadow); + margin-bottom: var(--crm-dash-panel-padding); +} +#contact-summary .crm-summary-block .crm-summary-block { + box-shadow: none; +} +#contact-summary div.crm-clear { + padding: var(--crm-dash-block-padding); +} +#mainTabContainer .crm-summary-block .crm-container-snippet table { + box-shadow: none; + border: 0; + padding: 0; + margin: 0; +} +div.crm-summary-contactname-block + .crm-actions-ribbon { + color: var(--crm-dash-header-col); + background-color: var(--crm-dash-header-bg2); + margin-bottom: 0; + clear: both; + margin-left: var(--crm-dash-heading-inset); +} +.crm-actions-ribbon ul#actions { + display: grid; + grid-template-columns: min-content min-content auto min-content min-content; + gap: var(--crm-m); + margin: 0; + padding: var(--crm-dash-header-padding); +} +.crm-actions-ribbon ul#actions > * { + width: max-content; + display: flex; + list-style: none; +} +.crm-search-col-type-field span.ng-scope a { + display: flex; + gap: var(--crm-btn-icon-spacing); + align-items: center; +} +/* Contact dashboard responsive (using Bootstrap viewports) */ + +@media (max-width: 768px) { + #crm-main-content-wrapper { + --crm-dash-heading-inset: 0; /* resets any inset on the title/action links */ + } + .crm-container #mainTabContainer, + .crm-container div.crm-summary-row { + flex-direction: column; + } + .crm-container .crm-actions-ribbon ul#actions { + display: flex; + flex-wrap: wrap; + } + .crm-actions-ribbon .crm-next-action, + .crm-actions-ribbon .crm-previous-action { + margin-left: 0; + } +} +@media (max-width: 500px) { /* shows only icons for contact dashboard */ + .crm-contact-page #mainTabContainer.ui-tabs { + grid-template-columns: auto 1fr; + } + .crm-contact-page #mainTabContainer .crm-contact-tabs-list { + width: fit-content; + } + .crm-container #mainTabContainer .ui-tabs-nav li .ui-tabs-anchor i { + font-size: var(--crm-font-size); + } + .crm-container #mainTabContainer ul.ui-tabs-nav a span { + display: none; + } +} diff --git a/civicrm/ext/riverlea/core/css/crm-i.css b/civicrm/ext/riverlea/core/css/crm-i.css new file mode 100644 index 0000000000..7c80ad7b92 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/crm-i.css @@ -0,0 +1,44 @@ +/* Direct copy of .fa from font-awesome.css +This is separate to avoid conflict with a site theme's implementation of FA. It +is loaded before font-awesome.css so that .fa-XXX classes can modify it. */ +.crm-container .ui-icon[class*=" fa-"], +.crm-container a.helpicon, +.crm-container .help a.helpicon, +.crm-container .replace-plain::before, +.crm-i { + display: inline-block; + font-family: "Font Awesome 6 Free", "Font Awesome 6 Brands", "FontAwesome"; + font-weight: 400; + font-size: inherit; + font-style: normal; + font-variant: normal; + text-rendering: auto; + text-decoration: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.crm-container a.helpicon { + margin-inline: var(--crm-s); +} + +/* Make jQuery UI icons use FA */ +.crm-container .ui-icon[class*=" fa-"] { + background: none repeat scroll 0 0 transparent; + margin: 0; + text-indent: 0; +} + +/* Extra icons to augment Font Awesome, e.g. fa-crm-formula */ +.crm-i[class*="fa-crm-"] { + height: 1rem; + width: 1rem; + vertical-align: middle; + background-color: currentColor; + mask: var(--icon); + mask-size: cover; + -webkit-mask: var(--icon); + -webkit-mask-size: cover; +} +.crm-i.fa-crm-formula { + --icon: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 121.83 122.88' style='enable-background:new 0 0 121.83 122.88' xml:space='preserve'%3E%3Cg%3E%3Cpath d='M27.61 34.37l-4.07 4.6l0.4 1.74h10.48c-2.14 12.38-3.74 23.54-6.81 40.74c-3.67 21.94-5.78 27.33-7.03 29.3 c-1.1 1.95-2.68 2.96-4.82 2.96c-2.35 0-6.6-1.86-8.88-3.97c-0.82-0.56-1.79-0.42-2.82 0.26C2 111.74 0 114.42 0 116.82 c-0.12 3.24 4.21 6.06 8.34 6.06c3.64 0 9-2.28 14.64-7.64c7.71-7.31 13.48-17.34 18.3-39.02c3.1-13.84 4.56-22.84 6.74-35.5 l13.02-1.18l2.82-5.17H49.2C52.99 10.53 55.95 7 59.59 7c2.42 0 5.24 1.86 8.48 5.52c0.96 1.32 2.4 1.18 3.5 0.28 c1.85-1.1 4.13-3.92 4.28-6.48C75.96 3.5 72.6 0 66.82 0C61.58 0 53.55 3.5 46.8 10.38c-5.92 6.27-9.02 14.1-11.16 23.99H27.61 L27.61 34.37z M69.27 50.33c4.04-5.38 6.46-7.17 7.71-7.17c1.29 0 2.32 1.27 4.53 8.41l3.78 12.19 c-7.31 11.18-12.66 17.41-15.91 17.41c-1.08 0-2.17-0.34-2.94-1.1c-0.76-0.76-1.6-1.39-2.42-1.39c-2.68 0-6 3.25-6.06 7.28 c-0.06 4.11 2.82 7.05 6.6 7.05c6.49 0 11.98-6.37 22.58-23.26l3.1 10.45c2.66 8.98 5.78 12.81 9.68 12.81 c4.82 0 11.3-4.11 18.37-15.22l-2.96-3.38c-4.25 5.12-7.07 7.52-8.74 7.52c-1.86 0-3.49-2.84-5.64-9.82l-4.53-14.73 c2.68-3.95 5.32-7.27 7.64-9.92c2.76-3.15 4.89-4.49 6.34-4.49c1.22 0 2.28 0.52 2.94 1.25c0.87 0.96 1.39 1.41 2.42 1.41 c2.33 0 5.93-2.96 6.06-6.88c0.12-3.64-2.14-6.74-6.06-6.74c-5.92 0-11.14 5.1-21.19 20.04l-2.07-6.41 c-2.9-9-4.82-13.63-8.86-13.63c-4.7 0-11.16 5.78-17.48 14.94L69.27 50.33L69.27 50.33z'/%3E%3C/g%3E%3C/svg%3E"); +} diff --git a/civicrm/ext/riverlea/core/css/crm-iconPicker.css b/civicrm/ext/riverlea/core/css/crm-iconPicker.css new file mode 100644 index 0000000000..d322415106 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/crm-iconPicker.css @@ -0,0 +1,27 @@ +/* icon picker styles */ + +#crmIconPicker .icon-ctrls input::placeholder { + font-family: FontAwesome; +} +#crmIconPicker .icon-ctrls > * { + margin-right: 1rem; +} +#crmIconPicker .icon-ctrls > button { + float: right; + margin-right: 0; +} +#crmIconPicker .icons { + display: flex; + flex-wrap: wrap; + gap: var(--crm-m); + margin-top: 2rem; +} +#crmIconPicker a.ui-button { + color: var(--crm-c-text) !important; + background: transparent; + width: var(--crm-r2); + height: var(--crm-r2); + border: 0; + padding: 0; + display: inline-block; +} diff --git a/civicrm/ext/riverlea/core/css/dashboard.css b/civicrm/ext/riverlea/core/css/dashboard.css new file mode 100644 index 0000000000..ef73f6576b --- /dev/null +++ b/civicrm/ext/riverlea/core/css/dashboard.css @@ -0,0 +1,203 @@ +/* Style rules for Dashboard. + Forked on 11 June 24. Called on main Civi dashboard home screen. + Status: merged (theme edits integrated) + NB - all Important Declarations can be removed for > 5.75 */ + +#civicrm-dashboard > .crm-flex-box { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--crm-r); + /* avoid total collapse else no droppable area if all widgets removed */ + min-height: var(--crm-r); +} +.crm-container .crm-dashlet { + border-radius: var(--crm-dashlet-radius); + background-color: var(--crm-dashlet-bg); + padding: var(--crm-dashlet-padding); + box-shadow: var(--crm-dashlet-box-shadow); + margin-bottom: var(--crm-padding-reg); + border: var(--crm-dashlet-border); +} +.crm-container .ui-sortable-helper.crm-dashlet { + box-shadow: var(--crm-block-shadow); +} +.crm-container #civicrm-dashboard .crm-dashlet-header { + background-color: var(--crm-dashlet-header-bg); + border-radius: var(--crm-dashlet-radius); + border: var(--crm-dashlet-header-border); + border-width: var(--crm-dashlet-header-border-width); + padding: var(--crm-dashlet-header-padding); + display: flex; + align-items: center; + flex-direction: row-reverse; + cursor: move; +} +.crm-container .crm-dashlet-header h3 { + background: transparent; + cursor: move; + margin: 0 auto 0 0 !important; + padding: 0; + color: var(--crm-dashlet-header-col); + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + color: var(--crm-dashlet-header-col); + font-size: var(--crm-dashlet-header-font-size); +} +.crm-container .crm-dashlet-header a { + color: var(--crm-dashlet-header-col); + padding: var(--crm-xs) var(--crm-s); + text-decoration: none; + font-size: var(--crm-font-size); + font-weight: normal; + cursor: var(--crm-hover-clickable); + opacity: .7; + float: right; +} +.crm-container .crm-dashlet-header:hover .crm-i { + opacity: 1; +} +.crm-container .crm-dashlet-header a.crm-dashlet-collapse { + order: 1; +} +crm-dashlet[is-fullscreen=true] > .crm-dashlet-content { + height: calc(100% - 1em); +} +.crm-container .crm-dashlet-content { + background: var(--crm-dashlet-bg); + padding: var(--crm-dashlet-content-padding); + overflow: auto; +} +.crm-container .crm-dashlet-content > .ng-scope { /* for FormBuilder dashlets */ + padding: var(--crm-dash-block-padding); +} +.crm-container .crm-dashlet details.crm-accordion-bold > .crm-accordion-body { + padding: 0; + border-bottom: var(--crm-expand-border); +} +.crm-container .crm-dashlet .crm-accordion-body table { + margin: 0; + border: 0; + box-shadow: var(--crm-input-box-shadow); +} +.crm-container .crm-dashlet .crm-accordion-body table tr { + padding: var(--crm-dash-block-padding); + display: flex; + border: 0 solid transparent; + gap: var(--crm-r); +} +.crm-dashlet .dataTables_wrapper { + border-radius: 0; + box-shadow: none; + margin: 0; + padding: var(--crm-dash-block-padding); + background: var(--crm-dashlet-bg); +} +.crm-dashlet table.dataTable { + overflow: scroll; + padding: 0; + border-bottom: 0 solid transparent; + width: 99% !important; +} +.crm-dashlet #help { + margin: var(--crm-dash-block-padding); +} +.crm-container .crm-inactive-dashlet-fieldset .help { + width: 100%; + margin: 0; +} +.crm-container .crm-inactive-dashlet { + display: inline-block; + width: 230px; + height: var(--crm-xxl); + margin: 10px; + box-shadow: 1px 1px 4px 1px rgba(0,0,0,0.2); + box-shadow: var(--crm-popup-shadow); + background-color: var(--crm-c-background4); + border-radius: var(--crm-dashlet-radius); + margin: 0; +} +.crm-container .crm-inactive-dashlet .crm-dashlet-header { + border-radius: var(--crm-dashlet-radius) var(--crm-dashlet-radius) 0 0; +} +.crm-container .crm-inactive-dashlet .crm-dashlet-header h3 { + font-size: 100%; + padding-left: var(--crm-s1); +} +#civicrm-dashboard .ui-sortable-placeholder { + border: 2px dashed var(--crm-c-gray-700); + visibility: visible !important; + width: 226px; + height: 66px !important; + vertical-align: bottom; +} +#civicrm-dashboard .ui-sortable-placeholder * { + visibility: hidden; +} + +/* News feed */ +.crm-container #civicrm-news-feed { + border: 0 solid transparent; + border-radius: var(--crm-dashlet-radius); +} +#civicrm-news-feed ul { + border-bottom: var(--crm-dashlet-tabs-border); + border-radius: var(--crm-roundness); +} +#civicrm-news-feed .ui-tabs-panel { + padding: var(--crm-s) 0 0; +} +.crm-container #civicrm-news-feed .crm-accordion-body { + padding: var(--crm-expand-body-padding); +} + +/* Getting statrted */ +#civicrm-getting-started table { + box-shadow: none; + border: 0 solid transparent; + margin: 0; +} +#civicrm-getting-started table tr:last-of-type { + border-bottom: 0 solid transparent; +} + +/* Activity dashlet */ +.crm-container .crm-dashlet table.activity-search-options { + width: 100%; +} +.crm-container .crm-activity-selector-dashlet .crm-accordion-body table tr { + display: grid; + grid-template-columns: 1fr 1fr; + border: 0 solid transparent; +} + +/* Add dashlet */ +fieldset.crm-inactive-dashlet-fieldset { + padding: 0; + border: 0; + margin-bottom: var(--crm-r); +} +fieldset.crm-inactive-dashlet-fieldset > div { + background-color: var(--crm-dashlet-dashlets-bg) !important; + box-shadow: var(--crm-dashlet-box-shadow); + border-radius: var(--crm-dashlet-radius); + display: flex; + flex-wrap: wrap; + gap: var(--crm-r); + padding: var(--crm-r); +} +fieldset.crm-inactive-dashlet-fieldset legend { + background-color: transparent; + display: block; + margin-bottom: var(--crm-r); + top: var(--crm-s); +} +fieldset.crm-inactive-dashlet-fieldset legend .crm-hover-button { + padding: var(--crm-btn-large-padding); + margin-right: var(--crm-r); +} +/* Searchkit Dashlets */ + +.crm-dashlet .crm-search-display .form-inline { + padding: var(--crm-padding-reg); +} diff --git a/civicrm/ext/riverlea/core/css/joomla.css b/civicrm/ext/riverlea/core/css/joomla.css new file mode 100644 index 0000000000..f786dd617c --- /dev/null +++ b/civicrm/ext/riverlea/core/css/joomla.css @@ -0,0 +1,72 @@ +/* Joomla-specific css directives for CiviCRM. + These are namespaced to Joomla so could be loaded on other CMSs. */ + +/* Joomla 3 - body.com_civicrm */ + +body.com_civicrm { + font-size: 100%; +} +body.admin.com_civicrm { + --crm-page-padding: 3rem; + --crm-page-width: 100%; +} +body.admin.com_civicrm #subhead-container, +body.admin.com_civicrm .subhead-collapse, +body.admin.com_civicrm.layout-default a[target="_blank"]::before { + display: none; +} +body.admin.com_civicrm .crm-container details { /* Atum J4 reset */ + background: inherit; + border: none; + border-radius: inherit; + margin: 0; + padding: 0; +} +body.admin.com_civicrm .crm-container details + details { + margin: 0.25rem 0 0; +} +body.admin.com_civicrm .crm-container details summary ~ * { /* Atum J4 reset */ + margin-top: 0; +} +body.admin.com_civicrm .crm-container.ui-dialog { + z-index: 100000; +} +body.admin.com_civicrm .ui-widget-overlay { + z-index: 100001; +} +body.admin.com_civicrm .select2-drop { + z-index: 100002; +} +body.admin.com_civicrm .modal-dialog { + max-width: inherit; + margin: 0; + padding: 0; + overflow: scroll; + pointer-events: all; +} + +/* Joomla 4 - body.com_civicrm.layout-default */ + +body.admin.com_civicrm.layout-default { + --crm-page-padding: 1rem; +} +body.admin.com_civicrm.layout-default .breadcrumb { + background: transparent; +} +body.admin.com_civicrm.task-civicrmcontactview .breadcrumb, /* Hides breadcrumb on contact dashboard */ +body.admin.com_civicrm.layout-default .crm-container .dropdown-toggle::after { + display: none; +} +body.admin.com_civicrm.layout-default .container-main { + padding-bottom: 0; /* removes bottom space */ +} +body.admin.com_civicrm.layout-default #content, +body.admin.com_civicrm.layout-default #content > .row > .col-md-12 { + padding: 0; +} +body.admin.com_civicrm.layout-default #content > .row { + margin-inline: 0; +} +body.com_civicm.layout-default .table tbody a:not(.badge):not(.btn):not(.dropdown-item) { + text-decoration: var(--crm-link-decoration); +} diff --git a/civicrm/ext/riverlea/core/css/rename-css-var.php b/civicrm/ext/riverlea/core/css/rename-css-var.php new file mode 100644 index 0000000000..7ef304b798 --- /dev/null +++ b/civicrm/ext/riverlea/core/css/rename-css-var.php @@ -0,0 +1,89 @@ +<?php +if (PHP_SAPI !== 'cli') { + http_response_code(404); + exit; +} + +// Put old var name then some spaces, then new var name. +// Run with: php fix.php from within the css/ dir. +$names = explode("\n", <<<TXT +--crm-alert --crm-c-alert +--crm-alert-text --crm-c-alert-text +--crm-amber --crm-c-amber +--crm-background --crm-c-background +--crm-background2 --crm-c-background2 +--crm-background3 --crm-c-background3 +--crm-background4 --crm-c-background4 +--crm-background5 --crm-c-background5 +--crm-blue --crm-c-blue +--crm-blue-dark --crm-c-blue-dark +--crm-blue-darker --crm-c-blue-darker +--crm-blue-light --crm-c-blue-light +--crm-dark-teal --crm-c-dark-teal +--crm-dark-text --crm-c-dark-text +--crm-darkest --crm-c-darkest +--crm-divider --crm-c-divider +--crm-drag-background --crm-c-drag-background +--crm-focus --crm-c-focus +--crm-gray-025 --crm-c-gray-025 +--crm-gray-050 --crm-c-gray-050 +--crm-gray-100 --crm-c-gray-100 +--crm-gray-200 --crm-c-gray-200 +--crm-gray-300 --crm-c-gray-300 +--crm-gray-400 --crm-c-gray-400 +--crm-gray-500 --crm-c-gray-500 +--crm-gray-600 --crm-c-gray-600 +--crm-gray-700 --crm-c-gray-700 +--crm-gray-800 --crm-c-gray-800 +--crm-gray-900 --crm-c-gray-900 +--crm-green --crm-c-green +--crm-green-dark --crm-c-green-dark +--crm-green-light --crm-c-green-light +--crm-inactive --crm-c-inactive +--crm-info --crm-c-info +--crm-info-text --crm-c-info-text +--crm-light-text --crm-c-light-text +--crm-link --crm-c-link +--crm-link-hover --crm-c-link-hover +--crm-page-background --crm-c-page-background +--crm-primary --crm-c-primary +--crm-primary-hover --crm-c-primary-hover +--crm-primary-text --crm-c-primary-text +--crm-purple --crm-c-purple +--crm-purple-dark --crm-c-purple-dark +--crm-red --crm-c-red +--crm-red-dark --crm-c-red-dark +--crm-red-light --crm-c-red-light +--crm-secondary --crm-c-secondary +--crm-secondary-hover --crm-c-secondary-hover +--crm-secondary-text --crm-c-secondary-text +--crm-success --crm-c-success +--crm-success-text --crm-c-success-text +--crm-teal --crm-c-teal +--crm-text --crm-c-text +--crm-warning --crm-c-warning +--crm-warning-text --crm-c-warning-text +--crm-yellow --crm-c-yellow +--crm-yellow-less-light --crm-c-yellow-less-light +--crm-yellow-light --crm-c-yellow-light +--crm-amber-light --crm-c-amber-light +TXT); +$map = []; +foreach ($names as $pair) { + [$old, $new] = preg_split('/\s+/', $pair); + $map[$old] = $new; +} +$di = new RecursiveDirectoryIterator(__DIR__, RecursiveDirectoryIterator::SKIP_DOTS); +$it = new RecursiveIteratorIterator($di); +foreach ($it as $filepath) { + if (pathinfo($filepath, PATHINFO_EXTENSION) == "css") { + $orig = $css = file_get_contents($filepath); + foreach ($map as $old => $new) { + $css = preg_replace("/$old(?!-)/", $new, $css); + } + if ($orig !== $css) { + echo "Updated $filepath\n"; + file_put_contents($filepath, $css); + } + } +} diff --git a/civicrm/ext/riverlea/core/css/searchForm.css b/civicrm/ext/riverlea/core/css/searchForm.css new file mode 100644 index 0000000000..a383b621fa --- /dev/null +++ b/civicrm/ext/riverlea/core/css/searchForm.css @@ -0,0 +1,45 @@ +/* Style rules for some search forms and results. + Forked on 1 JuAugustne 24. + Status: merged */ + +/* Alpha filter */ + +.crm-container div#alpha-filter { + background-color: var(--crm-filter-bg); + margin: var(--crm-r) 0; + padding: var(--crm-filter-padding); + text-align: left; + box-shadow: var(--crm-block-shadow); + border-radius: var(--crm-roundness); +} +#crm-container #alpha-filter ul { + margin: 0; + display: flex; + gap: var(--crm-flex-gap); + justify-content: var(--crm-filter-spacing); +} +.crm-container #alpha-filter li { + color: var(--crm-c-text); +} +.crm-container #alpha-filter a { + font-weight: normal; + background: var(--crm-filter-item-bg); + padding: var(--crm-s) var(--crm-m); + box-shadow: var(--crm-filter-item-shadow); +} + +/* Advanced Search - basic criteria */ + +.advanced-search-fields { + display: grid; + grid-template-columns: repeat(3, 1fr); + width: 100%; + column-gap: var(--crm-r); + row-gap: var(--crm-s); +} +.advanced-search-fields .search-field__span-2 { + grid-column: 1 / span 2; +} +.advanced-search-fields .search-field__span-3 { + grid-column: 1 / span 3; +} diff --git a/civicrm/ext/riverlea/core/org.civicrm.afform-ang/afCore.css b/civicrm/ext/riverlea/core/org.civicrm.afform-ang/afCore.css new file mode 100644 index 0000000000..8c0b255576 --- /dev/null +++ b/civicrm/ext/riverlea/core/org.civicrm.afform-ang/afCore.css @@ -0,0 +1,101 @@ +/* Style rules for Form Builder Admin + Forked on 29 July 24. Called on Form Builder front-end + Status: merged */ + +.af-api4-action-running { + cursor: not-allowed; + color: var(--crm-c-darkest); +} +a.af-api4-action-idle { + cursor: var(--crm-hover-clickable); +} +.crm-container .af-container.af-layout-cols, +.af-container.af-layout-inline { + display: flex; + flex-wrap: wrap; + gap: var(--crm-flex-gap); +} +.af-container.af-layout-cols > *, +.af-container.af-layout-inline > * { + flex: 1; +} +.af-container.af-layout-inline { + flex-direction: row; +} +.af-container.af-layout-cols > .af-title { + flex: 0 0 100%; +} +.af-container.af-layout-inline > .af-title { + display: block; + width: 100%; +} +.afform-directive, +af-form { + display: block; + position: relative; +} +#bootstrap-theme .input-group .crm-af-field { + display: inline-block; +} +#bootstrap-theme .input-group .afform-search-operator { + width: 6rem; +} +[af-repeat-item] { + position: relative; +} +#bootstrap-theme [af-repeat-item] .af-repeat-remove-btn { + min-width: 30px; + position: absolute; + top: 0; + right: 0; +} +.crm-container details.af-container { + border: var(--crm-expand-border); + border-radius: var(--crm-expand-radius); + padding-block: 0; +} + +/* Card style */ +.af-container-style-pane { + background-color: var(--crm-form-block-background); + border-radius: var(--crm-form-block-border-radius); + box-shadow: var(--crm-form-block-box-shadow); + position: relative; + padding: var(--crm-form-block-padding); + padding-top: 50px !important; +} +#bootstrap-theme .af-container-style-pane > .af-title { + background-color: var(--crm-c-background5); + color: var(--crm-c-light-text); + border-radius: var(--crm-form-block-border-radius) var(--crm-form-block-border-radius) 0 0; + position: absolute; + top: 0; + left: 0; + width: 100%; + padding: var(--crm-m) var(--crm-r); + margin-top: 0; +} + +/* Admin edit links */ +.afform-directive .af-admin-edit-form-link { + position: absolute !important; + right: 0; + top: 0; + opacity: .5; +} +.afform-directive .af-admin-edit-form-link.open, +.afform-directive:hover .af-admin-edit-form-link { + opacity: 1; +} + +/* Fieldset */ + +fieldset.af-container.af-layout-inline { + border: 0; +} + +/* Multiple button gap */ + +#bootstrap-theme .crm-search-col-type-buttons .btn { + margin: 0 var(--crm-flex-gap) var(--crm-flex-gap) 0; +} diff --git a/civicrm/ext/riverlea/core/org.civicrm.afform_admin-ang/afGuiEditor.css b/civicrm/ext/riverlea/core/org.civicrm.afform_admin-ang/afGuiEditor.css new file mode 100644 index 0000000000..ca5c3574bc --- /dev/null +++ b/civicrm/ext/riverlea/core/org.civicrm.afform_admin-ang/afGuiEditor.css @@ -0,0 +1,696 @@ +/* Style rules for Form Builder Admin + Forked on 24 July 24. Called on Form Builder + Status: merged */ + +/* List page */ +.afadmin-list th[ng-click] { + cursor: var(--crm-hover-clickable); +} +.afadmin-list th i.fa-sort-desc, +.afadmin-list th i.fa-sort-asc { + color: var(--crm-c-link); +} +.afadmin-list th:not(:hover) i.fa-sort { + opacity: .5; +} +#afform-list-filter { + font-family: sans-serif,'FontAwesome'; +} +/* Editor */ + +#afGuiEditor { + gap: var(--crm-r); + height: 100% !important /* vs inline fixed height */; +} +#afGuiEditor .af-gui-columns { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--crm-r); +} +#afGuiEditor fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +#afGuiEditor fieldset legend { + padding: var(--crm-s) 0 0 0; + border-bottom: var(--crm-c-divider); + width: 100%; + margin-bottom: var(--crm-m); +} +#afGuiEditor hr { + margin-block: var(--crm-m); +} + +/* Icon only buttons */ + +#afGuiEditor .panel-heading .af-gui-canvas-control-buttons button, +#afGuiEditor .af-gui-remove-entity, +#bootstrap-theme #afGuiEditor .af-gui-field-select-in-dropdown button /* icon-only buttons */ { + padding: 0; + margin: 0; + max-height: 32px; + aspect-ratio: 1 / 1; +} +#afGuiEditor .af-gui-field-select-in-dropdown button i.crm-i, +#afGuiEditor-canvas .af-gui-canvas-control-buttons button.btn-default i.crm-i, +#afGuiEditor .af-gui-remove-entity i.crm-i { + margin: 0; + border: 0; + padding: var(--crm-s2); + height: 100%; + aspect-ratio: 1 / 1; + min-width: var(--crm-r4); + display: flex; + align-items: center; + justify-content: center; +} + +/* Panel */ +#afGuiEditor-canvas .panel-heading { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: var(--crm-tabs-border); +} +#afGuiEditor-canvas .panel-heading > .nav-tabs { + width: auto; + border-bottom: 0; +} +#afGuiEditor-canvas .panel-heading > .af-gui-canvas-control-buttons, +#afGuiEditor-canvas .panel-heading > .pull-right, +#afGuiEditor .af-gui-edit-options-bar .pull-right { + order: 2; + display: flex; + gap: var(--crm-flex-gap); + padding: 0; + align-items: center; +} +#afGuiEditor-canvas .panel-heading > .pull-right { + order: 3; +} +#afGuiEditor .panel-heading ul.nav-tabs li.fluid-width-tab { + white-space: nowrap; + overflow: hidden; +} +#afGuiEditor .panel-heading .form-inline.pull-right button { + max-height: 32px; + margin: 0; +} +#afGuiEditor .panel-body { + padding: var(--crm-padding-reg); + position: relative; + border-top: none !important; + height: 100%; + background: var(--crm-tab-bg-active); +} + +/* Edit palette (left side) */ +#afGuiEditor-palette input, +#afGuiEditor-palette textarea, +#afGuiEditor-palette select { + width: 100%; +} +#afGuiEditor-palette input[type="checkbox"], +#afGuiEditor-palette input[type="radio"] { + width: 1rem; + height: 1rem; +} +#afGuiEditor-palette .form-group label { + width: 100%; + display: block; +} +#afGuiEditor-palette .checkbox label { + padding: 0; +} +#afGuiEditor-palette .input-group:has(#af_config_redirect) { + display: grid; + gap: var(--crm-s); + grid-template-columns: 1fr 250px; +} +#afGuiEditor-palette .input-group:has(#af_config_redirect) .input-group-addon, +#afGuiEditor-palette input.select2-input { + width: 100%; + min-width: 100%; +} +#afGuiEditor-palette #s2id_autogen3 { + width: 100% !important /* vs inline */; +} +#afGuiEditor-palette #af_config_form_permission_operator { + width: 60px; +} +#afGuiEditor-palette #s2id_af_config_form_permission { + width: calc(100% - 66px) !important /* vs inline */; +} + +/* Builder settings */ +#afGuiEditor-palette .af-gui-remove-entity { + position: absolute; + top: var(--crm-padding-reg); + right: var(--crm-padding-reg); +} +#afGuiEditor-palette .af-gui-entity-values .form-inline { + margin-bottom: var(--crm-m); + display: flex; + align-items: center; + gap: var(--crm-flex-gap); +} +#afGuiEditor-palette .af-gui-entity-values .select2-container { + width: 100% !important /* vs inline */; + margin-bottom: var(--crm-s2); +} +#afGuiEditor-palette .af-gui-entity-values .input-group { + width: 100%; + display: flex; +} +#afGuiEditor-palette .af-gui-entity-values .input-group > span { + width: 100%; +} +#bootstrap-theme #afGuiEditor-palette .af-gui-entity-values .input-group .btn { + height: calc(var(--crm-btn-height) + 4px); +} +#afGuiEditor-palette .af-gui-entity-palette legend { + margin-bottom: 0; + padding-bottom: 0; + border-bottom: 0; +} +#afGuiEditor-palette .af-gui-entity-palette .input-group { + margin-top: var(--crm-s); +} +#afGuiEditor-palette .af-gui-entity-palette [type="search"] { + width: 100%; + border-radius: var(--crm-roundness) var(--crm-roundness) 0 0; + padding: var(--crm-s2); + font-weight: normal; + position: relative; + margin: 0; + border-bottom: 0; + font-family: sans-serif,'FontAwesome'; +} +.af-gui-entity-palette-select-list { + border: var(--crm-c-divider); + border-radius: 0 0 var(--crm-roundness) var(--crm-roundness); + padding: 0 var(--crm-s) var(--crm-s); + max-height: 400px; + overflow-y: auto; +} +.af-gui-entity-palette-select-list [ui-sortable] > div { + cursor: move; + padding: var(--crm-xs) var(--crm-m) var(--crm-xs) var(--crm-r); + position: relative; +} +.af-gui-entity-palette-select-list [ui-sortable] > div.disabled { + cursor: auto; +} +.af-gui-entity-palette-select-list [ui-sortable] > div:not(.disabled):hover { + background-color: var(--crm-c-background3); +} + +/* Edit canvas (right side) */ +#afGuiEditor-canvas .af-gui-container, +#afGuiEditor-canvas .af-gui-markup, +#afGuiEditor-canvas .af-gui-text, +#afGuiEditor-canvas .af-gui-button, +#afGuiEditor-canvas .af-gui-element { + margin-bottom: var(--crm-padding-small); + border: 2px solid transparent; + display: block; + border-radius: var(--crm-roundness); + position: relative; + padding: var(--crm-m); +} +#afGuiEditor af-gui-field, +#afGuiEditor .af-gui-block-label, +#afGuiEditor af-gui-edit-options { + display: block; +} +#afGuiEditor .af-gui-container-type-fieldset { + box-shadow: 0 0 5px var(--crm-c-gray-300); +} + +/* Canvas gui bar */ +#afGuiEditor-canvas .af-gui-bar { + height: var(--crm-l); + width: 100%; + border-radius: 0; + transition: opacity .2s; + background-color: var(--crm-c-background3); + padding-inline: var(--crm-xs); + cursor: move; + display: flex; + justify-content: space-between; + align-items: center; +} +#afGuiEditor [ui-sortable] .af-gui-bar:before, +#afGuiEditor .af-gui-entity-palette-select-list [ui-sortable] > div:not(.disabled):hover:before, +#afGuiEditor af-gui-edit-options.af-gui-content-editing-area [ui-sortable] li:before { + background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjODg4Ij48L3JlY3Q+Cjwvc3ZnPg=="); + width: var(--crm-m); + height: calc(100% - var(--crm-m)); + content: ' '; + width: 10px; +} +#afGuiEditor-canvas .af-gui-bar .form-inline { + padding: 0; + display: flex; + gap: var(--crm-flex-gap); + align-items: center; +} +#afGuiEditor-canvas af-gui-container-multi-toggle .btn .ng-binding { + display: flex; + margin-right: var(--crm-m); +} +#afGuiEditor .af-gui-node-title { + position: absolute; + top: 1px; + width: calc(100% - var(--crm-r4)); +} +#afGuiEditor-canvas:not(.af-gui-menu-open) .af-gui-bar, +#afGuiEditor-canvas:not(.af-gui-menu-open) .af-gui-container-title span:empty { + opacity: 0; +} +#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-bar, +#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-container-title span:empty { + opacity: 1; + transition: opacity .2s; +} +#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-container:not(.af-gui-container-type-fieldset), +#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-element, +#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-markup { + border: 2px solid var(--crm-c-background2); +} +/* Dragging related */ +#afGuiEditor #afGuiEditor-canvas .af-gui-dragtarget > .af-gui-bar, +#afGuiEditor #afGuiEditor-canvas .af-gui-dragtarget > .af-gui-container-title span:empty { + background-color: var(--crm-c-background4); + opacity: 1; + transition: opacity .1s; +} +/* Disable menu while dragging */ +body.af-gui-dragging #civicrm-menu { + pointer-events: none; +} +/* Disable scrollbars while dragging */ +body.af-gui-dragging { + overflow-x: hidden; + overflow-y: hidden; +} +af-gui-container > .af-gui-bar, +.af-gui-element > .af-gui-bar, +.af-gui-container-type-div > .af-gui-bar, +.af-gui-markup > .af-gui-bar { + margin: calc(-1 * var(--crm-m)) calc(-1 * var(--crm-m)) var(--crm-m) calc(-1 * var(--crm-m)); + width: calc(100% + var(--crm-r)) !important; +} +#afGuiEditor-canvas [ui-sortable] .af-gui-bar:has(~ .af-gui-field-input) { + border-radius: var(--crm-roundness) var(--crm-roundness) 0 0; +} + +/* Canvas layout */ +#afGuiEditor .af-gui-layout { + min-height: 2rem; +} +#afGuiEditor .af-gui-layout.af-layout-cols, +#afGuiEditor .af-gui-layout.af-layout-inline { + display: flex; + gap: var(--crm-m); +} +#afGuiEditor .af-gui-layout.af-layout-inline { + flex-flow: wrap; +} +#afGuiEditor .af-gui-layout.af-layout-cols > div { + flex: 1; + min-width: 1%; +} +#afGuiEditor .af-gui-layout.af-layout-inline > div { + display: inline-block; + width: 300px; + vertical-align: top; +} + +/* Canvas elements */ +#afGuiEditor.af-gui-editing-content .af-gui-container, +#afGuiEditor .af-gui-markup-content { + border: 2px solid transparent; +} +#afGuiEditor-canvas:not(.af-gui-menu-open) .af-gui-container:hover, +.af-gui-dragging #afGuiEditor .af-gui-container, +#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-container:hover, +#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-element:hover, +#afGuiEditor:not(.af-gui-dragging *) #afGuiEditor-canvas:hover .af-gui-markup:hover, +#afGuiEditor .crm-editable-enabled:hover:not(:focus) { + border: 2px dashed var(--crm-c-gray-700); +} +#afGuiEditor-canvas:not(.af-gui-menu-open) .af-gui-container .af-gui-element:hover, +#afGuiEditor-canvas:not(.af-gui-menu-open) .af-gui-container .af-gui-markup:hover { + border-width: 1px; +} +#afGuiEditor-canvas .af-entity-selected { + border: 2px dashed var(--crm-c-blue-dark); +} +#afGuiEditor-canvas .af-entity-selected > .af-gui-bar { + background-color: var(--crm-c-primary); + opacity: 1; + transition: opacity 0s; +} +#afGuiEditor-canvas .af-entity-selected > .af-gui-bar + label, +#afGuiEditor .af-entity-selected > .af-gui-bar .af-gui-add-element-button span { + color: var(--crm-c-primary-text); +} +#afGuiEditor .af-gui-container.af-gui-dragtarget { + border: 2px solid var(--crm-c-blue-dark); + box-shadow: 0 0 5px var(--crm-c-blue-dark); +} + +/* Card style */ +#afGuiEditor .af-gui-search-display { + border: 1px dotted var(--crm-c-background5); + color: var(--crm-c-text); + padding: var(--crm-padding-reg); + background-color: var(--crm-c-background2); +} + +/* Markup area */ +#afGuiEditor .af-gui-markup-content-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +#afGuiEditor .af-gui-markup-content:hover .af-gui-markup-content-overlay { + background-color: rgba(255, 255, 255, .2); +} +#afGuiEditor .af-gui-content-editing-area .af-gui-edit-options-bar { + width: 100%; + background-color: var(--crm-c-background3); + display: flex; + align-items: center; + padding: var(--crm-m); + justify-content: space-between; +} +.af-gui-edit-options-bar h4 { + font-size: var(--crm-font-size); + margin: 0 !important; /* vs bootstrap.css */ +} +#afGuiEditor .af-gui-content-editing-area { + pointer-events: auto; + cursor: auto; +} +#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .form-inline > .btn-group > .btn-group > button:hover > span, +#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .form-inline > .btn-group > .btn-group > button[aria-expanded=true] > span, +#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .form-inline > .btn-group > .btn-group > button:focus > span { + color: var(--crm-c-info); +} +#afGuiEditor .af-gui-add-element-button span { + display: inline-block; + width: 18px; + height: 18px; + color: var(--crm-c-info); +} +#bootstrap-theme #afGuiEditor .af-gui-button > .btn.disabled .crm-editable-enabled:hover:not(:focus) { + border-color: var(--crm-c-background2) !important; +} +#bootstrap-theme #afGuiEditor .af-gui-button > .btn-default.disabled { + background-color: var(--crm-c-background2) !important; +} +#afGuiEditor .af-gui-container-title span:empty { + font-weight: lighter; +} +#afGuiEditor .af-gui-field-required:after { + content: '*'; + color: var(--crm-c-alert); + position: relative; + left: -4px; +} +/* For editing field placeholder text */ +#afGuiEditor .af-gui-field-input input[type=text].form-control { + color: var(--crm-c-background5); +} +#afGuiEditor .af-gui-field-input-type-number input[type=text].form-control { + background-image: url('../images/number.png'); + background-repeat: no-repeat; + background-position: center right 6px; +} +#afGuiEditor .af-gui-field-input input.crm-form-date { + width: 140px; + margin-right: -2px; +} +#afGuiEditor .af-gui-field-input input.crm-form-time { + width: 80px; +} +#afGuiEditor .af-gui-field-input-type-radio label.radio { + font-weight: normal; + margin-right: 10px; +} +#afGuiEditor .af-gui-field-input-type-radio label.radio input[type=radio] { + margin: 0; +} +#afGuiEditor .af-gui-field-input-type-select .input-group-btn { + position: initial; +} +#afGuiEditor .input-group-addon { + padding: 0; +} +#afGuiEditor .af-gui-text-legend { + text-decoration: underline; +} +#afGuiEditor .af-gui-text-h1, +#afGuiEditor .af-gui-text-h2, +#afGuiEditor .af-gui-text-h3, +#afGuiEditor .af-gui-text-h4, +#afGuiEditor .af-gui-text-h5, +#afGuiEditor .af-gui-text-h6 { + font-weight: bold; + font-family: var(--crm-font-bold); +} +#afGuiEditor.af-gui-editing-content .panel-heading, +#afGuiEditor.af-gui-editing-content .af-gui-element, +#afGuiEditor.af-gui-editing-content .af-gui-markup-content, +.af-gui-editing-content #afGuiEditor-palette .panel-body > * { + opacity: .5; +} +#afGuiEditor.af-gui-editing-content .af-gui-bar { + visibility: hidden; +} +#afGuiEditor.af-gui-editing-content .af-gui-bar:before { + background: none; +} +#afGuiEditor .af-gui-dropzone { + background-color: var(--crm-c-background2); + border: 2px solid var(--crm-c-info); + min-height: 30px; +} +/* Options editor */ +#afGuiEditor af-gui-edit-options.af-gui-content-editing-area { + border: 2px solid var(--crm-c-info); +} +#afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul[ui-sortable] { + padding-inline: var(--crm-padding-reg); +} +#afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul[ui-sortable] li { + background-color: var(--crm-c-background2); + cursor: move; + height: var(--crm-btn-height); + display: flex; + align-items: center; + padding-inline: var(--crm-m); +} +#afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul[ui-sortable] li:nth-child(even) { + background-color: var(--crm-c-background3); +} +#afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul[ui-sortable] li > div { + display: inline-block; +} +#afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul.af-gui-edit-options-deleted li > div { + text-decoration: line-through; +} +#bootstrap-theme #afGuiEditor af-gui-edit-options.af-gui-content-editing-area ul[ui-sortable] li .btn-xs { + padding: 1px; +} +#afGuiEditor af-gui-edit-options.af-gui-content-editing-area h5 { + margin-left: var(--crm-padding-reg); +} +#afGuiEditor af-gui-edit-options.af-gui-content-editing-area button.pull-right { + margin-left: auto; +} + +/* Rules for Conditional dialog */ +.af-gui-conditional-dialog fieldset { + padding: 6px; + border-top: 1px solid var(--crm-c-background2); + margin-top: 10px; + margin-bottom: 10px; + position: relative; +} +.af-gui-conditional-dialog fieldset fieldset { + padding-top: 0; + border: 1px solid var(--crm-c-background2); + border-top: 0; +} +#bootstrap-theme .af-gui-conditional-dialog af-gui-clause > .btn-group { + position: absolute; + right: 0; + top: 0; +} +.af-gui-conditional-dialog legend[ng-click] { + cursor: var(--crm-hover-clickable); +} +i.crm-i.af-gui-conditional-dialog-move-icon { + opacity: .5; +} +.crm-draggable:hover > i.crm-i.af-gui-conditional-dialog-move-icon, +.crm-draggable:hover > * > i.crm-i.af-gui-conditional-dialog-move-icon { + opacity: 1; +} +.af-gui-conditional-dialog .api4-clause-badge { + width: 55px; + display: inline-block; + cursor: move; +} +.af-gui-conditional-dialog .api4-clause-badge .badge { + opacity: .5; + position: relative; +} +.af-gui-conditional-dialog .api4-clause-badge .caret { + margin: 0; +}/* Icon only shown while dragging */ +.af-gui-conditional-dialog .api4-clause-badge .crm-i { + display: none; + padding: 0 6px; +} +.af-gui-conditional-dialog .ui-sortable-helper .api4-clause-badge .badge span { + display: none; +} +.af-gui-conditional-dialog .ui-sortable-helper .api4-clause-badge .crm-i { + display: inline-block; +} + +/* Dropdown buttons */ +#bootstrap-theme #afGuiEditor-canvas .dropdown-toggle, +#bootstrap-theme #afGuiEditor .af-gui-add-element-button { + padding: 0; + background-color: transparent; + border: 0; + box-shadow: none; + color: var(--crm-c-text); + height: auto; +} +#afGuiEditor-canvas .dropdown-toggle i.crm-i { + padding: 0 !important; + background: transparent; + border: 0; + min-width: auto; + height: auto; +} +#afGuiEditor .dropdown-menu { + min-width: 220px; +} +#afGuiEditor .dropdown-menu li { + cursor: default; + margin: 0; +} +#afGuiEditor .dropdown-menu li .af-gui-field-select-in-dropdown { + padding: var(--crm-xs); + margin: 0; + display: flex; + align-items: center; + justify-content: space-between; +} +#afGuiEditor .dropdown-menu li .af-gui-field-select-in-dropdown label, +#afGuiEditor .dropdown-menu li > * > label { + font-weight: normal; + cursor: var(--crm-hover-clickable); + color: var(--crm-dropdown-col); +} +#afGuiEditor .dropdown-menu li .af-gui-field-select-in-dropdown > select { + padding-inline: var(--crm-m); + width: 110px; + margin-left: var(--crm-xs2); + border: 1px solid var(--crm-input-border-color); + border-radius: 2px; +} +#afGuiEditor li.disabled a strong { + color: var(--crm-dropdown-col); /* resets inaccessible colour for dropdown headings mislabelled disabled */ +} +#afGuiEditor li .af-gui-field-select-in-dropdown input[type="color"] { + width: 32px; + padding: 1px; + margin-left: var(--crm-xs2); +} +#afGuiEditor li .af-gui-field-select-in-dropdown input[type=number] { + width: 50px; + padding-inline: var(--crm-s) 0; + height: auto; +} +#afGuiEditor .dropdown-menu li .ng-binding:has(> .fa-square-o, +> .fa-check-square-o) { + display: flex; + padding-block: 0; + align-items: center; + gap: var(--crm-s); +} +#afGuiEditor .af-gui-field-input-type-chainselect .input-group .dropdown-toggle, +#afGuiEditor .af-gui-field-input-type-select .input-group .dropdown-toggle, +#bootstrap-theme #afGuiEditor-palette-config .af-gui-entity-palette .input-group .btn, +#bootstrap-theme #afGuiEditor-canvas-body .af-gui-field-input .input-group .btn { + padding: var(--crm-s) var(--crm-m1); +} +#afGuiEditor .af-gui-field-input-type-select .input-group .dropdown-menu { + width: 100%; + right: 0; +} +#afGuiEditor .af-gui-layout-icon { + width: 16px; + height: 16px; + display: block; + background-image: url('data:image/svg+xml,<%3Fxml version="1.0" encoding="UTF-8"%3F><svg fill="none" viewBox="0 0 64 61" xmlns="http://www.w3.org/2000/svg"><mask id="d" fill="white"><rect y="33" width="40" height="28" rx="4"/></mask><rect y="33" width="40" height="28" rx="4" mask="url(%23d)" stroke="%23000" stroke-linejoin="round" stroke-width="10"/><mask id="c" fill="white"><rect x="45" y="33" width="19" height="28" rx="4"/></mask><rect x="45" y="33" width="19" height="28" rx="4" mask="url(%23c)" stroke="%23000" stroke-linejoin="round" stroke-width="10"/><mask id="b" fill="white"><rect width="24" height="28" rx="4"/></mask><rect width="24" height="28" rx="4" mask="url(%23b)" stroke="%23000" stroke-linejoin="round" stroke-width="10"/><mask id="a" fill="white"><rect x="29" width="24" height="28" rx="4"/></mask><rect x="29" width="24" height="28" rx="4" mask="url(%23a)" stroke="%23000" stroke-linejoin="round" stroke-width="10"/></svg>'); + background-repeat: no-repeat; + margin: var(--crm-m); + background-size: contain; +} +#afGuiEditor .af-gui-layout-icon.af-layout-cols { + background-image: url('data:image/svg+xml,<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="3" y="3" width="22" height="58" rx="3" stroke="black" stroke-width="6" stroke-linejoin="round"/><rect x="39" y="3" width="22" height="58" rx="3" stroke="black" stroke-width="6" stroke-linejoin="round"/></svg>'); +} +#afGuiEditor .af-gui-layout-icon.af-layout-rows { + background-image: url('data:image/svg+xml,<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="2.5" y="2.5" width="59" height="13" rx="3.5" stroke="black" stroke-width="5" stroke-linejoin="round"/><rect x="2.5" y="25.5" width="59" height="13" rx="3.5" stroke="black" stroke-width="5" stroke-linejoin="round"/><rect x="2.5" y="48.5" width="59" height="13" rx="3.5" stroke="black" stroke-width="5" stroke-linejoin="round"/></svg>'); +} + +/* Misc - aka stuff I can't identify but don't want to risk removing*/ +#bootstrap-theme #afGuiEditor .af-gui-bar .btn.active { + background-color: var(--crm-c-background5); +} +#afGuiEditor .af-gui-bar > .form-inline > span { + color: var(--crm-c-background5); + font-style: italic; +} +#afGuiEditor .ui-sortable-helper .af-gui-palette-item { + height: 30px; + width: 300px; + border: 2px dashed var(--crm-c-blue-dark); +} +.af-gui-conditional-dialog .api4-operator { + width: 110px; +} +.af-gui-conditional-dialog fieldset div.api4-input { + margin-bottom: 10px; +} +.af-gui-conditional-dialog fieldset div.api4-input.ui-sortable-helper { + background-color: rgba(255, 255, 255, .9); +} +.af-gui-conditional-dialog .api4-clause-fieldset fieldset { + float: right; + width: calc(100% - 58px); + margin-top: -8px; +} +.af-gui-conditional-dialog .api4-clause-fieldset.api4-sorting fieldset .api4-clause-group-sortable { + min-height: 3.5em; +} +.af-gui-conditional-dialog .api4-input-group { + display: inline-block; +} +#afGuiEditor .af-gui-container.af-container-style-pane { + background: linear-gradient(to bottom, #f2f2f2 0 var(--crm-l), transparent var(--crm-l) 100%) no-repeat; + border-radius: var(--crm-roundness); +} diff --git a/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchAdmin.css b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchAdmin.css new file mode 100644 index 0000000000..270b4b1bd6 --- /dev/null +++ b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchAdmin.css @@ -0,0 +1,421 @@ +/* Style rules for SearchKit Admin + Forked on 23 July 24. Called on SearchKit Admin pages + Status: merged */ + +/* Searchkit listing */ + +.crm-search-nav-tabs { + position: relative; +} +#bootstrap-theme .crm-search-nav-tabs > div.btn-group { + position: absolute; + right: var(--crm-s); + top: var(--crm-s); +} +#bootstrap-theme .crm-search-admin-search-listing-buttons { + display: flex; +} + +/* Searchkit admin */ + +/* Top */ +.crm-search .crm-flex-box.crm-search-admin-outer { + display: grid; + grid-template-columns: 280px auto; + margin-bottom: var(--crm-r2); +} +.crm-search .crm-flex-box.crm-search-admin-outer:first-of-type { + grid-template-columns: 33% auto; + align-items: center; + gap: var(--crm-m); +} +#crm-saved-search-label { + width: 100%; + height: var(--crm-btn-height); +} + +/* Tabs */ +.crm-search-admin-main-tabs ul.nav-stacked { + display: flex; + gap: var(--crm-s); + position: relative; + margin-top: var(--crm-r); +} +.crm-search-admin-main-tabs ul.nav-stacked li { + cursor: default; + margin: 0; + padding: 0; +} +.crm-search-admin-main-tabs ul.nav-stacked > li > a { + display: inline-block; + width: 100%; + border: 1px solid transparent; + border-radius: var(--crm-roundness) 0 0 var(--crm-roundness); + right: -1px; +} +.crm-search-admin-main-tabs ul.nav-stacked li.active { + width: calc(100% + 1px); +} +.crm-search-admin-main-tabs ul.nav-stacked li.active a { + background-color: var(--crm-tab-bg-active); + color: var(--crm-tab-col); + border-bottom-right-radius: 0; + border-top-right-radius: 0; + border: 1px solid var(--crm-c-gray-300); + border-right: 0 none; + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.crm-search ul.nav-stacked li[role=separator] { + height: var(--crm-m2); + border-top: 1px solid var(--crm-c-gray-300); + margin: var(--crm-m) var(--crm-l) 0 var(--crm-r); +} +.crm-search ul.nav-stacked li a[disabled] { + text-decoration: line-through !important; + color: grey; + cursor: default; + pointer-events: none; +} +#bootstrap-theme.crm-search button.btn-xs:has(i.crm-i) { + padding: 0; +} +.crm-search ul.nav-stacked li:last-of-type { + margin-top: var(--crm-r); +} +#bootstrap-theme.crm-search ul.nav-stacked li:has(.btn-xs) a { + padding-right: 5ch; +} +#bootstrap-theme .crm-search-admin-main-tabs button.btn-xs { + background: transparent; + color: var(--crm-c-text); + font-size: var(--crm-font-size); +} +.crm-search-display-control { + position: absolute; + right: var(--crm-s); + top: 25%; +} +.crm-search-display-control+.crm-search-display-control { + right: 28px; +} +.crm-search .crm-search-admin-outer .crm-flex-4.panel { + border: 1px solid var(--crm-c-gray-300); + margin: 0; +} +.crm-search .crm-search-admin-outer .crm-flex-4.panel .panel-body { + border-radius: var(--crm-roundness); + background: var(--crm-tab-bg-active); + height: 100%; +} + +/* Tab: Filter Conditions */ + +.crm-search fieldset div.api4-input { + margin-bottom: var(--crm-m); +} +.crm-search .api4-clause-badge { + width: 8ch; + display: inline-block; + cursor: move; + font-size: var(--crm-input-font-size); +} +.crm-search .api4-clause-badge .badge { + opacity: .5; + position: relative; +} +.crm-search .api4-clause-badge .caret { + margin: 0; +} + +/* Fieldsets */ + +.crm-container .crm-search fieldset { + padding: var(--crm-s); + border-top: var(--crm-c-divider); + margin-block: var(--crm-s); + border-radius: var(--crm-roundness); +} +.crm-search fieldset fieldset { + padding-top: 0; + border: var(--crm-c-divider); + border-width: 0 1px 1px 1px; +} +.crm-search fieldset legend { + font-size: inherit; + margin: 0; + width: auto; + border: 0; + padding: 0; + text-transform: none; +} +/* Icon only shown while dragging */ +.crm-search .api4-clause-badge .crm-i { + display: none; + padding: 0 var(--crm-s2); +} +.crm-search .ui-sortable-helper .api4-clause-badge .badge span { + display: none; +} +.crm-search .ui-sortable-helper .api4-clause-badge .crm-i { + display: inline-block; +} +.crm-search .api4-operator { + width: 235px; +} +.crm-search .crm-search-admin-relative .api4-clause-group-sortable { + margin: var(--crm-r) 0; +} +/* Tab: Select Fields */ + +.crm-search fieldset.crm-draggable { + background-color: var(--crm-c-drag-background); + border-radius: var(--crm-roundness); + border: 0 solid transparent; +} + +/* Tab: Configure Settings */ + +.crm-search .crm-search-admin-relative textarea { + width: 100%; + min-height: 100px; +} +.crm-search .input-group-addon:has(.fa-calendar-times-o) { + width: auto; +} +/* Tab: display */ + +.crm-search .crm-search-admin-relative details > fieldset { + padding: 0; + border: 0 solid transparent; +} +.crm-search .crm-search-admin-relative details > fieldset .form-inline:not(td) { + padding: var(--crm-padding-small) var(--crm-padding-reg); +} +.crm-search .crm-search-admin-relative details > fieldset fieldset, +.crm-search crm-search-admin-display fieldset .form-inline > fieldset { + margin: 0; + padding: 0; + border: 0 solid transparent; +} +.crm-search-admin-edit-columns fieldset.crm-draggable { + display: grid; + grid-template-columns: 2ch auto; +} +#bootstrap-theme .crm-search-admin-edit-columns fieldset.crm-draggable .btn.btn-xs.pull-right { + line-height: 1.45rem; + display: block; + z-index: 1; + position: absolute; + right: 15px; +} +i.crm-i.crm-search-move-icon { + opacity: .5; + margin-top: 0.5rem; +} +.crm-draggable details > *, +.crm-draggable details > .form-inline { + padding-inline: var(--crm-expand-body-padding); +} +.crm-draggable details > div:first-of-type { + padding-top: var(--crm-expand-body-padding); +} +.crm-draggable details > div:last-of-type { + padding-bottom: var(--crm-expand-body-padding); +} +.crm-search-admin-edit-columns .input-group-btn { + display: flex; + flex-direction: row; +} +.crm-search-admin-edit-columns .crm-draggable > td { + white-space: nowrap; + vertical-align: middle; +} +.crm-search-admin-edit-columns .crm-draggable > td input { + max-width: 125px; +} +.crm-search-admin-edit-columns .crm-draggable > td.form-inline { + font-size: 0; + padding-right: var(--crm-s); +} +.crm-search-admin-edit-columns .crm-draggable tfoot td.form-inline { + padding: var(--crm-padding-reg); +} +.crm-search-admin-relative { + position: relative; + display: block; +} +.crm-search .crm-search-admin-relative details > summary { + background: var(--crm-expand-header2-bg); + color: var(--crm-expand-header2-color); + padding: var(--crm-padding-small) var(--crm-padding-reg); +} +.crm-search crm-search-admin-link-group { + background: var(--crm-c-background2); +} +.crm-search crm-search-admin-link-group table { + margin: var(--crm-padding-reg); + max-width: calc(100% - var(--crm-padding-reg) - var(--crm-padding-reg)); + box-shadow: none; +} +.crm-search-admin-edit-columns { + padding: 0; + border: 0 solid transparent; +} +.crm-search-admin-edit-columns details, +.crm-search .crm-search-admin-relative details { + background-color: var(--crm-c-page-background); + border-radius: var(--crm-roundness); + border: 0; +} +.crm-search-admin-edit-columns details > summary { + background: var(--crm-expand-header2-bg); + color: var(--crm-expand-header2-color); + padding: var(--crm-padding-reg); + font-size: inherit; +} +.crm-search details label { + min-width: var(--crm-input-label-width); +} +.crm-search details label:has(~ a.helpicon) { + min-width: calc(var(--crm-input-label-width) - 19px); +} +/* Various */ + +.crm-search .help-block.bg-warning { + padding: var(--crm-padding-reg); +} +.crm-search .form-control.huge { + width: var(--crm-big-input); +} +/* Style expires_date date/time width */ +.crm-search #expires_date + input, +.crm-search #expires_date + input + input { + width: calc(100% - 30px); +} +/* Hide time field if date & time are both empty */ +.crm-search #expires_date + input:placeholder-shown + input:placeholder-shown { + display: none; +} +.crm-search div.form-control.disabled, +.crm-search div.form-control.disabled * { + cursor: not-allowed; +} +.crm-search input.ng-invalid::placeholder { + color: var(--crm-c-warning); +} +#bootstrap-theme.crm-search crm-search-clause > .btn-group { + position: absolute; + right: 0; + top: 0; +} +.crm-search fieldset div.api4-input.ui-sortable-helper { + background-color: rgba(255, 255, 255, .9); +} +.crm-search fieldset div.api4-input.ui-sortable-helper { + background-color: rgba(255, 255, 255, .9); +} +.crm-search .api4-clause-fieldset fieldset { + float: right; + width: calc(100% - 58px); + margin-top: -8px; +} +.crm-search .api4-clause-fieldset.api4-sorting fieldset .api4-clause-group-sortable { + min-height: 3.5em; +} +.crm-search .form-control label, +.crm-search legend[ng-click] { + cursor: var(--crm-hover-clickable); +} +.crm-search .api4-input-group { + display: inline-block; +} +.crm-draggable:hover > i.crm-i.crm-search-move-icon, +.crm-draggable:hover > * > i.crm-i.crm-search-move-icon { + opacity: 1; +} +.crm-search input[type=number] { + width: 90px; +} +/* For display.settings.limit field */ +.crm-search .checkbox-inline.form-control input[type=number] { + position: relative; + top: -5px; + right: -9px; + vertical-align: top; +} +.crm-search .api4-add-where-group-menu { + min-width: 80px; + background-color: rgba(186, 225, 251, 0.94); +} +.crm-search .api4-add-where-group-menu a { + padding: var(--crm-s) var(--crm-m); +} +#bootstrap-theme.crm-search .btn.form-control { + height: 36px; +} +.crm-search-admin-edit-columns { + height: 100%; +} +.crm-search-admin-edit-columns > fieldset { + background-color: rgba(255, 255, 255, .8); +} +.crm-search-admin-flex-row { + display: flex; + align-items: center; + column-gap: var(--crm-s3); +} +.crm-search-admin-unused-columns fieldset { + min-height: 60px; +} +.crm-search .crm-editable-enabled { + display: inline-block; + padding: 0 4px !important; + border: 2px solid transparent !important; + min-width: 21px; +} +.crm-search .crm-editable-enabled:hover:not(:focus) { + border: 2px dashed grey !important; +} +.crm-search-admin-icon-col { + width: 24px; +} +tbody .crm-search-admin-icon-col { + text-align: center; +} +.crm-search-admin-tag-color { + display: inline-block; + width: 12px; + height: 12px; + border: 1px solid lightgrey; + border-radius: 5px; +} +crm-search-admin-tags.btn-group-xs .crm-search-admin-tags-btn-label { + display: none; +} +/* .dropdown-menu li > * > label { + font-weight: normal; + cursor: var(--crm-hover-clickable); +} */ +.crm-container .crm-container .dropdown-menu li .form-inline > select { + max-width: 120px; + padding-left: 5px; + padding-right: 5px; +} +.crm-container li .form-inline input[type=color] { + width: 30px; + padding: 2px 4px; +} +button.crm-search-admin-combo-button { + min-width: 200px; + text-align: left; +} +crm-search-admin-export, +crm-search-admin-import { + display: block; +} +.crm-search-admin-right { + position: absolute; + top: 1px; + right: 0; + background-color: white; +} diff --git a/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplay.css b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplay.css new file mode 100644 index 0000000000..2ff3a721ca --- /dev/null +++ b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplay.css @@ -0,0 +1,77 @@ +/* Style rules for SearchKit Admin + Forked on 19 July 24. Called on SearchKit pages + Status: merged */ + +/* Sortable headers */ +.crm-search-display th.crm-sortable-col { + cursor: var(--crm-hover-clickable); + white-space: nowrap; +} +.crm-search-display th.crm-sortable-col span { + white-space: break-spaces; + word-wrap: initial; +} +.crm-search-display th i.fa-sort-desc, +.crm-search-display th i.fa-sort-asc { + color: var(--crm-c-primary); +} +.crm-search-display th:not(:hover) i.fa-sort { + opacity: .5; +} +.crm-search input.ng-invalid, +.crm-search-display input.ng-invalid, +.crm-search-task-dialog input.ng-invalid { + border-color: var(--crm-c-warning); +} +#crm-search-results-page-size { + width: 60px; +} +.crm-search-display button.dropdown-toggle { + white-space: nowrap; + font-size: var(--crm-font-size); +} + +/* Loading placeholders */ +.crm-search-loading-placeholder { + height: 2em; + width: 80%; + position: relative; + overflow: hidden; + background-color: rgba(0,0,0,.03); + display: inline-block; +} +.crm-search-loading-placeholder::before { + content: ''; + display: block; + position: absolute; + left: -150px; + top: 0; + height: 100%; + width: 150px; + background: linear-gradient(to right, transparent 0%, rgba(0,0,0,.05) 50%, transparent 100%); + animation: searchKitLoadingAnimation 1s cubic-bezier(0.4, 0.0, 0.2, 1) infinite; +} +@keyframes searchKitLoadingAnimation { + from { + left: -150px; + } + to { + left: 100%; + } +} +.crm-search-display ul.pagination > li { + margin: 0; +} + +/* Contact page */ + +#mainTabContainer .crm-search-display .form-group.pull-right, +#bootstrap-theme .afform-directive .btn-group.pull-right { + display: flex; + gap: var(--crm-flex-gap); + justify-content: end; + float: inherit; +} +.crm-contact-page .crm-search-display-pager { + padding: 0 var(--crm-r) var(--crm-r) var(--crm-r); +} diff --git a/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayGrid.css b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayGrid.css new file mode 100644 index 0000000000..04dc1b15ba --- /dev/null +++ b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayGrid.css @@ -0,0 +1,23 @@ +/* Style rules for SearchKit Admin + Forked on 19 July 24. Called on SearchKit pages + Status: merged */ + +/* SearchKit grid layout styling */ +.crm-search-display-grid-container { + display: grid; + grid-gap: var(--crm-flex-gap); + align-items: center; + justify-items: center; +} +.crm-search-display-grid-layout-2 { + grid-template-columns: repeat(2, 1fr); +} +.crm-search-display-grid-layout-3 { + grid-template-columns: repeat(3, 1fr); +} +.crm-search-display-grid-layout-4 { + grid-template-columns: repeat(4, 1fr); +} +.crm-search-display-grid-layout-5 { + grid-template-columns: repeat(5, 1fr); +} diff --git a/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayTable.css b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayTable.css new file mode 100644 index 0000000000..20240e71d9 --- /dev/null +++ b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchDisplayTable.css @@ -0,0 +1,54 @@ +/* Style rules for SearchKit Admin + Forked on 19 July 24. Called on SearchKit Admin pages + Status: merged */ + +table.crm-sticky-header > thead > tr { + position: sticky !important; + top: var(--crm-menubar-bottom, 0px); + z-index: 2; +} +.crm-search-display-table > table.table > thead > tr > th.crm-search-result-select { + padding-inline: 0; + text-transform: none; + color: initial; + min-width: 95px; /* Don't allow button to be split on 2 lines */ +} +.crm-search-display-table > table.table > thead > tr > th i.crm-search-table-column-sort-icon + .crm-search-display-table-column-label { + margin-left: 0 !important; +} +.crm-search-display.crm-search-display-table tfoot > tr > td { + font-weight: bold; + font-family: var(--crm-font-bold); +} + +/* Afform tables */ +.crm-container td.crm-search-col-type-buttons { + display: flex; + flex-wrap: wrap; + gap: var(--crm-s); +} +td.crm-search-col-type-buttons.text-right { + flex-direction: row-reverse; +} +#bootstrap-theme th.crm-search-result-select button.btn { + background: transparent; + padding: var(--crm-xs1) var(--crm-m1); +} +#bootstrap-theme th.crm-search-result-select button.btn:hover, +#bootstrap-theme th.crm-search-result-select button.btn:focus { + background: transparent; +} +#bootstrap-theme th.crm-search-result-select button.btn i.crm-i { + color: var(--crm-c-text); + min-width: fit-content; + padding: 0; +} +/* #bootstrap-theme th.crm-search-result-select button.btn.dropdown-toggle { + border-radius: var(--crm-roundness); + background-color: var(--crm-c-background4); + padding: var(--crm-xs1) var(--crm-m1); +} */ +.crm-search-display-table table { + border: var(--crm-table-outside-border); + box-shadow: var(--crm-block-shadow); +} diff --git a/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchTasks.css b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchTasks.css new file mode 100644 index 0000000000..8d5ce7e5e2 --- /dev/null +++ b/civicrm/ext/riverlea/core/org.civicrm.search_kit-css/crmSearchTasks.css @@ -0,0 +1,21 @@ +/* Style rules for SearchKit Admin + Forked on 12 June 24. Called on SearchKit Admin pages + Status: not merged (theme edits at foot) */ + +.crm-search-task-progress { + padding: 10px; + margin-top: 10px; + border: 1px solid lightgrey; +} +.crm-search-display.crm-search-display-table td > crm-search-display-editable, +.crm-search-display.crm-search-display-table td > .crm-editable-disabled, +.crm-search-display.crm-search-display-table td > .crm-editable-enabled { + display: inline-block; +} +crm-search-display-editable .form-inline, +.crm-dashlet .crm-search-display crm-search-display-editable .form-inline { + padding: 0; +} +.crm-search-display-editable-buttons button { + padding: var(--crm-padding-small) !important; +} diff --git a/civicrm/ext/riverlea/fonts/inter-v18-latin-600.woff2 b/civicrm/ext/riverlea/fonts/inter-v18-latin-600.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..fb50a02b2af82000d87d8c8b8161aa254b3b1593 GIT binary patch literal 24304 zcmXT-cQayOWME)mi2J}Gz`(%3$o_?aA+84^1`<cbQjG!9jhp;rt`@K**awF=hD0&6 z+6i)SHSVctT<FN%A;7?B#-zeLL54+vwN;FLp#TrNwBT3sf?^rh?4_T#xvmyk$MBz} zDyQ6Y;q$O_RuNt^B)0_5xf-AH|NnnW&*Kt&t9V_!SN~_XZ4&TJ;r0(&s66p-8{6u0 zWm^ws3I&-5ZhXhhYTFT^-LConQQqY0D+iB%&^uXq%w>(s>Sb+9H#ENKd}4hhC}?q@ zVd#QNKU1lDIgX#VBpvUZ>Cyjen{V5+7ZN5+e|MU?SgJU-vt)W+QZ@H5di<E}m+|u4 z<37dp+lznS`d@zI&)W?*cD~HNxwfb5*Z#OwyKO%7t~a*JD{!7#`F+Matpj-z`xiO) z{Zje2a@~*qV&m1T(&s%9UBK_C-89#IN%ZFG=_Nu6iXn<D980^V=qV_Oy-+GS*w(6~ z(vru%v?Oq2Lx)DkjSVGh^pCc&hOFU_ka9cHW?^$?ZT*xboJor>a4lxfY2K(MrW3i5 zQTf;kLGCQ&O}RM+fh^Kjgk3iB+x$0WyT0G%ROY!EkIrN){?YO9`X{H9)*Fm_E@yFn zyZ%#5kVo~w{P+50@9w8>a^uVi-el_dr1AMm*Ymdz?Y+6ociZ%94mMm1&nFqkH42C| zPLVh`Kjt!reZYZf8m?ZN{vjTgAxwMc&i}kyGV-C>|Mz?Stp5M4pRa6W&}?kM`u+jW zo_hc7A7p170u%nOt3te{=AHY$E{FTi^t8`)hx5%Q^A<0AX;S=U9_RJciFdeq3oPE) z#peca^zJ*iapxKD?LSsZ8m2x^la5bzi)hn6%zRgQLF;toEe~IKyXfAw(NuL^7&Ps~ zi@=CG`vVdT-<_IY=&{*1pf~AT&F=OC3q_<J8!&Y){9qMy^yt#E39ce*6$AFZ+WWcQ z@<PL{IfV{^??2p+`Ts4aM^h%@zqR_qzguif%Jh9BHcez^ddru0K#lWF>Uoi4`?7E4 ztB5749MQkMVUe(lv44QVu2w07^+C713h&7sNZj!MfA-3|({FEIFiF0Q)hzFP$cd29 zm5q0wow;{zrbvO;9$&%lE`L=@9h|;~2u84lURx0n`a+6Tqv!bk@U1x?T?<`4yvs=} z-TWl>+0&5jBCqL5PyfC8{-2$trpAfIF-u%Qb^RgM#+Y-3#z(!I4)LAzwwx&LylRf~ zMQi`}i%MQ@@>%(5M~3z8+%uow>(9P>eBthe(NlgOT&4S$Ep(Mr-m%6*r?o`fnEpT9 zbn|S@t2x#!R*5m2;&bInHO@93GGpbxzj|->eM!qTIl?SEYu=fZ?8xXyJ=tSs5o5nx zB`EIGzf(%jFI@<lBEoB=*v3~O_x<wrT5I1<C8L1g44;efk*eZS&t3_h%)b(|e|F7( zYtxs1FMs~L@O4y$kl8f{ou6S>LPGCYUSKTRps`6u`&+MVVJ4@JE9;JqC!(yk%+=VQ zKK#6lH|M@w@R8Z62d6itF&{`xEblz>`KG7M?w^$(y&AXpUUu3nDQI!vu<(KAj%90C z>Wd!rZrxzvUY1v!`Fr6OH4!cGsrId|o)3OnP5xdX9Hk|`H+$OaU(@oX7c_~K9J~~@ zA$Y<Lv46L@F4Wd{#D#Tq7<T)l2pHz-FORzYJ1E`ukw4Q*cMjDl3XUm)A6;BrmUv9K zcR6ciRes>=h@A>oCiKiaX}+v(@9P_vysPuibFB3-jMQ#PXwA6!?Vo+eJ;iyvFTbP- zuG)D?z4UkW$?01rB(L6~aM<nb{(uA-hI?F>8$umc$uyU|Xt(($^XXFliTKF@28SA) zl(-gb5R?wE=-}3{YFQ{D(Eg}dqD#I?LsZN8W>&O@^&5`V>30`y$>d&o_hEqE4uMmu z)16)xX)DF|v?;0gpV;w{gM;lG%eIz)%S)sC<BA?DYHW8pu*@O!M6umOt~Y&aI9b)c zZ#l;?W6nooK9dOzj?7$&Dx$CCGFq)`{VfV^c)8hMk8}7Dagc8fBg@elo6A^47RIyA z`2IV2-Ol#=a^fA$UV?{O7VNYX&hYE$z4R(*anIczC)XfOhn>Z>vZt=j_TxBu`k9A9 z7SrFU(_)UZF4pD{=J&eWnl4{+D8)%}OUWxS_56;GC-ZMM@mt>P_I9(a__*!*y#0R) z&tBxb%((Z-lXYgQZ$D3)?eS{ult(+)8D{n*?6|S+w)#Gmu==<MrjyRif2r}f%O&U7 zj;LSRJKue|I)~k_Ftd2kZq{ZQx4ot;1rwUsX3m&=+HrxQ;l#Ng^B#VdZE<V9{fsv| zTv$kD)p^(Rcgysq+FtK|9kxDX+3M$AYD@idxA)%SUuL!E!JCj-`EIG@-?kRMmwMOB za_aBbWw!Q;i}SM!Hg8+y5zx)@RsNg#+N!^KwMGHiD-YlN$uMK}gBo79z4Gqa!8-$T z)-p<~d|;DEOm~!0`co@;Xu=u`jayljmitdfd{`Q{j(KL$?|-UOzyF?OqZyd16?(Gy zR^ErdFJC_~zq4!ms>_1gw5G0K>Ah1p^xp1$uWItsd_JYQmRq^W{9u}|T(inGF+xVd zWtL#!guFE+DywGd*(LoB&Po5i?Nne%Sm4f*l9?x%+Ydf$7EuebP<p!W63a{VOFj2* zY<ZRI{<8bJw%uX}RlbTVSHAN^E!?X<b85<#C(K@_vo{E+#B6CP?PlIxw6NUlTy59E zoZGuU{R?||^kN#%+k1|4r1N*zGu`O?zTBSw!rloEwFggMuBn_;D%x!k_2FJmInz$V z`+l(sGc;-r?(4N$Xtm1o>J-_)u*<0-kBxiRExvcOm2;Vw&kXgg=gUrIe8~&D+g*Lr zEPabs@R?&zG#(w=bz7cyX2NZ8>2It;j{EAP=Y?G=|0AI?V_}NIQjK*d|Cv<n*^*Ul z9G<0-|8tj`Q}X9?mwuRrUO4ste$f%xzq_<ozk9v$n8`Z%Uq|0_t?HcNqtNM*vPdlI zt%!*OyH-I~@g8N_ocniovu8|9{LEXZcWUk{t#6mZZp@wfe9^S(n`W6S-@iz1PVe>k zdpz*k)ogCw72%FSH4f1?dv^c5^;cGA_19g&pUNU`o>n-dwJJ(sI=}A2<aNiyPR_E} z@V9E~mFY$D4eIfE3$_{POqkE(YZmjms=M;U=WMr6M*b6~F_rCf7pnZaFs|ptqf>Jm zx8yebmf2Sz=g1p*^2&kdR}S=<{HzjeD!9$pl*p>>^DVr#f7^qQTd7`~(!6Fkb*+ub zHUIIa$Y<JS&Ps91o9W*lT-aeC+r(+G`me>-6MO#zivG2@IAwZoKw$pA#WqrUJ-j*I zoZVd6TsbWUqRVc`Jk?qgy7X98v}|wylZn;)UGsXLRNXT>uz!DhgCv)IMv-+qU;0CR z4W&l6$3LgLcj!#_67~9CukRzc@pAt=R=$AS^BkJq{`ZnN6Y;BX{pJRf-mkI-mrUd0 zKVITJb@kCfM>DO1j~SKoUaWa-`}IMGnemH{Q8K&c<#aFFT`T&s=J;F7J6=1M8W&o8 z>1^BX6Z3Du(T~fQZjn}T2<Q(^6SVHs{w=rv7w2rZOJZw3cRFU7ADUIE`JJV0(+an9 z-VC#Bt~?R#+j{luvftV+F-uLttptpVcI_1vzxr#zu4<E4b7t-g4LhP}bT{|sQhCd* zuex<_?l9eDo6zO+;r6Md?1ZVWb-8~n)mrAZ!81VH*Ee!r@jC}8C-06s8)Tkxc=sHP zm{BI(#k9U^`OaIev9lx`W`8;Qan(MBed^yfHi+Jr%AR#2tH<$np|7m>8nuKy_YTaK z`s$N?N6p~=tR2GqmIv24+?r&=yz$i?TZwm-Jqtfo=)Rl3_WoZZi(s*MpH$|i8V@-y zO+7VM*K^I&qZFSRAM!eDy=DG?zvUil4upRWTo*sJZT%$8;DZ?l>~ccZhVl4(bXvFj zRXFQQtzB_fg!BG~g(w_y&{^OvzHyOy8P5`d#m6l+J{2;bw_@e9?;hJ5ECUzrke%g! zAwKYkq?o$q<7wWfcZpcuR1Kctoh@RrIP2-zb-uoir8fc#{%Y)TbTwIY;+U9g>7j#* ztiNh(>pXw7^z2WuFIN@|Rpswc-Jqb~RjB;MH>}JcppRkJ!~-^50&c8-UN~5?8FbD} zco6HTeY@bzjrK<kCoH&*dRm-wDioCT*EDs0RoOjx=A)Ep7Bh9ToKmmZ2+q{sd#F`N z)###Ar|?YHB-MXrZbC<npHbrU)>&4u*(K<U&hoBlDw2Vdx&p#Hx0<Y+dN1AM$(mG? zhbfm@C-t6q!l4>&QRx(UxpV6^+1G+Id7W<FSga9Xksmh2sY`IC(9005tW!%ODwhcy z^j)m@cH5~%xk6iGn_i_{;rn<?b8T7ru0T1hw~CLCR?XNp-KQtz@vKif6aUJ!e>!s6 z;A6KDvy#jzj$<K<<l-MaytG+>J49Go*7i$>f3mF1)6AO0rth~Z4=(N4?)6h)iH6(e z&#qGLb1o@c7r*lTa>s$+mNjbeg+=l*<ujPn#8`cL7Uf-1n(X9p!Kihb=H(9d<5faW zBWs$Kt$Q`~e8i>Y#T`$Gw5t7G@l;n>if3iuGUxS=zpikW)N9XgR}k|^sMhZnKO`!9 z>v*Z}s(FD%?W{$q5h^|UZd05)986r?c})2CtN+@!>dK1C%kCEbi*2cWbfS-?@;Z;} zvb=9k@(m{yPk!-7r7dW>=$w;J{x4Q^)%g6$t?k=;;cNT9-+A7Bdvcp`ec2?xe2uw{ z)1F?=boJH_U)0K=kyjou)BL=?>&idXEzOLZm;~l|O!%|<cF4_ypB4G>ABxYaDl3)j z-h8e==#asxQ0BSsA2lz&_Wj{jttZY~_Hcar^F_yGE<2Z<WaTNJ%TcX9m8+6|YkE!5 z3SKu+Xx<xPXa0hDEkApnSbyHX?(e(nnbF%CPpOqGEAYvT5H}As?@6j`>oYS>J1JA# zUOi#%f%DBD6lV*kbso^H2tQKCI`gL035I3qM|e3`iFe*UGRgR4?V}T)6RVh6S*<h$ zC*4p!;u}z^`%}iHJmLH~@2TInC%13X)!6jL<;s~W>}KJ+%`#JEOcHlzS#@>X5BifU z_}(?MNJsNygZG2Y^Uh?Pe4@a;__Unev+|=?1SjP0Ww$GEXTR-#|LI|2UGD`K4cG6k zTP^=~|82|V^VioT2}y|=*!Kr`cu!~aKGz&nb&2(HNRTDdhqUW2-`38xJ$qo@I;FmH z{l3Oow|28fE3I@(jyKN_*rBu0ReJMk+3$XbrSpU{Ypt~IYxJI(yWQubg>q|dk9<Mb z#_MU5K6Pb;bMCV(<?MZO^`FMA17D5Ve?F`|ntOWMN4vjqEKAbc{?89rw_17mj%;#* z-D0!1%~wR@k4kIaySP0^GP5WDoz}K5qUQIeGOxP-?BKj(?=Q_S{TtTKR<Zw4B6D+x zuXI7*)38mCmrqL+uuN7pR{SaYNSiZLXa7_8la9;NtL%;(sC%?|;@$rpcH2sN+f-Q> zg}7zUQTgjv&bcj1qg2|?BYN9KhqK4U+O@Z?`f}+LQ`w8AT2{wry8=sjx@Q#@T>RdA zVZ*{BH&(Bx=)byl>Z=?1A2`0Q{Hyz}hM|E`%Ajr0hww**fgMX`O<1cR^nUTP#KUq| z7y48<T|CsY-d$k+nKz5JJ=n&w)AsXz-z`=jre&?Uf7t$!+rF+%zkZgQN!Goe^fI(a z?s9;^oK2I&UIZ;MKYA~=#cT2PMe6(H!~R|hRVx4fVy*J>wo0{H=IyUj{jaQxxSaLE z`IBNv?_p2-iJX4-=RQ7MR}&H1zwF_&sg357@4JZS?lzZycC%4s(fY6})e;iIr*FJ& ziJu&0x<%7`{&}P2VOJ;r&sdO_)P7>Exz71}Pi7RD@B5^E<T2~F)e2P$LZ$RR%`MmA z$}P=%CY}5CknUblfl$d$uNXHP7JlUvObaUCXfgMO<l}9kE5iyt&XuzZ-k0%Ee`2y# z!cy+Zw$s0<ippi(Sh2A#aGzY{9wUSL&Hvq|hJ{9+{PMX}q#^6gw)?Nz&c3lfA2|Ek z3K6x)E4<q#xrq76M7)jP6}ehJ`l{0E6CyPnF{;we^_K(f!<e>w6$*av&A%=vQTHw% ztMneR+qc~Qw!A1_`$mJ+AeP5b&HuK<>ItVK9(Ajy%fGOBq`NBm(y24&BY$p_Y08ao zn6soSr<Czb@OC}Jr}Cz|oeEwH{n@FYJTX0g-@5bWC0R<|#b+{vx12cma(=+>v)R`l zPsw(Fe600R&HT0f!K-gwzo$BTyBe3Q!``MHEgZ7RpYHOnW|;aw>tv$}yQf#riaW}2 z8t42Syp<o^l4Mi%?(^;Rw+s2(@bv4`CG#@6l1|@Am21>|Fy(mFhvdi?RUe#cRtEM@ zKl1bP+Izf5`s++%GWC1EtvW00b|k}Zp=2`Gy&X2O>ny+ClxXkHFs^S;u5%ID{kP4< z*|7Och1`6%H*HT(F1uReCt_^I+<tr+yKUBHGlQC_ciURI_x!Ho<QCrCzdmu}^3Y8_ z^Y3Kpo0Xlo#dgTxW7#3O3fEcE<xfw~IJbAD#r%uWk5AeEe0L}|cdGP}=p2*0YfBs| zJLe1a$=G+;2CTlvaIoWBh^0-8RBh?A`h87ezBlq8)T{mFQf5+Hq@d+<%t41G!+saX z5_kSi9*G4C%5E!8OyidN<g!)rXXhqwhPJy-g>Mb#AFvBN@~wOFk())Ce4Y~zPxo1v zkS$WMEt1z?HtXl?3yKGV`&p{;BUbqD<KPdv;U*#8s-)UsWH*UR(50Vo(hS2REt+=5 z&jh%`ek|M6=40F|CoL!7ujsMxnd6}r#k1m!og%)TJrP`w)*P9j(z+`|DA*%4Ky7k= z?$)g=*EF4j*9iqJmAkf}ai8tCL$gerzgah|cGb>hmpycK-P~=5`yN?6voMuC=X7po zQ^D2T8?xns?{>1k{><=jVVw>$n?k>>tLY2NUE*;w-YrcmQNEW{^;}qYe(l1<EBrq8 zf0w=Lx1Yc%ykY;pBD2g%8_yi#XijBOI-tk3sKGhJg?06d4!&uI0?c<dJNguOx=hLY z_2sg!&zyHFO21WX^eq&SZ0F*0mC@2kGG20Oiezw_&rI7_Cfnnd%>KWkym3bIr8CFR z6{SbaoH9XZ?a~EXpIAy}8c6kYOqtN(vZTdjN!+7lr_wz9Jy&#OwJlz|Q8vZYH1F}s zLRr&ek=kj;8INn}l&x>*o~As-yH@pqb?B}P7nd`iRfCOGvy`$Hy^w#qV#9NfX0Eta ziKy%XQ~9}efvcl#)oZs+)kt0u!<(|YN+bTog(kxeLob^p635j!x%hb(wRT?CQa<C5 za8dOLm%g=v+_J)~uaD-4?|Edf?rf*#<rzVzk1oAgRG3-x<k&RX=(3!fN3(inYX&dd z^YSRm4wJ&nO=$-wnR2HY%DqezSuAt#>7l9Kue-cAKiw7+GpqW}W2P80lbxHB&L0a| zUAp&|ph@hLnUx*Z2i|HOd(GpUyF+WHkUD$Ham8Nt!>YcyKjxf#no>JwW>@5`&t=<7 znPanGOV}?s{OZBX*}IqQ6fq6XdhT(JW!<mPuVL9{PbPKseS81jF(>G*#p-p1d9Kw9 zyxvqk=oIvhURC2XJ2x$}J1Wfb$ePRB`ZpJzip=}@u;N$v{Z;o^d4C+KNpsWMH}T+_ z6Uk*ctES5vx-+=mn_?u&1Ztox@H{PYtAyjFkf3qOkr|T3!I7I2Pxslf_sy{=et7C^ z$vc~tS?T)<1W$#oxRNse*`E0`nfbDcPb9j_oR!@(x8RcI^0|fAET6{~TvVN_xBF4w z?q7GlA84@8_1QJk=$1^y7o`arD>7b4%!s%lQc!R^;>@R{+a;dAV>V5hvny=%5>NF^ zVL9geAMbuURd<iiV#Qg-cG<!bc{v4pkB2-a4|tb`$~U||5bet#!R-90BEgvR)vV@Q zGDSB8-DQjSOqg@4d`9fvtC}rgcPlv>>iHFN@8p`jPdci7aoh8SPkNm+RyHfu+|%9n zMy$O*J^lLMd&w_Yi?&a^9#p68_S>fHjb)LTUeqd|$f7k{&#|#`eU<j;muE~BE`4#j zd#-D0@eFg@KeueROT}J%8t?r4`=7^m_TKP4_cQbT=k$M9H!tpXx4V0<BJB3DO<Ehf z?wXa%vfb(Lmt4B;B*%Hto=2jO&OW(utUugjTW(tQ6{)Ps?tcn}_ttbP_cVU7&5M5X z=)`f?#XbVRKUZrmD|C6PIio2cam&#N@9<_eJJbC$Uk1z!eg6BV-|COWFMt2o{cINl z^E~cPm((AY?$*i7@mD!s604$Wqc=(FGk<jGR<Eec)k{<ti+$asu_WbM@1(!ceQiHq zq<E*AMQ(a(V;T7@zE+3R{giD*n}5F@^XY>J4joihP*PmHU{R;j@dHPMdV8m<{ul62 zE^Ff{Dtx3G;4wwz=7IRMouXmSmQ<V!`eb-rwqNiO?>(unQ}383@00$XY`<+^{MH{O zoS<m|E9H}yCiLiZPu29^CbRR?ljm0*v)ANmdvtkBo3ymkXp@dk@U$GuqNgY8H3cWT zIr<!#<bLR0MfR2OqWe8R^X~M|WL&7M?yBm2audtUO(~}*YWx4IEA+5xOjtfgYNOYz zl1Vz;C#I-I_r+9x`s{H<I)Cryd+hSHMz6GY<{zsupI5g<Oek{229Y{$*{RJ8olRYB zeT|*1zKrbGx2RXL9Om72Yu2W3(pnO)ru_9O+Fj$`y<KVToae6of}gDn9?o8}{Zohj z6sDcksuptbWul5ZAN)2H*(&t#7>mbhg&P~6R3wN^)!uN8?QDp3%!}p69}75_XUsk@ zH~x`R@y6Q+_+$6vJnH#uG0Sbac3M+J2kYM0_RTL}r8J}_ANg9LcQ23sR6mP_{)Ow) zmuB1jO<gK@R5zb{_p>Uwo~ma%#p9};ZvD?I+4ntt->;Y9zihdGG|Kiaduo+8U3YJF z-7<l7Q!C!(S6ob*mYx~G@$}Gf)#Q^WYh!93D|$c9ynJuN7LghO$vq)9du>9ub8Bx> zJ~Fkytm~!5A-9J@DP{Nk>n4BNd9KrLN5r3RPvnm;<e&R@VH|@nPnbg;yOGxgH^!&O zQVsule~GTWD0#x-mQT|YZE+rzdunIRX4H0>vBsUZoXxQP`ugm~!@u1(n(3;o=+V}C z^gXY&ud~;AqLCe=snnJXVWy3{w?C_2CVWvj?L<lb>#V;MR$N^FnNw-iyZq45+!bOk zZ@eg&7gc>F_HCEWqe)ZdM$R!>6l?icziH9J6^9NyzIw6p&A!Pqn!7eA$}lzYMQ29k zENQUl=oZloJa%}w(_}GOr{Ijss!0w${dUf7EFmicmmi$L8Ju<|azje$s?3}lo088r zDyyGcv$No-*fAbAorXEhGRDOQ!8&sk94{VOxh*CuOZB9O^2)AdAxkVy=k2~6Qtr9l zu*2hN_C*unjXsAjExB)RQK6E;;u2!Q;}iIT<;bd?s~0XkJ$?RqhlNr<yCm&23TKry z_i~9ui+p(5)_aHPv}OITwdqIxOQfdi%q`_y8Szr*zt-Mw`xOtn?fH1k`hD$(i|X?a zXW0GbDdO|ec<6F*vWjlm60Ts6iHlh7epd<&c@WST|I9%kL?QM3icjJ8Pxsn<PF(-B z>;1!(zw1BzIh<FJ^?!SetwGM^gN+lfvOPcExpCXoUst#I>~^jF5bOErNXr3*<6oOy zly}K)_SIXNaO;J^t4?jc6%Gfat-qg}aJgW8<yEG3B>~&==~q`eNj*qiamnw7SE3Q? z1-<jZN<to=5;MN_v8mq_Ielnr+U&PVnNN#t$}^njpW*dedh__jd*`}LKGkG=El%=K zc_S#pv~k~zwG+H}SZ-bUc_;Aof;!~~KbT6hTo$<&zGjY{vXY^*=KeL+%%Z4H7qR@+ zCJF|vYC?N_Ct9)`J>P1?zNo|Q?n1_{6}v*_v$%%ryV~v`xb?)Fy#X%gb2)Cr+B0>n zm@Zr;s<CMO5hDk|yKCH=m3Fy&Zc>VBdNzk|5zo}a{H%-9_`)VgclS<9dAV`YdZn^- zli#<Vv-Dh_V3@3J5u(<f_14QcA>n3g7js3})LTcbGBR6@#H6yaS}*T8F^|VhByyG4 z$|Jw~w3nQlbR=n)=@#u`+bN$HUU5;`HqD>&%9OLb$Dc3d3OP3Y&0AyUn+F4D8HK)@ zy3KisMyOuE%|jfCp}(}wb#Pkvq}a|~SEzC8W^<liEr*#%*}jD@glp9m<2?5>{wQ6t z`9-<&U#llu7foJv<4e}6s_>0mLMPt2`Z040DaBXMzJGPzES{JRiITkv>#FaXE~(q8 z?=w>}ARzB`F!$c;Jc}$+FIl-CyZ_SCTmP?E?xCXVrxUI`;=Zt9!^%Az4<7yBBvxZm zxBuAvkf_@w#;ab>ShjC=#?>vnu@`R6>vyh==X<Ny>A&=dVM1q{)c=%;>y9aGS$QK+ z$$wYOffQGdE7Hz2+d4N)W!d`YfkA3OTHdbyt9O6@`I5AV{llWml@$}O@aQkPvLR&U zA)Oz$gj!Cf%zEU}vM{Af$-hM}<x)mlfRCD0h;oS9WAF7h^tzS#Kk;9!iCrOiQruFi z*4y;5!gk~R8xG9oTy=M1O{d1!v+*q+TTjf_6+Ad+^{g9Qs&^)cY<_j%nt^W3*Q<Lj zI!SPfJ9}JlQ?XL53A^-OfB*9*?)}_mEgzpB?G$9}>7CX8aLv6%J;HVmrmJ$yOxNeR z$Ng}p`!3Dw%Netcq*J`Ny6Akr`?DbVc#{RsV_x@^UQ_FoiEm<4VuD>)b4pI^ahX=r zW6~SGzw3F{rbT|GDUy+HVXD!JT*`-jsK43sdDE+_685_V-Y6Y@efqiU;{#oSg1Ssy zj*n&+6fnp{F8fmb#QV#+r$3^zxdp10-2ddt^RD{Bxlk9?qtZtgoX&PTU-m=w+EhWK z?^B&>C+JNuRpevR(93CHV4o|+boLsvuxVGPyN9%}pAD<(|D;(H+!kg#YnEy;9ya%W zbt>xiUgp}@cl{G{>+aMn`PU|IF3ght)!b%Z<-;34PrkiAulC2`+taU$>tyUnZT@s; z%8GSswLdo-o|U@h!9VrQ;@r|qkz}77`yFK;540p&=j|)`wnT99>vOVkbr+9*EjD&$ zTlT-??TMgx-($O@vz<#V8?Q`TCVJWFJ6rM8Ic6s(TG|HXsBoOqIawIEV8(^x?n^!9 zm|v^VndElu+KT=6zxl@fJ(O<q&i4L4-}pag)NS5;bf5P(OaJ$w{ED~Q^Xr<pF5Bl- zHlIHKcGf=m>(TL*{|+YSl^xEWQ}<%h_rlw&^=+-({O~wVNZ5Y&yA`Q_vr^wR%*%M) zcJ;LAlx?A#r!M2R-m*SFD%3II&+U766zuN`C@j45_UzLdE5^j66-V1dRUMn>O~0hF zEV<|3|0jN5b2v^knJwLsy=u{6*OytdmSwI20gbLj8dh`tmS27e0w=%zW1ROR@}GlJ z&b@=lYMx4-LJSPX#>UU*6z|kKGD*b~fjkgQ6_6@WLk5Z$Oh;Cz0u^OQ_~A8MW!+7` zP_vWMoju#y*_3-&Yo$a26PxZtpSQiR_OfTL)YX+iDRXl&r+Eu#PO0~P*zt4QtE_oN zJ1eJaE$z6Z&6swxR?)F!%_J3128P4@S0!tf)!wRE-23)*Ru{`L`?bAOYNU?c4bxrn zm?5Nlr4sKg?jkPt$(Cw;vZ_AwESLS3eYkyXXVi%Um3;NJR%t>B7Kg$ni<)IjHEC4* zf5NEwN#Wv_Q>MND%(XUOn6M*o@_(5>TiLfJH82#LOyA_m5j36qbaz)(U!%n0`H|^U zjOw-+>`b3+mH4HAabf0BAJvyF!khi(+E{gX{E%N`@_+uCbN?pyoIhA??96MW^73$) zuB*hX6Lto<j~X}*7M-!leB+_0bh%f0PR*jumyeU0IF^go{mMBZTz<FUqUYOLZ^Ksm zG}fH{{HgxF|NjO5URiz@aSjW=&%1t2-e2?YulIIrh)IV=&=xgMri7^d&aahS%M}l9 zkPhaMbxMfHNS*#fi>tKwmMh1V?XE0WY=777Tw^VHgTJZhw~=>cm^j;y3$+OvrF?9s zS2l0yoKaZ0>Cl4Jd%t`uH+K{1>`q&5d+6Ev%N)IZllv~`{eI$JEVwv$-rTZCA-St& zA0EHi61>}2MCik_H(Q(|ErSeh*jVS7Z+fD<MT}c-&bEimAH&qn-O-w`>}=&(rkJ;y zYi+)itJ&{U?z4KfgHL@<;kC-=bILAh9uxd&n8mj3!{T7UxARh`oL}DSeb|3-U0Y-B z$`aSfzF}QrZXJ9@&3UgbtT-gKQmEzA(?dK}Y6;E)`b-X-3xpOaEG<=V6kGCzPgUb^ zYIZ`9$Lv=gGp0_upyDaEbjyoLTf(_Aja4%9HB=3z3Ypb<9}4oS=3bi8qv`p=T9cWl z$*ZDudS|=XDGj4t+2^%{432BuOne@1w|9FL@3)LC;ggx8WUgfGubp++!;fKRPQq=O zd5g2#!l%A!;Vb0(9?op%b%dM8%wk(oxz%Ew#qG1Dnr_60THl>z>1ZP4W7GblZTS|4 ze<~}CXIVcMd3{5^pzQy$yZ2|uzrVEk{l^zK%WE7?U6;NtKli1(blv{g8-aJ@rq(Q3 z5VN-T=Gzm?I_lWf&c<68q?(?zNwIm{7E>6tZ))tXIrpDUi)Vl3lzjM6nZongFFzjs zB2_NEKl{{;BYE-N6DMyzEnipJ@3Fb%<z%`0+CKuD<$bu!K8D@1_+E5_ukFYFTASy_ za(hnIpIok0DRkG$bN|k#6U!bt*4)4N<K61t(RG`z+f`jSn=SUF>e6eq5Am(rcPLGN zy{q(;>f58NzxP;MWY4#JsNy%F>h|`96WHwf4zKgr{qkbe_0_Joe5N<Q`F6xkh`}uW z)^EQ%*|%yJZ(o!CBv1Oz((`j?-EmuSI>&wO|4F>}+Sto3H~msH-_Rv5y28yed+p{a z0g(?D7QVd4@X9wb<%pA?h{607&TC57t={v+g>TcsbLXAdF0IdJ7joc{S-{9QL4d7s z;=)r(K`SFBG*p~Wj9$QEJo%@okK|tYMeGw~*17vMy`FeNPCYkMLenlMuuDNr?1xBk ze8;_7Wsm&_@5r)#Xqfm^YlZ^1StR?M!zxTH1~Klx-idW`$;(Z2E9Gy<de*4)T2zrW zDxkDjK+~hPqd@v0cS6|>PQ?blEldwze)(6xapwSM*&#EIJqZosU&`m#-LY|L5vVz0 z9hbi3`qa0QVTJ2wvv1!U$?Oy(%wF*938VI%{6l+h-EqFrI`@&v=R4cQjZ_}bC_Hh$ z%Qt%SP3K#>8(K}zB=qra=*XS4OhzTbp!MRZ_}yHgRY!VmZg_rVs(SvyXWb&oev?9i zj8?A=UKBG`ciXMSC+pZtES}EkUbpLEpB=xgS;i6T`Mtj)yU*)8T0K~i?8y{b_$^}M z9f^eu*7n??`dnSg%Ze{ez4u?7>BM}GYi~MFOw8gqo_!+Z=>wK0S&sydPuHGYyNE?2 z!D?YXqy8QC)#t6JeASm<%Bb<=@WHnY){GBU&976uz<JGE_}c9QuYQLze=>5||MCj^ zn{M8%NA48vo2&eA_g!0CY0HM+f4!zCu)K)>T9<i3R!zyl^+16Q0}~6ArQzX522ppJ z2BtMGhbCNomHv9QuOn;ULyh^L7oFXIEKV^y>u!YqwFj(%DhCz5+}lvV&Hr$9fb$An z5zeEBGM&^HP7hGZncZEY{rqZN<s{bMn;tE3tPW;fpDn}On8C95eRqKGimQ{hUI;Y$ zr5$FxZ|SwC2Vb)u5B{UIE@+L2<{OnCA6ZX5*Oq_!cIx5P22Z~|-4k{zDtGOcFU!`n zHxxI_u9jw~+<DBvO5atx%}oEzq@PUX9~b?OUj9<()=tT+lxM9>D=ijpj{C$eJ}n{O z&`yEQCAPlX1hm#%*<PC$wfUA>c+_;sz~(dd_YTQ^7kk$II{U!%-@N^5%q6A&rJ{DP z_6qd~UwMT0X;JB|XGQu!%2#W*YI)u%IH+oTY}5UErnyXVrmsvgjFQhadBzt#PF9PL zOIvdOHq%ETohdK-8C$R2UU0+B)hp!ox^sNDWv)D%ASSH$^Sp2Dy4};}<W;<!dVSu+ z)n7t8Znp;P*~xSE<xGn_#v}DpCplgCkuL3^%kX6_V^Qgb!_Qg1?PSQQ4c%~)aRcX- z8C+gr(&}4s4IM>2FGZW?II-!jGTs}M?rdTqzW(Z(bqAbJnP_gErFMU<c~D)=yk$Lw z36AT0^KEaLUt057=Z8=#!$CooeQvSYu9qTtP1PE<&hh4E6m0d~ZKbt9#;GlJ;XBWz z7rYuSiRK)cz+U4c9yF)5u>H#2Nq1guIXfxb<Y}t-jEwjQ6_<F=l)2|Zyc_0vA2_$m z_>-^v(msABhM5d)LL6HJ4l;C!Id*bx$n{IP@agF-ot`@<9-P?r>ZoNP_oY)+Q8QS> zIWBWDe2Jd>@Abvkrc<s<r_4>~U^8kGWV&PioMTqE#F@LL2WK7asg6)6Z_MUBR>xzZ zxc=<AsrPS9=IhVC#!|AK#YnBC^+aR>U$|MG;Nvax9F(txzfLr2ZSN9~KA1H-U0OCG zB=}v;^%^b<wL>BSlm5)O_w1)8bH%|_E4Occ_1PBB{5Y3RbI(7~p4+HndHmkn#?qb1 z+fM!z<WOmrE3i|XH0i_IDGd`F1GYyjsGsnRMaBD9_`1-%b+hMgh>KZm8tx_8I>Y+u zGw0w#^+mH}OHZtSczz?7Ylw=*+E+o_XBbZlQRbIj$zZ$9=D*wWpYxTgSD#wlt2Q-S zxXZeib4t&OBQ-fwKg?PlzcAvTaP;|&r%#6NU$xX?+t(m5{i+wi_w&k>o-S|wddXKa z-PSy6o*=8pchwsjn~oMTh)PHZ7|&j`!?9Cr>ZkVJziKnT&P}*?+HlV_xoul-ZA?&2 zS6m&vA!$O}dtueHq1-_;4s~<7K4&r8B72xOb-}8n5TDyCU)`RV{aWn7-(%Tx&V1Xk zYtEf7Tb*uZhG~7+GVPALYxD#D?u8dWy~+su>#)*z>$U|C68#S^l{?ezmBQxA_q=)f zSE>D%)17;J&cA&A^|8FY*tRImRp!S!J^m>8Df+D|iBApeyZJ_ejrCGoRV4S}a+bBz z|9fn${llb{9`&b0=hq64C3iHAzK{vucH^^RQ1GkTKGu?{UymiOu-fnb`K)}{mMbDU z%$iPB%PxMM+Pgg_ChM^Jw3Q*zpK2n_Z!j!=b9WWf+!~Sh36of!3f+9M%2RRgs;O}u z?u&2Vb9L}r^5bWe&@40UqUq-io=)UA{z`MdVCDQeum3UeYm;1AmA6m6d??DA%`IKD z!9d+xP5-u|@U3H)4oN>vR`+r)yTtGLIYqp04R6t0osI04(K@%Yp0mDAx}wOgsUQ1m zf4j8nHkG-TT~4gYP&mn)G=WWjQ`nc;3m3IM=V5;mF7^N6ii4&T!#DzL@;ASlc=6{~ zj>hB<)jfv-*IrOf-n(U~k$P#g?yasn9v7w^?=6@eRC6WXXjRawM8}^(W|~X=*sP`V zHFiinkk~c#{z>*;X3lem7M>8>U;F&*tEt(tPjfmmCwlo7s79VDW^Md^H_mserrykj z+2%!tJGX~BpX-R&^3`}D^ZT9!6V%)OFfLp&o!xxSCfl2bSS@u#{(W)dc{E|UG}jWI zGspayt7GydPEFFA{?W)RkuU84d&XVu>#P9+7LQuy^%-?vpR?oo<@JstZr@W^KkWIf zlB~D(by?W4Yn>-j_Ou0NxMlk`=WfqiZ<s$N^J>`9y}3fg#fnPKf+ER$b8^h4EeO3Q zwfW220JD@J>ELZy>+Ju#y*eUy>}6H1WGZh;^p_@n=jzMNUhh`iSZEp-D|>SPQvq4^ z41uBxvrT$)BsD^s{a^ISm~8!UytDb`+7icyV*2GXsxzAWyj2c(nn>MuZq9%EYRhf8 z*FRof3I5V;*RXirq3RfR(fzqO|IQjeQ~0*=W}~^`92uV#oqT_frh5t&nauZLRWId~ z)Vn^_eapX7*ZdZ3y7{v5*Z<>MuY#}bK9ZQBQ(o`-e9uXzf66h2p%UFImfqpyaXij1 zbNk0~JBPTkt%19zi{$*3Hno}ZXVV15j7bl>q;)_4Z8_;I<M(5)?9yl7kI#ClAF!q_ zG-P%2uf!;wtNSz8O?&p;T+)IuMUpASU1JTmebl<s)1F&Qk`&k(7;^8imDJ1|an6bp z<4&BD((a1BT3;`JB=PIf8Cz@b7mCdOX;h_raM9FRpOsb8{%tbTs&abkT_|Xo{&qsJ z<dd6UGR}x?Y0S7c@rXriUs3<-2VopcTa)AOiO&6f|FXS8)$cP7`(M1~y{M`tc6iar zmhMTHxeFeKTq+Y0T4sIkz)a1!b<Jrd8#hiY%i6qqq161lN2jjM6Oz4sQaIDE_3(_f z_iD@jUW@rUf9?M2g(9a^XB$jEQMgB!=SuVg#Z$%Jic@wizr8~AURrv1I{V{=hXR{< zI;0CWTo!1kmGb%huBJEb>C&TjcBrpuz20&pmE%6Mtw}-I8vl!@7RoGOJ^SxuhH1%x zmGPx-Wm@jMT575K=BKH;<;8xc7y-9?r6OFV|90IEOFe#Q(__{aUf11A4!q-#<(;D$ zdRz6y6vn!rQ#=EOvL}5GlB{7<D#}rRF7z|@ZA7`RW^!T1RLzb}?`>{9eWJJX!R_zu zcmAz-{rdfN|Knehe<Yr@{qu3f>3~@(Qtiy||Id$)D4F1tBGccP-M8RpoSsw47IE#2 zeV>#IBN7&feOM^$JIi?9V~y^eYE!;ui|cM+YW#TK)p6gtZSTJ9y|qS~?I)|EPW1Ax zrc?Q)OEeBlt|<?w2oGAdbLsu#p`DHHmw)y1huJvjEoisnITl>faQH`LgR%I7t8=g0 zSkL+0{m)n{^v|t{yS`fn9*uX%s-K}~|NURZ*TW%8Z8QB!7xP~}ZL=ol&?bXP2lBYO zvi;V5n%%JOO;gvpj|qnrw~IvVSRT19%&S#^`Jmp$To$g<<I0ntGaOU6_UGMdgVX=m zo7TO(tzW4Z`<Ls@($il57Bu_6+4sci`GTEqEw{YpI&N#Z^40Zoj&t7bmCSop{eJGu zx7VE~7A9=1y#ME-+<n7FF4N?^zN^jF`76rinr;5Q^~j55`vUpzw3vS{H_(rdDie5E zBl)=IEA!4Qzv*2+w}=|ols~ii>)w9fDokaYbnBB7_1t%!My{;)%CsxpvR^D^#lk1Q zUOj#+(e3A9UVL(e{Q7lYpKN5jx}nk7H6%>NGC5=U<hElw@BHp65}#Di@Vmj}P9=9y zmeF>0mx%WvWh|>i4T`zG7@n|N=9l<fZK|7M-t)GvYbKakNvSR^^E;mxvhvvP)ZR<8 z0x!OqRVi83ey=1jbd?rE#lpE&ugWE}3f!&EAJm8`{(sVSU9JW9ny|h%>zS_H*!*V? z$KEUT8)J9^1S(fvF8KU<OS4RT^Y(l<G4JzSSua+5-jn%d>ruv_>MZKMZq2z1B_B^_ zPBPW~&yjk{VZnwy{cn5XOYUFt`g&nQEpvVw>lvfJv75Kg$lY-A&HY_GOug@Q^wz{> zudfWhY`@uxS!d6pSbk~8&+qo_=C*1$y6Ex;XV+6Jc?9oGIINI+(?@;Q&qoK>%<1vg z)>L17Z|Byvr@Ia=ntF@FEG13ZP?bZp`{8S&E#DLzE<P-~@FeivbN%O)2PcPr@!p}F zy7F>#sq|ZeJT6Yf>%6PyU(&9(t26q#T(ehf_G>j&7qwf9EN4&YUe|YRe?kM>UH(=3 z)L%{Ef2<y~uX@JSx&NKt?(QgF8)*Nhq^Zwx|M?_A9kEEus~@=X*2U$otP8g_+5GD- zZ&BITGh1HG?P6xq`q95IoUgF{XVE<Il8;&cgg$!AEGp{GdM&rarQvMJ!OZ0)EA8i6 zO#Ah@w07Yyj(CeX{}$8+mLygkDa^N?t)u<ZWz*Z+I#(xOP1xRb<oMP8@7Ml3HeRP2 zKWlOC<n-*~?@{lovVU<_oc#a!vv9cT^u-#Y*E47RR$R9~_u&4CtDkkIbml*PymIk( z+j(Idd}~(*eeDh2`jzQd<bJ0++F91JMV?ob-d$c_vumr!R;F&(XX)A@nb)$-95!uV z{=0AHcL~Y+xxc^6eY|}Bp01kRx_ulo`WT$Q%=|X{8cUtseg!f1rUkEEoUb(OK9k8j zyYgC%LdoT{gpC<LpX@bPTxInvWXZk5PDf`fE&E-|!1#`D`@+e`omiyym1$R8`t#}L zHLiI(J_VMC&i?fI<79mY-nsu~`ThLd`S{fQFJa8ftrMr;T70kG!nZwkPxmjyHIJ(N zUbR1Vf2wol*_6Ze8r(<ytIzuH)4sMRJLAf}ze_7@Uh~E#9%z4VEb-7v+3e%|QiH!g zi%<7Pe7!%hpoCNXedU6lL;uaPP0mY8ZQ<UZ(rdoQH&mqEb;-q<f-~8UyuRBVVfJd8 zC0Cn_zwa_LyG<Dz?+A!a3Xwe_7~-(fNJPf@Dx2}!{+V%GYmAHo!s?&%hu(j%d`p+) z<(flQ+sq=5Uu0YK!$75X;^XqgCroecyS`YV@s5VR?*8BNOA-YCq?V?X{_B1l{$tZ$ zmF=r)Yd=hUtLj-&>|PQi<S0Mm$)vZ7fAxL!oy`y@zU#%lrBhx_JNuP)$3p=F;kS4B z<CF8)`Mx*a-hD^>`|X|YHa*`JBkou1vMk!=+-0`wKVx=ZjIDkXRi68NSFE_Nc4v)w zcgy9f>y<Iqzhl|U9L1T<x3#?s{+)B@>cf4@Z(exiaPVJ!8RL}))1EZ0wiU8E*!n<l zB_rqh3-;_s+E>?noNo4eSIi8n*YBkG<9o9>o>gyt_an|A)iF8mk2V*FP0XX&hu6%P zoP2Ss9w$pW>#BQ`6aJk!cXW*;@0PRkzNKD1@vBTF(>gq@l>7L}@XX^jkBXfZ@$A*O zRhHLu)ppK@Jkc{2TK$)wynVT`rABw><+-Vv$**=Sl@nWd&t#rBm+sd&bsuiVON8g{ z5S)2ZqDXuG`K+^lp3aw>%_evG!TW;AQ-wRd+@_VD4KSM|p*mOSdP2yC{q|jtdE~6p z<}5q9b@}N<r?VoL-&K`f$rmQnzN{xh&;NAK8jg#rJ9^oS#P#eNT;Imu*X}SixtBg| zh5kdHD)nu(3&kVXOSK(Ujdi*nZah6|@%iAZ^Cmt?ST#xL?5R!{HD%$g)#*q34;Xd5 zoxEN8F7u5wIT2I&BDVGGx&^u}j6Uzn)a@#iB<&?8n)t|jpXSx()zeMY{JEaZ`&hiR zW8;yO9~~h&51t-t;a6SS+MmYp(yV=3j!?w2Kc1fAJ$0E{hO+jtN&i;Xgc!XD*LWha zebY7O=w6QJi^_g?niw6qu}S4f;!K|>{`ZStE9}g-4d^_psVl_K%1|D6^DbBK$)~HU zJ}kL1A)sYphfS{Hvja&V?^_-Xn6*M+>uX8#a0$a%Q^f412p$%F(j}<ed9q_8kLCrA zzSFP0ea_7>n(;TvbV`Nf-3NPa-!IBrt>?j&?UDSULP~9ulFND(GwG8yGd|ycKHDzp zZJ%M-nIMLgiC-SRao)Z32K&rM*BHHY>{6?zo@FkUPB)s=F_UFwy4Jg-?xJrK;xEsg z@ZyQHPHgeAZz~t8&kSamEIlvdYrJ0Ex&QYk2PM}S&eGz$Tk<sf&$LrF<Co;ly%Uq> z@|`R7M?=T~;U}Gf%-)j@?KZYpuy5hTW!vRK-hRxrx)?IoR&RRT>OJX(GiJul>F{@T zS>f1wC59_3H>lfj?uPFoq5QSa9Gxd}I0&~}+$d5_IIH|*k?e*DmByowW^VaEZ|9fe zEH^Co{9sq#SFk^N^V{+x>LOt+!6mtK{nlFbeSDc3E3q$Wg1%+gj=XzwXNaD5>00pb z(h2Fw=XYv$=FBkB2ywJsdOhXk4#|A$Pjhop?P6NC8gggNle>R-XGKZilBtLJ^*xm? zh;@Fd`5cj?^x#nQtHceAfBv7kX7ftJf6HFiBkEU7jw}!?Hq-uQt?1vkIrH??`a_rI zYJNPv*X`H+?6Th}Z%-PzZ#%vGe&@7xDy1x5t~reVm>!oF1^(UEQre+l)h?-hdda~* zCp~UWlXm;NYp?aE$(ya7-w-`2-Z``F?H+lB_D3_7%B(oW9QvN*?9H=SaC@(+|4Qj9 zMHX3;=5Lp{D~r!|t@zWUsQ*6V(Z922w>>W2>uNcDU+4OrpO&dFRftwvfAQ(dd7BUa zEU1_CnX%m0&*aIezYW)Cd`bLwm@&K9!$l(Lw&A?%e?LmhZa&P;e!JnSTZ(V!j=R%~ zl^@<b<Hr4xKX_hq{^yl$_4~NbR8<JhJQ-l3X2>${;A=zfueMfKvmNh6gom&DaJs?l zZ1=RC6~9l!?zpJvtGRFYfxUO11s$wev)U-5vfQf5zv{uJ?jpTwiQ8w3y!hdLDK~Sn zb+Dk??%$>5<-2FS^E^N2&+jc$?yf4hY`eFtzuD8~%l2CbA2wgv^kkmxxxMlEKAo@j zPkm*!%>Kk-8TnFyiZy~ZFLaAf?UFmtDfMm1D!w2M<;FR8UR$@D-?hBIcl$3_hIYFb zo<Wt9JenD0V(c}vxaa?VxaEW%)915kO>Rze;{LZsYdyI+kLS)io)^X8Pm|W{o&3{1 zwsFx4(X||+`E0+^t{7+UpZ-$#-S;(#`i)oRYo!~HE^2z(F3e`IZ`$(x;UR1G@1JIz zSCiIr_3&ZQh@2fk@^aZM9S<Kx{jqZvymv4;{r&A#kIpm4T4ooAE*06z&whX3QSH13 z=YDTKt8xFEZe6wdKXXm>yYqDJeF%;`Z_cDEesiCL#5MiyZqclk59?TkBDVXmJj!Q0 z{lzC?=DU)@BW1M*lMD~POE+_W@WpV${OvD3T>0j8@ZCjUzX<R4=xNsF_g8J&b$075 zp4*1AjHRmlZv2g7`{@36hs-?5Xysbx=zFub@0#}KcF^IMxwr1$-MJ}c>5Qo|FQ=zE zJ?`}JkP}KR=u4h+^jz_JnV5S!57ak@UE5a9IwfRI`#knLTPka=&)uLmyLj0XyNZbU z`KO=$cwWtNP)oezR^rwt?cC2*?B&k+IBU<Xbgb8$wrB%?L1g$`HR+x6?fO5=(VKgA zpFfN8H{t(QT$Zn2hu-<`@8?rz8+al%e*J@*v+sU{#Ra<ju&L|%uyj#`oce;L%a47W zuif2n-uc9De$~g!!CzkgZ<+6K)c5oMUqO#HF^6g}c}<jaTCz-8;ALPu^L3p);oG;a zPZK#Own_Qd>-T2YXGPr#tLM&o^ZV(_t>$OAL=JfxTGdMh%X@hoc+lbb^uvu!$5X%D z5!fOlE2-wmr}kj;-%i8dzCK)C%j!bRw(dW7A?~bJmhHN`xzm?i&{(>~i|cj%-<gb4 z{-n=an}7b-^1l9?PkH>T3(lrS{bv;Go^U8zGH9y*?3bSMdn}YCj$fI~!NxZ|B+8}p zm?RTxyv?6|pY(g#vtRnkdMtdTvT_Aaz2erjpAIh%GDuiIN4Zy~v$UdQa^;HG=Qgcc z^vyNu=hw4QtC+VNc+R`CWbq#P4W+KBT~dD}m-=&+te1*9RsSQ#?oU&ohw{`-Ggy-C zrgjGWxFEqk`9VoirlM@jN15vE&7VG<e{Xx-u8HmU!}wLZH0QQljh}w#e#+Xg_4aGe zn#DwTW@W{A8pWNsW)^eqPU_jmSC+bb_b&Mw{C`E8T;Zq09Vs@QE3`UNjJPKrF%goR z9m0_=e{gw=+mVGAJ0eu4ID|Mo+?Zjaq-QFU^653(rBlndzgY8TC+n#nPuygm?slAg z!Y8nnVRgzzhwr=AZT+-d|EaUuso75+9-g*OYR~R>cHx=#+tr;`^f-HVXe`>;a4t#Y z!U<I!wTmm3H}U;G`LWaK+^;IZ@BJrFcG|0R?|l85b&kEd+P<lhr7O-q*V}Ml#q^V2 zUrhAp9A=&V;=q~JN5jAU_nMW?I4OSFM3oikr5pB%{9ECDD#q@CZg@TC<z8|3xt}Z( zu1z$0HR)jU*VOxGrfHa@mM&LVc>B>Dfp4B?y>(YiUAul=^Lf|O$9Ad3H8-X=PHEaX zWnw?;KlyWOBDbnIJ~mxgxW8fgs(&KS<|y<@wO`3S!93~ctJzf%@m%>wjvoDbfh!`O zk>T)r8K2X8r|GI)osw28Fikw~xb@;a4|uFD&VTZ-^D8gcgwH|F7w?I$`JQBD$m7es zG=7$jw6*ft)0S#trN<vJnbaILJ(2BX;MV7I=%{8R%Q=RXE9O*%?v3jIqqc6|pH9D+ zLrv}azA^vrH8=gc_SZ**v!G&P!wN>5bBxzR!r$=E-X>-BLHtmM{>P6$=C8lB``c16 z-HChb4cS|@tZZ6zzqGP??m3)%X2btwGrINkJG!&PQ+JAgX?-Qk+0kiPF+E~e?K`7D zodXY#zM1STtMlx^zpYjhQ<T5)a*J)B(Y4Ox^yhQGH$6YL^F&k49yg7;?&Hxt{OdgU z7mMCZS@q34X#FHfw_N?t+da2+?E4aZG3X@E0#1wTlm7f!)AKg*iiq0I@8+w_X7~8X zMC;DgjbYd>)2O;G{U7HBi@zyyD_9!OvIaZG21YjKNXNvv%%4(!$<;KRr-j|r<>RIm zp7QBs?W_Ere^Lt22o{;L)z`^s7x$q<A%_hU*QzTl++nJv+h1h4bIuHr$1%4Gr`y#1 zIC$t&OOtc1V=|A*0b`Z4Xmb$;$-`^s9<+|Ty`66@XVmZJ=C=La+CTm#FZ^-)Y0bsw z`&FO5pMSB({*U+T@~CJ3VhXmzP7|H@TE_R?##^o#)1QUJ>P}m~#cb8RGa@3VR)0*- zO%-QvVm3S&!F4`!(H6B|*B7V%SGTV#OFr~6bLHQei!bF~KcCyb_sFXoOUsug>*c?& zFj;wXn!bm+L-w>KEiW%G)Txr<3_J3O{mS};X6@NKYm3(^EU8@knR##F#G=P(f0&9^ zZ%YZcIG@RXrt$x+=X?8Xi=6(%R{qS^bnn|gO-!uGXeGb5y^Q6@9ML(~&tz<V#@)5) zS(=H|*)?vq;UNp=&A(dpKQzej`;I-Av=pn~1$y3GZ29Qss!6AQ?)<dr)ArB(yR7=< zneVGw&o%pFo1)FU{7~|NU8#Sc9auasUhmJQmygb;*I6?A?E9Np_+Vq>)5g?>L(L2m z6cZVCPP-ZAXgvM4PRB#D%m{(YM|h8O>^Qsh0Gqb8>YfwgOk!uxi8uK!opsk~@;|G_ zr8g4_9_;_x$gsXcw7VeJPbZIIjj5UL^Rv5G{l44~Rk!f{uXSb?-wr1)`K)|7dfL}r zrMZR-S5C=KjFxZQwe!Hv0Q0%=;{EUU?*6PdXX}QdbXJ#h|9|{TPP)5!YkGsu{GT6w zF*}rQS{U)|goH^4`&ao)nYN_L!^sUg^Q*r8y1HIAL!s~3f}@MFg?k&5^WOhZ?~07* zIoNSzz1l<;pZ5JV|Ak&2im%$QvN^VTD_a}e*;6l;zusZ!V%y{R<KZHAjXvgz+GR`6 zT;3YPxYVGjX`ANP1|bPGB@WB1jEjF_{z{$E@i9GUce^9Ot>CNb|EBkwv+KXTdAn?B z`h(fGbmi*%ICib|O601NebaTm$o8Mq!|zekx=y|qn-I;aWS_U!v+&Yi^UOu*^X`7u zNOk&b+MJw}7#-mK*>u6;--5fV?Ft`>F|6V2JCY&Z%G`X&b?vpLCiAUUg>3A}HV*PG zj<dg&`JK~cW}0;+>sgxbxwqlB+ZWHO&+7hHx#=?7p-()E4n7D_d%ocP)fMk*|9><z zzOB5QC#QZwO5Fa5Gv`*!nSU`)y83e=TXTmGkGq<io04d!pvR)7k1zJEEvbAip>Jr- z_9*M?HNL#_)xS*ge<$o^WsT1bxF!`5cK>lnY2mw-S6P@=ul#wH!D(Gw?QZ40hKn_o z|DNUh;&;~Xn%~=V+WDpS@9g&f*v0fF`h}A81drdTMK2FDgs8oq?#1@R$g_UG$~U8y zM{j-Gei-?DY;<sNi9fOWuC$6+q4wbyGcN{J7Ol5GKgn<M#&vHE`4=l|nke4+)t6yz zsk_iRpu@~c^WqB=w+n}5URP&l)Wu#tYS)<3@r5<fcyeK5itYwpt|a#6ueUDEUiCyW z+4IwzvsW$!HAJbp?K(H<v5Mh2^M0q+Cte>^nw}W06k*&ccA$3i=Xd9L9kb*`F5Q;i z#m{iwo8?AS@!z*|=LWxCBYj1rZ`Z!1XMUZNcKFcS)sy1N>~s10p}Kb`wp)D-N^PzB z82$Ie?A{CEvEL@uhcKosvp(;UyES~z*PCLhq8>LlR`8@8IPJb|<B8Lnfl{;D54EUk zD|4vbzOnG4=%mK*$<xo>w|#lb`oZ4GM^ip8VojOyUeQGG(iy!kx8(I3)08#}p7c^V zcPFt;rdYvHMRV!vs4YjISlqPZdAciCebwjP|6ltF${5Mq`IhkhE}PyX&fU*bubuum z`Ti5;(+d{)t-Kle_{uwnG7pt5xhMAP=dXKfX%jp3-KJiK<P}FZE<7o6`rzY)`&FKY z3{#S(asKSg?2%+U&uR5UmU-z(uape4FB8O%@=KolT3F%Hc~+vY!~czAQD{Yu*8Jqu zm1!#<XQ)&jt6;ftpmE-`*w}p6`YMCN)wVsy%?0+pZ)s4Qa`e&F=l3sN$TO|Us{Hrx z<#cD~<#A`v_v`b2eYoLiTTqTFU;kPy!=%#(?37Ht94mXR&6|FVt1;#8z1SNJw-oDR z1din2NHWSj6A@q<v9Q4YK(Bt-k>D9-FRTKxMPp?SOrNnxpMCN-$EJ;r?FtbrZQ;kc zUD|(E87bI_d}p34AuJRxdhC(-B7;*LGTt2<w+b33KYFPtEZQ*hUSI1JJ|q2wx%02( zo|oHppk)pp>)C5>csW)jeNGLZa{XX{kX+w_AmwfRE&V^(uI+#Q^zDw^pGEf$CS<9Z z1szT>?8^3Ba9PXZy5~VxUWwVR#(Rx4Z#Sf^T4Nx7&c8}<arfrjbtwx!R*16A^wzes zymo_W`K5=6Dpq%Lk7#oEKW)CVGuJFNb_%1L_=>HQ!dy2@Hu!f>M(B;v=6N$D8W$a% zddT8Uk%g{Yr;7Ha94pTP4r_+Po>`p}LX<ajG$<swWN2tAosgIA3;6Muqwx+e$BqoX zo%~!g-<W2&wV8f9^fQ_LZ=u2VEgG-cUs~wc$#$PvT)5~|R>q_QbM|Upys_|;*u}Ma zGk<hkPu#wCT}YlqvP9f1t<dEXa!MP;>^9-4S{-3GlA`)@zIo49G^<=w)YvVY7g zFAT3SI6gu2p5M+Hu~+@vb&dN1i(b|@F#LBgeX}F0wOa3-=B7nQ*?adsstljt{kwS; z>$5V&6r(Sh9D)nNS)T-d)IM#heIRC~#(~6Qt-7z3F|6#%-ukY2I(b%QiQUeXee)-T z99B2^__8LcnAg8>hJcRig@=tsLUt~Ei<K7y-Fb2Qh?U&Nnfpt8x7Hk;m0iinyYQ!g z=CS={ldrMO-nMmC!+$#thQ3K#U4PH7&uM)B^?SNN`hnNG=JHp*kCk^{zVvOZMRs8) zgVUYcdE2W0JEvHm^V4BWT*(-0KY!M?Yga>aa?4UL{n~ftNUoRle&xUJf2Ndm+MKnU z(X%Gyc;OChZEo{tQQ4=x@?UX9<SFZJ>%VbtiS6B6zv5D6D>IzlAp2=?_UDh^8hb8@ zy_4MD;QBc1ZN9?qVtxmC&K+$>w4Wa<oRT9cxy^s^2LDoKd;3nV)VKS-hk9<kdE@HU zZP!+6PRQLFp!ojL>-fmr+?l)Bw(VoTFl*M#m$}w`@~dST&fLk#o;#221y@G)RP!UZ zcW?c5Y|D`s8-L7S&OJlt?V{(GStrD93bhlE&!2oVLrBjgkCB`EW_*{+x99g+6;w*S z@Aq|XdGU93$hm)II~t=?J-24Aznb=&O(u4y^WhC_EW2`k80Sl~Pm-|R%oY4hmVsY9 zD8gPS>AyaEpV7j#Zl6|vU-R7Nh%np6|1ld@zWlgZ`s;kF`rK7ZOG{NPcAKrdl)tcO z_94BipQ8So+V2jT=d}5P*R+jO=j^EODQWt8!Z32DiXU%acE1iwyvNP3tA{i^j|FZD z6!~*O<XqB$Lpcn5&WY!w=DcK8(_jmb&WZgJpJE{`r`O@;7A4&H;pl<7!|Ug-F?$=m zX8qY$&o2ol{Jv4>W!JYvO^DURec`Ku6tOSNsg5j33s^WEqZHzt4;Yr@_5_7SY+t#1 z;cT@pMXvcN|Jdj8tmbC=?Xqs~HKym~nF7XfG85PhTqVyiJ*fVBFZ0ODbybg-@u!<N zK47;$5P8NxqMJ{h?RW4-@fi#Z&n_HTD(SQQ%c+B9%fH?2S+PZXw%wYWPn5n|m#;jq z!1mINjOiV$|B{&EuGf8@x%K<G&xh6;xSi;oZ8zsO%eMaLpXrM~O8yA+zRqM7+pf0c zvP#MVgHr-MM_E{JEoEVUY|!YKtQ~%P%Ig!0T3a@(FtC`c6>X52U7&d|QRhSQ={n5` zzi-XGeNgK~yfMrFWfz1}rtW9gT40+f#&hV^V?(j~Q%@Z<_2|+#6f;YMsZXosyZXDk z9$&A1e<sH&^7P|_Kc_?<G$$r>&M{GW#HUovd-C0j)9ZLnZIrQ?>0`R$yG!i)|I<1r z=U4v9|8%-Sj;XcEKbr0K)w3an?KM;W|2^^MM{~w2(NvGtGmBpBf8P^$H`cZ2jHl*t z5!+kayO`SDf6mN4tA6_9iQM%$S3mFQKJo2{?@`ttaYyZLg!Fi>iB_s#%YX8npyF<g zQyUHazwwpcH2!nP;=`A~tIOhJ!lnCtR@UlTWUW7(WA%0Q#+O&t=f&jaXS|A<bCTt{ z?EC|N8kbMKy?7pLKu^g+0~r=hsg5ViRZTM9Q{HrL|FJf6H^bW>|Km4)$X~5-B7MsI zoB#iWo6p<-p1<(V=~&LEao70I=I3*@zPRKuw@BD?>oEaesq4Ht!ZG1)Ol5l&pN5@| zi%;?Y@+AMYc)jkwiS;M%y4-0x{%!XK>3P{fPhDoEBz0cNEN4yKICtH#f=@j^X4f%m z<@PR7I(+|5qULms>O*CB19|OstT#IDBQ5!N*RCC5g{Kz!Tz@J5t>Mm$JM%3+>Ax*H z_Q&yN?pB%p<*#>c|5fgswf;MgSC0QK;oIx9u70wb5@h;U@OsCKsja(?vh2=r{d(NM zz5I<|`X=qfqBDHg7h8#BySFY=*s%3_weekMp%Q<)ugf@Bn%NcyRo64<-~Y#09P~e@ zT&<e@aA|+!bk23!3dh^Z_onZNa(i6A%l3zTr=8W~@IC*%rzCIrUjDX1jMc}T`SO94 zk3~J#obb3QBG_%X?)kL|o1X2gn>xLF?(N;Pcb>R(WYO)1*&*T5pAY|kP;#d_J(}f7 zjO~f*vmZ+pongGbSTQ7%`><8`8<(xklQoiMZbq3^x$n<+dii+b<BiIHa_rt5vr!5= zve@R>iCH@&mxT*#=Ghi|vUvaZcRNG-W;jlp<#_9if^V8Yt7J>Oo7eq#_nS=f%ER8} zS{2{DDRpfY!)HF3`PHA+PYZlzepB1AGqvC7dTzBwY2Oy3!#ZCsX54x3Dt%*G?xxR2 zi*vd|HjA`Y&Aw9ZdD+iOS8|`h^Q4PKd>@tH?Z0`mOTWlK_w@F_P+^|K&BdSg%-weO zhE;j|m5N+O+r8!9^Of(V|C7$>vVC0W+vs{b^P_BiCTF=+i>`Xb)PMXM#&+{J%};-J ze#+9ErxRv#EPJB6eaQ*0JJDAER;@lQA-Xqp@#Vf<XD%*`oVC_6@m*(#*S)B%D>VO! zFZ(FOo&O_2ttR!_CKD6sANR5kJvCqwdda4`>W|GMkAkfVilzq=9q%@kDBL@;{OJ3Y z7JrPN9c8%3DCC>8F(q;Bq^O7Mz29rGo|<f>@nd<U!7dxt{o=D0)_PA6R}gu_HEo-) zYC`BHt+{;@!n}m<)isJ#JiNd&@npA3@I2AflN!>qly`pOIXU_HvN9c;>1x&o^~!?% znX5BW^nKqfp7~d1gKl}-#^Tkdzo+akyK2vI_m%eY8*l6LbSqf1@`Nw@=J~9byT88P zX1!?6iWmDNY(892{>x_b?MQI*yvlda4srA5J3M7S5Od}FgM@Eet52uC`)~j1k9v`| zo!QU4Zo4nCf6p`D-~QP4@V>7Z0e|mTfBLUyvxf1=57U2NU;YVx{pX&W57Rcue7SEK z4VT54EaZIF?`XX^|MSC;-}}wmSnZ^l&sXzbPTx4~`Vx(sSF;qqwI5olpT?EO(kMH@ zwD8fUtqbl4_4)iebZi6v8a9u2>hD?R1xtmVI&wJ6<QVfI?}zh*UJJf>QzrjcQsS|~ z`V*$FeL8Np%<FyUp11i4&t2QMZILBSc2n>Fa4MN%^zKSiz3UqmPOao~KQ}WRz4dp3 zD!cDh74fHn>+ep_Q(P$H_{v6SXYs0w65meRN&jX3s2w0!QBlb|MJPte>DY9epW-gX zkGE~N|KcPgaDRiqjqe&kyWgw-4?Gb6;(R90?Ch-{4@*7>&z|;sdf2ul>D{c;>#G*W z&16dWv@N0PRM@kACbQ6Ahbu}o?^pGwo{|x|V6W$^v|xs@d3m*U`zq$f_VU+F&g<SR z*)#1}oymnYKbN~H+3no6NPJi2FBhB4_HR=UY`DPTs-QXXu6LSTy@b`tms_t!Oj@1w z$fuY?SGe~Fi|EqD%lED2E!scbDQH5t{MTOg(*Bv-;~itIFaPUpu(=w|zv8h%9!r%; z(A~q&wqB5}s$co#Ve<dL>76UB%64446r{3zzkSZib*gLF+8lSsq{(nzvP_Q8s!Qf? zIO%ux<-UtP&Xf5x6J55ZiF|1iH4xadEzT&=iB;Kssrf#pRVOWrv^HMR4FA%0H^#fk zjC0dc(N-U!b5kxH`o7>{T<88tIrEPM+U|=xI(JdV(^#9&i{^hze6i(wT~hzm80QP~ zYYy``sv6H~{OQ>)9{sX`!Qjp=@t$%k%{8ZY1g3xg9L04nLQ6x-dp6t61^J>kt+_TI z|Mh{@IO!_i7hz>5(feT{ziy-kJzA9H{zP)p<4L6#{vUmRrta7lX_Z)0^}|Yjx0YOs zatpeceK`BQdd;^P(MlKf<ycogyLHazXt2xv8%+D+%1k184=ook3}Ie!=b~7W{8_y> zUuU&7#ov19{yKVd)x+3Jc2SQa?@yTiR^(Est-BfzU)eR@>;BWD#4GnM_4#vlm)Y!n z8guugF3T`t{qN!)Qd;&s!2e$9UoY>pZ@i+Z%g@JNJsef?>A{DyZ~Ye^+V!N=yEN<T z%Iojj(#zB2?2i8FS)P4Lb))~%(wm-2Kb|Z-U6OCR)ysJM%rK4%y0UBh-bZbj5^i3$ zI_2$F{aF$9_b!$_Gv3D3?CUvCH+c2FsGCz|SA9;({ahExAnPms)Yp9G3rm~8;N9v^ zRKB`JH%W-rF5W#`Tb+N)iRnj;k20M5bICgJs_EN@bH3Lukl#IR=H7ja=6u_EyLyK3 z-2W#&l<vCQ>)aZ9^7ZSrm(Q#@weaQ2hC71g%k3I1X85{zJSpQ^_4$8lP*~dbw6NNf zZ_n=Rv=01ucHZPE3jDqcrbw;(J6C^uQb~z{$0dFB^D)<&pG;y*sQdb5=gJ8m>;2bn z{jz+Ml~q}9$_LGZ3lowOo^ig2*ERaJ{yg988P=B{yzn{Qe>uDH?xd5S>%Px3v7H(H z_rt|~oV#YuJ(hXwnST0qsrtzQQOow_bKY3mXr<75jdAHzSvP@HhOI{Src>DW-_mSp zv`t%DW3ad4SC07alT5o#Tb+MjfBvragI#~z%@;F2P_LH{7u>#o^_=^Sve7S@<8Np) z8vZyDP`uop|Iz=r(1cxcqBP!peCvMT_2ZnKe6=QL&F!+B4^Qj+?f*7?HG4~6Yucqt zAMLNOU5>kB6O!TMA=3QDBfUG~@v(cS>!q%=?Q(c=>~~1}_Qoz<-kL4XWRtgcCR<K) zwstam6jjr@=KcTGU)LS>lStmT^HAB{`3bi78dHqFn-x1>KksC_Qsau!A^V?#^P-(I zAM!VK{H%7lc*!kz<wP#mN5>Ygcbo1a*mO(Nq}QlaT=&Ll5y9D^6DM90x|F^6Mex@T zv*J5ei0SODdQc~MtIBTC8PShIo8ok8OqIiCfB(3)aJ#PPvELR-$K;cDY<w=V`RA@F zUw7FbET~!dX41@sd#qh^?032Kf3v!ExS@6OnZ&fHD9)s6r++J=3>Sud=}29ioB3YE z$ZA?uj)YXPr{3zVUMrk5%RJ6$YMTAtbjfCS%eu%-*OkH+pLg3`d**O^)^C%S0qd8( zS<;$!_w~o?MgG}cjPY5!LR`W!_w7(-dDb$gVA}j_%az}>mcBXZw`=mWOK+tNduMK0 z_d?;6__58G-u}EDl|IF+LG*(74z=ILLBj53JFZTXVsBJiwxVuk=D|ZT9=Tr&rk&!; z-gj0d=!n$&?_nJhO2zH!Y%f$Y7<m_1zmVCLHizxi9n-R<_v8Iv8D-ozT-_Yvx1d;9 z;USxqfey#Iu$iSZihDnFUVawVd|{vJB5$3uYs0R{dB19D*_B`TruMm!sWC6>lN|?w z1cTC=ygY+e&Yo$$qj8g7)!OySOTRoh7A>T7?PN>u?n<YBLFdXDm+yS{Rpe9RjyZ?U z?h5A4UlwcJ<2*&wK>ER(ZL1f*c4~Yb@x8&EL7(v+V@*Nima3V|A?z<4*6}4&rrw>M z{`#J$P@+5oqXA>%%#7$<-Vc&~x?I;c+rBTH%lY8^v~A2Mt})25#qh;2-jVuY^r5e^ z@v_)Mp`>ta_5<vfCH^k`{8jJ%HUIcipVvINwrb1&jBUJ;&I`mkj)-(J&8(RGGWYI} zZF|o#eE4$b@S~2fU){-bIK<Q=q_xy9cL(3djGyD>E&ABy-;1N7hOEY_;-8Nc2{4)M zHdUN0R_@XJ?NQ%F&KbW~&Od3hkDYJbBqh&1DVsfxL}$)yUAAeWm(l|<{gBcYr)9Hq zH~!51VC1bjiK9{V>Fe)Pl9sxrd8%!Uh+=v^b-CB`Ba@a+&N7^-8gyw3-`?Ywe!q<N zn3$HCSNeIAjnC;N(bH<(TXP~dB&BMld+RDEo_i<MG-+?E4rBj8Ua>>#-_$&p(zp@n zW%XTN|Lm1*6V7L31Wnr#m(sH4wZZQGR=tdk>a$tDWd`ePzu~m_v7=Q*(qo;w;ij)< zUb?bP*i&`GhJvj-mI_W;`uxYHLw}ELc=>s4{batK(OVffYB_JoUV3WJ%`UQWfzphG zfIGPY(NFXbOC&5go@8Fy-Wl<D`j<w-$$~y>d=B@fJS+Qg_u}iY5I4P-r{^5Kp&B;r z@yv+Gx4&j*om`++?qi<qEgSZ7-|ly=F8%**sKvJR6j;g{>Tb@t!IzViD!y;+O><NB zewz;gNsY{NREo|#jw$-Zn`-ra&gT<H*`I%EX>E2tv2~_LWn^0G)QQn@tXoq&rDkbs zy?;^rO!?@NnTDUH=1mRBG~DQtY<~KU#g4O`?e}B;rf^Q0bV8#0z&U<3@1tTH;swGQ zANqz&I3psYDykDc&vsMlNzF*ErC0j6JVRGhF7?!3!!tA2Y`@N{Lu++o{Z>DXHkRrN zb(s;6!XZ*><!b%<afW)B;X}FaC#y}QuiT1ow5icz39(<bFM9PM+i4x*?LMui))$<* zdSlTy<`4W;yLah#oO*jX=l^w=jn`}*h1>mIYw>c*<#R_IZh0>e<en{EzESML>ovva zc0X9;ZMArpL*$(8%YsYJ6t>2e9Syy1^-@Hwi%&hKT=)9j4)2qW!N2r#!(&T4yThzX zI16hGUv0_yc=!HuyT8{i=<HA16)o&9CsMRt>8RJ5?Wf=Ux|2V-Nv`6>#DC|^A8b^g zC-vn_vHqSfSrKBp+8gTU?4R^I?M(UOx*spYllMuxhiA1JG0Rmyn)&?a+kVb^U$-an zZST3V&V7D7{r<lnr|<v!xc>j2d^gL*sy)TmOjr7>3#i+xb#Bh~fM_nMwSM`jxyjk- z?-LBVEcS;B<rwXr*Ozh5e8)#cy$dYO$u7psoq|TMXUlzO6*0aid+Lc<%B;3M9ASxJ z;a*DG2U(o|2re+V{pLA$$PMGnLeGa&l8RIsyq1L=XrFj@r`Pn28p{_uT<v<_A`v+! zo?o8n_&k>9dd_ik->Gje{ic47L0X<yLyN<cZ;RHmD1Hw06IX?%a@}h=;IgChus6fv z^0_wR%T9i<Ha(G6n0e&wel6GA^D2bA4shM>auJrU3P})`S-b3@wCma1A}QA-)jynA z+!y7$@zL&O+^d%;eo#rg5b!g>X2Dgl6uBDKz;Nw}iyfq@JpXH0-ff(g`{Db?BN`tj zHtDs;Jn8%|Q+)BWV7q5ZBG=qVlW&u!8LSscY0I5(^4@l>*-M@kN?%T$FL!v;dUo%( zk(aO3SpQkL;oU<)`IE6yX6;|z_xN#@DAhdwuDT(@qkZ$zl|E&Wvs;*C_lo_@`0yp# zhdsY<hPHWGkM?#}d70@auSTn_xU~3&)$4EnO4fLtsLK{U*Y)(vhQf7S-uI@|UiFgT zDf9ihAw%|`+0qFje_y3--|;^>*Qav%+y&3V%Y(jN+cY;yf+3pY^)jh~*EgO2P5pNL zdFkqirK^$~`PR*LIsNUAcJ3j?>Z7%aFCS|rHZR_E=KRs+KbAb>yXyU0#XIQz`%RW} zbC-3o+`BD%Pu!hhn!=Mskx_F)v-D2?xf2`w`J7&)>)lgvx}l+L_fz&M$n{?O!BR6( zB(>;BTqaZ6!G#Aqw|xm%lXfv|^YPm{L8b9)(vGjtEdPA(L{Um{a&|4dx4ugG=0Dqm zpJ>_3eMnQ6-cx$(kT&b<lr?^l>dC8BUq90c+8A**%)5-UdAI&PD<(bBlY9Q|usye3 zWx*85_UW4Lsk2URPZpF=Wh`i5UT*YI@en6-xzrt2A-)v`S{I~wnWSWU4I5_Y#v61T z)MC=ux?Zh|!Qud;)>1Ym7giaD1}=sR(hR%_JPK*7yP8BIbA>A{e5a>|guPPlioCTs zsoJY!$9vzK7p4eUD$f+``Lf%0_T=mq5r*4~d-fQeh}<f2>?((KP^3cFvhB`+vuADJ z^yQ!N{CBNh%k`?0!fvnBIb<Rq%_eJq&N0>eOlhc&x$>4Ag-f~#4=e*pW3L!IbC_bg zecNrX<xdh@8rQA1VtL2BGv|1AEzg;s@=A)ixu0cIz2r^`{yaaWw(yqkvgLVePn`aC z)%sd>>2JjkRyWT7;(N#I5L;tl?j~~1x-=|kT65bIp~Ohdd2IcW=Qrv;Ss?uEv7M;g xTHU78fhGCdvLxoM_%$)--sV+n)OMcGx_$iQxn=TG7hewg^K-`E<$t*B82}kZ6*K?< literal 0 HcmV?d00001 diff --git a/civicrm/ext/riverlea/fonts/inter-v18-latin-italic.woff2 b/civicrm/ext/riverlea/fonts/inter-v18-latin-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ec07ef7dd6bb53bcbdeeb5da6a9b468d1bb191c5 GIT binary patch literal 25080 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 VmlR3f)qV2)_nZ5he$HfO003BsmC*nI literal 0 HcmV?d00001 diff --git a/civicrm/ext/riverlea/fonts/inter-v18-latin-regular.woff2 b/civicrm/ext/riverlea/fonts/inter-v18-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..33002f12853a3d37d7b7eba39623fae3bca94a3b GIT binary patch literal 23692 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 AW&i*H literal 0 HcmV?d00001 diff --git a/civicrm/ext/riverlea/fonts/lato-v24-latin-700.woff2 b/civicrm/ext/riverlea/fonts/lato-v24-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..11de83feaf0fb872c91fce89534fd4e2d8bbda28 GIT binary patch literal 23040 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 literal 0 HcmV?d00001 diff --git a/civicrm/ext/riverlea/fonts/lato-v24-latin-700italic.woff2 b/civicrm/ext/riverlea/fonts/lato-v24-latin-700italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..38df58bff44c1b7ff9ff6a1efda725a10ca4cb93 GIT binary patch literal 24448 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 literal 0 HcmV?d00001 diff --git a/civicrm/ext/riverlea/fonts/lato-v24-latin-italic.woff2 b/civicrm/ext/riverlea/fonts/lato-v24-latin-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..851630ff85699de633f37170f29cbadce3d322ab GIT binary patch literal 24408 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 K)wPw13=9Aj_Et~; literal 0 HcmV?d00001 diff --git a/civicrm/ext/riverlea/fonts/lato-v24-latin-regular.woff2 b/civicrm/ext/riverlea/fonts/lato-v24-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ff60934dd0ea9cdd93f961d2dfd1e158357f2a77 GIT binary patch literal 23580 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 literal 0 HcmV?d00001 diff --git a/civicrm/ext/riverlea/info.xml b/civicrm/ext/riverlea/info.xml new file mode 100755 index 0000000000..6e225c7647 --- /dev/null +++ b/civicrm/ext/riverlea/info.xml @@ -0,0 +1,35 @@ +<?xml version="1.0"?> +<extension key="riverlea" type="module"> + <file>riverlea</file> + <name>RiverLea CiviCRM Theme Framework</name> + <description>CiviCRM Theme package with CSS Variable defined variations ('streams'). Includes Minetta (~Greenwich), Walbrook (~Shoreditch), HackneyBrook (~Finsbury Park), Thames (~Aah).</description> + <license>AGPL-3.0</license> + <maintainer> + <author>Nicol Wistreich</author> + </maintainer> + <urls> + <url desc="Main Extension Page">https://lab.civicrm.org/extensions/riverlea</url> + <url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url> + </urls> + <releaseDate>[civicrm.releaseDate]</releaseDate> + <version>[civicrm.version]</version> + <develStage>stable</develStage> + <compatibility> + <ver>[civicrm.majorVersion]</ver> + </compatibility> + <comments>A cross-CMS CiviCRM theme framework.</comments> + <classloader> + <psr4 prefix="Civi\" path="Civi"/> + </classloader> + <civix> + <namespace>CRM/riverlea</namespace> + <format>23.02.1</format> + </civix> + <mixins> + <mixin>theme-php@1.0.0</mixin> + <mixin>setting-php@1.0.0</mixin> + <mixin>setting-admin@1.0.1</mixin> + <mixin>mgd-php@1.0.0</mixin> + <mixin>scan-classes@1.0.0</mixin> + </mixins> +</extension> diff --git a/civicrm/ext/riverlea/managed/navigationmenu.mgd.php b/civicrm/ext/riverlea/managed/navigationmenu.mgd.php new file mode 100644 index 0000000000..edf3e0d1cd --- /dev/null +++ b/civicrm/ext/riverlea/managed/navigationmenu.mgd.php @@ -0,0 +1,27 @@ +<?php + +use CRM_riverlea_ExtensionUtil as E; + +return [ + [ + 'name' => 'riverlea_settings', + 'entity' => 'Navigation', + 'cleanup' => 'always', + 'update' => 'unmodified', + 'params' => [ + 'version' => 4, + 'values' => [ + 'label' => E::ts('Riverlea Settings'), + 'name' => 'riverlea_settings', + 'url' => 'civicrm/admin/setting/riverlea', + 'permission' => 'administer Riverlea', + 'permission_operator' => 'OR', + 'parent_id.name' => 'Customize Data and Screens', + 'is_active' => TRUE, + 'has_separator' => 0, + 'weight' => 90, + ], + 'match' => ['name'], + ], + ], +]; diff --git a/civicrm/ext/riverlea/riverlea.civix.php b/civicrm/ext/riverlea/riverlea.civix.php new file mode 100755 index 0000000000..01dd89c912 --- /dev/null +++ b/civicrm/ext/riverlea/riverlea.civix.php @@ -0,0 +1,200 @@ +<?php + +// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file + +/** + * The ExtensionUtil class provides small stubs for accessing resources of this + * extension. + */ +class CRM_riverlea_ExtensionUtil { + const SHORT_NAME = 'riverlea'; + const LONG_NAME = 'riverlea'; + const CLASS_PREFIX = 'CRM_riverlea'; + + /** + * Translate a string using the extension's domain. + * + * If the extension doesn't have a specific translation + * for the string, fallback to the default translations. + * + * @param string $text + * Canonical message text (generally en_US). + * @param array $params + * @return string + * Translated text. + * @see ts + */ + public static function ts($text, $params = []): string { + if (!array_key_exists('domain', $params)) { + $params['domain'] = [self::LONG_NAME, NULL]; + } + return ts($text, $params); + } + + /** + * Get the URL of a resource file (in this extension). + * + * @param string|NULL $file + * Ex: NULL. + * Ex: 'css/foo.css'. + * @return string + * Ex: 'http://example.org/sites/default/ext/org.example.foo'. + * Ex: 'http://example.org/sites/default/ext/org.example.foo/css/foo.css'. + */ + public static function url($file = NULL): string { + if ($file === NULL) { + return rtrim(CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME), '/'); + } + return CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME, $file); + } + + /** + * Get the path of a resource file (in this extension). + * + * @param string|NULL $file + * Ex: NULL. + * Ex: 'css/foo.css'. + * @return string + * Ex: '/var/www/example.org/sites/default/ext/org.example.foo'. + * Ex: '/var/www/example.org/sites/default/ext/org.example.foo/css/foo.css'. + */ + public static function path($file = NULL) { + // return CRM_Core_Resources::singleton()->getPath(self::LONG_NAME, $file); + return __DIR__ . ($file === NULL ? '' : (DIRECTORY_SEPARATOR . $file)); + } + + /** + * Get the name of a class within this extension. + * + * @param string $suffix + * Ex: 'Page_HelloWorld' or 'Page\\HelloWorld'. + * @return string + * Ex: 'CRM_Foo_Page_HelloWorld'. + */ + public static function findClass($suffix) { + return self::CLASS_PREFIX . '_' . str_replace('\\', '_', $suffix); + } + +} + +use CRM_riverlea_ExtensionUtil as E; + +/** + * (Delegated) Implements hook_civicrm_config(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config + */ +function _riverlea_civix_civicrm_config($config = NULL) { + static $configured = FALSE; + if ($configured) { + return; + } + $configured = TRUE; + + $extRoot = __DIR__ . DIRECTORY_SEPARATOR; + $include_path = $extRoot . PATH_SEPARATOR . get_include_path(); + set_include_path($include_path); + // Based on <compatibility>, this does not currently require mixin/polyfill.php. +} + +/** + * Implements hook_civicrm_install(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install + */ +function _riverlea_civix_civicrm_install() { + _riverlea_civix_civicrm_config(); + // Based on <compatibility>, this does not currently require mixin/polyfill.php. +} + +/** + * (Delegated) Implements hook_civicrm_enable(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable + */ +function _riverlea_civix_civicrm_enable(): void { + _riverlea_civix_civicrm_config(); + // Based on <compatibility>, this does not currently require mixin/polyfill.php. +} + +/** + * Inserts a navigation menu item at a given place in the hierarchy. + * + * @param array $menu - menu hierarchy + * @param string $path - path to parent of this item, e.g. 'my_extension/submenu' + * 'Mailing', or 'Administer/System Settings' + * @param array $item - the item to insert (parent/child attributes will be + * filled for you) + * + * @return bool + */ +function _riverlea_civix_insert_navigation_menu(&$menu, $path, $item) { + // If we are done going down the path, insert menu + if (empty($path)) { + $menu[] = [ + 'attributes' => array_merge([ + 'label' => $item['name'] ?? NULL, + 'active' => 1, + ], $item), + ]; + return TRUE; + } + else { + // Find an recurse into the next level down + $found = FALSE; + $path = explode('/', $path); + $first = array_shift($path); + foreach ($menu as $key => &$entry) { + if ($entry['attributes']['name'] == $first) { + if (!isset($entry['child'])) { + $entry['child'] = []; + } + $found = _riverlea_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item); + } + } + return $found; + } +} + +/** + * (Delegated) Implements hook_civicrm_navigationMenu(). + */ +function _riverlea_civix_navigationMenu(&$nodes) { + if (!is_callable(['CRM_Core_BAO_Navigation', 'fixNavigationMenu'])) { + _riverlea_civix_fixNavigationMenu($nodes); + } +} + +/** + * Given a navigation menu, generate navIDs for any items which are + * missing them. + */ +function _riverlea_civix_fixNavigationMenu(&$nodes) { + $maxNavID = 1; + array_walk_recursive($nodes, function($item, $key) use (&$maxNavID) { + if ($key === 'navID') { + $maxNavID = max($maxNavID, $item); + } + }); + _riverlea_civix_fixNavigationMenuItems($nodes, $maxNavID, NULL); +} + +function _riverlea_civix_fixNavigationMenuItems(&$nodes, &$maxNavID, $parentID) { + $origKeys = array_keys($nodes); + foreach ($origKeys as $origKey) { + if (!isset($nodes[$origKey]['attributes']['parentID']) && $parentID !== NULL) { + $nodes[$origKey]['attributes']['parentID'] = $parentID; + } + // If no navID, then assign navID and fix key. + if (!isset($nodes[$origKey]['attributes']['navID'])) { + $newKey = ++$maxNavID; + $nodes[$origKey]['attributes']['navID'] = $newKey; + $nodes[$newKey] = $nodes[$origKey]; + unset($nodes[$origKey]); + $origKey = $newKey; + } + if (isset($nodes[$origKey]['child']) && is_array($nodes[$origKey]['child'])) { + _riverlea_civix_fixNavigationMenuItems($nodes[$origKey]['child'], $maxNavID, $nodes[$origKey]['attributes']['navID']); + } + } +} diff --git a/civicrm/ext/riverlea/riverlea.php b/civicrm/ext/riverlea/riverlea.php new file mode 100755 index 0000000000..f126e288c6 --- /dev/null +++ b/civicrm/ext/riverlea/riverlea.php @@ -0,0 +1,101 @@ +<?php + +require_once 'riverlea.civix.php'; +use CRM_riverlea_ExtensionUtil as E; + +/** + * Supports multiple theme variations/streams. + */ +function riverlea_civicrm_themes(&$themes) { + $themes['minetta'] = array( + 'ext' => 'riverlea', + 'title' => 'Minetta (RiverLea ~Greenwich)', + 'prefix' => 'streams/minetta/', + 'search_order' => array('minetta', '_riverlea_core_', '_fallback_'), + ); + $themes['walbrook'] = array( + 'ext' => 'riverlea', + 'title' => 'Walbrook (RiverLea ~Shoreditch/Island)', + 'prefix' => 'streams/walbrook/', + 'search_order' => array('walbrook', '_riverlea_core_', '_fallback_'), + ); + $themes['hackneybrook'] = array( + 'ext' => 'riverlea', + 'title' => 'Hackney Brook (RiverLea ~Finsbury Park)', + 'prefix' => 'streams/hackneybrook/', + 'search_order' => array('hackneybrook', '_riverlea_core_', '_fallback_'), + ); + $themes['thames'] = array( + 'ext' => 'riverlea', + 'title' => 'Thames (RiverLea ~Aah)', + 'prefix' => 'streams/thames/', + 'search_order' => array('thames', '_riverlea_core_', '_fallback_'), + ); + $themes['_riverlea_core_'] = array( + 'ext' => 'riverlea', + 'title' => 'Riverlea: base theme', + 'prefix' => 'core/', + 'search_order' => array('_riverlea_core_', '_fallback_'), + ); +} + +/** + * Check if current active theme is a Riverlea theme + * @return bool + */ +function _riverlea_is_active() { + $themeKey = Civi::service('themes')->getActiveThemeKey(); + $themeExt = Civi::service('themes')->get($themeKey)['ext']; + return ($themeExt === 'riverlea'); +} + +function riverlea_civicrm_config(&$config) { + _riverlea_civix_civicrm_config($config); +} + +/** + * Implements hook_civicrm_alterBundle(). + * + * Add Bootstrap JS. + */ +function riverlea_civicrm_alterBundle(CRM_Core_Resources_Bundle $bundle) { + if (!_riverlea_is_active()) { + return; + } + + if ($bundle->name === 'bootstrap3') { + $bundle->clear(); + $bundle->addStyleFile('riverlea', 'core/css/_bootstrap.css'); + $bundle->addScriptFile('greenwich', 'extern/bootstrap3/assets/javascripts/bootstrap.min.js', [ + 'translate' => FALSE, + ]); + $bundle->addScriptFile('greenwich', 'js/noConflict.js', [ + 'translate' => FALSE, + ]); + } + if ($bundle->name === 'coreResources') { + // get DynamicCss asset + $bundle->addStyleUrl(\Civi::service('asset_builder')->getUrl( + \Civi\riverlea\DynamicCss::CSS_FILE, + \Civi\riverlea\DynamicCss::getCssParams() + )); + } +} + +/** + * Implements hook_civicrm_install(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install + */ +function riverlea_civicrm_install() { + _riverlea_civix_civicrm_install(); +} + +/** + * Implements hook_civicrm_enable(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable + */ +function riverlea_civicrm_enable() { + _riverlea_civix_civicrm_enable(); +} diff --git a/civicrm/ext/riverlea/settings/riverlea.setting.php b/civicrm/ext/riverlea/settings/riverlea.setting.php new file mode 100644 index 0000000000..038c3134ad --- /dev/null +++ b/civicrm/ext/riverlea/settings/riverlea.setting.php @@ -0,0 +1,50 @@ +<?php + +use CRM_riverlea_ExtensionUtil as E; + +return [ + 'riverlea_dark_mode_backend' => [ + 'name' => 'riverlea_dark_mode_backend', + 'group' => 'riverlea', + 'type' => 'String', + 'default' => 'inherit', + 'html_type' => 'select', + 'add' => 1.0, + 'title' => E::ts('Backend Dark Mode Control'), + 'is_domain' => 1, + 'is_contact' => 0, + 'description' => E::ts('Control whether and how dark mode can be activated on backend pages (for supported Riverlea themes only)'), + 'options' => [ + 'inherit' => E::ts('Inherit from browser/OS'), + 'light' => E::ts('Always use light mode'), + 'dark' => E::ts('Always use dark mode'), + ], + 'settings_pages' => [ + 'riverlea' => ['weight' => 100], + // show alongside backend theme selector on Display settings page + 'display' => ['weight' => 900], + ], + ], + 'riverlea_dark_mode_frontend' => [ + 'name' => 'riverlea_dark_mode_frontend', + 'group' => 'riverlea', + 'type' => 'String', + 'default' => 'inherit', + 'html_type' => 'select', + 'add' => 1.0, + 'title' => E::ts('Frontend Dark Mode Control'), + 'is_domain' => 1, + 'is_contact' => 0, + 'description' => E::ts('Control whether and how dark mode can be activated on frontend pages (for supported Riverlea themes only)'), + 'options' => [ + 'inherit' => E::ts('Inherit from browser/OS'), + 'light' => E::ts('Always use light mode'), + 'dark' => E::ts('Always use dark mode'), + ], + 'settings_pages' => [ + 'riverlea' => ['weight' => 110], + // show alongside frontend theme selector on Display settings page + 'display' => ['weight' => 950], + ], + ], +]; diff --git a/civicrm/ext/riverlea/streams/empty/css/_dark.css b/civicrm/ext/riverlea/streams/empty/css/_dark.css new file mode 100644 index 0000000000..e1cf0c2bf3 --- /dev/null +++ b/civicrm/ext/riverlea/streams/empty/css/_dark.css @@ -0,0 +1,63 @@ +/* Empty dark mode settings */ +:root { + --crm-c-text: #fff; + --crm-c-link: var(--crm-c-teal); + --crm-c-link-hover: var(--crm-c-yellow); + --crm-c-text-light: var(--crm-c-darkest); + --crm-c-background: var(--crm-c-gray-900); + --crm-c-page-background: var(--crm-c-gray-900); + --crm-c-background2: var(--crm-c-gray-800); + --crm-c-background3: var(--crm-c-gray-700); + --crm-c-background4: var(--crm-c-gray-600); + --crm-c-code-background: var(--crm-c-gray-200); + --crm-c-success: #58a458; + --crm-red-alert: #b24b4f; + --crm-c-alert: #ff899a; + --crm-blue-info: #2c99a4; + --crm-c-green-light: #468847; + --crm-c-green: #55aa57; + --crm-c-green-dark: #dff0d8; + --crm-c-gray-700: #535252; + --crm-c-gray-600: #67676a; + --crm-c-gray-500: #6c6c6c; + --crm-c-divider: 1px solid var(--crm-c-gray-500); + /* And others */ + --crm-block-shadow: 0; + --crm-popup-shadow: 0 3px 18px 0 rgb(0,0,0); + --crm-heading-bg: var(--crm-c-blue-dark); + --crm-dashlet-bg: var(--crm-c-background2); + --crm-dashlet-header-bg: var(--crm-c-background3); + --crm-expand-header-bg: var(--crm-c-background4); + --crm-expand-body-bg: var(--crm-c-background3); + --crm-dash-header-bg: transparent; + --crm-dash-block-bg: var(--crm-c-background2); + --crm-dash-label-bg: transparent; + --crm-dash-panel-bg: var(--crm-c-background3); + --crm-dropdown-bg: var(--crm-c-background); + --crm-dropdown-2-bg: var(--crm-c-background); + --crm-tabs-border: 1px solid var(--crm-c-gray-500); + --crm-tabs-bg: var(--crm-c-background3); + --crm-table-outside-border: 1px solid var(--crm-c-gray-500); + --crm-table-row-border: 1px solid var(--crm-c-gray-500); + --crm-panel-border-col: var(--crm-c-gray-500); + --crm-input-border-color: var(--crm-c-gray-500); + --crm-table-odd-row: var(--crm-c-gray-800); + --crm-table-odd-hover: var(--crm-c-gray-700); + --crm-table-even-row: var(--crm-c-gray-700); + --crm-table-even-hover: var(--crm-c-gray-600); + --crm-alert-text-help: var(--crm-c-text-light); + --crm-alert-text-warning: var(--crm-c-text-light); + --crm-alert-background-info: var(--crm-c-blue-dark); + --crm-alert-text-info: var(--crm-c-blue-light); + --crm-c-inactive: var(--crm-c-gray-400); + --crm-input-color: var(--crm-c-text); + --crm-input-description: var(--crm-c-gray-300); + --crm-checkbox-list-col: var(--crm-c-text-light); + --crm-alert-text-help: var(--crm-c-text); + --crm-dialog-header-border-col: transparent; + --crm-dialog-header-bg: var(--crm-c-background2); + --crm-dialog-body-bg: var(--crm-c-background2); + --crm-notify-background: var(--crm-c-darkest); + --crm-wizard-active-bg: var(--crm-c-dark-teal); + --crm-form-block-background: var(--crm-c-background2); +} diff --git a/civicrm/ext/riverlea/streams/empty/css/_variables.css b/civicrm/ext/riverlea/streams/empty/css/_variables.css new file mode 100644 index 0000000000..7324d49d6f --- /dev/null +++ b/civicrm/ext/riverlea/streams/empty/css/_variables.css @@ -0,0 +1,431 @@ +/* + Name: Empty stream; + Description: duplicate this to create a new stream; + Riverlea version: 1.1.0; +*/ + +:root { + --crm-version: 'Empty, v' var(--crm-release); +/* Fonts * +--crm-system-fonts:; +--crm-font:; +--crm-font-bold:; +--crm-font-italic:; +--crm-font-bold-italic:; +/* Colour names * +--crm-c-darkest: #0a0a0a; +--crm-c-gray-900: #2f2f2e; +--crm-c-gray-800: #3e3e3e; +--crm-c-gray-700: #696969; +--crm-c-gray-600: #828388; +--crm-c-gray-500: #919297; +--crm-c-gray-400: #adaeb3; +--crm-c-gray-300: #c2c0c0; +--crm-c-gray-200: #d5d5d5; +--crm-c-gray-100: #e2e1e1; +--crm-c-gray-050: #eaeaea; +--crm-c-gray-025: #fbfafa; +--crm-c-blue: #bce8f1; +--crm-c-blue-light: #d9edf7; +--crm-c-blue-dark: #297292; +--crm-c-blue-darker: #215c76; +--crm-c-purple: #4d4d69; +--crm-c-purple-dark: #3e3e54; +--crm-c-green: #d6e9c6; +--crm-c-green-light: #dff0d8; +--crm-c-green-dark: #468847; +--crm-c-red: #eed3d7; +--crm-c-red-light: #f2dede; +--crm-c-red-dark: #b94a48 ; +--crm-c-amber: #dd5600; +--crm-c-amber-light: #fbf0e2; +--crm-c-yellow: #fcfc5a; +--crm-c-yellow-light: #ffffcc; +--crm-c-yellow-less-light: #fffdb2; +--crm-c-teal: #63c4b9; +--crm-c-dark-teal: #3e8079; +/* Practical colours * +--crm-c-text: #464354; +--crm-c-light-text: #fff; +--crm-c-dark-text: var(--crm-c-text); +--crm-c-link: var(--crm-c-blue-dark); +--crm-c-link-hover: var(--crm-c-blue-darker); +--crm-c-divider: 1px solid var(--crm-c-gray-300); +--crm-c-page-background: #fff; /* background to page body * +--crm-c-background: #f4f4ed; /* background to page header, often form block & dialog bg * +--crm-c-background2: var(--crm-c-gray-050); /* 2-5 = progressively darker backgrounds * +--crm-c-background3: var(--crm-c-gray-100); +--crm-c-background4: var(--crm-c-gray-200); +--crm-c-background5: var(--crm-c-gray-700); +--crm-c-drag-background: var(--crm-c-background3); /* background for drag/drop regions, select2 highlight * +--crm-c-code-background: var(--crm-c-background2); /* background for code regions * +--crm-c-primary: var(--crm-c-gray-700); +--crm-c-primary-hover: var(--crm-c-gray-800); +--crm-c-primary-text: var(--crm-c-light-text); +--crm-c-primary-hover-text: var(--crm-c-light-text); +--crm-c-secondary: #5d677b; +--crm-c-secondary-hover: #3e485b; +--crm-c-secondary-text: var(--crm-c-light-text); +--crm-c-secondary-hover-text: var(--crm-c-light-text); +--crm-c-success: var(--crm-c-green-dark); +--crm-c-success-text: var(--crm-c-light-text); +--crm-c-alert: var(--crm-c-red-dark); +--crm-c-alert-text: var(--crm-c-light-text); +--crm-c-warning: var(--crm-c-amber); +--crm-c-warning-text: var(--crm-c-light-text); +--crm-c-info: var(--crm-c-blue-dark); +--crm-c-info-text: var(--crm-c-light-text); +--crm-c-focus: var(--crm-c-blue-dark); +--crm-c-inactive: #696969; +/* Shadows * +--crm-block-shadow:; +--crm-popup-shadow: 0 3px 18px 0 rgba(48,40,40,.25); +--crm-bottom-shadow: 0 0 16px 1px rgba(0,0,0,.1); +--crm-body-inset:; +/* Sizes * +--crm-roundness: 0.25rem; +--crm-xs: 0.1rem; +--crm-xs1: 0.125rem; +--crm-xs2: 0.15rem; +--crm-s: 0.25rem; +--crm-s1: 0.275rem; +--crm-s2: 0.325rem; +--crm-s3: 0.375rem; +--crm-m: 0.5rem; +--crm-m1: 0.625rem; +--crm-m2: 0.75rem; +--crm-m3: 0.875rem; +--crm-r: 1rem; +--crm-r1: 1.125rem; +--crm-r2: 1.25rem; +--crm-r3: 1.375rem; +--crm-r4: 1.5rem; +--crm-l: 2rem; +--crm-xl: 3rem; +--crm-xxl: 4rem; +--crm-big-input: 15em; +--crm-huge-input: 25em; +--crm-padding-reg: var(--crm-r); +--crm-padding-small: var(--crm-s); +--crm-padding-inset: var(--crm-m); +--crm-page-padding: var(--crm-xl); /* Margin left/right * +--crm-page-width: 100%; /* Default that CMS can overwrite * +--crm-flex-gap: 0.5rem; +/* Type * +--crm-font-size: var(--crm-r); +--crm-small-font-size: var(--crm-m2); +--crm-type-line-height: 1.5; +--crm-link-decoration: none; +--crm-link-decoration-hover: underline; +--crm-heading-bg: var(--crm-c-blue-light); +--crm-heading-col: var(--crm-c-text); +--crm-heading-padding: var(--crm-s1) var(--crm-m1); +--crm-heading-margin: var(--crm-m) 0; +--crm-heading-radius: var(--crm-roundness); +/* Mouse events * +--crm-hover-clickable: pointer; +/* Buttons * +--crm-btn-box-shadow: none; +--crm-btn-border: 0 solid transparent; +--crm-btn-txt-transform: inherit; +--crm-btn-radius: 3px; +--crm-btn-padding-block: var(--crm-xs1); /* padding for top and bottom, one value * +--crm-btn-padding-inline: var(--crm-m1); /* padding for left and right, one value * +--crm-btn-small-padding: var(--crm-xs) var(--crm-s); +--crm-btn-large-padding: var(--crm-m) var(--crm-r); +--crm-btn-align: center; +--crm-btn-height: 28px; +--crm-btn-icon-spacing: var(--crm-s); +--crm-btn-icon-size: auto; +--crm-btn-cancel-bg: var(--crm-c-alert); +--crm-btn-cancel-text: var(--crm-c-alert-text); +--crm-btn-info-bg: var(--crm-c-info); +--crm-btn-info-text: var(--crm-c-info-text); +--crm-btn-warning-bg: var(--crm-c-warning); +--crm-btn-warning-text: var(--crm-c-warning-text); +--crm-btn-success-bg: var(--crm-c-success); +--crm-btn-success-text: var(--crm-c-success-text); +--crm-btn-alert-bg: var(--crm-c-alert); +--crm-btn-alert-text: var(--crm-c-alert-text); +--crm-btn-icon-bg: ; /* btn-icon-* supports distinct border/bg for icons. If applied, set btn-icon-padding to 0px to make the icon bg stretch to the button * +--crm-btn-icon-border: ; +--crm-btn-icon-padding: var(--crm-btn-padding-block); +--crm-btn-margin: 0; /* used to add padding block between multiple stacked buttons */ +/* Tables * +--crm-table-outside-border: 1px solid var(--crm-c-background3); +--crm-table-background: var(--crm-c-page-background); +--crm-table-row-border: var(--crm-c-divider); +--crm-table-column-border: 0 solid transparent; +--crm-table-font-size: var(--crm-font-size); +--crm-table-padding: var(--crm-m); +--crm-table-header-border: 1px solid transparent; +--crm-table-header-bottom: 2px solid var(--crm-c-gray-300); +--crm-table-header-bg: var(--crm-c-page-background); +--crm-table-header-col: var(--crm-c-text); +--crm-table-header-txt: inherit; +--crm-table-even-row: var(--crm-c-background2); +--crm-table-even-hover: var(--crm-c-yellow-less-light); +--crm-table-odd-row: var(--crm-c-gray-025); +--crm-table-odd-hover: var(--crm-c-yellow-light); +--crm-table-sort-col: var(--crm-c-gray-300); +--crm-table-sort-float: left; /* 'left', 'right' or 'none' * +--crm-table-sort-active-col: var(--crm-c-link); +--crm-table-compressed-width: auto; +--crm-table-nested-padding: var(--crm-r) var(--crm-m); +--crm-table-nested-head-border: 0 solid transparent; +--crm-table-nested-border: var(--crm-c-divider); +--crm-table-inset-bg: var(--crm-c-background3); +/* Panels * +--crm-panel-shadow: var(--crm-block-shadow); +--crm-panel-background: var(--crm-c-page-background); +--crm-panel-border: var(--crm-c-divider); +--crm-panel-head-margin: 0px; +/* Accordions * +--crm-expand-icon: "\f0da"; /* unicode value for FontAwesome icon * +--crm-expand-icon-color: var(--text); +--crm-expand-icon-spacing: var(--crm-m); +--crm-expand-transform: rotate(90deg); +--crm-expand-transition: transform .3s; +--crm-expand-radius: var(--crm-roundness); +--crm-expand-gap: var(--crm-xs2) 0 0; /* space between multiple accordions */ +/* .crm-accordion-bold * +--crm-expand-header-bg: var(--crm-c-secondary); +--crm-expand-header-bg-active: var(--crm-c-gray-900); +--crm-expand-header-color: var(--crm-c-light-text); +--crm-expand-header-padding: var(--crm-s) var(--crm-m); +--crm-expand-header-weight: bold; +--crm-expand-header-font: var(--crm-font-bold); +--crm-expand-header-border: var(--crm-c-divider); +--crm-expand-header-border-width: 0 0 1px 0; +--crm-expand-border: var(--crm-c-divider); +--crm-expand-border-width: 0 1px 1px 1px; +--crm-expand-body-bg:; +--crm-expand-body-box-shadow:; +--crm-expand-body-padding: var(--crm-padding-reg); +/* .crm-accordion-light * +--crm-expand2-header-bg:; +--crm-expand2-header-bg-active: var(--crm-c-background-2); +--crm-expand2-header-weight: normal; +--crm-expand2-header-font:; +--crm-expand2-header-color: var(--crm-c-text); +--crm-expand2-header-border:; +--crm-expand2-header-border-width: ; +--crm-expand2-header-padding: var(--crm-s) var(--crm-m); +--crm-expand2-border:; +--crm-expand2-border-width:; +--crm-expand2-body-bg:; +--crm-expand2-body-padding: var(--crm-s); +/* Alerts * +--crm-alert-padding: var(--crm-m) var(--crm-m2); +--crm-alert-margin: 0 0 var(--crm-m); +--crm-alert-border-width: 1px; +--crm-alert-background-help: var(--crm-c-green-light); +--crm-alert-border-help: var(--crm-c-green); +--crm-alert-text-help: var(--crm-c-green-dark); +--crm-alert-background-warning: var(--crm-c-yellow-light); +--crm-alert-border-warning: var(--crm-c-yellow); +--crm-alert-text-warning: var(--crm-c-text); +--crm-alert-background-info: var(--crm-c-blue-light); +--crm-alert-border-info: var(--crm-c-blue); +--crm-alert-text-info: var(--crm-c-blue-dark); +--crm-alert-background-danger: var(--crm-c-red-light); +--crm-alert-border-danger: var(--crm-c-red); +--crm-alert-text-danger: var(--crm-c-red-dark); +/* Form * +--crm-form-block-box-shadow: var(--crm-block-shadow); +--crm-form-block-background: var(--crm-c-background); +--crm-form-block-padding: var(--crm-m); +--crm-form-block-border-radius: var(--crm-roundness); +--crm-input-background: var(--crm-c-page-background); +--crm-input-background-image: linear-gradient(top, #eee 1%, #fff 15%); +--crm-input-color: var(--crm-c-text); +--crm-input-border-color: var(--crm-c-gray-400); +--crm-input-border-radius: 3px; +--crm-input-active-ani: border-color .15s ease-in-out 0s; +--crm-input-box-shadow: inset 0 1px 2px 0 rgba(0,0,0,.1); +--crm-input-padding: var(--crm-xs1) var(--crm-s2); +--crm-input-padding-large: var(--crm-s) var(--crm-m1); +--crm-input-height: var(--crm-l); +--crm-input-font-size: var(--crm-m3); +--crm-input-label-weight: bold; +--crm-input-label-font: var(--crm-font); +--crm-input-label-size: var(--crm-font-size); +--crm-input-label-width: var(--crm-big-input); +--crm-input-label-align: right; +--crm-input-label-color: var(--crm-c-text); +--crm-input-description: var(--crm-c-gray-700); +--crm-input-dropdown-icon: "\f107"; +--crm-input-radio-color: var(--crm-c-focus); +--crm-form-select-bg: var(--crm-c-background2); +--crm-inline-edit-border: 0 solid transparent; +--crm-inline-edit-bg: var(--crm-c-background); +--crm-fieldset-border-color: var(--crm-c-gray-400); +--crm-fieldset-border: 1px 0 0 0; +--crm-fieldset-padding: var(--crm-padding-reg) var(--crm-padding-small); +--crm-checkbox-list-col: var(--crm-c-text); +/* Tabs * +--crm-tabs-bg: var(--crm-c-background4); +--crm-tabs-padding: var(--crm-s); +--crm-tabs-border: var(--crm-dash-border); +--crm-tabs-radius: var(--crm-roundness); +--crm-tabs-gap: var(--crm-s); +--crm-tab-bg: var(--crm-c-background2); +--crm-tab-bg-hover: var(--crm-c-background); +--crm-tab-bg-active: var(--crm-c-background); +--crm-tab-hang: 0; /* lip to extend tab flush with active region - set to 0 for no lip * +--crm-tab-padding: var(--crm-s3) var(--crm-m) var(--crm-s) var(--crm-m); +--crm-tab-col: var(--crm-c-text); +--crm-tab-weight: normal; +--crm-tab-font:; +--crm-tab-count-bg: var(--crm-c-info-text); +--crm-tab-count-col: var(--crm-c-info); +--crm-tab-roundness: var(--crm-roundness); +--crm-tab-border: var(--crm-c-divider); +--crm-tab-border-width: 0; +--crm-tab-border-active: 0 solid transparent; +/* Contact dashboard * +--crm-dash-border: var(--crm-tab-border); +--crm-dash-roundness: var(--crm-roundness); +--crm-dash-direction: flex; /* choose 'flex' for tabs at top, or 'grid' for tabs at side * +--crm-side-tabs-width: ; +--crm-dash-tabs-flow: row; /* choose 'row' for tabs at top, or 'column' for tabs at side * +--crm-dash-tabs-gap: var(--crm-tabs-gap); +--crm-dash-tabs-bg: var(--crm-tabs-bg); +--crm-dash-tabs-padding: var(--crm-tabs-padding); +--crm-dash-tabs-roundness: var(--crm-dash-roundness) var(--crm-dash-roundness) 0 0; +--crm-dash-tab-bg: var(--crm-tab-bg); +--crm-dash-tab-bg-hover: var(--crm-tab-bg-hover); +--crm-dash-tab-padding: var(--crm-s3) var(--crm-m2); +--crm-dash-tab-border: 0 solid transparent; +--crm-dash-tab-border-hover: 0 solid transparent; +--crm-dash-tab-border-width: 0; /* to remove border on one side for hanging tabs * +--crm-dash-tab-col: var(--crm-tab-col); +--crm-dash-tab-count-bg: rgba(0,0,0,0.1); +--crm-dash-tab-count-col: var(--crm-c-text); +--crm-dash-tab-width: 100%; +--crm-dash-tab-align: none; +--crm-dash-tab-hang: 0; /* lip to extend tab flush with active region - set to 0 for no lip * +--crm-dash-tab-radius: var(--crm-dash-roundness); +--crm-dash-icon-size: var(--crm-r); +--crm-dash-summary-row-bg: var(--crm-c-background); +--crm-dash-box-shadow: 0; +--crm-dash-heading-inset: ; +--crm-dash-panel-padding: var(--crm-m); +--crm-dash-panel-bg: #fff; +--crm-dash-panel-border: 0; +--crm-dash-panel-radius: 0 0 var(--crm-dash-roundness) var(--crm-dash-roundness); +--crm-dash-edit-border: 2px dashed var(--crm-c-gray-300); +--crm-dash-block-padding: 0; +--crm-dash-block-bg: ; +--crm-dash-block-radius: var(--crm-roundness); +--crm-dash-label-bg: var(--crm-c-background2); +--crm-dash-header-bg: var(--crm-c-page-background); +--crm-dash-header-bg2: transparent; +--crm-dash-header-col: var(--crm-c-text); +--crm-dash-header-size: var(--crm-r3); +--crm-dash-header-padding: 0 0 var(--crm-r) 0; +--crm-dash-image-size: 100px; +--crm-dash-image-radius: 0; +--crm-dash-image-right: 10px; /* distance from right of dashboard * +--crm-dash-image-top: unset; /* distance from top of dashboard * +--crm-dash-image-border: 0; +/* Dialog * +--crm-dialog-bg: var(--crm-c-page-background); +--crm-dialog-padding: var(--crm-s); +--crm-dialog-radius: var(--crm-roundness); +--crm-dialog-line:; +--crm-dialog-inner-shadow: var(--crm-bottom-shadow); +--crm-dialog-header-bg: var(--crm-c-secondary); +--crm-dialog-header-col: var(--crm-c-light-text); +--crm-dialog-header-size: var(--crm-r1); +--crm-dialog-header-padding: var(--crm-m1) var(--crm-r); +--crm-dialog-header-radius: var(--crm-dialog-radius); +--crm-dialog-header-border-col: transparent transparent var(--crm-c-gray-300) transparent; /* set a border color for each side of the header * +--crm-dialog-body-bg: var(--crm-c-background); +--crm-dialog-body-padding: var(--crm-m); +/* Dashlet * +--crm-dashlet-border:; +--crm-dashlet-bg: var(--crm-c-page-background); +--crm-dashlet-padding: var(--crm-s2); +--crm-dashlet-box-shadow: var(--crm-popup-shadow); +--crm-dashlet-dashlets-bg: var(--crm-c-background); +--crm-dashlet-header-bg: var(--crm-expand-header-bg); +--crm-dashlet-header-col: var(--crm-expand-header-color); +--crm-dashlet-header-border:; +--crm-dashlet-header-border-width:; +--crm-dashlet-header-font-size: var(--crm-font-size); +--crm-dashlet-header-padding: var(--crm-s); +--crm-dashlet-content-padding: var(--crm-dashlet-padding) 0; +--crm-dashlet-tabs-border:0; +--crm-dashlet-radius: var(--crm-roundness); +/* Button dropdowns * +--crm-dropdown-padding: var(--crm-s); +--crm-dropdown-radius: var(--crm-roundness); +--crm-dropdown-bg: var(--crm-c-secondary-hover); +--crm-dropdown-col: var(--crm-c-light-text); +--crm-dropdown-hover: var(--crm-c-text); +--crm-dropdown-hover-bg: var(--crm-c-page-background); +--crm-dropdown-border: 0; +--crm-dropdown-width: 180px; +--crm-dropdown-alert-bg: var(--crm-c-alert); /* for delete links in dropdowns * +--crm-dropdown-2-bg: var(--crm-c-secondary); +--crm-dropdown-2-col: var(--crm-c-text); +--crm-dropdown-2-padding: var(--crm-padding-small); +/* Notifications * +--crm-notify-background: rgba(0,0,0,0.85); +--crm-notify-padding: var(--crm-m2); +--crm-notify-col: var(--crm-c-light-text); +--crm-notify-accent-border: 2px 0 0 0; /* adds a border to one/several sides of the notification - set to 0 for none * +--crm-notify-radius: var(--crm-roundness); +/* Icons * +--crm-icon-alert: "\f06a"; +--crm-icon-success: "\f058"; +--crm-icon-info: "\f05a"; +--crm-icon-close: "\f00d"; +--crm-icon-sort: "\f0dc"; +--crm-icon-sort-desc: "\f0dd"; +--crm-icon-sort-asc: "\f0de"; +--crm-icon-alert-color: inherit; +--crm-icon-success-color: inherit; +--crm-icon-warning-color: inherit; +--crm-icon-info-color: inherit; +/* Wizard * +--crm-wizard-width: fit-content; +--crm-wizard-margin: 0.5rem auto; +--crm-wizard-height: 30px; +--crm-wizard-radius: var(--crm-l); +--crm-wizard-angle: 0px; +--crm-wizard-active-col: var(--crm-c-light-text); +--crm-wizard-active-bg: var(--crm-c-link); +--crm-wizard-border: var(--crm-c-divider); +--crm-wizard-bg: var(--crm-c-page-background); +/* Alpha filter * +--crm-filter-bg: var(--crm-c-blue-light); +--crm-filter-padding: var(--crm-m); +--crm-filter-item-bg: #fafafa; +--crm-filter-item-shadow: 0px 0px 3px rgba(0,0,0,0.1); +--crm-filter-spacing: start; /* choose 'space-between' to spread out evenly, or 'end' to right align. */ +/* Frontend * +--crm-f-form-width:; +--crm-f-box-shadow: var(--crm-block-shadow); +--crm-f-fieldset-bg: var(--crm-c-background); +--crm-f-fieldset-padding: var(--crm-r); +--crm-f-fieldset-margin: 0 0 var(--crm-padding-reg) 0; +--crm-f-fieldset-border: 0; +--crm-f-legend-align: center; +--crm-f-legend-size: var(--crm-r3); +--crm-f-form-padding: var(--crm-padding-reg); +--crm-f-form-layout: block; /* 'grid' = inline, 'block' = stacked * +--crm-f-label-position: ; +--crm-f-label-align: left; +--crm-f-label-width: 200px; +--crm-f-label-weight: bold; +--crm-f-input-radius: var(--crm-roundness); +--crm-f-input-padding: var(--crm-r2) var(--crm-m2); +--crm-f-input-font-size: var(--crm-r1); +--crm-f-input-width: 300px; +--crm-f-form-focus-bg: var(--crm-c-green); +--crm-f-form-error-bg: var(--crm-c-red); +--crm-f-logo-height: 40px; +--crm-f-logo-align: center; /* left, right or center */ +} diff --git a/civicrm/ext/riverlea/streams/hackneybrook/css/_dark.css b/civicrm/ext/riverlea/streams/hackneybrook/css/_dark.css new file mode 100644 index 0000000000..e7af4b10a4 --- /dev/null +++ b/civicrm/ext/riverlea/streams/hackneybrook/css/_dark.css @@ -0,0 +1,70 @@ +/* HackneyBrook dark mode settings */ +:root { + --crm-c-text: #fff; + --crm-c-link: var(--crm-c-teal); + --crm-c-link-hover: var(--crm-c-yellow); + --crm-c-text-light: var(--crm-c-darkest); + --crm-c-background: var(--crm-c-darkest); + --crm-c-page-background: var(--crm-c-gray-900); + --crm-c-background2: var(--crm-c-gray-800); + --crm-c-background3: var(--crm-c-gray-700); + --crm-c-background4: var(--crm-c-gray-600); + --crm-c-code-background: var(--crm-c-gray-200); + --crm-c-primary: var(--crm-c-gray-800); + --crm-c-secondary: var(--crm-c-gray-800); + --crm-c-primary-hover: var(--crm-c-gray-900); + --crm-c-secondary-hover: var(--crm-c-gray-900); + --crm-c-success: #58a458; + --crm-c-alert: #ff899a; + --crm-c-info: #2c99a4; + --crm-c-teal: #28ae9f; + --crm-c-green-light: #468847; + --crm-c-green: #55aa57; + --crm-c-green-dark: #dff0d8; + --crm-c-gray-700: #535252; + --crm-c-gray-600: #67676a; + --crm-c-gray-500: #6c6c6c; + --crm-c-divider: 1px solid var(--crm-c-gray-500); + /* And others */ + --crm-c-focus: var(--crm-c-amber); + --crm-btn-icon-bg: var(--crm-c-gray-700); + --crm-block-shadow: 0; + --crm-popup-shadow: 0 3px 18px 0 rgb(0,0,0); + --crm-heading-bg: var(--crm-c-blue-dark); + --crm-dashlet-bg: var(--crm-c-background2); + --crm-dashlet-header-bg: var(--crm-c-background3); + --crm-expand-header-bg: var(--crm-c-background4); + --crm-expand-header-bg-active: var(--crm-c-background5); + --crm-expand-body-bg: var(--crm-c-background3); + --crm-expand-body-border: 0; + --crm-dash-header-bg: transparent; + --crm-dash-block-bg: var(--crm-c-background2); + --crm-dash-label-bg: transparent; + --crm-dash-tabs-bg: transparent; + --crm-dash-panel-bg: var(--crm-c-background2); + --crm-dash-tab-bg-hover: var(--crm-c-background2); + --crm-dropdown-bg: var(--crm-c-background); + --crm-dropdown-2-bg: var(--crm-c-background); + --crm-tabs-bg: var(--crm-c-background3); + --crm-panel-border-col: var(--crm-c-gray-500); + --crm-input-border-color: var(--crm-c-gray-500); + --crm-table-odd-row: var(--crm-c-gray-800); + --crm-table-odd-hover: var(--crm-c-gray-700); + --crm-table-even-row: var(--crm-c-gray-700); + --crm-table-even-hover: var(--crm-c-gray-600); + --crm-alert-text-help: var(--crm-c-text-light); + --crm-alert-text-warning: var(--crm-c-text-light); + --crm-alert-background-info: var(--crm-c-blue-dark); + --crm-alert-text-info: var(--crm-c-blue-light); + --crm-c-inactive: var(--crm-c-gray-400); + --crm-input-color: var(--crm-c-text); + --crm-input-description: var(--crm-c-gray-300); + --crm-checkbox-list-col: var(--crm-c-text-light); + --crm-alert-text-help: var(--crm-c-text); + --crm-dialog-header-border-col: transparent; + --crm-dialog-header-bg: var(--crm-c-background2); + --crm-dialog-body-bg: var(--crm-c-background2); + --crm-notify-background: var(--crm-c-darkest); + --crm-wizard-active-bg: var(--crm-c-dark-teal); + --crm-form-block-background: var(--crm-c-background2); +} diff --git a/civicrm/ext/riverlea/streams/hackneybrook/css/_variables.css b/civicrm/ext/riverlea/streams/hackneybrook/css/_variables.css new file mode 100644 index 0000000000..b2229598c2 --- /dev/null +++ b/civicrm/ext/riverlea/streams/hackneybrook/css/_variables.css @@ -0,0 +1,140 @@ +/* + Name: HackneyBrook; + Description: named after the Hackney Brook, a tributary of the River Lea that ran through Finsbury Park; + Riverlea version: 1.1.0; +*/ + +:root { + --crm-version: 'Hackney, v' var(--crm-release); + /* Fonts */ + --crm-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue",sans-serif; + /* Colour names */ + --crm-c-gray-025: #f9f9f9; + --crm-c-green-light: #cff0be; + --crm-c-green-dark: #46b450; + --crm-c-red-dark: #dc3232; + --crm-c-amber: #ffb900; + --crm-c-teal: #399389; + /* Practical colours */ + --crm-c-divider: 1px solid var(--crm-c-gray-200); + --crm-c-background: var(--crm-c-gray-025); /* background to page header, often form block & dialog bg */ + --crm-c-drag-background: var(--crm-c-background3); /* background for drag/drop regions, select2 highlight */ + --crm-c-primary: var(--crm-c-gray-025); + --crm-c-primary-hover: var(--crm-c-gray-050); + --crm-c-primary-text: var(--crm-c-text); + --crm-c-primary-hover-text: var(--crm-c-text); + --crm-c-secondary: var(--crm-c-gray-025); + --crm-c-secondary-hover: var(--crm-c-gray-050); + --crm-c-secondary-text: var(--crm-c-text); + --crm-c-secondary-hover-text: var(--crm-c-text); + --crm-c-info: var(--crm-c-blue-darker); + /* Type */ + --crm-heading-padding: var(--crm-s2) var(--crm-m2); + /* Buttons */ + --crm-btn-border: 1px solid var(--crm-c-gray-300); + --crm-btn-padding-block: 2px; /* padding for top and bottom, one value */ + --crm-btn-height: 31px; + --crm-btn-icon-spacing: var(--crm-m1); + --crm-btn-icon-size: var(--crm-btn-height); + --crm-btn-cancel-bg: var(--crm-c-primary); + --crm-btn-cancel-text: var(--crm-c-text); + --crm-btn-info-bg: var(--crm-c-primary); + --crm-btn-info-text: var(--crm-c-text); + --crm-btn-warning-bg: var(--crm-c-primary); + --crm-btn-warning-text: var(--crm-c-text); + --crm-btn-success-bg: var(--crm-c-primary); + --crm-btn-success-text: var(--crm-c-text); + --crm-btn-alert-bg: var(--crm-c-primary); + --crm-btn-alert-text: var(--crm-c-text); + --crm-btn-icon-bg: rgba(256,256,256,0.25); + --crm-btn-icon-border: var(--crm-btn-border); + --crm-btn-icon-padding: 0px; + /* Tables */ + --crm-table-outside-border: var(--crm-c-divider); + /* Accordions */ + /* .crm-accordion-bold */ + --crm-expand-header-bg: var(--crm-c-gray-200); + --crm-expand-header-bg-active: var(--crm-c-gray-300); + --crm-expand-header-color: var(--crm-c-text); + --crm-expand-header-border: 0 solid transparent; + /* Alerts */ + --crm-alert-padding: var(--crm-r); + --crm-alert-text-help: var(--crm-c-text); + --crm-alert-text-info: var(--crm-c-blue-darker); + /* Form */ + --crm-input-color: var(--crm-c-text); + --crm-input-border-color: var(--crm-c-gray-300); + --crm-input-box-shadow: 0; + --crm-input-label-weight: normal; + --crm-fieldset-border: 1px; + --crm-checkbox-list-col: var(--crm-c-text); + /* Tabs */ + --crm-tabs-border: var(--crm-c-divider); + --crm-tab-count-bg: var(--crm-c-blue-dark); + --crm-tab-count-col: var(--crm-c-light-text); + --crm-tab-border: 1px solid var(--crm-c-gray-400); + /* Contact dashboard */ + --crm-dash-border: 0; + --crm-dash-direction: grid; /* choose 'flex' for tabs at top, or 'grid' for tabs at side */ + --crm-side-tabs-width: 200px; + --crm-dash-tabs-flow: column; /* choose 'row' for tabs at top, or 'column' for tabs at side */ + --crm-dash-tabs-gap: var(--crm-m); + --crm-dash-tabs-bg: transparent; + --crm-dash-tabs-padding: var(--crm-r) 0; + --crm-dash-tab-bg: transparent; + --crm-dash-tab-bg-hover: var(--crm-c-background); + --crm-dash-tab-padding: var(--crm-m2) var(--crm-m1) var(--crm-m2) var(--crm-r); + --crm-dash-tab-border: 1px solid transparent; + --crm-dash-tab-border-hover: var(--crm-c-divider); + --crm-dash-tab-border-width: 1px 0 1px 1px; /* to remove border on one side for hanging tabs */ + --crm-dash-tab-width: auto; /* 100% to fill column width, auto to only cover contents */ + --crm-dash-tab-align: right; + --crm-dash-tab-hang: 0 -1px 0 0; /* lip to extend tab flush with active region - set to 0 for no lip */ + --crm-dash-tab-radius: var(--crm-dash-roundness) 0 0 var(--crm-dash-roundness); + --crm-dash-summary-row-bg: var(--crm-c-background3); + --crm-dash-heading-inset: var(--crm-side-tabs-width); + --crm-dash-panel-padding: var(--crm-r); + --crm-dash-panel-bg: var(--crm-c-background); + --crm-dash-panel-border: var(--crm-c-divider); + --crn-dash-panel-radius: var(--crm-dash-roundness); + --crm-dash-image-size: 100px; + --crm-dash-image-radius: 200px; + --crm-dash-image-right: 0; /* distance from right of dashboard */ + --crm-dash-image-top: -10px; /* distance from top of dashboard */ + --crm-dash-image-border: 0; + /* Dialog */ + --crm-dialog-header-bg: var(--crm-c-background4); + --crm-dialog-header-col: var(--crm-c-text); + --crm-dialog-header-size: var(--crm-r); + --crm-dialog-header-padding: var(--crm-s) var(--crm-m1) var(--crm-s) var(--crm-m2); + --crm-dialog-header-radius: var(--crm-dialog-radius) var(--crm-dialog-radius) 0 0; + --crm-dialog-body-bg: var(--crm-c-page-background); + --crm-dialog-body-padding: var(--crm-r); + /* Dashlet */ + --crm-dashlet-border: var(--crm-c-divider); + --crm-dashlet-padding: 0; + --crm-dashlet-content-padding: var(--crm-m); + --crm-dashlet-tabs-border: 3px solid #fff; + --crm-dashlet-radius: var(--crm-roundness) var(--crm-roundness) 0 0; + /* Button dropdowns */ + --crm-dropdown-bg: var(--crm-c-page-background); + --crm-dropdown-col: var(--crm-c-text); + --crm-dropdown-hover-bg: var(--crm-c-secondary-hover); + --crm-dropdown-border: var(--crm-btn-border); + --crm-dropdown-width: 180px; + --crm-dropdown-2-bg: var(--crm-c-background3); + /* Notifications */ + --crm-notify-background: rgb(0,0,0); + --crm-notify-padding: 10px 10px 15px 15px; + --crm-notify-accent-border: 0 0 0 4px; /* adds a border to one/several sides of the notification - set to 0 for none */ + --crm-notify-radius: 0; + /* Icons */ + --crm-icon-alert-color: var(--crm-c-alert); + --crm-icon-success-color: var(--crm-c-success); + --crm-icon-warning-color: var(--crm-c-warning); + --crm-icon-info-color: var(--crm-c-info); + /* Frontend */ + --crm-f-legend-align: unset; + --crm-f-legend-size: var(--crm-r2); + --crm-f-form-width: 50vw; +} diff --git a/civicrm/ext/riverlea/streams/minetta/css/_dark.css b/civicrm/ext/riverlea/streams/minetta/css/_dark.css new file mode 100644 index 0000000000..e19620ef23 --- /dev/null +++ b/civicrm/ext/riverlea/streams/minetta/css/_dark.css @@ -0,0 +1,63 @@ +/* Minetta dark mode settings */ +:root { + --crm-c-text: #fff; + --crm-c-link: var(--crm-c-teal); + --crm-c-link-hover: var(--crm-c-yellow); + --crm-c-text-light: var(--crm-c-darkest); + --crm-c-background: var(--crm-c-gray-900); + --crm-c-page-background: var(--crm-c-gray-900); + --crm-c-background2: var(--crm-c-gray-800); + --crm-c-background3: var(--crm-c-gray-700); + --crm-c-background4: var(--crm-c-gray-600); + --crm-c-code-background: var(--crm-c-gray-200); + --crm-c-success: #58a458; + --crm-red-alert: #b24b4f; + --crm-c-alert: #ff899a; + --crm-blue-info: #2c99a4; + --crm-c-green-light: #468847; + --crm-c-green: #55aa57; + --crm-c-green-dark: #dff0d8; + --crm-c-gray-700: #535252; + --crm-c-gray-600: #67676a; + --crm-c-gray-500: #6c6c6c; + --crm-c-divider: 1px solid var(--crm-c-gray-500); + /* And others */ + --crm-block-shadow: 0; + --crm-popup-shadow: 0 3px 18px 0 rgb(0,0,0); + --crm-heading-bg: var(--crm-c-blue-dark); + --crm-dashlet-bg: var(--crm-c-background2); + --crm-dashlet-header-bg: var(--crm-c-background3); + --crm-expand-header-bg: var(--crm-c-background4); + --crm-expand-body-bg: var(--crm-c-background3); + --crm-dash-header-bg: transparent; + --crm-dash-block-bg: var(--crm-c-background2); + --crm-dash-label-bg: transparent; + --crm-dash-panel-bg: var(--crm-c-background3); + --crm-dropdown-bg: var(--crm-c-background); + --crm-dropdown-2-bg: var(--crm-c-background); + --crm-tabs-border: 1px solid var(--crm-c-gray-500); + --crm-tabs-bg: var(--crm-c-background3); + --crm-table-outside-border: 1px solid var(--crm-c-gray-500); + --crm-table-row-border: 1px solid var(--crm-c-gray-500); + --crm-panel-border-col: var(--crm-c-gray-500); + --crm-input-border-color: var(--crm-c-gray-500); + --crm-table-odd-row: var(--crm-c-gray-800); + --crm-table-odd-hover: var(--crm-c-gray-700); + --crm-table-even-row: var(--crm-c-gray-700); + --crm-table-even-hover: var(--crm-c-gray-600); + --crm-alert-text-help: var(--crm-c-text-light); + --crm-alert-text-warning: var(--crm-c-text-light); + --crm-alert-background-info: var(--crm-c-blue-dark); + --crm-alert-text-info: var(--crm-c-blue-light); + --crm-c-inactive: var(--crm-c-gray-400); + --crm-input-color: var(--crm-c-text); + --crm-input-description: var(--crm-c-gray-300); + --crm-checkbox-list-col: var(--crm-c-text-light); + --crm-alert-text-help: var(--crm-c-text); + --crm-dialog-header-border-col: transparent; + --crm-dialog-header-bg: var(--crm-c-background2); + --crm-dialog-body-bg: var(--crm-c-background2); + --crm-notify-background: var(--crm-c-darkest); + --crm-wizard-active-bg: var(--crm-c-dark-teal); + --crm-form-block-background: var(--crm-c-background2); +} diff --git a/civicrm/ext/riverlea/streams/minetta/css/_variables.css b/civicrm/ext/riverlea/streams/minetta/css/_variables.css new file mode 100644 index 0000000000..527054df5e --- /dev/null +++ b/civicrm/ext/riverlea/streams/minetta/css/_variables.css @@ -0,0 +1,9 @@ +/* + Name: Minetta; + Description: Generic CiviCRM UI, somewhat familiar to users of CiviCRM since 2014. Named after Minetta Creek, which runs under Greenwich, New York; + Riverlea version: 1.1.0; +*/ + +:root { + --crm-version: 'Minetta, v' var(--crm-release); +} diff --git a/civicrm/ext/riverlea/streams/thames/css/_dark.css b/civicrm/ext/riverlea/streams/thames/css/_dark.css new file mode 100644 index 0000000000..c30024ce65 --- /dev/null +++ b/civicrm/ext/riverlea/streams/thames/css/_dark.css @@ -0,0 +1,123 @@ +:root { + --crm-c-dkblue-01: #050b0d; + --crm-c-dkblue-02: #0c191e; + --crm-c-dkblue-03: #1a292f; + --crm-c-dkblue-04: #1e323b; + --crm-c-background: var(--crm-c-dkblue-02); + --crm-dash-tabs-bg: var(--crm-c-dkblue-03); + --crm-dash-tab-count-bg: var(--crm-c-blue-darker); + --crm-c-page-background: var(--crm-c-dkblue-01); + --crm-c-code-background: var(--crm-c-dkblue-04); + --crm-dashlet-bg: var(--crm-c-dkblue-02); + --crm-c-green: #335417; + --crm-c-link: #2c98ed; + --crm-c-link-hover: color-mix(in srgb, white, var(--crm-c-blue-dark) 70%); + --crm-dash-header-col: var(--crm-c-blue-light); + --crm-dash-tab-bg-hover: var(--crm-c-dkblue-02); + --crm-dash-panel-bg: var(--crm-c-dkblue-02); + --crm-dash-block-bg: var(--crm-c-dkblue-03); + --crm-dash-summary-row-bg: transparent; + --crm-dash-label-bg: transparent; + --crm-c-text: var(--crm-c-blue-overlay2); + --crm-tabs-bg: var(--crm-dkblue-01); + --crm-tabs-border: var(--crm-dkblue-01); + --crm-c-drag-background: var(--crm-c-dkblue-04); + --crm-tab-bg-active: var(--crm-c-dkblue-02); + --crm-tab-bg-hover: var(--crm-c-dkblue-02); + --crm-tab-bg: transparent; + --crm-alert-background-help: var(--crm-c-dkblue-03); + --crm-alert-background-warning: #383124; + --crm-input-background: var(--crm-c-blue-darker); + --crm-inline-edit-bg: var(--crm-c-dkblue-01); + --crm-input-color: var(--crm-c-blue); /* text */ + --crm-alert-background-info: var(--crm-c-blue-darker); + --crm-alert-text-info: var(--crm-c-blue-light); + --crm-expand-body-bg: var(--crm-c-dkblue-03); + --crm-expand-header-color: var(--crm-c-blue-light); + --crm-expand-header-bg: var(--crm-c-dkblue-03); + --crm-c-divider: var(--crm-c-dkblue-03); + --crm-table-odd-row: var(--crm-c-dkblue-02); + --crm-table-even-row: var(--crm-c-dkblue-01); + --crm-table-odd-hover: var(--crm-c-dkblue-03); + --crm-table-even-hover: var(--crm-c-dkblue-02); + --crm-c-background2: var(--crm-c-dkblue-02); + --crm-c-background3: var(--crm-c-dkblue-02); + --crm-c-background4: var(--crm-c-dkblue-01); + --crm-panel-background: var(--crm-c-dkblue-02); + --crm-form-block-background: var(--crm-c-dkblue-02); + --crm-notify-background: var(--crm-c-dkblue-02); + --crm-expand-header-bg-active: var(--crm-c-dkblue-04); +} + +.crm-container div.crm-summary-row div.crm-label { + --crm-c-blue-darker: var(--crm-c-blue); +} + +/* todo variablize this */ +.crm-container .ui-tabs:not(#mainTabContainer) { + background: var(--crm-c-dkblue-01); + --crm-tabs-border: solid 4px var(--crm-c-dkblue-01); +} + +.crm-container .crm-accordion-bold>summary:is(:hover, +:focus) { + background-color: var(--crm-c-dkblue-01); +} + +/* Get rid of the ugly black overlay during loading */ +@keyframes aahblockoverlay-dark { + 0% { + background-color: var(--crm-c-dkblue-01); + } + + 50% { + background-color: var(--crm-c-dkblue-03); + } + + 100% { + background-color: var(--crm-c-dkblue-01); + } +} + +.crm-container .blockUI.blockOverlay { + animation: aahblockoverlay-dark 10s infinite; +} + +.crm-container .crm-dashlet-content { + background: var(--crm-c-dkblue-00) !important; +} +.crm-container .crm-dashlet-header { + background: var(--crm-c-dkblue-01) !important; +} +.crm-container summary { + background: var(--crm-c-dkblue-03); +} +.crm-container details { + background-color: var(--crm-c-dkblue-02); +} +.standalone-errors { + background: #3e0a01; +} +/* .crm-container .crm-search-nav-tabs { border-color: var(--crm-c-dkblue-01); } */ + +/* Override standalone.css */ +.standalone-auth-box { + background: var(--crm-c-dkblue-01) !important; +} +#login-form { + --crm-big-input: 100%; +} +/* Override _fixes.scss */ +.crm-container del, +.crm-container .ui-icons_deleted, +.crm-container table.caseSelector td.status-urgent, +.crm-container .font-red, +.crm-container .status-removed, +.crm-container .status-overdue, +.crm-container .status-fatal, +.crm-container .status-hold, +.crm-container .status-past, +.crm-contact-deceased, +.crm-container .status-warning { + --crm-c-alert: var(--crm-c-red); +} diff --git a/civicrm/ext/riverlea/streams/thames/css/_variables.css b/civicrm/ext/riverlea/streams/thames/css/_variables.css new file mode 100644 index 0000000000..45e829b5fc --- /dev/null +++ b/civicrm/ext/riverlea/streams/thames/css/_variables.css @@ -0,0 +1,492 @@ +/* + Name: Thames; + Description: Aaaaah; + Riverlea version: 1.1.0; + + I have added 'thames' to lines I changed. + This means I can track changes to the core variables with diff. + (One day all this css could be nicely optimised but for now + during heavy development it's more helpful to track changes than + worry about duplicate definitions etc.) + +*/ + + +:root { + --crm-version: 'Thames, v' var(--crm-release); +/* FONTS */ +/* --crm-system-fonts:; */ + --crm-font: Lato, sans-serif; +/* --crm-font-bold:Lato; */ + --crm-bold-weight: bold; +/* --crm-font-italic:; */ + --crm-italic-style: italic; +/* --crm-font-bold-italic:; */ +} +:root { +/* COLOUR */ + color-scheme: light dark; /* check to use simpler syntax late-2024 (Edge+iOS Safari) + +/* COLOUR NAMES */ + --crm-c-darkest: #0a0a0a; + --crm-c-gray-900: #2f2f2e; + --crm-c-gray-800: #3e3e3e; + --crm-c-gray-700: #696969; + --crm-c-gray-600: #828388; + --crm-c-gray-500: #919297; + --crm-c-gray-400: #adaeb3; + --crm-c-gray-300: #c2c0c0; + --crm-c-gray-200: #d5d5d5; + --crm-c-gray-100: #e2e1e1; + --crm-c-gray-050: #f8f8f8; + --crm-c-gray-025: #fcfbfb; + --crm-c-blue-overlay2: #edf4f7; /* thames only */ + --crm-c-blue-overlay: #dce9ef; /* thames only */ + --crm-c-blue-light: #d8edfe; /* thames */ + --crm-c-blue: #c5e4fc; /* thames */ +/* non-WCAG-AA --crm-c-blue-dark: #2c98ed ; /* thames */ + --crm-c-blue-dark: #127aca; /* thames */ + --crm-c-blue-darker: #02477d; /* thames */ + --crm-c-purple: #4d4d69; + --crm-c-purple-dark: #3e3e54; + --crm-c-green: #d6e9c6; + --crm-c-green-light: #dff0d8; + --crm-c-green-dark: #468847; + --crm-c-red: #eed3d7; + --crm-c-red-light: #f2dede; + --crm-c-red-dark: #740f0f; /* thames */ + --crm-c-red-bright: #bd0404; /* thames only */ + --crm-c-amber: #eeb153; + --crm-c-amber-light: #ffebc5; + --crm-c-yellow: #fcfc5a; /* thames todo change this horrible yellow! */ + --crm-c-yellow-light: #f2deb9; + --crm-c-yellow-less-light: #fffdb2; + --crm-c-teal: #63c4b9; + --crm-c-dark-teal: #3e8079; +/* PRACTICAL COLOURS */ + --crm-c-text: #000000dd; /* thames */ + --crm-c-light-text: #fff; + --crm-c-dark-text: var(--crm-c-text); + --crm-c-link: var(--crm-c-blue-dark); + --crm-c-link-hover: var(--crm-c-blue-darker); + --crm-c-divider: 1px solid var(--crm-c-blue-overlay); /* thames */ + --crm-c-page-background: #f3f2ed; /* background to page body */ /* thames */ + --crm-c-background: #f8f8f8; /* background to page header, often form block & dialog bg */ /* thames */ + --crm-c-background2: var(--crm-c-gray-050); /* 2-5 = progressively darker backgrounds*/ + --crm-c-background3: var(--crm-c-gray-100); + --crm-c-background4: var(--crm-c-gray-200); + --crm-c-background5: var(--crm-c-gray-700); + --crm-c-drag-background: var(--crm-c-blue-overlay2); /* background for drag/drop regions, select2 highlight */ + --crm-c-code-background: var(--crm-c-blue-overlay2); /* background for code regions */ + --crm-c-primary: var(--crm-c-blue-dark); /* primary button bgs */ /* thames */ + --crm-c-primary-hover: var(--crm-c-blue-darker); /* thames */ + --crm-c-primary-text: var(--crm-c-light-text); + --crm-c-primary-hover-text: white; /* thames */ + --crm-c-secondary: #c9e1f1; /* buttons */ /* thames */ + --crm-c-secondary-hover: #a1cef3; /* thames */ + --crm-c-secondary-text: var(--crm-c-blue-darker); /* thames */ + --crm-c-secondary-hover-text: var(--crm-c-light-text); /* thames todo */ + --crm-c-success: var(--crm-c-green-dark); + --crm-c-success-text: var(--crm-c-light-text); + --crm-c-alert: var(--crm-c-red-dark); /* thames */ + --crm-c-alert-text: var(--crm-c-light-text); + --crm-c-warning: var(--crm-c-amber); /* bg on .btn-warning, .label-warming but border on notification .alert */ + --crm-c-warning-text: var(--crm-c-text); + --crm-c-info: var(--crm-c-blue-dark); + --crm-c-info-text: var(--crm-c-light-text); + --crm-c-focus: var(--crm-c-blue-dark); + --crm-c-inactive: #696969; +} +:root { +/* thames only radii */ + --crm-r-5: 0.8rem; + --crm-r-3: 0.4rem; + --crm-r-2: 0.25em; + --crm-r-1: 3px; +/* SHADOWS */ + --crm-block-shadow: unset; + --crm-popup-shadow: 3px 3px 18px 0 rgba(0, 0, 0,.25); /* thames */ + --crm-bottom-shadow: unset; /* thames */ + --crm-body-inset: unset; +/* SIZES - temporary */ + --crm-roundness: 0; /* thames - this gets applied in too many places; so setting to 0 and positively re-applying, rather than using this and negatively unapplying. */ + --crm-xs: 0.1rem; + --crm-xs1: 0.125rem; + --crm-xs2: 0.15rem; + --crm-s: 0.25rem; + --crm-s1: 0.275rem; + --crm-s2: 0.325rem; + --crm-s3: 0.375rem; + --crm-m: 0.5rem; + --crm-m1: 0.625rem; + --crm-m2: 0.75rem; + --crm-m3: 0.875rem; + --crm-r: 1rem; + --crm-r1: 1.125rem; + --crm-r2: 1.25rem; + --crm-r3: 1.375rem; + --crm-r4: 1.5rem; + --crm-l: 2rem; + --crm-xl: 3rem; + --crm-xxl: 4rem; + --crm-big-input: 15em; + --crm-huge-input: 100%; /* thames */ + --crm-padding-reg: var(--crm-r); + --crm-padding-small: var(--crm-s); + --crm-padding-inset: var(--crm-m); +/* thames: on standalone the following is overridden in cms.css */ + --crm-page-padding: clamp(0.5rem 2vw 4rem); /* Margin left/right */ /* thames */ + --crm-page-width: 100%; /* Default that CMS can overwrite */ +/* Type */ + --crm-font-size: var(--crm-r); + --crm-small-font-size: var(--crm-m2); + --crm-type-line-height: 1.5; + --crm-link-decoration: none; + --crm-link-decoration-hover: underline; + --crm-heading-bg: unset; /*var(--crm-c-blue-light);*/ /* thames */ + --crm-heading-col: var(--crm-c-text); + --crm-heading-padding: var(--crm-s1) var(--crm-m1); /* thames unset this? todo */ + --crm-heading-margin: var(--crm-m) 0; + --crm-heading-radius: var(--crm-roundness); +/* Mouse events */ + --crm-hover-clickable: pointer; +} +:root { +/* Buttons */ + --crm-btn-box-shadow: none; + --crm-btn-border: 0 solid transparent; + --crm-btn-txt-transform: inherit; + --crm-btn-radius: 3px; + --crm-btn-padding-block: var(--crm-s); /* padding for top and bottom, one value */ /* thames */ + --crm-btn-padding-inline: var(--crm-m2); /* padding for left and right, one value */ /* thames */ + --crm-btn-small-padding: var(--crm-xs) var(--crm-s); + --crm-btn-large-padding: var(--crm-m) var(--crm-r); + --crm-btn-align: center; + --crm-btn-height: 1.825rem; /* thames */ + --crm-btn-icon-spacing: var(--crm-xs2); /* thames */ + --crm-btn-icon-size: auto; + --crm-btn-cancel-bg: var(--crm-c-red-light); + --crm-btn-cancel-text: var(--crm-c-red-dark); + --crm-btn-info-bg: var(--crm-c-secondary); /* thames */ + --crm-btn-info-text: var(--crm-c-secondary-text); /* thames */ + --crm-btn-warning-bg: var(--crm-c-warning); + --crm-btn-warning-text: var(--crm-c-warning-text); + --crm-btn-success-bg: var(--crm-c-info); /* thames */ + --crm-btn-success-text: #fff; /* thames */ + --crm-btn-alert-bg: var(--crm-c-red); + --crm-btn-alert-text: var(--crm-c-red-dark); + --crm-btn-icon-bg: unset; + --crm-btn-icon-border: unset; + --crm-btn-margin: var(--crm-m) 0; +} +:root { +/* Tables */ + --crm-table-outside-border: 1px solid var(--crm-c-background3); + --crm-table-background: var(--crm-c-page-background); + --crm-table-row-border: var(--crm-c-divider); + --crm-table-column-border: 0 solid transparent; + --crm-table-font-size: var(--crm-font-size); + --crm-table-padding: var(--crm-m); + --crm-table-header-border: 1px solid transparent; + --crm-table-header-bottom: 2px solid var(--crm-c-gray-300); + --crm-table-header-bg: var(--crm-c-page-background); + --crm-table-header-txt: inherit; + --crm-table-even-row: var(--crm-c-background2); + --crm-table-even-hover: var(--crm-c-blue-overlay); + --crm-table-odd-row: var(--crm-c-gray-025); + --crm-table-odd-hover: var(--crm-c-blue-overlay); + --crm-table-sort-col: var(--crm-c-gray-300); + --crm-table-sort-float: left; /* 'left', 'right' or 'none' */ + --crm-table-sort-active-col: var(--crm-c-link); + --crm-table-compressed-width: auto; + --crm-table-nested-padding: var(--crm-r) var(--crm-m); + --crm-table-nested-head-border: 0 solid transparent; + --crm-table-nested-border: var(--crm-c-divider); + --crm-table-inset-bg: var(--crm-c-background3); +} +:root { +/* Panels */ + --crm-panel-shadow: var(--crm-block-shadow); + --crm-panel-background: white; + --crm-panel-border: var(--crm-c-divider); + --crm-panel-head-margin: 0px; +} +:root { +/* Accordions */ + --crm-expand-icon: "\f0da"; /* unicode value for FontAwesome icon */ + --crm-expand-icon-color: var(--text); + --crm-expand-icon-spacing: var(--crm-m); + --crm-expand-transform: rotate(90deg); + --crm-expand-transition: transform .3s; + --crm-expand-radius: 4px; /* thames */ + --crm-expand-gap: var(--crm-xs2) 0 0; /* space between multiple accordions */ +/* .crm-accordion-bold */ + --crm-expand-header-bg: var(--crm-c-blue-overlay); /* thames */ + --crm-expand-header-bg-active: var(--crm-c-blue-overlay); /* thames */ + --crm-expand-header-color: var(--crm-c-blue-darker); /* thames */ + --crm-expand-header-padding: 0.6rem 1.6rem 0.6rem 2.8rem; /* thames */ + --crm-expand-header-weight: var(--crm-bold-weight); + --crm-expand-header-font: var(--crm-font-bold); + --crm-expand-header-border: unset;/*var(--crm-c-divider);*/ /* thames */ + --crm-expand-header-border-width: unset; /*0 0 1px 0*/; /* thames */ + --crm-expand-border: unset; /* thames */ + --crm-expand-border-width: unset; /* thames */ + --crm-expand-body-bg: var(--crm-c-blue-overlay); /* thames todo check*/ + --crm-expand-body-box-shadow: unset; + --crm-expand-body-padding: 0.25rem 2.8rem; /* thames */ +/* .crm-accordion-light */ + --crm-expand2-header-bg: transparent; + --crm-expand2-header-bg-active: var(--crm-c-background-2); + --crm-expand2-header-weight: normal; + --crm-expand2-header-font: unset; + --crm-expand2-header-color: var(--crm-c-text); + --crm-expand2-header-border: unset; + --crm-expand2-header-border-width: unset; + --crm-expand2-header-padding: .6rem 1.6rem 0.6rem 2.8rem; /*var(--crm-s) var(--crm-m); */ /* thames */ + --crm-expand2-border: unset; + --crm-expand2-border-width: unset; + --crm-expand2-body-bg: transparent; + --crm-expand2-body-padding: 0.25rem 2.8rem; /* thames */ +} +:root { +/* Alerts */ + --crm-alert-padding: var(--crm-r); /* thames */ + --crm-alert-margin: 0 0 var(--crm-m); + --crm-alert-border-width: 0; /* thames */ +/* Note 'help' suffix here is for the 'success' boxes. */ + --crm-alert-background-help: var(--crm-c-blue-light); /* thames */ + --crm-alert-border-help: unset; /* thames */ + --crm-alert-text-help: unset; /* thames */ + --crm-alert-background-warning: var(--crm-c-yellow-light); + --crm-alert-border-warning: var(--crm-c-yellow); + --crm-alert-text-warning: var(--crm-c-text); + --crm-alert-background-info: var(--crm-c-blue-light); + --crm-alert-border-info: var(--crm-c-blue); + --crm-alert-text-info: var(--crm-c-blue-darker); + --crm-alert-background-danger: var(--crm-c-red-light); + --crm-alert-border-danger: var(--crm-c-red); + --crm-alert-text-danger: var(--crm-c-red-dark); +} +:root { +/* Form */ + --crm-form-block-box-shadow: var(--crm-block-shadow); + --crm-form-block-background: var(--crm-c-background); + --crm-form-block-padding: var(--crm-m); + --crm-form-block-border-radius: var(--crm-roundness); + --crm-input-background: white; /* thames */ + --crm-input-background-image: linear-gradient(top, #eee 1%, #fff 15%); + --crm-input-color: var(--crm-c-text); + --crm-input-border-color: #0000001a; /* thames */ + --crm-input-border-radius: 3px; + --crm-input-active-ani: border-color .15s ease-in-out 0s; + --crm-input-box-shadow: none; /* thames */ + --crm-input-padding: var(--crm-xs1) var(--crm-s2); + --crm-input-padding-large: var(--crm-s) var(--crm-m1); + --crm-input-height: var(--crm-l); + --crm-input-font-size: var(--crm-m3); + --crm-input-label-weight: bold; + --crm-input-label-font: var(--crm-font); + --crm-input-label-size: var(--crm-font-size); + --crm-input-label-width: 16ch; /* thames todo - where is this used? */ + --crm-input-label-align: right; + --crm-input-description: #000000e8; /* darker for legibility */ /* thames */ + --crm-input-dropdown-icon: "\f107"; + --crm-input-radio-color: var(--crm-c-focus); + --crm-form-select-bg: var(--crm-c-background2); + --crm-inline-edit-border: 0 solid transparent; + --crm-inline-edit-bg: var(--crm-c-background); + --crm-fieldset-border-color: var(--crm-c-gray-400); + --crm-fieldset-border: 1px 0 0 0; + --crm-fieldset-padding: var(--crm-padding-reg) var(--crm-padding-small); + --crm-checkbox-list-col: var(--crm-c-text); +} +:root { +/* Tabs */ + --crm-tabs-bg: var(--crm-c-blue-overlay2); + --crm-tabs-padding: 0; + --crm-tabs-border: 4px solid var(--crm-c-blue-overlay2); + --crm-tabs-gap: var(--crm-s); + --crm-tab-bg: var(--crm-c-background2); + --crm-tab-bg-hover: var(--crm-c-blue-overlay); + --crm-tab-bg-active: white; + --crm-tab-hang: 0 0 calc(-1 * var(--crm-s)) 0; /* lip to extend tab flush with active region - set to 0 for no lip */ /* thames todo check */ + --crm-tab-padding: var(--crm-s3) var(--crm-m) var(--crm-s) var(--crm-m); + --crm-tab-padding: var(--crm-m2) var(--crm-r1) var(--crm-m); /* thames todo check */ + --crm-tab-col: var(--crm-c-text); + --crm-tab-weight: normal; + --crm-tab-font: unset; + --crm-tab-count-bg: var(--crm-c-info-text); + --crm-tab-count-col: var(--crm-c-info); + --crm-tab-roundness: var(--crm-r-3) var(--crm-r-3) 0 0; + --crm-tab-border: none; + --crm-tab-border-width: 0; + --crm-tab-border-active: 0 solid transparent; + --crm-tabs-2-border: var(--crm-tabs-border); +} +:root { +/* Contact dashboard/summary */ + --crm-dash-border: 0 solid transparent; /* thames */ + --crm-dash-roundness: var(--crm-r-5); /* thames */ + --crm-dash-direction: grid; /* choose 'flex' for tabs at top, or 'grid' for tabs at side */ /* thames */ + --crm-side-tabs-width: 220px; /* thames */ + --crm-dash-tabs-flow: column; /* choose 'row' for tabs at top, or 'column' for tabs at side */ /* thames */ + --crm-dash-tabs-gap: 0; /* thames */ + --crm-dash-tabs-bg: var(--crm-c-blue-overlay); /* thames */ + --crm-dash-tabs-padding: unset; /* thames */ + --crm-dash-tab-bg: transparent; + --crm-dash-tabs-roundness: var(--crm-dash-roundness) 0 0 var(--crm-dash-roundness); + --crm-dash-tab-bg-hover: white; /* thames */ + --crm-dash-tab-padding: var(--crm-m2) var(--crm-r1); /* thames */ + --crm-dash-tab-border: var(--crm-dash-border); /* thames */ + --crm-dash-tab-border-hover: 0 solid transparent; + --crm-dash-tab-border-width: 0; /* to remove border on one side for hanging tabs */ + --crm-dash-tab-col: unset; /* thames */ + --crm-dash-tab-count-bg: var(--crm-c-primary); /* thames */ + --crm-dash-tab-count-col: var(--crm-c-light-text); /* thames */ + --crm-dash-tab-width: 100%; + --crm-dash-tab-align: none; + --crm-dash-tab-hang: 0 0 -1px 0; /* lip to extend tab flush with active region - set to 0 for no lip */ /* thames */ + --crm-dash-tab-radius: 0; /* thames */ + --crm-dash-icon-size: var(--crm-r); /* thames */ + --crm-dash-summary-row-bg: var(--crm-c-background); + --crm-dash-box-shadow: 0; /* thames */ + --crm-dash-heading-inset: unset; + --crm-dash-panel-padding: var(--crm-r2); /* thames */ + --crm-dash-panel-bg: white; /* thames */ + --crm-dash-panel-border: 0; + --crm-dash-panel-radius: 0 var(--crm-dash-roundness) var(--crm-dash-roundness) 0; + --crm-dash-edit-border: 1px solid var(--crm-c-blue-dark); /* thames */ + --crm-dash-block-padding: var(--crm-m2); /* thames */ + --crm-dash-block-bg: var(--crm-c-background); /* thames */ + --crm-dash-block-radius: var(--crm-roundness); + --crm-dash-label-bg: var(--crm-c-background); /* thames */ + --crm-dash-header-bg: unset; /* thames */ + --crm-dash-header-bg2: unset; /* thames */ + --crm-dash-header-col: var(--crm-c-blue-darker); /* thames */ + --crm-dash-header-size: var(--crm-r3); + --crm-dash-header-padding: unset; /* thames */ + --crm-dash-image-right: 20px; /* distance from right of dashboard */ +} +:root { +/* Dialog */ + --crm-dialog-bg: var(--crm-c-page-background); + --crm-dialog-padding: 0; /* thames */ + --crm-dialog-radius: var(--crm-roundness); + --crm-dialog-line: unset; + --crm-dialog-inner-shadow: var(--crm-bottom-shadow); + --crm-dialog-header-bg: var(--crm-c-blue-overlay); /* thames */ + --crm-dialog-header-col: var(--crm-c-blue-darker); /* thames */ + --crm-dialog-header-size: var(--crm-r1); + --crm-dialog-header-padding: var(--crm-m1) var(--crm-r); + --crm-dialog-header-radius: var(--crm-dialog-radius); + --crm-dialog-header-border-col: transparent; /* thames */ + --crm-dialog-body-bg: var(--crm-c-background); + --crm-dialog-body-padding: var(--crm-m); +} +:root { +/* Dashlet */ + --crm-dashlet-border: unset; + --crm-dashlet-bg: white; + --crm-dashlet-padding: var(--crm-s2); + --crm-dashlet-box-shadow: none; + --crm-dashlet-dashlets-bg: var(--crm-c-background); + --crm-dashlet-header-bg: white; + --crm-dashlet-header-col: var(--crm-expand-header-color); + --crm-dashlet-header-border: unset; + --crm-dashlet-header-border-width: unset; + --crm-dashlet-header-font-size: var(--crm-font-size); + --crm-dashlet-header-padding: var(--crm-s); + --crm-dashlet-content-padding: var(--crm-dashlet-padding) 0; + --crm-dashlet-tabs-bg: var(--crm-tabs-bg); + --crm-dashlet-tabs-border: 0; + --crm-dashlet-tab-bg: transparent; + --crm-dashlet-tab-border: unset; + --crm-dashlet-tab-color: unset; + --crm-dashlet-tab-active: var(--crm-tab-bg-active); + --crm-dashlet-tab-border-active: var(--crm-tab-border-active); + --crm-dashlet-tab-body-border: 0; + --crm-dashlet-tab-body-padding: var(--crm-m); + --crm-dashlet-radius: var(--crm-r-3); +} +:root { +/* Button dropdowns */ + --crm-dropdown-padding: var(--crm-s); + --crm-dropdown-radius: var(--crm-roundness); + --crm-dropdown-bg: white; /* thames */ + --crm-dropdown-col: var(--crm-c-blue-darker); /* thames */ + --crm-dropdown-hover: var(--crm-c-blue-dark); /* thames */ + --crm-dropdown-hover-bg: var(--crm-c-blue-light); /* thames */ + --crm-dropdown-border: 0; + --crm-dropdown-width: 23ch; /* thames */ + --crm-dropdown-alert-bg: transparent; /* thames */ + --crm-dropdown-2-bg: var(--crm-c-secondary); + --crm-dropdown-2-col: var(--crm-c-text); + --crm-dropdown-2-padding: var(--crm-padding-small); +} +:root { +/* Notifications */ + --crm-notify-background: white; /* thames */ + --crm-notify-padding: var(--crm-m2); + --crm-notify-col: var(--crm-c-text); /* thames */ + --crm-notify-accent-border: 0.875rem 0 0 0; /* adds a border to one/several sides of the notification - set to 0 for none */ /* thames */ + --crm-notify-radius: 4px; /* thames */ +} +:root { +/* Icons */ + --crm-icon-alert: "\f06a"; + --crm-icon-success: "\f058"; + --crm-icon-info: "\f05a"; + --crm-icon-close: "\f00d"; + --crm-icon-sort: "\f0dc"; + --crm-icon-sort-desc: "\f0dd"; + --crm-icon-sort-asc: "\f0de"; + --crm-icon-alert-color: inherit; + --crm-icon-success-color: inherit; + --crm-icon-warning-color: inherit; + --crm-icon-info-color: inherit; +} +:root { +/* Wizard */ + --crm-wizard-width: fit-content; + --crm-wizard-margin: 0.5rem auto; + --crm-wizard-height: 30px; + --crm-wizard-radius: var(--crm-l); + --crm-wizard-angle: 0px; + --crm-wizard-active-col: var(--crm-c-light-text); + --crm-wizard-active-bg: var(--crm-c-link); + --crm-wizard-border: var(--crm-c-divider); + --crm-wizard-bg: var(--crm-c-page-background); +} +:root { +/* Alpha filter */ + --crm-filter-bg: var(--crm-c-blue-overlay); + --crm-filter-padding: var(--crm-m); + --crm-filter-item-bg: transparent; + --crm-filter-item-shadow: none; + --crm-filter-spacing: space-between; +} +:root { +/* Frontend */ + --crm-f-form-width: 700px; + --crm-f-box-shadow: var(--crm-block-shadow); + --crm-f-fieldset-bg: var(--crm-c-background); + --crm-f-fieldset-padding: var(--crm-r); + --crm-f-fieldset-margin: 0 0 var(--crm-padding-reg) 0; + --crm-f-fieldset-border: 0; + --crm-f-legend-align: center; + --crm-f-legend-size: var(--crm-r3); + --crm-f-form-padding: var(--crm-padding-reg); + --crm-f-form-layout: block; /* 'grid' = inline, 'block' = stacked */ + --crm-f-label-position: unset; + --crm-f-label-align: left; + --crm-f-label-width: 200px; + --crm-f-label-weight: bold; + --crm-f-input-radius: var(--crm-roundness); + --crm-f-input-padding: var(--crm-r2) var(--crm-m2); + --crm-f-input-font-size: var(--crm-r1); + --crm-f-input-width: 100%; /* thames */ + --crm-f-form-focus-bg: var(--crm-c-green); + --crm-f-form-error-bg: var(--crm-c-red); + --crm-f-logo-height: 40px; + --crm-f-logo-align: center; /* left, right or center */ +} diff --git a/civicrm/ext/riverlea/streams/thames/css/civicrm.css b/civicrm/ext/riverlea/streams/thames/css/civicrm.css new file mode 100755 index 0000000000..0fa0b2e54a --- /dev/null +++ b/civicrm/ext/riverlea/streams/thames/css/civicrm.css @@ -0,0 +1,609 @@ +@import url(../../../core/css/_base.css); /* resets and civi wide styles */ +@import url(../../../core/css/_cms.css); /* CMS-specific hacks/workarounds */ +@import url(../../../core/css/_core.css); /* components and utility classes */ +@import url(../../../core/css/_fixes.css); /* deprecated-Civi handling, hacks/workarounds. one day this will go. */ + +/* Only affect body colour in standalone */ +html.cms-standalone body { + background-color: var(--crm-c-page-background); +} + +#crm-container { + min-height: 100vh; + background-color: var(--crm-c-page-background); +} + +.crm-container details { + background-color: #bad0df45; /* @todo fix this to a var. */ + border: var(--crm-c-divider); +} + +.crm-container summary { + background-color: var(--crm-c-green-dark); /* novar */ + color: var(--crm-c-blue-darker); /* novar */ + cursor: pointer; /* show it's clickable */ + position: relative; /* so our animated triangle doesn't go walkies */ +} +.crm-container :where(summary:hover, +summary:focus) { + background-color: #b8daf4; /* novar */ +} + +/* RL introduces a border on focus which causes layout shift + * https://lab.civicrm.org/extensions/riverlea/-/issues/49 + */ +.crm-container :focus, +.crm-container .ui-dialog :focus { + border: none; +} + +/* Replace Riverlea's FontAwesome icon with our own shape. */ +/* This rule is really sensitive to specificity. */ +/* .crm-container :where(details, .crm-accordion-wrapper)>:is(summary,.crm-accordion-header)::before { */ + +.crm-container details>summary::before /* accordion8 (recommended) */, +.crm-container .crm-accordion-header::before, /* accordion1, accordion2, accordion6 */ +.crm-container .crm-collapsible .collapsible-title::before /* accordion3 */ { + content: ""; + border: .4rem solid transparent; + border-left-color: var(--crm-expand-icon-color); + position: absolute; + margin-left: -1.5rem; + margin-top: 0.2rem; + transform: rotate(0); + transform-origin: .2rem 50%; + transition: transform .25s ease; +} +/* we have to sort of re-state these rules because the specificity of the above overrules the 'open' state + * note that a lot of non-recommended patterns use .collapsed, whereas details uses [open] - reverse logic. + * This covers accordion1, accordion2, accordion6. + */ +.crm-container .crm-accordion-wrapper.collapsed>.crm-accordion-header::before { + transform: none; + transform-origin: .2rem 50%; +} +.crm-container .crm-accordion-wrapper:not(.collapsed)>.crm-accordion-header::before { + transform: rotate(90deg); +} +/* the following 2 rules are for accordion3 and accordion4(still bit weird) */ +.crm-container .crm-collapsible.collapsed>.collapsible-title::before { + transform: none; + transform-origin: .2rem 50%; +} +.crm-container .crm-collapsible:not(.collapsed)>.collapsible-title::before { + transform: rotate(90deg); +} + +/* Apply subtle animation */ +@keyframes crm-details-show { + from { + opacity: 0; + transform: translateY(-0.5rem); +} + 50% { + transform: translateY(-0.1rem); +} +} +.crm-container :is(details, +.crm-accordion-wrapper)>.crm-accordion-body { + padding: var(--crm-expand-body-padding); + animation: crm-details-show 240ms ease-in-out; +} +/* We don't want a different colour header bg on 'active' (open) but we do on hover + * This does't work yet.*/ +.crm-container .crm-accordion-bold>summary:is(:hover, +:focus) { + background-color: var(--crm-c-blue-overlay2); +} + + +/* Alternate backgrounds */ +/* .crm-container details:not(.crm-accordion-light) details:not(.crm-accordion-light) { */ +/* --crm-expand-header-bg: var(--crm-c-blue-overlay2); */ +/* } */ + + +/* ALERTS (these are in-page-flow boxes with info, not the (normally) popup notifications) */ + +/* help boxes: put stripe down left with icon in it. */ +.crm-container #help, +.crm-container .help { + border: none; + border-left: 2rem solid #7cb5e1; + border-radius: 0; +} +.crm-container #help::before, +.crm-container .help::before { + color: #fff; + content: "\f0eb"; + display: inline-block; + font-size: 2rem; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + margin-left: -2.3rem; + position: absolute; + text-rendering: auto; +} + +.crm-container .alert-success { + background-color: var(--crm-c-green); +} +.crm-container :is(.status, +.alert-warning, +.messages.warning) { + --crm-roundness: 0.25rem; +} + +/* BUTTONS */ + +/*.crm-container .btn, +.crm-container button, +.crm-container .crm-button, +.crm-container [type="button"], +.crm-container [type="reset"], +.crm-container [type="submit"] { + Sometimes we have lots of buttons and they wrap to a 2nd line. This puts some vertical space betwixt. + margin: var(--crm-m) 0; +} + +/* Make it clear when you're hovering delete. */ +.crm-container .btn.btn-danger:hover, +.crm-container .btn.btn-danger:focus, +.crm-container a.button.delete-button:hover, +.crm-container a.button.delete-button:focus, +.crm-container a.button.delete:hover { + color: var(--crm-c-red-bright); +} + +/* DIALOGS */ + +/* I feel title, resize, close is a better order for buttons bs modal dialogs */ +/* .ui-dialog-title { flex: 1 1 auto; order: 1; } */ +/* .crm-dialog-titlebar-resize { order: 2; } */ +.crm-container.ui-dialog .ui-dialog-titlebar .ui-button.crm-dialog-titlebar-print { + display: none; +} + +/* .modal-header .close { order: 3; } */ +/* .crm-container .modal-header .ui-icon[class*=" fa-"] { font-size: 1rem; } */ +/* I don't know what problem this solved, but it creates an undesired left padding */ +/* #bootstrap-theme .modal-header::before, #bootstrap-theme .modal-header::after { */ +/* display: none !important; */ +/* } */ +/**/ +/* #bootstrap-theme .modal-header { */ +/* border:none; */ +/* } */ +/**/ +/* .crm-container button.close { */ +/* color: var(--crm-c-blue-darker) !important; */ +/* } */ + +/* DROPDOWNS */ +.crm-container .btn-group .dropdown-menu, +.crm-container .btn.dropdown-toggle+.dropdown-menu { + border-radius: 4px; +} + +/* FORMS */ + +.crm-container .replace-plain { + background: #fff; +} + + +/* NOTIFICATIONS (the popup ones) */ +/* This produces a nicer hanging-indent type thing aligning the title and message to the left. */ +.crm-container .notify-content { + padding-left: 1.6rem; +} + +/* Thames theme does hanging indent for the little <i>con, but happy for the list bullets to be outside of main text block as is narrow column. */ +#crm-notification-container div.ui-notify-message .notify-content ul, +#crm-notification-container div.ui-notify-message .alert.notify-content ul { + margin: 1rem 0 0; + padding: 0; +} + +/* Only include the margin under the h1 (h1!) when it's not empty. When it's empty the h1 only contains the <i>con and adding a margin messes up vertical alignment of the message. */ +#crm-notification-container div.ui-notify-message h1:not(:empty) { + margin-bottom: 1rem; +} + +/* OTHER */ +/* 'alpha-filter' is the alphabetical pager you see, for example, on adv search results */ +.crm-container #alpha-filter li { + --crm-c-text: #0002; /* referenced in searchForm.css */ +} + +.crm-container .description:not(#help), +.crm-container td.description { + font-size: 0.875rem; +} + + +/* Get rid of the ugly black overlay during loading */ +@keyframes aahblockoverlay { + 0% { + background-color: var(--crm-c-blue-overlay); +} + 50% { + background-color: var(--crm-c-page-background); +} + 100% { + background-color: var(--crm-c-blue-overlay); +} +} +.crm-container .blockUI.blockOverlay { + animation: aahblockoverlay 10s infinite; +} + +/* CONTACT SUMMARY */ +/* Ensure the Summary tab's top left corner matches the radius of the container */ +.crm-contact-page #mainTabContainer .crm-contact-tabs-list>li:first-child a { + border-radius: var(--crm-dash-roundness) 0 0 0; +} + +.crm-contact-page #mainTabContainer .ui-tabs-nav li .ui-tabs-anchor:has(.crm-i) { + grid-template-columns: var(--crm-dash-icon-size) 1fr auto; + gap: 1ch; +} + +.crm-contact-page #mainTabContainer .ui-tabs-nav li .ui-tabs-anchor .crm-i:first-child { + justify-self: center; +} + +/* make count badges more readable */ +.crm-container .ui-tabs ul.ui-tabs-nav a em, +.crm-container .nav-tabs a .badge { + padding: 0 0.2rem; +} + +/* RL has no margin-bottom so the actions ribbon touches the main contact block */ +div.crm-summary-contactname-block+.crm-actions-ribbon { + margin-bottom: var(--crm-r1) !important; +} + +/* Use subgrid? No. Not responsive enough. */ +/* #contact-summary { grid-template-columns: 1fr 1fr; display: grid; } */ +/* .crm-container div.contact_panel { display: grid; grid-template-columns: subgrid; grid-column: 1 / 3; } */ +/* .contact_details { grid-template-columns: subgrid; grid-column: 1/ 3; } */ + +/* Decorations to indicate an editable chunk. */ +#contact-summary .crm-edit-help { + color: transparent; + transition: 0.3s color; + opacity: 1; + font-size: 0.875rem; +} + +#contact-summary .crm-edit-help .crm-i.fa-pencil { + color: var(--crm-c-blue-dark) !important; /* important overrides contactSummary.css */ +} + +#contact-summary .crm-inline-edit:hover .crm-edit-help { + color: var(--crm-c-blue-dark); +} + +#contact-summary .crm-inline-edit:hover .crm-edit-help .crm-i.fa-pencil { + color: var(--crm-c-blue-dark) !important; +} + +.crm-container div.crm-summary-row { + display: grid; + grid-template-columns: var(--crm-input-label-width) 1fr; +} + +/* unbold the labels */ +.crm-container div.crm-summary-row div.crm-label { + font-weight: normal !important; /* important overrides contactSummary.css that comes after this stylesheet */ +} + +/* instead bold the values */ +.crm-container div.crm-summary-row div.crm-label+div { + font-weight: bold; +} + +/* drop the ugly mahusive roadsign-atop unreadable icon for things like do not email */ +.fa-stack .crm-i.fa-stack-2x { + font-size: 1rem; +} + +.fa-stack .crm-i.fa-stack-1x:first-child { + display: none; +} + +#contact-summary div.crm-summary-row div.crm-label .fa-stack { + height: auto; + line-height: inherit; + vertical-align: baseline; + width: auto; +} + +#contact-summary div.crm-summary-row div.crm-label :where(.fa-stack-1x, +.fa-stack-2x) { + position: static; + width: auto; +} + +/* when space is tight, wrap labels onto next row */ +.crm-container div.crm-summary-row { + flex-wrap: wrap; +} + +/* */ +#contact-summary .crm-tag-item { + border-radius: var(--crm-r-1); +} + +.crm-container div.crm-summary-row div.crm-label { + color: var(--crm-c-blue-darker); +} + +/* INLINE EDIT */ +.crm-editable.crm-editable-editing { + background: white; + padding: 0.5em; + border-radius: 0.25em; + border: solid 1px var(--crm-c-blue); +} + +.crm-container .crm-editable-form [type="submit"] { + color: var(--crm-c-green-dark) !important; +} + +/* nice rounded tables. Pretty niche. */ +.crm-container table:not(.crm-inline-edit-form) { + border-radius: 0.4rem; + /* Fails when pop-up menus inside table need to extend beyond the table */ + /* clip-path: inset(0 0 0 0 round 0.4rem); */ + border-collapse: separate; + border-spacing: 0; +} + +.crm-container table tr:first-child th:first-child { + border-radius: 0.4rem 0 0 0; +} + +.crm-container table tr:first-child th:last-child { + border-radius: 0 0.4rem 0 0; +} + +.crm-container table tr:last-child td:first-child { + border-radius: 0 0 0 0.4rem; +} + +.crm-container table tr:last-child td:last-child { + border-radius: 0 0 0.4rem 0; +} + +/* ensure thing that wrap tables allow scrolling in case the table overflows. */ +div:has(> table) { + overflow-x: auto; + max-width: 100%; +} + +/* ...and adjust the individual row checkboxes to be in line + * Ah, no we have no way to target these. + * Would be nice if core markup identified this type of <td> + */ + +/* apply hanging indent to sorting buttons */ +.crm-container tr a.sorting, +.crm-container tr a.sorting_asc, +.crm-container tr a.sorting_desc, +.crm-container table.dataTable thead th.sorting, +.crm-container table.dataTable thead th.sorting_asc, +.crm-container table.dataTable thead th.sorting_desc, +.crm-search-display th.crm-sortable-col { + padding-left: calc(var(--crm-table-padding, 0) + 1ch); +} +.crm-container tr a.sorting::after, +.crm-container tr a.sorting_asc::after, +.crm-container tr a.sorting_desc::after, +.crm-container table.dataTable thead th.sorting::after, +.crm-container table.dataTable thead th.sorting_asc::after, +.crm-container table.dataTable thead th.sorting_desc::after, +.crm-search-display th.crm-sortable-col::after, +.crm-container tr a.sorting::before, +.crm-container tr a.sorting_asc::before, +.crm-container tr a.sorting_desc::before, +.crm-container table.dataTable thead th.sorting::before, +.crm-container table.dataTable thead th.sorting_asc::before, +.crm-container table.dataTable thead th.sorting_desc::before, +.crm-search-display th.crm-sortable-col::before { + position: absolute; + margin-left: -1em; +} + +/* ...and in searchkit, this is terribly awkward and could be fixed with a core PR to provide more classes */ +.crm-container .table > thead > tr > th:has(.crm-search-table-column-sort-icon) { + padding-left: 1.5ch; +} +.crm-search-display-table > table.table > thead > tr > th i.crm-search-table-column-sort-icon { + position: absolute; + margin-left: -1.5ch; +} + +/* Advanced search: override searchForm.css for slightly better aligned fields */ +.advanced-search-fields { + align-items: end; +} + +/* tabs */ +.crm-container .ui-tabs:not(#mainTabContainer) { + background: white; + border: var(--crm-tabs-border) !important; + border-radius: var(--crm-r-3); + /* overrides #civicrm-news-feed.ui-tabs and .crm-contact-page #secondaryTabContainer */ +} +/* breadcrumbs - links not accessibile using the nromal blue. */ +#civicrm-footer a, +nav.breadcrumb a { + --crm-c-link: var(--crm-c-blue-darker); + --crm-c-link-hover: var(--crm-c-blue-dark); +} +#crm-contactname-content .crm-edit-help { + color: var(--crm-c-blue-dark) !important; /* override */ + padding: 0.25rem !important; + opacity: 1 !important; +} +#crm-contactname-content > .crm-inline-block-content { + border: solid 1px transparent !important; +} +#crm-contactname-content:hover > .crm-inline-block-content { + border-color: var(--crm-c-blue-dark) !important; +} + +/* Overrides for crmSearchAdmin.css */ +.crm-search-nav-tabs > div.btn-group { + top: 0 !important; /* the buttons already have padding, we don't need this. (crmSearchAdmin.css, L10 at time of writing) */ +} + + +/* Make the tags list nicer. */ +.crm-tag-item { + padding: 0 1ch; + border-radius: 1rem; +} + +/* clickable items in select2 drop downs should be blue like links. */ +.select2-drop.select2-drop-active.crm-container .select2-results > li { + color: var(--crm-c-blue-dark); +} + +/* Breadcrumbs */ +html.crm-standalone nav.breadcrumb>ol { + display: flex; + gap: var(--crm-m); +} +.breadcrumb ol li:not(:first-child)::before { + content: " \BB "; + margin-inline-end: var(--crm-m); + color: var(--crm-c-blue-dark); +} + +/* override _fixes.css */ +.crm-container .font-red { + color: var(--crm-c-red-bright) !important; +} +/* override _icons.css */ +.crm-i.fa-ban.fa-stack-2x { + opacity: 1; +} + +/* PHP errors, warnings */ +.standalone-errors { + background: #ead2ce; +} + +/* e.g. search buttons followed by count of matches on SK screen */ +.crm-search-display .form-inline { + padding: var(--crm-padding-reg) 0; + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--crm-m); +} + +/* Spinner. Replace the fa icon with something nicer. */ +.fa-spinner::before { + content: ""; + width: 1rem; + height: 1rem; + min-width: 1rem; + min-height: 1rem; + border: dashed 1px white; + border-radius: 1rem; + animation: thames-spinner 1s infinite; +} +.fa-spin { + animation: none; /* placing animation on an odd-shaped item is a PITA for getting it 100% centred. */ +} +/* Spinner for notifications .status-start notifications e.g. loading/saving. */ +.crm-status-box-outer.status-start .crm-status-box-inner { + /* Allow space for spinner.*/ + padding-left: 2.5ch; +} + +/* The spinner. */ +.crm-status-box-outer.status-start .crm-status-box-inner::before { + position: absolute; + top: 50%; + transform: translateY(-50%); + margin-left: -2.5ch; + display: block; + content: ''; + line-height: 1; + animation: thames-spinner 1s infinite; + transform-origin: center; + width: 1.5ch; + height: 1.5ch; + border: dashed 1px white; + border-radius: 2ch; +} + +@keyframes thames-spinner { + 0% { + transform: none; +} + 100% { + transform: rotateZ(360deg); +} +} + +/* Font */ +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: url('../../../fonts/lato-v24-latin-regular.woff2') format('woff2'); +} + +/* lato-italic - latin */ +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 400; + src: url('../../../fonts/lato-v24-latin-italic.woff2') format('woff2'); +} + +/* lato-700 - latin */ +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: normal; + font-weight: 700; + src: url('../../../fonts/lato-v24-latin-700.woff2') format('woff2'); +} + +/* lato-700italic - latin */ +@font-face { + font-display: swap; + font-family: 'Lato'; + font-style: italic; + font-weight: 700; + src: url('../../../fonts/lato-v24-latin-700italic.woff2') format('woff2'); +} + +/* Searchkit preview table headers go weird because of the button margin for the select-all button. */ +/* .crm-container .btn, .crm-container button, .crm-container .crm-button, .crm-container [type="button"], .crm-container [type="reset"], .crm-container [type="submit"]*/ +.crm-container th.crm-search-result-select { + --crm-btn-margin: 0; +} + +/* Override _dropdowns.css */ +#afGuiEditor .af-gui-bar .dropdown-menu { + --crm-c-alert-text: var(--crm-c-red-dark); +} +/* Override contactSummary.css */ +#crm-contact-actions-list a.delete { + --crm-c-alert-text: var(--crm-c-red-dark); +} +#crm-contact-actions-list a.delete:hover, +#crm-contact-actions-list a.delete:focus { + /* the hover state gives crm-c-red-dark to the background */ + --crm-c-alert-text: var(--crm-c-red-light); +} diff --git a/civicrm/ext/riverlea/streams/walbrook/css/_dark.css b/civicrm/ext/riverlea/streams/walbrook/css/_dark.css new file mode 100755 index 0000000000..3131b10d32 --- /dev/null +++ b/civicrm/ext/riverlea/streams/walbrook/css/_dark.css @@ -0,0 +1,68 @@ +/* Walbrook dark mode settings */ + +:root { + --crm-c-text: #fff; + --crm-c-link: var(--crm-c-amber); + --crm-c-link-hover: var(--crm-c-amber-light); + --crm-c-text-light: var(--crm-c-darkest); + --crm-c-background: var(--crm-c-gray-900); + --crm-c-page-background: var(--crm-c-darkest); + --crm-c-code-background: var(--crm-c-background2); + --crm-c-background2: var(--crm-c-gray-900); + --crm-c-background3: var(--crm-c-gray-800); + --crm-c-background4: var(--crm-c-gray-700); + --crm-c-success: #58a458; + --crm-red-alert: #b24b4f; + --crm-c-alert: #ff899a; + --crm-alert-background-danger: var(--crm-c-red); + --crm-blue-info: #2c99a4; + --crm-c-blue-dark: #043353; + --crm-c-green-light: #468847; + --crm-c-green: #55aa57; + --crm-c-green-dark: #dff0d8; + --crm-c-gray-700: #535252; + --crm-c-gray-600: #67676a; + --crm-c-gray-500: #6c6c6c; + --crm-c-divider: 1px solid var(--crm-c-gray-500); + /* And others */ + --crm-block-shadow: 0 3px 18px 0 rgb(0,0,0); + --crm-popup-shadow: 0 3px 18px 0 rgb(0,0,0); + --crm-heading-bg: var(--crm-c-blue-dark); + --crm-dashlet-bg: var(--crm-c-background2); + --crm-dashlet-header-bg: var(--crm-c-background3); + --crm-expand-header-bg: var(--crm-c-blue-dark); + --crm-expand-body-bg: var(--crm-c-background3); + --crm-expand-body-border: 0; + --crm-dash-header-bg: var(--crm-c-background4); + --crm-dash-block-bg: var(--crm-c-background2); + --crm-dash-label-bg: transparent; + --crm-dash-tabs-bg: var(--crm-c-background3); + --crm-dash-panel-bg: var(--crm-c-background2); + --crm-dash-tab-bg-hover: var(--crm-c-background2); + --crm-dropdown-bg: var(--crm-c-background); + --crm-dropdown-2-bg: var(--crm-c-background); + --crm-tabs-bg: var(--crm-c-background3); + --crm-panel-border-col: var(--crm-c-gray-500); + --crm-input-border-color: var(--crm-c-gray-500); + --crm-table-odd-row: var(--crm-c-gray-800); + --crm-table-odd-hover: var(--crm-c-gray-700); + --crm-table-even-row: var(--crm-c-gray-700); + --crm-table-even-hover: var(--crm-c-gray-600); + --crm-alert-text-help: var(--crm-c-text-light); + --crm-alert-text-warning: var(--crm-c-text-light); + --crm-alert-background-info: var(--crm-c-blue-dark); + --crm-alert-text-info: var(--crm-c-blue-light); + --crm-c-inactive: var(--crm-c-gray-400); + --crm-input-color: var(--crm-c-text); + --crm-input-description: var(--crm-c-gray-300); + --crm-checkbox-list-col: var(--crm-c-text-light); + --crm-alert-text-help: var(--crm-c-text); + --crm-dialog-header-border-col: transparent; + --crm-dialog-header-bg: var(--crm-c-background2); + --crm-dialog-body-bg: var(--crm-c-background2); + --crm-notify-background: var(--crm-c-darkest); + --crm-wizard-active-bg: var(--crm-c-dark-teal); + --crm-form-block-background: var(--crm-c-background2); + --crm-btn-cancel-bg: #9b3d4b; + --crm-panel-border: 1px; +} diff --git a/civicrm/ext/riverlea/streams/walbrook/css/_variables.css b/civicrm/ext/riverlea/streams/walbrook/css/_variables.css new file mode 100755 index 0000000000..51475e99ef --- /dev/null +++ b/civicrm/ext/riverlea/streams/walbrook/css/_variables.css @@ -0,0 +1,218 @@ +/* + Name: Walbrook; + Description: Based on Shoreditch theme. Named after after River Walbrook, which runs under Shoreditch, London; + Riverlea version: 1.1.0; +*/ + +:root { + --crm-version: 'Walbrook, v' var(--crm-release); +/* Fonts */ + --crm-system-fonts: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue",sans-serif; + --crm-font: "Civitype", "Open Sans", var(--crm-system-fonts); + --crm-font-bold: "Civitype-bold", var(--crm-system-fonts); + --crm-font-italic: "Civitype-italic", var(--crm-system-fonts); + --crm-font-bold-italic: "Civitype", var(--crm-system-fonts); +/* Colour names */ + --crm-c-gray-900: #222831; + --crm-c-gray-800: #393a3f; + --crm-c-gray-700: #75767b; + --crm-c-gray-300: #cad5d7; + --crm-c-gray-200: #d3dee2; + --crm-c-gray-100: #ebeff0; + --crm-c-gray-050: #f3f6f7; + --crm-c-gray-025: #fcfcfc; + --crm-c-blue: #0071bd; + --crm-c-blue-light: #dff0f4; + --crm-c-blue-dark: #66afe9; + --crm-c-blue-darker: #005c99; + --crm-c-green: #44cb7e; + --crm-c-green-light: #bcecd1; + --crm-c-green-dark: var(--crm-c-text); + --crm-c-red: #cf3458; + --crm-c-red-light: #ecb0be; + --crm-c-red-dark: var(--crm-c-text); + --crm-c-amber: #e6ab5e; + --crm-c-yellow: #f8e80b; + --crm-c-teal: #399389; +/* Practical colours */ + --crm-c-link: var(--crm-c-blue); + --crm-c-link-hover: var(--crm-c-blue-dark); + --crm-c-page-background: #e8eef0; /* background to page body */ + --crm-c-background: #fff; /* background to page header, often form block & dialog bg */ + --crm-c-drag-background: var(--crm-c-background4); /* background for drag/drop regions, select2 highlight */ + --crm-c-code-background: var(--crm-c-background3); /* background for code regions */ + --crm-c-primary: var(--crm-c-blue); + --crm-c-primary-hover: var(--crm-c-blue-darker); + --crm-c-primary-text: var(--crm-c-light-text); /* text colour when on top of primary */ + --crm-c-secondary: var(--crm-c-purple); + --crm-c-secondary-hover: var(--crm-c-purple-dark); + --crm-c-success: var(--crm-c-green); + --crm-c-success-text: var(--crm-c-dark-text); + --crm-c-alert: var(--crm-c-red); + --crm-c-warning-text: var(--crm-c-dark-text); + --crm-c-info-text: var(--crm-c-light-text); +/* Shadows */ + --crm-block-shadow: 0 3px 18px 0 rgba(48,40,40,.25); + --crm-popup-shadow: var(--crm-block-shadow); + --crm-body-inset: inset 0 10px 8px -10px rgba(0,0,0,.15),inset 0 -11px 8px -9px rgba(0,0,0,.15); +/* Sizes */ + --crm-roundness: 2px; + --crm-padding-inset: 0; /* to support flush theme variations */ + --crm-page-padding: 0; /* Margin left/right */ +/* Type */ + --crm-link-decoration-hover: none; + --crm-heading-bg: var(--crm-c-background3); + --crm-heading-padding: var(--crm-m2) var(--crm-m); + --crm-heading-margin: 0; + --crm-heading-radius: 0; +/* Buttons */ + --crm-btn-radius: 2px; + --crm-btn-padding-block: var(--crm-m); /* padding for top and bottom, one value */ + --crm-btn-padding-inline: var(--crm-r2); /* padding for left and right, one value */ + --crm-btn-small-padding: var(--crm-s1) var(--crm-m1); + --crm-btn-height: 40px; +/* Tables */ + --crm-table-outside-border: var(--crm-c-divider); + --crm-table-background: var(--crm-c-background); + --crm-table-header-bottom: var(--crm-c-divider); + --crm-table-header-bg: var(--crm-c-background); + --crm-table-even-row: #fff; + --crm-table-odd-row: var(--crm-c-gray-050); + --crm-table-even-hover: var(--crm-c-gray-025); + --crm-table-odd-hover: var(--crm-c-gray-100); + --crm-table-sort-col: var(--crm-c-gray-500); + --crm-table-nested-padding: 0 0 var(--crm-r) 0; + --crm-table-nested-head-border: 2px solid var(--crm-c-gray-300); + --crm-table-nested-border: 0 solid transparent; +/* Panels */ + --crm-panel-head-margin: var(--crm-m2); +/* Accordions */ + --crm-expand-icon: "\f105"; /* unicode value for FontAwesome icon */ + --crm-expand-icon-color: unset; + --crm-expand-icon-spacing: var(--crm-m3); + --crm-expand-gap: 0; +/* .crm-accordion-bold */ + --crm-expand-header-bg: var(--crm-c-background2); + --crm-expand-header-bg-active: var(--crm-c-background3); + --crm-expand-header-color: var(--crm-c-text); + --crm-expand-header-padding: var(--crm-m2) var(--crm-m3); + --crm-expand-border: unset; + --crm-expand-border-width: unset; + --crm-expand-body-bg: transparent; + --crm-expand-body-box-shadow: var(--crm-body-inset); +/* .crm-accordion-light */ + --crm-expand2-header-bg: var(--crm-c-primary); + --crm-expand2-header-bg-active: var(--crm-c-primary-hover); + --crm-expand2-header-weight: bold; + --crm-expand2-header-font: var(--crm-font-bold); + --crm-expand2-header-color: var(--crm-c-primary-text); + --crm-expand2-header-padding: var(--crm-expand-header-padding); + --crm-expand2-border: 0; + --crm-expand2-body-bg: transparent; + --crm-expand2-body-padding: 0; +/* Alerts */ + --crm-alert-padding: var(--crm-r) var(--crm-r2); + --crm-alert-text-help: var(--crm-c-text); + --crm-alert-background-warning: var(--crm-c-amber-light); + --crm-alert-border-warning: var(--crm-c-amber); + --crm-alert-background-info: var(--crm-c-primary); + --crm-alert-border-info: var(--crm-c-primary); + --crm-alert-text-info: var(--crm-c-primary-text); + --crm-alert-text-danger: var(--crm-c-text); +/* Form */ + --crm-form-block-padding: var(--crm-r); + --crm-form-block-border-radius: 0; + --crm-input-background: var(--crm-c-background); + --crm-input-background-image: none; + --crm-input-color: #464354; + --crm-input-border-color: #c2cfd8; + --crm-input-border-radius: var(--crm-roundness); + --crm-input-box-shadow: inset 0 0 3px 0 rgba(0,0,0,.2); + --crm-input-padding: var(--crm-xs1) var(--crm-m1); + --crm-input-label-weight: bold; + --crm-input-label-font: var(--crm-font-bold); + --crm-input-radio-color: var(--crm-c-primary); + --crm-inline-edit-border: 1px solid var(--crm-c-gray-900); + --crm-fieldset-border-color: unset; + --crm-fieldset-border: 0; + --crm-fieldset-padding: 0; +/* Tabs */ + --crm-tabs-bg: var(--crm-c-background2); + --crm-tabs-padding: var(--crm-m) var(--crm-m) 0 var(--crm-m); + --crm-tabs-border: var(--crm-c-divider); + --crm-tab-roundness: 2px 2px 0 0; + --crm-tab-bg-hover: var(--crm-c-background); + --crm-tab-bg-active: var(--crm-c-background); + --crm-tab-hang: 0 0 -1px 0; /* lip to extend tab flush with active region - set to 0 for no lip */ + --crm-tab-padding: var(--crm-m2) var(--crm-r1) var(--crm-m); + --crm-tab-font: var(--crm-font-bold); + --crm-tab-count-bg: transparent; + --crm-tab-count-col: var(--crm-c-text); + --crm-tab-border-active: var(--crm-c-divider); +/* Contact dashboard */ + --crm-dash-border: 0 solid transparent; + --crm-dash-roundness: 0; + --crm-dash-direction: grid; /* choose 'flex' for tabs at top, or 'grid' for tabs at side */ + --crm-side-tabs-width: 220px; + --crm-dash-tabs-flow: column; /* choose 'row' for tabs at top, or 'column' for tabs at side */ + --crm-dash-tabs-gap: 0; + --crm-dash-tabs-bg: var(--crm-c-background); + --crm-dash-tabs-padding: unset; + --crm-dash-tab-bg: transparent; + --crm-dash-tab-bg-hover: var(--crm-c-background3); + --crm-dash-tab-padding: var(--crm-r) var(--crm-r1); + --crm-dash-tab-border: var(--crm-dash-border); + --crm-dash-tab-border-hover: unset; + --crm-dash-tab-col: unset; + --crm-dash-tab-count-bg: var(--crm-c-primary); + --crm-dash-tab-count-col: var(--crm-c-light-text); + --crm-dash-tab-hang: 0 0 -1px 0; /* lip to extend tab flush with active region - set to 0 for no lip */ + --crm-dash-icon-size: var(--crm-m2); + --crm-dash-box-shadow: inset 0 3px 18px -5px rgba(0, 0, 0, 0.25); + --crm-dash-panel-padding: var(--crm-r2); + --crm-dash-edit-border: 1px dashed var(--crm-c-gray-900); + --crm-dash-block-padding: var(--crm-m2); + --crm-dash-block-bg: var(--crm-c-background); + --crm-dash-label-bg: var(--crm-c-background); + --crm-dash-header-bg: var(--crm-c-gray-900); + --crm-dash-header-bg2: var(--crm-c-gray-800); + --crm-dash-header-col: var(--crm-c-light-text); + --crm-dash-header-size: var(--crm-l); + --crm-dash-header-padding: var(--crm-r) var(--crm-r1); + --crm-dash-image-size: 100px; + --crm-dash-image-radius: 200px; + --crm-dash-image-right: 30px; /* distance from right of dashboard */ + --crm-dash-image-top: 30px; /* distance from top of dashboard */ + --crm-dash-image-border: 2px solid #fff; +/* Dialog */ + --crm-dialog-bg: var(--crm-c-background); + --crm-dialog-padding: 0; + --crm-dialog-line: var(--crm-c-divider); + --crm-dialog-header-bg: var(--crm-c-background2); + --crm-dialog-header-col: var(--crm-c-text); +/* Dashlet */ + --crm-dashlet-border: var(--crm-tab-border); + --crm-dashlet-bg: var(--crm-c-background); + --crm-dashlet-padding: 0; + --crm-dashlet-header-bg: var(--crm-c-secondary); + --crm-dashlet-header-col: var(--crm-c-light-text); + --crm-dashlet-header-padding: var(--crm-padding-reg); + --crm-dashlet-tabs-border: var(--crm-tabs-border); +/* Notifications */ + --crm-notify-background: var(--crm-c-background); + --crm-notify-col: var(--crm-c-text); + --crm-notify-accent-border: 0 0 0 3px; /* adds a border to one/several sides of the notification - set to 0 for none */ +/* Wizard */ + --crm-wizard-width: auto; + --crm-wizard-margin: calc(-1 * var(--crm-form-block-padding)) calc(-1 * var(--crm-form-block-padding)) 0; + --crm-wizard-height: 62px; + --crm-wizard-radius: 0; + --crm-wizard-angle: 20px; + --crm-wizard-active-col: var(--crm-c-link); + --crm-wizard-active-bg: var(--crm-c-page-background); + --crm-wizard-border: 1px solid var(--crm-c-page-background); + --crm-wizard-bg: var(--crm-c-background); +/* Frontend */ + --crm-f-legend-align: unset; + --crm-f-legend-size: var(--crm-r2); +} diff --git a/civicrm/ext/riverlea/streams/walbrook/css/civicrm.css b/civicrm/ext/riverlea/streams/walbrook/css/civicrm.css new file mode 100644 index 0000000000..a08341162f --- /dev/null +++ b/civicrm/ext/riverlea/streams/walbrook/css/civicrm.css @@ -0,0 +1,28 @@ +@import url(../../../core/css/_base.css); /* resets and civi wide styles */ +@import url(../../../core/css/_cms.css); /* CMS-specific hacks/workarounds */ +@import url(../../../core/css/_core.css); /* components and utility classes */ +@import url(../../../core/css/_fixes.css); /* deprecated-Civi handling, hacks/workarounds. one day this will go. */ + +/* Font */ + +@font-face { + font-family: Civitype; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("../../../fonts/inter-v18-latin-regular.woff2") format("woff2"); +} +@font-face { + font-family: Civitype-italic; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url("../../../fonts/inter-v18-latin-italic.woff2") format("woff2"); +} +@font-face { + font-family: Civitype-bold; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("../../../fonts/inter-v18-latin-600.woff2") format("woff2"); +} diff --git a/civicrm/ext/search_kit/Civi/Api4/Action/SKEntity/Refresh.php b/civicrm/ext/search_kit/Civi/Api4/Action/SKEntity/Refresh.php index 1e5a732e28..6e8d4852f6 100644 --- a/civicrm/ext/search_kit/Civi/Api4/Action/SKEntity/Refresh.php +++ b/civicrm/ext/search_kit/Civi/Api4/Action/SKEntity/Refresh.php @@ -30,18 +30,30 @@ class Refresh extends AbstractAction { ->execute()->single(); $apiParams = $display['saved_search_id.api_params']; + // Add orderBy to api params foreach ($display['settings']['sort'] ?? [] as $item) { $apiParams['orderBy'][$item[0]] = $item[1]; } + // Set select clause to match display columns + $select = []; + foreach ($display['settings']['columns'] as $column) { + foreach ($apiParams['select'] as $selectExpr) { + if ($selectExpr === $column['key'] || str_ends_with($selectExpr, " AS {$column['key']}")) { + $select[] = $selectExpr; + continue 2; + } + } + } + $apiParams['select'] = $select; $api = Request::create($display['saved_search_id.api_entity'], 'get', $apiParams); $query = new Api4SelectQuery($api); $query->forceSelectId = FALSE; - $select = $query->getSql(); + $sql = $query->getSql(); $tableName = _getSearchKitDisplayTableName($displayName); $columnSpecs = array_column($display['settings']['columns'], 'spec'); $columns = implode(', ', array_column($columnSpecs, 'name')); \CRM_Core_DAO::executeQuery("TRUNCATE TABLE `$tableName`"); - \CRM_Core_DAO::executeQuery("INSERT INTO `$tableName` ($columns) $select"); + \CRM_Core_DAO::executeQuery("INSERT INTO `$tableName` ($columns) $sql"); $result[] = [ 'refresh_date' => \CRM_Core_DAO::singleValueQuery("SELECT NOW()"), ]; diff --git a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php index 121ef5a388..007d308923 100644 --- a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php +++ b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php @@ -151,17 +151,28 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction { foreach ($this->display['settings']['columns'] as $column) { $columns[] = $this->formatColumn($column, $data); } - $style = $this->getCssStyles($this->display['settings']['cssRules'] ?? [], $data); - // Add hierarchical styles - if (!empty($this->display['settings']['hierarchical'])) { - $style[] = 'crm-hierarchical-row crm-hierarchical-depth-' . ($data['_depth'] ?? '0'); - $style[] = empty($data['_depth']) ? 'crm-hierarchical-parent' : 'crm-hierarchical-child'; - } $row = [ 'data' => $data, 'columns' => $columns, - 'cssClass' => implode(' ', $style), ]; + $style = $this->getCssStyles($this->display['settings']['cssRules'] ?? [], $data); + // Add hierarchical styles + if (!empty($this->display['settings']['hierarchical'])) { + $depth = $data['_depth'] ?? 0; + $style[] = 'crm-hierarchical-row crm-hierarchical-depth-' . $depth; + if ($depth) { + $style[] = 'crm-hierarchical-child'; + } + if (!empty($data['_descendents'])) { + $style[] = 'crm-hierarchical-parent'; + if (($this->display['settings']['collapsible'] ?? FALSE) === 'closed') { + $row['collapsed'] = TRUE; + } + } + } + if ($style) { + $row['cssClass'] = implode(' ', $style); + } if (isset($record[$keyName])) { $row['key'] = $record[$keyName]; } @@ -325,7 +336,7 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction { // Convert dots to nested arrays which are more Smarty-friendly foreach ($data as $key => $value) { $parent = &$vars; - $allKeys = $keys = array_map('CRM_Utils_String::munge', explode('.', $key)); + $allKeys = $keys = array_map(fn($s) => \CRM_Utils_String::munge($s, '_', 0), explode('.', $key)); while (count($keys) > 1) { $level = array_shift($keys); $parent[$level] = $parent[$level] ?? []; @@ -1352,6 +1363,7 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction { // Add `depth_` column for hierarchical entity displays if (!empty($this->display['settings']['hierarchical'])) { $this->addSelectExpression('_depth'); + $this->addSelectExpression('_descendents'); } // Add draggable column (typically "weight") if (!empty($this->display['settings']['draggable'])) { diff --git a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/Download.php b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/Download.php index 3874293604..2722f290a3 100644 --- a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/Download.php +++ b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/Download.php @@ -179,14 +179,14 @@ class Download extends AbstractRunAction { // Header row foreach (array_values($columns) as $index => $col) { - $sheet->setCellValueByColumnAndRow($index + 1, 1, $col['label']); + $sheet->setCellValue([$index + 1, 1], $col['label']); $sheet->getColumnDimensionByColumn($index)->setAutoSize(TRUE); } foreach ($rows as $rowNum => $data) { $colNum = 1; foreach ($columns as $index => $col) { - $sheet->setCellValueByColumnAndRow($colNum++, $rowNum + 2, $this->formatColumnValue($col, $data['columns'][$index])); + $sheet->setCellValue([$colNum++, $rowNum + 2], $this->formatColumnValue($col, $data['columns'][$index])); } } diff --git a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php index 8b1b6377bf..1453e1f317 100644 --- a/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php +++ b/civicrm/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php @@ -219,6 +219,9 @@ class GetSearchTasks extends \Civi\Api4\Generic\AbstractAction { $task['entity'] = $entity['name']; // Add default for number of rows action requires $task += ['number' => '> 0']; + if (!empty($task['apiBatch']['fields'])) { + $this->getApiBatchFields($task); + } } usort($tasks[$entity['name']], function($a, $b) { @@ -228,6 +231,19 @@ class GetSearchTasks extends \Civi\Api4\Generic\AbstractAction { $result->exchangeArray($tasks[$entity['name']]); } + private function getApiBatchFields(array &$task) { + $fieldInfo = civicrm_api4($task['entity'], 'getFields', [ + 'checkPermissions' => $this->getCheckPermissions(), + 'action' => $task['apiBatch']['action'] ?? 'update', + 'select' => ['name', 'label', 'description', 'input_type', 'data_type', 'serialize', 'options', 'fk_entity', 'required', 'nullable'], + 'loadOptions' => ['id', 'name', 'label', 'description', 'color', 'icon'], + 'where' => [['name', 'IN', array_column($task['apiBatch']['fields'], 'name')]], + ])->indexBy('name'); + foreach ($task['apiBatch']['fields'] as &$field) { + $field += $fieldInfo[$field['name']] ?? []; + } + } + public static function fields(): array { return [ [ diff --git a/civicrm/ext/search_kit/Civi/Api4/Event/Subscriber/SKEntitySubscriber.php b/civicrm/ext/search_kit/Civi/Api4/Event/Subscriber/SKEntitySubscriber.php index 70c6f3abd9..50fc3543f2 100644 --- a/civicrm/ext/search_kit/Civi/Api4/Event/Subscriber/SKEntitySubscriber.php +++ b/civicrm/ext/search_kit/Civi/Api4/Event/Subscriber/SKEntitySubscriber.php @@ -132,8 +132,15 @@ class SKEntitySubscriber extends AutoService implements EventSubscriberInterface private function formatFieldSpec(array $column, array $expr): array { // Strip the pseuoconstant suffix [$name, $suffix] = array_pad(explode(':', $column['key']), 2, NULL); - // Sanitize the name - $name = \CRM_Utils_String::munge($name, '_', 255); + // Sanitize the name and limit to 58 characters. + // 64 characters is the max for some versions of SQL, minus the length of "index_" = 58. + if (strlen($name) <= 58) { + $name = \CRM_Utils_String::munge($name, '_', NULL); + } + // Append a hash of the full name to trimmed names to keep them unique but predictable + else { + $name = \CRM_Utils_String::munge($name, '_', 42) . substr(md5($name), 0, 16); + } $spec = [ 'name' => $name, 'data_type' => $expr['dataType'], diff --git a/civicrm/ext/search_kit/Civi/Api4/Service/Spec/Provider/SearchSegmentExtraFieldProvider.php b/civicrm/ext/search_kit/Civi/Api4/Service/Spec/Provider/SearchSegmentExtraFieldProvider.php index 97f3f2c470..2f02f9d86b 100644 --- a/civicrm/ext/search_kit/Civi/Api4/Service/Spec/Provider/SearchSegmentExtraFieldProvider.php +++ b/civicrm/ext/search_kit/Civi/Api4/Service/Spec/Provider/SearchSegmentExtraFieldProvider.php @@ -15,8 +15,13 @@ namespace Civi\Api4\Service\Spec\Provider; use Civi\Api4\Query\Api4SelectQuery; use Civi\Api4\Service\Spec\FieldSpec; use Civi\Api4\Service\Spec\RequestSpec; +use Civi\Core\Service\AutoService; -class SearchSegmentExtraFieldProvider implements Generic\SpecProviderInterface { +/** + * @service + * @internal + */ +class SearchSegmentExtraFieldProvider extends AutoService implements Generic\SpecProviderInterface { /** * @inheritDoc diff --git a/civicrm/ext/search_kit/Civi/Search/Admin.php b/civicrm/ext/search_kit/Civi/Search/Admin.php index 81a1b5e9b4..00d230bdf6 100644 --- a/civicrm/ext/search_kit/Civi/Search/Admin.php +++ b/civicrm/ext/search_kit/Civi/Search/Admin.php @@ -327,7 +327,8 @@ class Admin { 'description' => '', 'entity' => $targetEntityName, 'conditions' => self::getJoinConditions($keyField['name'], $alias . '.' . $reference->getTargetKey(), $dynamicValue, $dynamicCol), - 'defaults' => self::getJoinDefaults($alias, $targetEntity), + // No default conditions for straight joins as they ought to be direct 1-1 + 'defaults' => [], 'alias' => $alias, 'multi' => FALSE, ]; @@ -506,28 +507,30 @@ class Admin { * @throws \CRM_Core_Exception * @throws \Civi\API\Exception\NotImplementedException */ - private static function getJoinDefaults(string $alias, ...$entities):array { + private static function getJoinDefaults(string $alias, ...$entities): array { $conditions = []; foreach ($entities as $entity) { - foreach ($entity['ui_join_filters'] ?? [] as $fieldName) { - $field = civicrm_api4($entity['name'], 'getFields', [ - 'select' => ['options', 'data_type'], - 'where' => [['name', '=', $fieldName]], + if (!empty($entity['ui_join_filters'])) { + $filterFields = civicrm_api4($entity['name'], 'getFields', [ + 'select' => ['name', 'options', 'data_type'], + 'where' => [['name', 'IN', $entity['ui_join_filters']]], 'loadOptions' => ['name'], - ])->first(); - $value = ''; - if ($field['data_type'] === 'Boolean') { - $value = TRUE; - } - elseif (isset($field['options'][0])) { - $fieldName .= ':name'; - $value = json_encode($field['options'][0]['name']); + ])->indexBy('name'); + foreach ($filterFields as $fieldName => $field) { + $value = ''; + if ($field['data_type'] === 'Boolean') { + $value = TRUE; + } + elseif (isset($field['options'][0])) { + $fieldName .= ':name'; + $value = json_encode($field['options'][0]['name']); + } + $conditions[] = [ + $alias . '.' . $fieldName, + '=', + $value, + ]; } - $conditions[] = [ - $alias . '.' . $fieldName, - '=', - $value, - ]; } } return $conditions; diff --git a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.component.js b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.component.js index a7d79f9360..31d84bba5d 100644 --- a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.component.js +++ b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.component.js @@ -16,10 +16,19 @@ searchMeta.getSearchTasks(ctrl.apiEntity).then(function(tasks) { ctrl.allTasks = tasks; }); + // Set default mode for editing old searches that were created before this setting was added + if (this.display.settings.actions) { + this.display.settings.actions_display_mode = this.display.settings.actions_display_mode || 'menu'; + } }; this.toggleActions = function() { this.display.settings.actions = !this.display.settings.actions; + if (!this.display.settings.actions) { + delete this.display.settings.actions_display_mode; + } else { + this.display.settings.actions_display_mode = 'menu'; + } ctrl.menuOpen = false; }; diff --git a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.html b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.html index b6ae4adc2c..5c9c6c5209 100644 --- a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.html +++ b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/common/searchAdminTasksConfig.html @@ -24,3 +24,7 @@ </ul> </div> </div> +<select ng-if="$ctrl.display.settings.actions" class="form-control" ng-model="$ctrl.display.settings.actions_display_mode"> + <option value="menu">{{:: ts('Dropdown') }}</option> + <option value="buttons">{{:: ts('Buttons') }}</option> +</select> diff --git a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/searchAdminDisplayTable.html b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/searchAdminDisplayTable.html index 9047870ccd..94ff75c591 100644 --- a/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/searchAdminDisplayTable.html +++ b/civicrm/ext/search_kit/ang/crmSearchAdmin/displays/searchAdminDisplayTable.html @@ -18,6 +18,11 @@ <span>{{:: ts('Show nested hierarchy') }}</span> </label> </div> + <select class="form-control" ng-if="$ctrl.display.settings.hierarchical" ng-model="$ctrl.display.settings.collapsible" title="{{:: ts('Should hierarchical tree be collapsible') }}"> + <option value="">{{:: ts('Not collapsible') }}</option> + <option value="open">{{:: ts('Collapsible - Open') }}</option> + <option value="closed">{{:: ts('Collapsible - Closed') }}</option> + </select> </div> <div class="form-inline"> <search-admin-tasks-config display="$ctrl.display" api-entity="$ctrl.apiEntity" api-params="$ctrl.apiParams"></search-admin-tasks-config> diff --git a/civicrm/ext/search_kit/ang/crmSearchAdmin/resultsTable/crmSearchAdminResultsTable.html b/civicrm/ext/search_kit/ang/crmSearchAdmin/resultsTable/crmSearchAdminResultsTable.html index b6b0e653cb..0a78256345 100644 --- a/civicrm/ext/search_kit/ang/crmSearchAdmin/resultsTable/crmSearchAdminResultsTable.html +++ b/civicrm/ext/search_kit/ang/crmSearchAdmin/resultsTable/crmSearchAdminResultsTable.html @@ -1,7 +1,7 @@ <div class="crm-search-display crm-search-display-table"> <div class="form-inline"> <div class="btn-group" ng-include="'~/crmSearchDisplay/SearchButton.html'"></div> - <crm-search-tasks-menu ids="$ctrl.selectedRows" task-manager="$ctrl.taskManager"></crm-search-tasks-menu> + <crm-search-tasks-menu ids="$ctrl.selectedRows" task-manager="$ctrl.taskManager" display-mode="'menu'"></crm-search-tasks-menu> <span ng-include="'~/crmSearchDisplay/ResultCount.html'"></span> </div> <table class="{{:: $ctrl.settings.classes.join(' ') }}"> diff --git a/civicrm/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js b/civicrm/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js index 2ed8d61528..4f568d5d53 100644 --- a/civicrm/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js +++ b/civicrm/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js @@ -2,7 +2,7 @@ "use strict"; // Trait provides base methods and properties common to all search display types - angular.module('crmSearchDisplay').factory('searchDisplayBaseTrait', function(crmApi4, crmStatus) { + angular.module('crmSearchDisplay').factory('searchDisplayBaseTrait', function($timeout, $interval, crmApi4, crmStatus) { // Return a base trait shared by all search display controllers // Gets mixed in using angular.extend() @@ -45,26 +45,37 @@ // Integrations can pass in `total-count="somevar" to keep track of the number of results returned // FIXME: Additional hack to directly update tabHeader for contact summary tab. It would be better to // decouple the contactTab code into a separate directive that checks totalCount. - var contactTab = $element.closest('.crm-contact-page .ui-tabs-panel').attr('id'); - if (contactTab || ctrl.hasOwnProperty('totalCount')) { + let contactTab = $element.closest('.crm-contact-page .ui-tabs-panel').attr('id'); + // Only the first display in a tab gets to control the count + if (contactTab && !$element.is($('#' + contactTab + ' [search][display]').first())) { + contactTab = null; + } + let hasCounter = contactTab || ctrl.hasOwnProperty('totalCount'); + if (hasCounter) { $scope.$watch('$ctrl.rowCount', function(rowCount) { // Update totalCount only if no user filters are set if (typeof rowCount === 'number' && angular.equals({}, ctrl.getAfformFilters())) { - ctrl.totalCount = rowCount; - // The first display in a tab gets to control the count - if (contactTab && $element.is($('#' + contactTab + ' [search][display]').first())) { - CRM.tabHeader.updateCount(contactTab.replace('contact-', '#tab_'), rowCount); - } + setTotalCount(rowCount); } }); } + function setTotalCount(rowCount) { + if (ctrl.hasOwnProperty('totalCount')) { + ctrl.totalCount = rowCount; + } + if (contactTab) { + CRM.tabHeader.updateCount(contactTab.replace('contact-', '#tab_'), rowCount); + } + } + // Popup forms in this display or surrounding Afform trigger a refresh $element.closest('form').on('crmPopupFormSuccess crmFormSuccess', function() { ctrl.rowCount = null; ctrl.getResultsPronto(); }); + // When filters are changed, trigger callbacks and refresh search (if there's no search button) function onChangeFilters() { ctrl.page = 1; ctrl.rowCount = null; @@ -85,22 +96,60 @@ } if (this.afFieldset) { - $scope.$watch(this.afFieldset.getFieldData, onChangeFilters, true); // Add filter title to Afform - this.onPostRun.push(function(apiResults) { + this.onPostRun.push(function (apiResults) { if (apiResults.run.labels && apiResults.run.labels.length && $scope.$parent.addTitle) { $scope.$parent.addTitle(apiResults.run.labels.join(' ')); } }); } - if (this.settings.pager && this.settings.pager.expose_limit) { - $scope.$watch('$ctrl.limit', onChangePageSize); + + // Set up watches to refresh search results when needed. + // Because `angular.$watch` runs immediately as well as on subsequent changes, + // this also kicks off the first run of the search (if there's no search button). + function setUpWatches() { + if (ctrl.afFieldset) { + $scope.$watch(ctrl.afFieldset.getFieldData, onChangeFilters, true); + } + if (ctrl.settings.pager && ctrl.settings.pager.expose_limit) { + $scope.$watch('$ctrl.limit', onChangePageSize); + } + $scope.$watch('$ctrl.filters', onChangeFilters, true); + } + + // If the search display is visible, go ahead & run it + if ($element.is(':visible')) { + setUpWatches(); + } + // Wait until display is visible + else { + let checkVisibility = $interval(() => { + if ($element.is(':visible')) { + $interval.cancel(checkVisibility); + setUpWatches(); + } + }, 250); } - $scope.$watch('$ctrl.filters', onChangeFilters, true); + + // Manually fetch total count if: + // - there is a counter (e.g. a contact summary tab) + // - and the search is hidden or not set to auto-run + // - or afform filters are present which would interfere with an accurate total + // (wait a brief timeout to allow more important things to happen first) + $timeout(function() { + if (hasCounter && (!(ctrl.loading || ctrl.results) || !angular.equals({}, ctrl.getAfformFilters()))) { + var params = ctrl.getApiParams('row_count'); + // Exclude afform filters + params.filters = ctrl.filters; + crmApi4('SearchDisplay', 'run', params).then(function(result) { + setTotalCount(result.count); + }); + } + }, 900); }, hasExtraFirstColumn: function() { - return this.settings.actions || this.settings.draggable || (this.settings.tally && this.settings.tally.label); + return this.settings.actions || this.settings.draggable || this.settings.collapsible || (this.settings.tally && this.settings.tally.label); }, getFilters: function() { diff --git a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html index 733524da68..f932165bac 100644 --- a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html +++ b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html @@ -2,7 +2,7 @@ <div class="alert alert-info crm-search-display-description" ng-if="$ctrl.settings.description">{{:: $ctrl.settings.description }}</div> <div class="form-inline"> <div class="btn-group" ng-include="'~/crmSearchDisplay/SearchButton.html'" ng-if="$ctrl.settings.button"></div> - <crm-search-tasks-menu ng-if="$ctrl.settings.actions && $ctrl.taskManager" ids="$ctrl.selectedRows" task-manager="$ctrl.taskManager"></crm-search-tasks-menu> + <crm-search-tasks-menu ng-if="$ctrl.settings.actions && $ctrl.taskManager" ids="$ctrl.selectedRows" task-manager="$ctrl.taskManager" display-mode="$ctrl.settings.actions_display_mode || 'menu'"></crm-search-tasks-menu> <span ng-if="$ctrl.settings.headerCount" ng-include="'~/crmSearchDisplay/ResultCount.html'"></span> <div class="form-group pull-right" ng-include="'~/crmSearchDisplay/toolbar.html'" ng-if="$ctrl.toolbar"></div> </div> diff --git a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTableBody.html b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTableBody.html index 481d222c3b..c2d0ba981f 100644 --- a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTableBody.html +++ b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTableBody.html @@ -1,9 +1,10 @@ -<tr ng-repeat="(rowIndex, row) in $ctrl.results" data-entity-id="{{:: row.key }}"> +<tr ng-repeat="(rowIndex, row) in $ctrl.results" data-entity-id="{{:: row.key }}" ng-if="!row.hidden"> <td ng-if=":: $ctrl.hasExtraFirstColumn()" class="crm-search-ctrl-column {{:: row.cssClass }}"> <span ng-if=":: $ctrl.settings.draggable" class="crm-draggable" title="{{:: ts('Drag to reposition') }}"> <i class="crm-i fa-arrows-v"></i> </span> <input ng-if=":: $ctrl.settings.actions" type="checkbox" ng-checked="$ctrl.isRowSelected(row)" ng-click="$ctrl.toggleRow(row, $event)" ng-disabled="!!$ctrl.loadingAllRows"> + <crm-search-display-toggle-collapse ng-if=":: $ctrl.settings.collapsible" rows="$ctrl.results" row-index="rowIndex"></crm-search-display-toggle-collapse> </td> <td ng-repeat="(colIndex, colData) in row.columns" ng-include="'~/crmSearchDisplay/colType/' + $ctrl.settings.columns[colIndex].type + '.html'" title="{{:: colData.title }}" class="crm-search-col-type-{{:: $ctrl.settings.columns[colIndex].type }} {{:: row.cssClass }} {{:: colData.cssClass }}" data-field-name="{{:: colData.edit.value_key }}"> </td> diff --git a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.component.js b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.component.js new file mode 100644 index 0000000000..369b8e1857 --- /dev/null +++ b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.component.js @@ -0,0 +1,63 @@ +(function(angular, $, _) { + "use strict"; + + angular.module('crmSearchDisplayTable').component('crmSearchDisplayToggleCollapse', { + bindings: { + rows: '<', + rowIndex: '<', + }, + templateUrl: '~/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.html', + controller: function($scope, $element) { + const ts = $scope.ts = CRM.ts('org.civicrm.search_kit'), + ctrl = this; + + this.$onInit = function() { + const row = this.getRow(); + if (row.collapsed && row.data._descendents) { + row.collapsed = false; + this.toggleCollapsed(); + } else { + row.collapsed = false; + } + // Button is irrelevant without any descendents; hide it without breaking the layout. + if (!row.data._descendents) { + $element.css('visibility', 'hidden'); + } + }; + + this.getRow = function () { + return this.rows[this.rowIndex]; + }; + + this.isCollapsed = function() { + return this.getRow().collapsed && this.getRow().data._descendents; + }; + + this.countDescendents = function () { + return this.getRow().data._descendents; + }; + + this.toggleCollapsed = function() { + const row = this.getRow(); + row.collapsed = !row.collapsed; + + let descendentsEnd = this.rowIndex + row.data._descendents; + for (let i = this.rowIndex + 1; i <= descendentsEnd; i++) { + let hide = row.collapsed; + // We're past the end of the page + if (!ctrl.rows[i]) { + return; + } + ctrl.rows[i].hidden = hide; + // Hiding rows is simple, just hide all of them, but when un-hiding we need to skip over + // the children of collapsed elements. + if (!hide && ctrl.rows[i].collapsed) { + i += ctrl.rows[i].data._descendents; + } + } + }; + + } + }); + +})(angular, CRM.$, CRM._); diff --git a/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.html b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.html new file mode 100644 index 0000000000..2aaafc8277 --- /dev/null +++ b/civicrm/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayToggleCollapse.html @@ -0,0 +1,4 @@ +<button class="btn" type="button" title="{{:: ts('Show sub-rows') }}" ng-click="$ctrl.toggleCollapsed()"> + <i class="crm-i" ng-class="{'fa-caret-right': $ctrl.isCollapsed(), 'fa-caret-down': !$ctrl.isCollapsed()}"></i> + <span ng-show="$ctrl.isCollapsed()">{{:: $ctrl.countDescendents() }}</span> +</button> diff --git a/civicrm/ext/search_kit/ang/crmSearchPage.module.js b/civicrm/ext/search_kit/ang/crmSearchPage.module.js index a11836662e..e088558421 100644 --- a/civicrm/ext/search_kit/ang/crmSearchPage.module.js +++ b/civicrm/ext/search_kit/ang/crmSearchPage.module.js @@ -8,18 +8,28 @@ // Load & render a SearchDisplay $routeProvider.when('/display/:savedSearchName/:displayName?', { controller: 'crmSearchPageDisplay', - // Dynamic template generates the directive for each display type template: '<h1 crm-page-title>{{:: $ctrl.display.label }}</h1>\n' + - '<form ng-include="\'~/crmSearchPage/displayType/\' + $ctrl.display.type + \'.html\'" id="bootstrap-theme"></form>', + '<form id="bootstrap-theme">' + + // Edit link for authorized users + ' <div class="pull-right btn-group" ng-if="$ctrl.editLink">' + + ' <a class="btn btn-sm" ng-href="{{:: $ctrl.editLink }}"><i class="crm-i fa-pencil"></i> {{:: ts("Edit Search") }}</a>' + + ' </div>' + + // Dynamic template generates the directive for each display type + // @see \Civi\Search\Display::getPartials() + ' <div ng-include="\'~/crmSearchPage/displayType/\' + $ctrl.display.type + \'.html\'"></div>' + + '</form>', resolve: { // Load saved search display info: function($route, crmApi4) { var params = $route.current.params; var apiCalls = { search: ['SavedSearch', 'get', { - select: ['name', 'api_entity'], - where: [['name', '=', params.savedSearchName]] - }, 0] + select: ['id', 'name', 'api_entity'], + where: [['name', '=', params.savedSearchName]], + chain: { + checkAccess: ['SavedSearch', 'checkAccess', {action: 'update', values: {id: '$id'}}, 0], + }, + }, 0], }; if (params.displayName) { apiCalls.display = ['SearchDisplay', 'get', { @@ -38,10 +48,13 @@ // Controller for displaying a search .controller('crmSearchPageDisplay', function($scope, $location, info) { - var ctrl = $scope.$ctrl = this; + const ctrl = $scope.$ctrl = this; + const ts = $scope.ts = CRM.ts('org.civicrm.search_kit'); this.display = info.display; this.searchName = info.search.name; this.apiEntity = info.search.api_entity; + // Format edit link if user has access + this.editLink = info.search.checkAccess.access ? CRM.url('civicrm/admin/search#/edit/' + info.search.id) : false; $scope.$watch(function() {return $location.search();}, function(params) { ctrl.filters = params; diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.component.js b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.component.js index 9267fc09dd..1da0fd0aa6 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.component.js +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.component.js @@ -4,16 +4,19 @@ angular.module('crmSearchTasks').component('crmSearchInput', { bindings: { field: '<', - 'op': '<', - 'format': '<', - 'optionKey': '<' + op: '<', + format: '<', + optionKey: '<', + showLabel: '<', }, require: {ngModel: 'ngModel'}, templateUrl: '~/crmSearchTasks/crmSearchInput/crmSearchInput.html', controller: function($scope) { - var ts = $scope.ts = CRM.ts('org.civicrm.search_kit'), + const ts = $scope.ts = CRM.ts('org.civicrm.search_kit'), ctrl = this; + this.domId = 'search-input-' + Math.random().toString(36).substr(2, 9); + this.$onInit = function() { $scope.$watch('$ctrl.value', function() { diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.html index 3f3a110dfb..98b88a7579 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.html +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInput.html @@ -1,13 +1,16 @@ +<label ng-if="$ctrl.showLabel && $ctrl.field.label" for="{{:: $ctrl.domId }}"> + {{ $ctrl.field.label }} +</label> <div ng-switch="$ctrl.op || ''" class="form-group"> <div ng-switch-when="BETWEEN|NOT BETWEEN" ng-switch-when-separator="|" class="form-group"> - <crm-search-input-val field="$ctrl.field" op="'>'" option-key="$ctrl.optionKey" ng-model="$ctrl.value[0]" class="form-group"></crm-search-input-val> + <crm-search-input-val field="$ctrl.field" op="'>'" option-key="$ctrl.optionKey" ng-model="$ctrl.value[0]" class="form-group" label-id="{{:: $ctrl.domId }}"></crm-search-input-val> - <crm-search-input-val field="$ctrl.field" op="'<'" option-key="$ctrl.optionKey" ng-model="$ctrl.value[1]" class="form-group"></crm-search-input-val> </div> <div ng-switch-default class="form-group"> - <crm-search-input-val field="$ctrl.field" op="$ctrl.op" option-key="$ctrl.optionKey" ng-model="$ctrl.value" class="form-group"></crm-search-input-val> + <crm-search-input-val field="$ctrl.field" op="$ctrl.op" option-key="$ctrl.optionKey" ng-model="$ctrl.value" class="form-group" label-id="{{:: $ctrl.domId }}"></crm-search-input-val> </div> </div> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js index 8225a2f7e8..692edd958b 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js @@ -5,7 +5,8 @@ bindings: { field: '<', 'op': '<', - 'optionKey': '<' + 'optionKey': '<', + labelId: '@', }, require: {ngModel: 'ngModel'}, template: '<div class="form-group" ng-include="$ctrl.getTemplate()"></div>', diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/date.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/date.html index f5c7508be3..00e632119e 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/date.html +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/date.html @@ -1,5 +1,5 @@ <div class="form-group"> - <select class="form-control" ng-if="$ctrl.isMulti() === false" ng-model="$ctrl.dateType" ng-change="$ctrl.changeDateType()"> + <select id="{{:: $ctrl.labelId }}" class="form-control" ng-if="$ctrl.isMulti() === false" ng-model="$ctrl.dateType" ng-change="$ctrl.changeDateType()"> <option value="fixed">{{:: ts('Pick Date') }}</option> <option value="range">{{:: ts('Date Range') }}</option> <option value="now">{{:: ts('Now') }}</option> @@ -10,8 +10,8 @@ <div class="form-group" ng-switch="$ctrl.dateType"> <div class="form-group" ng-switch-when="fixed"> - <input class="form-control" crm-ui-datepicker="{time: $ctrl.field.data_type === 'Timestamp'}" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" ng-if="!$ctrl.isMulti()"> - <input class="form-control" crm-multi-select-date ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" ng-if="$ctrl.isMulti()"> + <input class="form-control" crm-ui-datepicker="{time: $ctrl.field.data_type === 'Timestamp'}" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" ng-if="!$ctrl.isMulti()"> + <input class="form-control" crm-multi-select-date ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" ng-if="$ctrl.isMulti()"> </div> <div class="form-group" ng-switch-when="range"> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html index 26e2bf84a5..7103359bd6 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/email.html @@ -1,6 +1,6 @@ <div class="form-group" ng-if="!$ctrl.isMulti()" > - <input type="email" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable"> + <input type="email" class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required"> </div> <div class="form-group" ng-if="$ctrl.isMulti()" > - <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list> + <input class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list> </div> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/float.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/float.html index e6da4f7c9f..f9c9202dd2 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/float.html +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/float.html @@ -1,6 +1,6 @@ <div class="form-group" ng-if="!$ctrl.isMulti()" > - <input type="number" step="any" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable"> + <input type="number" step="any" class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required"> </div> <div class="form-group" ng-if="$ctrl.isMulti()" > - <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list> + <input class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list> </div> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/integer.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/integer.html index d578956db5..d91b385db2 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/integer.html +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/integer.html @@ -1,6 +1,6 @@ <div class="form-group" ng-if="!$ctrl.isMulti()" > - <input type="number" step="1" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable"> + <input type="number" step="1" class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required"> </div> <div class="form-group" ng-if="$ctrl.isMulti()" > - <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list> + <input class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list> </div> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/text.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/text.html index 71a043d276..65068cdfc6 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/text.html +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchInput/text.html @@ -1,6 +1,6 @@ <div class="form-group" ng-if="!$ctrl.isMulti()" > - <input type="text" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable"> + <input type="text" class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required"> </div> <div class="form-group" ng-if="$ctrl.isMulti()" > - <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list> + <input class="form-control" ng-model="$ctrl.value" id="{{:: $ctrl.labelId }}" ng-required="!$ctrl.field.nullable || $ctrl.field.required" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list> </div> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.ctrl.js b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.ctrl.js index b2fc595374..fed074981f 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.ctrl.js +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.ctrl.js @@ -9,11 +9,30 @@ this.entityTitle = this.getEntityTitle(); - // If no confirmation message, skip straight to processing - if (!ctrl.apiBatch.confirmMsg) { + // If no selectable fields or confirmation message, skip straight to processing + if (!ctrl.apiBatch.confirmMsg && !ctrl.apiBatch.fields) { ctrl.start(ctrl.apiBatch.params); } + if (ctrl.apiBatch.fields) { + ctrl.apiBatch.params = ctrl.apiBatch.params || {}; + ctrl.apiBatch.params.values = ctrl.apiBatch.params.values || {}; + // Set values from field defaults + ctrl.apiBatch.fields.forEach((field) => { + let value = ''; + if ('default_value' in field) { + value = field.default_value; + } else if (field.serialize || field.data_type === 'Array') { + value = []; + } else if (field.data_type === 'Boolean') { + value = true; + } else if (field.options && field.options.length) { + value = field.options[0].id; + } + ctrl.apiBatch.params.values[field.name] = value; + }); + } + this.onSuccess = function(result) { var entityTitle = this.getEntityTitle(result.batchCount); CRM.alert(ts(ctrl.apiBatch.successMsg, {1: result.batchCount, 2: entityTitle}), ts('%1 Complete', {1: ctrl.taskTitle}), 'success'); diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.html index 6352890efb..f8f4517e77 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.html +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskApiBatch.html @@ -1,6 +1,9 @@ <div id="bootstrap-theme" crm-dialog="crmSearchTask"> - <form ng-controller="crmSearchTaskApiBatch as $ctrl"> + <form name="crmSearchTaskApiBatchForm" ng-controller="crmSearchTaskApiBatch as $ctrl"> <p><strong ng-if="model.apiBatch.confirmMsg">{{:: ts(model.apiBatch.confirmMsg, {1: model.ids.length, 2: $ctrl.entityTitle}) }}</strong></p> + <div class="form-inline" ng-repeat="field in model.apiBatch.fields"> + <crm-search-input class="form-group" ng-model="model.apiBatch.params.values[field.name]" field="field" show-label="true"></crm-search-input> + </div> <hr /> <div ng-if="$ctrl.run" class="crm-search-task-progress"> <h5>{{:: ts(model.apiBatch.runMsg, {1: model.ids.length, 2: $ctrl.entityTitle}) }}</h5> @@ -8,6 +11,6 @@ </div> <crm-dialog-button text="ts('Cancel')" icons="{primary: 'fa-times'}" on-click="$ctrl.cancel()" disabled="$ctrl.run" ></crm-dialog-button> - <crm-dialog-button ng-if="model.apiBatch.confirmMsg" text="model.taskTitle" icons="{primary: $ctrl.run ? 'fa-spin fa-spinner' : 'fa-check'}" on-click="$ctrl.start(model.apiBatch.params)" disabled="$ctrl.run" ></crm-dialog-button> + <crm-dialog-button ng-if="model.apiBatch.confirmMsg || model.apiBatch.fields" text="model.taskTitle" icons="{primary: $ctrl.run ? 'fa-spin fa-spinner' : 'fa-check'}" on-click="$ctrl.start(model.apiBatch.params)" disabled="$ctrl.run || !crmSearchTaskApiBatchForm.$valid" ></crm-dialog-button> </form> </div> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.ctrl.js b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.ctrl.js index 042d94cae7..e7e3639635 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.ctrl.js +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.ctrl.js @@ -18,10 +18,8 @@ loadOptions: ['id', 'name', 'label', 'description', 'color', 'icon'], where: [['deprecated', '=', false], ["readonly", "=", false]], }], - entityInfo: ['Entity', 'get', {select: ['primary_key'], where: [['name', '=', this.entity]]}, 0] }).then(function(results) { ctrl.fields = results.getFields; - ctrl.idField = results.entityInfo.primary_key[0]; }); this.updateField = function(index) { @@ -39,7 +37,7 @@ if (ctrl.add) { var field = ctrl.getField(ctrl.add), value = ''; - if (field.serialize) { + if (field.serialize || field.data_type === 'Array') { value = []; } else if (field.data_type === 'Boolean') { value = true; diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.html index 411329fb9c..74dcb42dbb 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.html +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTaskUpdate.html @@ -10,7 +10,7 @@ </div> <div ng-if="$ctrl.run" class="crm-search-task-progress"> <h5>{{:: ts('Updating %1 %2...', {1: model.ids.length, 2: $ctrl.entityTitle}) }}</h5> - <crm-search-batch-runner entity="model.entity" action="update" params="$ctrl.run" ids="model.ids" success="$ctrl.onSuccess()" error="$ctrl.onError()" id-field="{{:: $ctrl.idField }}"></crm-search-batch-runner> + <crm-search-batch-runner entity="model.entity" action="update" params="$ctrl.run" ids="model.ids" success="$ctrl.onSuccess()" error="$ctrl.onError()" id-field="{{:: $ctrl.entityInfo.primary_key[0] }}"></crm-search-batch-runner> </div> <crm-dialog-button text="ts('Cancel')" icons="{primary: 'fa-times'}" on-click="$ctrl.cancel()" disabled="$ctrl.run" ></crm-dialog-button> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-buttons.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-buttons.html new file mode 100644 index 0000000000..48cf2ec44c --- /dev/null +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-buttons.html @@ -0,0 +1,8 @@ +<button type="button" + class="btn btn-default crm-search-task-button" + ng-disabled="!$ctrl.isActionAllowed(action)" + ng-repeat="action in $ctrl.taskManager.tasks" + title="{{ $ctrl.getActionTitle(action) }}" + ng-click="$ctrl.doAction(action)"> + <i class="crm-i {{:: action.icon }}"></i> {{:: action.title }} +</button> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-menu.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-menu.html new file mode 100644 index 0000000000..d09c1ff546 --- /dev/null +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasks-menu.html @@ -0,0 +1,18 @@ +<button type="button" + ng-disabled="!$ctrl.taskManager.isDisplayReady()" + ng-click="$ctrl.openMenu = true; $ctrl.taskManager.getMetadata();" + class="btn dropdown-toggle btn-default crm-search-task-menu" + title="{{:: ts('Perform action on selected items.') }}" + data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" +> + <i class="crm-i fa-pencil"></i> + {{:: ts('Action') }} <span class="caret"></span> +</button> +<ul class="dropdown-menu" ng-if="$ctrl.openMenu"> + <li ng-class="{disabled: !$ctrl.isActionAllowed(action)}" ng-repeat="action in $ctrl.taskManager.tasks" title="{{ $ctrl.getActionTitle(action) }}"> + <a href ng-click="$ctrl.doAction(action); $ctrl.openMenu = false;"><i class="crm-i {{:: action.icon }}"></i> {{:: action.title }}</a> + </li> + <li class="disabled" ng-if="!$ctrl.taskManager.tasks"> + <a href><i class="crm-i fa-spinner fa-spin"></i></a> + </li> +</ul> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.component.js b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.component.js index f8fd366bf0..1a2a1e4cf7 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.component.js +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.component.js @@ -4,9 +4,10 @@ angular.module('crmSearchTasks').component('crmSearchTasksMenu', { bindings: { taskManager: '<', + displayMode: '<', ids: '<' }, - templateUrl: '~/crmSearchTasks/crmSearchTasksMenu.html', + template: '<div class="btn-group" ng-include="\'~/crmSearchTasks/crmSearchTasks-\'+$ctrl.displayMode+\'.html\'"></div>', controller: function($scope) { var ts = $scope.ts = CRM.ts('org.civicrm.search_kit'), ctrl = this; diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.html b/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.html deleted file mode 100644 index 8f460d1519..0000000000 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/crmSearchTasksMenu.html +++ /dev/null @@ -1,20 +0,0 @@ -<div class="btn-group"> - <button type="button" - ng-disabled="!$ctrl.taskManager.isDisplayReady()" - ng-click="$ctrl.openMenu = true; $ctrl.taskManager.getMetadata();" - class="btn dropdown-toggle btn-default" - title="{{:: ts('Perform action on selected items.') }}" - data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" - > - <i class="crm-i fa-pencil"></i> - {{:: ts('Action') }} <span class="caret"></span> - </button> - <ul class="dropdown-menu" ng-if="$ctrl.openMenu"> - <li ng-class="{disabled: !$ctrl.isActionAllowed(action)}" ng-repeat="action in $ctrl.taskManager.tasks" title="{{ $ctrl.getActionTitle(action) }}"> - <a href ng-click="$ctrl.doAction(action); $ctrl.openMenu = false;"><i class="crm-i {{:: action.icon }}"></i> {{:: action.title }}</a> - </li> - <li class="disabled" ng-if="!$ctrl.taskManager.tasks"> - <a href><i class="crm-i fa-spinner fa-spin"></i></a> - </li> - </ul> -</div> diff --git a/civicrm/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js b/civicrm/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js index fd525aaa17..a7d7c62420 100644 --- a/civicrm/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js +++ b/civicrm/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js @@ -234,6 +234,11 @@ } else if (status === 'success' && !editedRow && apiResults.run && apiResults.run[0]) { const mngr = this.taskManager; + // If tasks are shown as buttons, they need to be loaded right away + if (this.settings.actions_display_mode === 'buttons') { + mngr.getMetadata(); + return; + } // If results contain a link to a task, prefetch task info to prevent latency when clicking the link _.each(apiResults.run[0].columns, function(column) { if ((column.link && column.link.task) || _.find(column.links || [], 'task')) { diff --git a/civicrm/ext/search_kit/css/crmSearchDisplayTable.css b/civicrm/ext/search_kit/css/crmSearchDisplayTable.css index 0c345856e1..776844b386 100644 --- a/civicrm/ext/search_kit/css/crmSearchDisplayTable.css +++ b/civicrm/ext/search_kit/css/crmSearchDisplayTable.css @@ -31,12 +31,17 @@ table.crm-sticky-header > thead > tr { position: sticky !important; top: var(--crm-menubar-bottom, 0px); + z-index: 2; } /* Nested styling for hierarchical rows */ #bootstrap-theme .crm-search-display-table tr td.crm-hierarchical-row { position: relative; } +#bootstrap-theme .crm-search-display-table crm-search-display-toggle-collapse { + position: relative; + z-index: 1; +} /* Depth >= 1 */ #bootstrap-theme .crm-search-display-table tr td.crm-hierarchical-child:first-child:not(.crm-search-ctrl-column), #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-child { @@ -53,6 +58,9 @@ table.crm-sticky-header > thead > tr { border-bottom: 2px dotted currentColor; border-left: 2px dotted currentColor; } +#bootstrap-theme .crm-search-display-table .crm-hierarchical-depth-1 crm-search-display-toggle-collapse { + left: 30px; +} /* Depth = 2 */ #bootstrap-theme .crm-search-display-table tr td.crm-hierarchical-depth-2:first-child:not(.crm-search-ctrl-column), #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-2 { @@ -62,6 +70,9 @@ table.crm-sticky-header > thead > tr { #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-2:before { left: 45px; } +#bootstrap-theme .crm-search-display-table .crm-hierarchical-depth-2 crm-search-display-toggle-collapse { + left: 60px; +} /* Depth = 3 */ #bootstrap-theme .crm-search-display-table tr td.crm-hierarchical-depth-3:first-child:not(.crm-search-ctrl-column), #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-3 { @@ -71,6 +82,9 @@ table.crm-sticky-header > thead > tr { #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-3:before { left: 75px; } +#bootstrap-theme .crm-search-display-table .crm-hierarchical-depth-3 crm-search-display-toggle-collapse { + left: 90px; +} /* Depth = 4 */ #bootstrap-theme .crm-search-display-table tr td.crm-hierarchical-depth-4:first-child:not(.crm-search-ctrl-column), #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-4 { @@ -80,3 +94,6 @@ table.crm-sticky-header > thead > tr { #bootstrap-theme .crm-search-display-table tr td.crm-search-ctrl-column + td.crm-hierarchical-depth-4:before { left: 105px; } +#bootstrap-theme .crm-search-display-table .crm-hierarchical-depth-4 crm-search-display-toggle-collapse { + left: 120px; +} diff --git a/civicrm/ext/search_kit/templates/CRM/Search/Help/DisplayTypeEntity.hlp b/civicrm/ext/search_kit/templates/CRM/Search/Help/DisplayTypeEntity.hlp index d7f2c9eef9..ccb07e4c47 100644 --- a/civicrm/ext/search_kit/templates/CRM/Search/Help/DisplayTypeEntity.hlp +++ b/civicrm/ext/search_kit/templates/CRM/Search/Help/DisplayTypeEntity.hlp @@ -1,4 +1,4 @@ {htxt id="entity_permission"} <p>{ts}Set the permission level needed to view this entity.{/ts}</p> - <p>{ts}Users without this permission will not be able to see this entity in SearchKit.{/ts}</p> + <p>{ts}Users without this permission will not be able to see this entity in SearchKit nor in any search queries or displays that use this entity.{/ts}</p> {/htxt} diff --git a/civicrm/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php b/civicrm/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php index 2902241644..d0bf93d508 100644 --- a/civicrm/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php +++ b/civicrm/ext/search_kit/tests/phpunit/Civi/Search/AdminTest.php @@ -126,6 +126,36 @@ class AdminTest extends Api4TestBase { 'multi' => FALSE, ]); $this->assertCount(1, $optionValueToGroup); + + // Location joins + $addressJoins = \CRM_Utils_Array::findAll($joins['Individual'], [ + 'entity' => 'Address', + 'multi' => TRUE, + ]); + $this->assertCount(1, $addressJoins); + $this->assertEquals( + [['id', '=', 'Contact_Address_contact_id.contact_id']], + $addressJoins[0]['conditions'] + ); + $this->assertEquals( + [['Contact_Address_contact_id.is_primary', '=', TRUE]], + $addressJoins[0]['defaults'] + ); + + // LocBlock joins + $locBlockAddress = \CRM_Utils_Array::findAll($joins['LocBlock'], [ + 'entity' => 'Address', + ]); + $this->assertCount(2, $locBlockAddress); + $this->assertEquals( + [['address_id', '=', 'LocBlock_Address_address_id.id']], + $locBlockAddress[0]['conditions'] + ); + // Should have no defaults because it's a straight 1-1 join + $this->assertEquals( + [], + $locBlockAddress[0]['defaults'] + ); } public function testEntityRefGetJoins(): void { diff --git a/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/EntityDisplayTest.php b/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/EntityDisplayTest.php index b9f564215a..da6eaa2165 100644 --- a/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/EntityDisplayTest.php +++ b/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/EntityDisplayTest.php @@ -38,7 +38,9 @@ class EntityDisplayTest extends Api4TestBase { 'api_entity' => 'Contact', 'api_params' => [ 'version' => 4, - 'select' => ['id', 'first_name', 'last_name', 'prefix_id:label', 'created_date', 'modified_date'], + // The select clause is intentionally in a different order than the columns below, and with an extra column + // To test the matching between columns and the select clause. + 'select' => ['id', 'last_name', 'UPPER(first_name) AS first', 'middle_name', 'prefix_id:label', 'created_date', 'modified_date'], 'where' => [['last_name', '=', $lastName]], ], ]); @@ -56,7 +58,7 @@ class EntityDisplayTest extends Api4TestBase { 'type' => 'field', ], [ - 'key' => 'first_name', + 'key' => 'first', 'label' => 'First Name', 'type' => 'field', ], @@ -110,9 +112,9 @@ class EntityDisplayTest extends Api4TestBase { $this->assertSame('Integer', $getFields['id']['data_type']); $this->assertSame('EntityRef', $getFields['id']['input_type']); $this->assertSame('Contact', $getFields['id']['fk_entity']); - $this->assertSame('String', $getFields['first_name']['data_type']); - $this->assertSame('Text', $getFields['first_name']['input_type']); - $this->assertNull($getFields['first_name']['fk_entity']); + $this->assertSame('String', $getFields['first']['data_type']); + $this->assertSame('Text', $getFields['first']['input_type']); + $this->assertNull($getFields['first']['fk_entity']); $this->assertSame('Integer', $getFields['prefix_id']['data_type']); $this->assertSame('Select', $getFields['prefix_id']['input_type']); $this->assertNull($getFields['prefix_id']['fk_entity']); @@ -124,8 +126,9 @@ class EntityDisplayTest extends Api4TestBase { $rows = \CRM_Core_DAO::executeQuery('SELECT * FROM civicrm_sk_my_new_entity ORDER BY `_row`')->fetchAll(); $this->assertCount(3, $rows); - $this->assertEquals('a', $rows[0]['first_name']); - $this->assertEquals('c', $rows[2]['first_name']); + $this->assertEquals('A', $rows[0]['first']); + $this->assertEquals('C', $rows[2]['first']); + $this->assertEquals($lastName, $rows[2]['last_name']); // Add a contact $this->createTestRecord('Contact', [ @@ -136,15 +139,15 @@ class EntityDisplayTest extends Api4TestBase { \CRM_Core_Config::singleton()->userPermissionClass->permissions = ['view all contacts']; $rows = civicrm_api4('SK_MyNewEntity', 'get', [ - 'select' => ['first_name', 'prefix_id:label'], + 'select' => ['first', 'prefix_id:label'], 'orderBy' => ['_row' => 'ASC'], ]); $this->assertCount(4, $rows); - $this->assertEquals('a', $rows[0]['first_name']); + $this->assertEquals('A', $rows[0]['first']); $this->assertEquals('Dr.', $rows[1]['prefix_id:label']); - $this->assertEquals('b', $rows[1]['first_name']); - $this->assertEquals('b2', $rows[2]['first_name']); - $this->assertEquals('c', $rows[3]['first_name']); + $this->assertEquals('B', $rows[1]['first']); + $this->assertEquals('B2', $rows[2]['first']); + $this->assertEquals('C', $rows[3]['first']); $this->assertEquals('Ms.', $rows[3]['prefix_id:label']); // Ensure entity_permission setting is enforced diff --git a/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php b/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php index f4e4aed239..b9d097fac2 100644 --- a/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php +++ b/civicrm/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php @@ -1357,7 +1357,7 @@ class SearchRunTest extends Api4TestBase implements TransactionalInterface { $this->assertEquals('text-center', $result[0]['columns'][0]['cssClass']); // First contact is deceased, gets strikethrough class $this->assertEquals('strikethrough', $result[0]['cssClass']); - $this->assertNotEquals('strikethrough', $result[1]['cssClass']); + $this->asserttrue(empty($result[1]['cssClass'])); // Ensure the view contact link was formed $this->assertStringContainsString('cid=' . $contacts[0]['id'], $result[0]['columns'][1]['links'][0]['url']); $this->assertEquals('_blank', $result[0]['columns'][1]['links'][0]['target']); @@ -2305,6 +2305,116 @@ class SearchRunTest extends Api4TestBase implements TransactionalInterface { $this->assertCount(1, $result[1]['columns'][1]['links']); } + public function testLinksWithGroupBy() { + $contacts = $this->saveTestRecords('Individual', [ + 'records' => [ + ['first_name' => 'A', 'last_name' => 'A'], + ['first_name' => 'B', 'last_name' => 'B'], + ], + ]); + $contributions = $this->saveTestRecords('Contribution', [ + 'records' => [ + ['contact_id' => $contacts[0]['id']], + ['contact_id' => $contacts[1]['id']], + ], + ]); + $params = [ + 'checkPermissions' => FALSE, + 'return' => 'page:1', + 'savedSearch' => [ + 'api_entity' => 'Contribution', + 'api_params' => [ + 'version' => 4, + 'select' => [ + 'id', + 'contact_id', + 'contact_id.sort_name', + 'total_amount', + 'financial_type_id:label', + ], + 'orderBy' => [], + 'where' => [ + ['id', 'IN', $contributions->column('id')], + ], + 'groupBy' => [ + 'id', + ], + 'join' => [ + [ + 'Contact AS Contribution_Contact_contact_id_01', + 'LEFT', + [ + 'contact_id', + '=', + 'Contribution_Contact_contact_id_01.id', + ], + ], + ], + ], + ], + 'display' => [ + 'type' => 'table', + 'label' => 'testDisplay', + 'settings' => [ + 'description' => NULL, + 'sort' => [], + 'limit' => 50, + 'pager' => [], + 'placeholder' => 5, + 'columns' => [ + [ + 'type' => 'field', + 'key' => 'id', + 'dataType' => 'Integer', + 'label' => 'Contribution ID', + 'sortable' => TRUE, + ], + [ + 'type' => 'field', + 'key' => 'contact_id.sort_name', + 'dataType' => 'String', + 'label' => 'Contact Sort Name', + 'sortable' => TRUE, + 'link' => [ + 'path' => '', + 'entity' => 'Contact', + 'action' => 'view', + 'join' => 'contact_id', + 'target' => '', + ], + 'title' => 'View Contact', + ], + [ + 'type' => 'field', + 'key' => 'total_amount', + 'dataType' => 'Money', + 'label' => 'Total Amount', + 'sortable' => TRUE, + ], + [ + 'type' => 'field', + 'key' => 'financial_type_id:label', + 'dataType' => 'Integer', + 'label' => 'Financial Type', + 'sortable' => TRUE, + ], + ], + 'actions' => TRUE, + 'classes' => [ + 'table', + 'table-striped', + ], + ], + ], + ]; + + $result = civicrm_api4('SearchDisplay', 'run', $params); + $this->assertCount(2, $result); + + $this->assertCount(1, $result[0]['columns'][1]['links']); + $this->assertCount(1, $result[1]['columns'][1]['links']); + } + public function testContactTypeIcons(): void { $this->createTestRecord('ContactType', [ 'label' => 'Star', diff --git a/civicrm/ext/standaloneusers/CRM/Standaloneusers/BAO/User.php b/civicrm/ext/standaloneusers/CRM/Standaloneusers/BAO/User.php index 11bc84e228..4ca25ea203 100644 --- a/civicrm/ext/standaloneusers/CRM/Standaloneusers/BAO/User.php +++ b/civicrm/ext/standaloneusers/CRM/Standaloneusers/BAO/User.php @@ -48,12 +48,24 @@ class CRM_Standaloneusers_BAO_User extends CRM_Standaloneusers_DAO_User implemen * @param \Civi\Core\Event\PreEvent $event */ public static function self_hook_civicrm_pre(\Civi\Core\Event\PreEvent $event) { - if ( - in_array($event->action, ['create', 'edit'], TRUE) && - empty($event->params['when_updated']) - ) { - // Track when_updated. - $event->params['when_updated'] = date('YmdHis'); + if (in_array($event->action, ['create', 'edit'], TRUE)) { + if (empty($event->params['when_updated'])) { + // Track when_updated. + $event->params['when_updated'] = date('YmdHis'); + } + if (empty($event->params['uf_name'])) { + // If no email is specified, fetch from contact + $contactId = $event->params['contact_id'] ?? NULL; + + if ($contactId) { + $email = \Civi\Api4\Contact::get(FALSE) + ->addWhere('id', '=', $contactId) + ->addSelect('email_primary.email') + ->execute()->single()['email_primary.email'] ?? NULL; + + $event->params['uf_name'] = $email; + } + } } } diff --git a/civicrm/ext/standaloneusers/CRM/Standaloneusers/Page/Login.php b/civicrm/ext/standaloneusers/CRM/Standaloneusers/Page/Login.php index ea1adafaff..4a1c485011 100644 --- a/civicrm/ext/standaloneusers/CRM/Standaloneusers/Page/Login.php +++ b/civicrm/ext/standaloneusers/CRM/Standaloneusers/Page/Login.php @@ -1,12 +1,10 @@ <?php use CRM_Standaloneusers_ExtensionUtil as E; -use Civi\Standalone\Security; class CRM_Standaloneusers_Page_Login extends CRM_Core_Page { public function run() { - Security::singleton()->getLoggedInUfID(); - if (CRM_Core_Session::singleton()->get('ufID')) { + if (CRM_Core_Config::singleton()->userSystem->isUserLoggedIn()) { // Already logged in. CRM_Utils_System::redirect('/civicrm'); } @@ -26,7 +24,7 @@ class CRM_Standaloneusers_Page_Login extends CRM_Core_Page { * Log out. */ public static function logout() { - Security::singleton()->logoutUser(); + CRM_Core_Config::singleton()->userSystem->logout(); // Dump them back on the log-IN page. CRM_Utils_System::redirect('/civicrm/login?justLoggedOut'); } diff --git a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/Login.php b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/Login.php index 0467729911..e9d1b66c6f 100644 --- a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/Login.php +++ b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/Login.php @@ -107,8 +107,8 @@ class Login extends AbstractAction { return; } $security = Security::singleton(); - $user = $security->loadUserByName($this->username); - if (!$security->checkPassword($this->password, $user['hashed_password'] ?? '')) { + $userID = $security->checkPassword($this->username, $this->password); + if (!$userID) { $result['publicError'] = "Invalid credentials"; return; } @@ -126,7 +126,7 @@ class Login extends AbstractAction { case 0: // MFA not enabled. - $this->loginUser($user['id']); + $this->loginUser($userID); $result['url'] = $successUrl; return; @@ -134,13 +134,13 @@ class Login extends AbstractAction { // MFA enabled. Store data in a pendingLogin key on session. // @todo expose the 120s timeout to config? \CRM_Core_Session::singleton()->set('pendingLogin', [ - 'userID' => $user['id'], + 'userID' => $userID, 'username' => $this->username, 'expiry' => time() + 120, 'successUrl' => $successUrl, ]); $mfaClass = $mfaClasses[0]; - $mfa = new $mfaClass($user['id']); + $mfa = new $mfaClass($userID); // Return the URL for the MFA form. $result['url'] = $mfa->getFormUrl(); break; @@ -153,8 +153,7 @@ class Login extends AbstractAction { } protected function loginUser(int $userID) { - $authx = new \Civi\Authx\Standalone(); - $authx->loginSession($userID); + _authx_uf()->loginSession($userID); } } diff --git a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/PasswordReset.php b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/PasswordReset.php index 6e71dd1cde..b4c01b9cfc 100644 --- a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/PasswordReset.php +++ b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/PasswordReset.php @@ -39,8 +39,7 @@ class PasswordReset extends AbstractAction { // todo: some minimum password quality check? // Only valid change here is password, for a known ID. - $security = Security::singleton(); - $userID = $security->checkPasswordResetToken($this->token); + $userID = Security::singleton()->checkPasswordResetToken($this->token); if (!$userID) { throw new API_Exception("Invalid token."); } diff --git a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/WriteTrait.php b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/WriteTrait.php index f99d6e3b01..547cc95354 100644 --- a/civicrm/ext/standaloneusers/Civi/Api4/Action/User/WriteTrait.php +++ b/civicrm/ext/standaloneusers/Civi/Api4/Action/User/WriteTrait.php @@ -75,15 +75,10 @@ trait WriteTrait { $loggedInUserID = \CRM_Utils_System::getLoggedInUfID() ?? FALSE; $hasAdminPermission = \CRM_Core_Permission::check(['cms:administer users']); $authenticatedAsLoggedInUser = FALSE; - $security = Security::singleton(); // Check that we have the logged-in-user's password. if ($this->actorPassword && $loggedInUserID) { - $storedHashedPassword = \Civi\Api4\User::get(FALSE) - ->addWhere('id', '=', $loggedInUserID) - ->addSelect('hashed_password') - ->execute() - ->single()['hashed_password']; - if (!$security->checkPassword($this->actorPassword, $storedHashedPassword)) { + $user = \CRM_Core_Config::singleton()->userSystem->getUserById($loggedInUserID); + if (!_authx_uf()->checkPassword($user['username'], $this->actorPassword)) { throw new UnauthorizedException("Incorrect password"); } $authenticatedAsLoggedInUser = TRUE; diff --git a/civicrm/ext/standaloneusers/Civi/Authx/Standalone.php b/civicrm/ext/standaloneusers/Civi/Authx/Standalone.php index 0fe4c66466..c2d0c944f8 100644 --- a/civicrm/ext/standaloneusers/Civi/Authx/Standalone.php +++ b/civicrm/ext/standaloneusers/Civi/Authx/Standalone.php @@ -19,33 +19,48 @@ class Standalone implements AuthxInterface { * @inheritDoc */ public function checkPassword(string $username, string $password) { - $security = Security::singleton(); - $user = $security->loadUserByName($username); - return $security->checkPassword($password, $user['hashed_password'] ?? '') ? $user['id'] : NULL; + return Security::singleton()->checkPassword($username, $password); } /** * @inheritDoc */ public function loginSession($userId) { - $user = Security::singleton()->loadUserByID($userId); - Security::singleton()->loginAuthenticatedUserRecord($user, TRUE); + $this->loginStateless($userId); + + $session = \CRM_Core_Session::singleton(); + $session->set('ufID', $userId); + + // Identify the contact + $user = \Civi\Api4\User::get(FALSE) + ->addWhere('id', '=', $userId) + ->execute() + ->single(); + + // Confusingly, Civi stores it's *Contact* ID as *userID* on the session. + $session->set('userID', $user['contact_id'] ?? NULL); + + if (!empty($user['language'])) { + $session->set('lcMessages', $user['language']); + } } /** * @inheritDoc */ public function logoutSession() { + global $loggedInUserId; + $loggedInUserId = NULL; \CRM_Core_Session::singleton()->reset(); - session_destroy(); + // session_destroy(); } /** * @inheritDoc */ public function loginStateless($userId) { - $user = Security::singleton()->loadUserByID($userId); - Security::singleton()->loginAuthenticatedUserRecord($user, FALSE); + global $loggedInUserId; + $loggedInUserId = $userId; } /** diff --git a/civicrm/ext/standaloneusers/Civi/Standalone/Security.php b/civicrm/ext/standaloneusers/Civi/Standalone/Security.php index 56cb567c70..a41f50828f 100644 --- a/civicrm/ext/standaloneusers/Civi/Standalone/Security.php +++ b/civicrm/ext/standaloneusers/Civi/Standalone/Security.php @@ -2,18 +2,25 @@ namespace Civi\Standalone; use Civi\Crypto\Exception\CryptoException; -use CRM_Core_Session; use Civi; use Civi\Api4\User; use Civi\Api4\MessageTemplate; use CRM_Standaloneusers_WorkflowMessage_PasswordReset; /** - * This is a single home for security related functions for Civi Standalone. + * Security related functions for Standaloneusers. * - * Things may yet move around in the codebase; at the time of writing this helps - * keep core PRs to a minimum. + * This is closely coupled with CRM_Utils_System_Standalone + * Many functions there started life here when Standalone + * was being resurrected. * + * Some of the generic user functions have been moved back to the + * System class so that they are more permanently available. + * + * Things may yet move around in the codebase - particularly if + * alternative user extensions to Standaloneusers are developed as + * these would then need to share an interface with the System + * class */ class Security { @@ -53,7 +60,10 @@ class Security { } // NULL means the current logged-in user - $userID ??= $this->getLoggedInUfID() ?? 0; + $userID = $userID ?? \CRM_Utils_System::getLoggedInUfID(); + + // now any falsey userid is equivalent to userID = 0 = anonymous user + $userID = $userID ?: 0; if (!isset(\Civi::$statics[__METHOD__][$userID])) { @@ -88,218 +98,42 @@ class Security { } /** + * High level function to encrypt password using the site-default mechanism. */ - public function getUserIDFromUsername(string $username): ?int { - return \Civi\Api4\User::get(FALSE) - ->addWhere('username', '=', $username) - ->execute() - ->first()['id'] ?? NULL; + public function hashPassword(string $plaintext): string { + // For now, we just implement D7's but this should be configurable. + // Sites should be able to move from one password hashing algo to another + // e.g. if a vulnerability is discovered. + $algo = new \Civi\Standalone\PasswordAlgorithms\Drupal7(); + return $algo->hashPassword($plaintext); } /** - * Load an active user by username. + * Standaloneusers implementation of AuthxInterface::checkPassword * - * @return array|bool FALSE if not found. + * @return int|NULL + * The User id, if check was successful, otherwise NULL + * @see \Civi\Authx\Standalone */ - public function loadUserByName(string $username) { + public function checkPassword(string $username, string $plaintextPassword): ?int { $user = \Civi\Api4\User::get(FALSE) ->addWhere('username', '=', $username) ->addWhere('is_active', '=', TRUE) - ->execute()->first() ?? []; - if ($user) { - return $user; - } - return FALSE; - } - - /** - * Load an active user by internal user ID. - * - * @return array|bool FALSE if not found. - */ - public function loadUserByID(int $userID) { - $user = \Civi\Api4\User::get(FALSE) - ->addWhere('id', '=', $userID) - ->addWhere('is_active', '=', TRUE) - ->execute()->first() ?? []; - if ($user) { - return $user; - } - return FALSE; - } - - /** - * - */ - public function logoutUser() { - // This is the same call as in CRM_Authx_Page_AJAX::logout() - _authx_uf()->logoutSession(); - } - - /** - * Create a user in the CMS. - * - * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method. - * - * @param array $params keys: - * - 'cms_name' - * - 'cms_pass' plaintext password - * - 'notify' boolean - * @param string $emailParam - * Name of the $param which contains the email address. - * - * @return int|bool - * uid if user was created, false otherwise - */ - public function createUser(&$params, $emailParam) { - try { - $email = $params[$emailParam]; - $userID = User::create(FALSE) - ->addValue('username', $params['cms_name']) - ->addValue('uf_name', $email) - ->addValue('password', $params['cms_pass']) - ->addValue('contact_id', $params['contact_id'] ?? NULL) - // ->addValue('uf_id', 0) // does not work without this. - ->execute()->single()['id']; - } - catch (\Exception $e) { - \Civi::log()->warning("Failed to create user '$email': " . $e->getMessage()); - return FALSE; - } - - // @todo This next line is what Drupal does, but it's unclear why. - // I think it assumes we want to be logged in as this contact, and as there's no uf match, it's not in civi. - // But I'm not sure if we are always becomming this user; I'm not sure waht calls this function. - // CRM_Core_Config::singleton()->inCiviCRM = FALSE; - - return (int) $userID; - } - - /** - * Update a user's email - * - * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method. - */ - public function updateCMSName($ufID, $email) { - \Civi\Api4\User::update(FALSE) - ->addWhere('id', '=', $ufID) - ->addValue('uf_name', $email) - ->execute(); - } - - /** - * Authenticate the user against the CMS db. - * - * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method. - * - * @param string $name - * The user name. - * @param string $password - * The password for the above user. - * @param bool $loadCMSBootstrap - * Load cms bootstrap?. - * @param string $realPath - * Filename of script - * - * @return array|bool - * [contactID, ufID, unique string] else false if no auth - * @throws \CRM_Core_Exception. - */ - public function authenticate($name, $password, $loadCMSBootstrap = FALSE, $realPath = NULL) { - - // this comment + session lines: copied from Drupal's implementation in case it's important... - /* Before we do any loading, let's start the session and write to it. - * We typically call authenticate only when we need to bootstrap the CMS - * directly via Civi and hence bypass the normal CMS auth and bootstrap - * process typically done in CLI and cron scripts. See: CRM-12648 - */ - $session = CRM_Core_Session::singleton(); - $session->set('civicrmInitSession', TRUE); - - $user = $this->loadUserByName($name); + ->addSelect('hashed_password', 'id') + ->execute() + ->first(); - if (!$this->checkPassword($password, $user['password'] ?? '')) { - return FALSE; + if ($user && $this->checkHashedPassword($plaintextPassword, $user['hashed_password'])) { + return $user['id']; } - - $this->applyLocaleFromUser($user); - - // Note: random_int is more appropriate for cryptographical use than mt_rand - // The long number is the max 32 bit value. - return [$user['contact_id'], $user['id'], random_int(0, 2147483647)]; - } - - /** - * Register the given user as the currently logged in user. - */ - public function loginAuthenticatedUserRecord(array $user, bool $withSession) { - global $loggedInUserId, $loggedInUser; - $loggedInUserId = $user['id']; - $loggedInUser = $user; - - if ($withSession) { - $session = \CRM_Core_Session::singleton(); - $session->set('ufID', $user['id']); - - // Identify the contact - $contactID = civicrm_api3('UFMatch', 'get', [ - 'sequential' => 1, - 'return' => ['contact_id'], - 'uf_id' => $user['id'], - ])['values'][0]['contact_id'] ?? NULL; - // Confusingly, Civi stores it's *Contact* ID as *userID* on the session. - $session->set('userID', $contactID); - $this->applyLocaleFromUser($user); - } - } - - /** - * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method. - */ - public function isUserLoggedIn(): bool { - return !empty($this->getLoggedInUfID()); - } - - /** - * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method. - */ - public function getLoggedInUfID(): ?int { - $authX = new \Civi\Authx\Standalone(); - return $authX->getCurrentUserId(); - } - - /** - * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method. - */ - public function languageNegotiationURL($url, $addLanguagePart = TRUE, $removeLanguagePart = FALSE) { - // @todo - return $url; - } - - /** - * This is the (perhaps temporary location for) the implementation of CRM_Utils_System_Standalone method. - * Return the CMS-specific url for its permissions page - * @return array - */ - public function getCMSPermissionsUrlParams() { - return ['ufAccessURL' => '/civicrm/admin/roles']; - } - - /** - * High level function to encrypt password using the site-default mechanism. - */ - public function hashPassword(string $plaintext): string { - // For now, we just implement D7's but this should be configurable. - // Sites should be able to move from one password hashing algo to another - // e.g. if a vulnerability is discovered. - $algo = new \Civi\Standalone\PasswordAlgorithms\Drupal7(); - return $algo->hashPassword($plaintext); + return NULL; } /** * Check whether a password matches a hashed version. + * @return bool */ - public function checkPassword(string $plaintextPassword, string $storedHashedPassword): bool { + protected function checkHashedPassword(string $plaintextPassword, string $storedHashedPassword): bool { if (preg_match('@^\$S\$[A-Za-z./0-9]{52}$@', $storedHashedPassword)) { // Looks like a default D7 password. @@ -452,17 +286,4 @@ class Security { return $workflowMessage; } - /** - * Applies the locale from the user record. - * - * @param array $user - * @return void - */ - private function applyLocaleFromUser(array $user) { - $session = CRM_Core_Session::singleton(); - if (!empty($user['language'])) { - $session->set('lcMessages', $user['language']); - } - } - } diff --git a/civicrm/ext/standaloneusers/ang/afformEditUserAccount.aff.html b/civicrm/ext/standaloneusers/ang/afformEditUserAccount.aff.html index 7df8b3b1c9..24b5cb1871 100644 --- a/civicrm/ext/standaloneusers/ang/afformEditUserAccount.aff.html +++ b/civicrm/ext/standaloneusers/ang/afformEditUserAccount.aff.html @@ -4,7 +4,7 @@ <af-field name="roles" /> <af-field name="username" /> <af-field name="contact_id" defn="{required: true, input_attrs: {quickAdd: ['civicrm/quick-add/Individual']}}" /> - <af-field name="uf_name" /> + <af-field name="uf_name" defn="{help_pre: ts('Email used for password resets.'), input_attrs: {placeholder: ts('Leave blank to use the primary email from the selected contact')}}" /> <af-field name="is_active" /> <af-field name="timezone" defn="{help_pre: ts('Set the timezone of the user. Date and times will be shown in this timezone. You can also leave it empty to use the default system timezone (which is a server setting).'), input_attrs: {placeholder: ts('Server default timezone')}}" /> <af-field name="language" defn="{help_pre: ts('Set the user interface language of this user. You can also leave it empty to use the default system language.'), input_attrs: {placeholder: ts('System default language')}}" /> diff --git a/civicrm/ext/standaloneusers/css/standalone.css b/civicrm/ext/standaloneusers/css/standalone.css index cf25602f91..659ed53f09 100644 --- a/civicrm/ext/standaloneusers/css/standalone.css +++ b/civicrm/ext/standaloneusers/css/standalone.css @@ -1,5 +1,5 @@ .standalone-page-padding { - padding: 1px 3vw 1rem; + padding: 1px max(10px, 1vw) 1rem; } html.crm-standalone nav.breadcrumb>ol { diff --git a/civicrm/ext/standaloneusers/templates/CRM/Standaloneusers/Page/Login.tpl b/civicrm/ext/standaloneusers/templates/CRM/Standaloneusers/Page/Login.tpl index a17ab1b2a7..ffd6b71ff0 100644 --- a/civicrm/ext/standaloneusers/templates/CRM/Standaloneusers/Page/Login.tpl +++ b/civicrm/ext/standaloneusers/templates/CRM/Standaloneusers/Page/Login.tpl @@ -3,8 +3,9 @@ <form id=login-form> <img class="crm-logo" src="{$logoUrl}" alt="logo for CiviCRM, with an intersecting blue and green triangle"> {if $justLoggedOut}<div class="help message info">{ts}You have been logged out.{/ts}</div>{/if} - {if $anonAccessDenied}<div class="help message warning">{ts}You do not have permission to access that, you may - need to login.{/ts}</div>{/if} + {if $anonAccessDenied}<div class="help message warning"> + {ts}You do not have permission to access that. You may need to login.{/ts} + </div>{/if} {if $sessionLost}<div class="help message warning">{ts}Your session timed out.{/ts}</div>{/if} <div class="input-wrapper"> <label for="usernameInput" name=username class="form-label">Username</label> diff --git a/civicrm/ext/standaloneusers/tests/phpunit/Civi/Api4/Action/UserTest.php b/civicrm/ext/standaloneusers/tests/phpunit/Civi/Api4/Action/UserTest.php index 797783d6df..487d902c89 100644 --- a/civicrm/ext/standaloneusers/tests/phpunit/Civi/Api4/Action/UserTest.php +++ b/civicrm/ext/standaloneusers/tests/phpunit/Civi/Api4/Action/UserTest.php @@ -8,10 +8,9 @@ use Civi\Api4\User; use Civi\Api4\Role; use Civi\Api4\UserRole; use Civi\Api4\Contact; -use Civi\Standalone\Security; /** - * FIXME - Add test description. + * Test the Standaloneusers User Api4 actions * * Tips: * - With HookInterface, you may implement CiviCRM hooks directly in the test class. @@ -92,41 +91,21 @@ class UserTest extends \PHPUnit\Framework\TestCase implements EndToEndInterface, } } - /** - * Note I thought I could use \Civi\Authx\Standalone::logoutSession() - * but it calls session_destroy which messes up future tests. - * - * Not sure if there is a generic logout without session destroy. - * - */ public function ensureLoggedOut() { - global $loggedInUserId, $loggedInUser; - - if (\CRM_Utils_System::getLoggedInUfID()) { - \CRM_Core_Session::singleton()->reset(); - $loggedInUser = $loggedInUserId = NULL; - } + \CRM_Utils_System::logout(); } public function tearDown():void { - $this->deleteStuffWeMade(); + // only tear down if we set up + if (CIVICRM_UF === 'Standalone') { + $this->ensureLoggedOut(); + $this->deleteStuffWeMade(); + } parent::tearDown(); } protected function loginUser($userID) { - $security = Security::singleton(); - $user = \Civi\Api4\User::get(FALSE) - ->addWhere('id', '=', $userID) - ->execute()->first(); - - $contactID = civicrm_api3('UFMatch', 'get', [ - 'sequential' => 1, - 'return' => ['contact_id'], - 'uf_id' => $user['id'], - ])['values'][0]['contact_id'] ?? NULL; - $this->assertNotNull($contactID); - /** @var \Civi\Standalone\Security $security */ - $security->loginAuthenticatedUserRecord($user, FALSE); + _authx_uf()->loginSession($userID); } /** diff --git a/civicrm/ext/standaloneusers/tests/phpunit/Civi/Standalone/SecurityTest.php b/civicrm/ext/standaloneusers/tests/phpunit/Civi/Standalone/SecurityTest.php index e08e65d63a..d91db2d8ef 100644 --- a/civicrm/ext/standaloneusers/tests/phpunit/Civi/Standalone/SecurityTest.php +++ b/civicrm/ext/standaloneusers/tests/phpunit/Civi/Standalone/SecurityTest.php @@ -6,7 +6,7 @@ use Civi\Test\TransactionalInterface; use Civi\Api4\User; /** - * FIXME - Add test description. + * Test Security flows in Standalone * * Tips: * - With HookInterface, you may implement CiviCRM hooks directly in the test class. @@ -52,7 +52,6 @@ class SecurityTest extends \PHPUnit\Framework\TestCase implements EndToEndInterf } protected function loginUser($userID) { - $security = Security::singleton(); $user = \Civi\Api4\User::get(FALSE) ->addWhere('id', '=', $userID) ->execute()->first(); @@ -63,8 +62,8 @@ class SecurityTest extends \PHPUnit\Framework\TestCase implements EndToEndInterf 'uf_id' => $user['id'], ])['values'][0]['contact_id'] ?? NULL; $this->assertNotNull($contactID); - /** @var \Civi\Standalone\Security $security */ - $security->loginAuthenticatedUserRecord($user, FALSE); + + \CRM_Core_Config::singleton()->userSystem->loadUser($user['username']); } public function testCheckPassword():void { @@ -75,8 +74,8 @@ class SecurityTest extends \PHPUnit\Framework\TestCase implements EndToEndInterf ->execute()->single(); // Test that the password can be checked ok. - $this->assertTrue($security->checkPassword('secret1', $user['hashed_password'])); - $this->assertFalse($security->checkPassword('some other password', $user['hashed_password'])); + $this->assertTrue((bool) $security->checkPassword($user['username'], 'secret1')); + $this->assertFalse((bool) $security->checkPassword($user['username'], 'some other password')); } public function testPerms() { @@ -209,7 +208,7 @@ class SecurityTest extends \PHPUnit\Framework\TestCase implements EndToEndInterf $this->assertEquals(1, $result['success']); $user = User::get(FALSE)->addWhere('id', '=', $userID)->execute()->single(); - $this->assertTrue($security->checkPassword('fingersCrossed', $user['hashed_password'])); + $this->assertTrue((bool) $security->checkPassword($user['username'], 'fingersCrossed')); // Should not work a 2nd time with same token. try { @@ -238,12 +237,6 @@ class SecurityTest extends \PHPUnit\Framework\TestCase implements EndToEndInterf $this->assertNull($security->checkPasswordResetToken($token)); } - public function testGetUserIDFromUsername() { - [$contactID, $adminUserID, $security] = $this->createFixtureContactAndUser(); - $this->assertEquals($adminUserID, $security->getUserIDFromUsername('user_one'), 'Should return admin user ID'); - $this->assertNull($security->getUserIDFromUsername('user_unknown'), 'Should return NULL for non-existent user'); - } - protected function deleteStuffWeMade() { User::delete(FALSE)->addWhere('username', '=', 'testuser1')->execute(); } diff --git a/civicrm/js/crm.ajax.js b/civicrm/js/crm.ajax.js index acc4205f94..2ac8f2295d 100644 --- a/civicrm/js/crm.ajax.js +++ b/civicrm/js/crm.ajax.js @@ -271,7 +271,7 @@ if (url.search(/[&?]snippet=/) < 0) { url += (url.indexOf('?') < 0 ? '?' : '&') + 'snippet=' + snippetType; } else { - url = url.replace(/snippet=[^&]*/, 'snippet=' + snippetType); + url = url.replace(/([&?])snippet=[^&]*/, '$1snippet=' + snippetType); } // See Civi\Angular\AngularLoader if (snippetType === 'json' && CRM.angular) { diff --git a/civicrm/js/version.json b/civicrm/js/version.json index becfe0b468..96adb6d66d 100644 --- a/civicrm/js/version.json +++ b/civicrm/js/version.json @@ -1 +1 @@ -"5.79.1" +"5.80.0" diff --git a/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Notes.mgd.php b/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Notes.mgd.php index b9a376ab58..f22452a09f 100644 --- a/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Notes.mgd.php +++ b/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Notes.mgd.php @@ -202,6 +202,8 @@ return [ ], [ 'size' => 'btn-xs', + 'label' => ts('Row Actions'), + 'label_hidden' => TRUE, 'links' => [ [ 'icon' => 'fa-external-link', diff --git a/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Relationships.mgd.php b/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Relationships.mgd.php index 543bfae401..b9e89f03d7 100644 --- a/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Relationships.mgd.php +++ b/civicrm/managed/contactSummary/SavedSearch_Contact_Summary_Relationships.mgd.php @@ -247,6 +247,8 @@ return [ 'icon' => 'fa-bars', 'links' => $links, 'type' => 'menu', + 'label' => ts('Row Actions'), + 'label_hidden' => TRUE, 'alignment' => 'text-right', ], ], @@ -404,6 +406,8 @@ return [ 'style' => 'default', 'size' => 'btn-xs', 'icon' => 'fa-bars', + 'label' => ts('Row Actions'), + 'label_hidden' => TRUE, 'links' => [ [ 'entity' => 'Relationship', diff --git a/civicrm/release-notes.md b/civicrm/release-notes.md index 46c27d7b36..cc6f13b981 100644 --- a/civicrm/release-notes.md +++ b/civicrm/release-notes.md @@ -15,15 +15,6 @@ Other resources for identifying changes are: * https://github.com/civicrm/civicrm-joomla * https://github.com/civicrm/civicrm-wordpress -## CiviCRM 5.79.1 - -Released November 25, 2024 - -- **[Synopsis](release-notes/5.79.1.md#synopsis)** -- **[Bugs resolved](release-notes/5.79.1.md#bugs)** -- **[Credits](release-notes/5.79.1.md#credits)** -- **[Feedback](release-notes/5.79.1.md#feedback)** - ## CiviCRM 5.79.0 Released November 6, 2024 diff --git a/civicrm/release-notes/5.79.1.md b/civicrm/release-notes/5.79.1.md deleted file mode 100644 index 2052184331..0000000000 --- a/civicrm/release-notes/5.79.1.md +++ /dev/null @@ -1,48 +0,0 @@ -# CiviCRM 5.79.1 - -Released November 25, 2024 - -- **[Synopsis](#synopsis)** -- **[Bugs resolved](#bugs)** -- **[Credits](#credits)** -- **[Feedback](#feedback)** - -## <a name="synopsis"></a>Synopsis - -| *Does this version...?* | | -| --------------------------------------------------------------- | -------- | -| Change the database schema? | no | -| Alter the API? | no | -| **Require attention to configuration options?** | **yes** | -| **Fix problems installing or upgrading to a previous version?** | **yes** | -| Introduce features? | no | -| **Fix bugs?** | **yes** | -| Fix security vulnerabilities? | no | - -## <a name="bugs"></a>Bugs resolved - -* **_CiviContribute_: Accounts are sometimes displayed with internal names instead of labels ([dev/financial#229](https://lab.civicrm.org/dev/financial/-/issues/229): [#31486](https://github.com/civicrm/civicrm-core/pull/31486))** -* **_CiviMail_: When re-using a mailing, date fields are copied incorrectly ([#31522](https://github.com/civicrm/civicrm-core/pull/31522))** -* **_CiviMail_: Concurrent email delivery suffers contention on new date fields ([#31517](https://github.com/civicrm/civicrm-core/pull/31517))** -* **_Installer_: New installs fail when using alternate locales ([dev/core#5590](https://lab.civicrm.org/dev/core/-/issues/5590): [#31482](https://github.com/civicrm/civicrm-core/pull/31482))** -* **_Profiles_: Restore validation of emails ([dev/core#5587](https://lab.civicrm.org/dev/core/-/issues/5587), [dev/core#5560](https://lab.civicrm.org/dev/core/-/issues/5560): [#31455](https://github.com/civicrm/civicrm-core/pull/31455))** -* **_WordPress_: Shortcodes don't render in some themes ([dev/core#5553](https://lab.civicrm.org/dev/core/-/issues/5553): [wordpress#337](https://github.com/civicrm/civicrm-wordpress/pull/337))** - - If shortcodes still do not work with your theme, then toggle the option `civicrm_theme_compatibility_mode`. - -## <a name="credits"></a>Credits - -This release was developed by the following authors and reviewers: - -Wikimedia Foundation - Eileen McNaughton; Tadpole Collective - Kevin Cristiano; MJW -Consulting - Matthew Wire; Megaphone Technology Consulting - Jon Goldberg; JMA Consulting -- Seamus Lee, Monish Deb; Jade Gaunt; heitz.jm; Dave D; CiviCRM - Coleman Watts, Tim -Otten; Christian Wach; Australian Greens - Andrew Cormick-Dockery; ASMAC (American Society -of Music Arrangers and Composers) - Jeff Kellem; Agileware - Justin Freeman, Francis -Whittle - -## <a name="feedback"></a>Feedback - -These release notes are edited by Tim Otten and Andie Hunt. If you'd like to -provide feedback on them, please login to https://chat.civicrm.org/civicrm and -contact `@agh1`. diff --git a/civicrm/release-notes/5.80.0.md b/civicrm/release-notes/5.80.0.md new file mode 100644 index 0000000000..3bbf208608 --- /dev/null +++ b/civicrm/release-notes/5.80.0.md @@ -0,0 +1,491 @@ + +# CiviCRM 5.80.0 + +Released December 4, 2024; + +- **[Features](#features)** +- **[Bugs resolved](#bugs)** +- **[Miscellany](#misc)** +- **[Credits](#credits)** + +## <a name="synopsis"></a>Synopsis + +| *Does this version...?* | | +|:--------------------------------------------------------------- |:-------:| +| Fix security vulnerabilities? | no | +| **Change the database schema?** | **yes** | +| **Alter the API?** | **yes** | +| Require attention to configuration options? | no | +| **Fix problems installing or upgrading to a previous version?** | **yes** | +| **Introduce features?** | **yes** | +| **Fix bugs?** | **yes** | + +## <a name="features"></a>Features + +### Core CiviCRM + +- **SearchKit - Add link to edit search when viewing results + ([31209](https://github.com/civicrm/civicrm-core/pull/31209))** + + Adds a link to edit the search when viewing a SearchKit display. + +- **SearchKit - Support fields in apiBatch task + ([31352](https://github.com/civicrm/civicrm-core/pull/31352))** + + Allows api batch tasks to include fields for the user to interact with. + +- **SearchKit - Improve loading efficiency when multiple search displays are + hidden ([31392](https://github.com/civicrm/civicrm-core/pull/31392))** + + Improves efficiency loading SearchKit displays. + +- **Package RiverLea theme extension during CiviCRM build + ([31527](https://github.com/civicrm/civicrm-core/pull/31527), + [31545](https://github.com/civicrm/civicrm-core/pull/31545), + [31535](https://github.com/civicrm/civicrm-core/pull/31535), + [31389](https://github.com/civicrm/civicrm-core/pull/31389) and + [31478](https://github.com/civicrm/civicrm-core/pull/31478))** + + Adds Riverlea theme extension. + +- **SearchKit suggestion: Multiple action buttons + ([dev/core#5572](https://lab.civicrm.org/dev/core/-/issues/5572): + [31415](https://github.com/civicrm/civicrm-core/pull/31415))** + + Adds the ability to add Actions as buttons to SearchKit + searches. + +- **Advanced Search: compact the Search Settings + ([31226](https://github.com/civicrm/civicrm-core/pull/31226))** + + Makes the Advanced Search screen more web responsive. + +- **EnglishNumber - Create camel-case and hypenated names for 100-999 + ([31277](https://github.com/civicrm/civicrm-core/pull/31277))** + + Adds support for version numbers 5.100 - 5.999. + +- **Optimize Change Log Viewing For A Contact + ([31125](https://github.com/civicrm/civicrm-core/pull/31125))** + + Optimizes the code for viewing the change logs for a contact. + +### CiviContribute + +- **Log payment processor errors that get reported to the user + ([31412](https://github.com/civicrm/civicrm-core/pull/31412))** + + Improves logging of payment processor errors. + +- **Add CustomField support to Products + ([31250](https://github.com/civicrm/civicrm-core/pull/31250))** + + Adds support for custom fields on Products. + +- **Improve product description + ([31288](https://github.com/civicrm/civicrm-core/pull/31288))** + + Improves description for product. + +### CiviMail + +- **Mass SMS: enable access to reports + ([31425](https://github.com/civicrm/civicrm-core/pull/31425))** + + Adds reports for Mass SMS. + +### CiviMember + +- **Membership User Dashboard.tpl adding Recurring links and cleanup + ([31342](https://github.com/civicrm/civicrm-core/pull/31342))** + + Adds recurring links to the membership section of the user dashboard. + +### Standalone Integration + +- **Standalone System - use authx_login for authenticate flow + ([31153](https://github.com/civicrm/civicrm-core/pull/31153))** + + Use the authx_login flow in CRM_Utils_System_Standalone::authenticate. + +## <a name="bugs"></a>Bugs resolved + +### Core CiviCRM + +- **reference to used address is lost - address master_id is set to NULL when + referenced address or owning contact are edited + ([dev/core#5592](https://lab.civicrm.org/dev/core/-/issues/5592): + [31559](https://github.com/civicrm/civicrm-core/pull/31559))** + +- **API v4 explorer: boolean params don't render correctly for CV (short) + ([dev/core#4129](https://lab.civicrm.org/dev/core/-/issues/4129): + [31393](https://github.com/civicrm/civicrm-core/pull/31393))** + +- **Search Kit: DB Entity needs all columns to work + ([dev/core#4629](https://lab.civicrm.org/dev/core/-/issues/4629): + [31328](https://github.com/civicrm/civicrm-core/pull/31328))** + +- **Afform - Reset button click does not refresh the search result once clicked + ([dev/core#4871](https://lab.civicrm.org/dev/core/-/issues/4871): + [31263](https://github.com/civicrm/civicrm-core/pull/31263))** + +- **Group delete confirmation messages gives Confirm Group Delete and not the + group name as the deleted group + ([dev/core#5321](https://lab.civicrm.org/dev/core/-/issues/5321): + [31406](https://github.com/civicrm/civicrm-core/pull/31406))** + +- **Advanced Search initiated from QuickSearch doesn't show default search view + ([dev/core#5437](https://lab.civicrm.org/dev/core/-/issues/5437): + [31052](https://github.com/civicrm/civicrm-core/pull/31052))** + +- **SearchKit: Column links don't work with grouped by searches + ([dev/core#5453](https://lab.civicrm.org/dev/core/-/issues/5453): + [31211](https://github.com/civicrm/civicrm-core/pull/31211))** + +- **API4 Explorer Index + ([dev/core#5515](https://lab.civicrm.org/dev/core/-/issues/5515): + [31251](https://github.com/civicrm/civicrm-core/pull/31251))** + +- **SearchKit: Can't save a DB Entity + ([dev/core#5520](https://lab.civicrm.org/dev/core/-/issues/5520): + [31360](https://github.com/civicrm/civicrm-core/pull/31360))** + +- **Don't require both first and last name when creating contact + ([dev/core#5545](https://lab.civicrm.org/dev/core/-/issues/5545): + [31289](https://github.com/civicrm/civicrm-core/pull/31289))** + +- **SearchKit: CSS issue allows editable fields to show through sticky table + headers ([dev/core#5568](https://lab.civicrm.org/dev/core/-/issues/5568): + [31396](https://github.com/civicrm/civicrm-core/pull/31396))** + +- **5.79 : unable to install with fr_FR locale : broken SQL + ([dev/core#5590](https://lab.civicrm.org/dev/core/-/issues/5590): + [31482](https://github.com/civicrm/civicrm-core/pull/31482))** + +- **Literal `<del>` appears in activity tab when source contact is soft-deleted + ([dev/core#5609](https://lab.civicrm.org/dev/core/-/issues/5609): + [31494](https://github.com/civicrm/civicrm-core/pull/31494))** + +- **Afform - Do not allow DisplayOnly fields to submit + ([31421](https://github.com/civicrm/civicrm-core/pull/31421))** + +- **Afform - add css selector to distinguish multi select af field + ([31316](https://github.com/civicrm/civicrm-core/pull/31316))** + +- **Afform - Fix LocBlock address/email/phone saving + ([31343](https://github.com/civicrm/civicrm-core/pull/31343))** + +- **SearchKit - Fix collapsible toggle + ([31474](https://github.com/civicrm/civicrm-core/pull/31474))** + +- **SearchKit - Make hierarchical tables collapsible + ([31408](https://github.com/civicrm/civicrm-core/pull/31408))** + +- **AuthX [PHP User Deprecation] Permission 'authenticate with password' should + be declared with 'label' and 'description' keys. -> + Update hook_civicrm_permission to use new format + ([dev/core#5551](https://lab.civicrm.org/dev/core/-/issues/5551): + [31356](https://github.com/civicrm/civicrm-core/pull/31356))** + +- **APIv4 - Fix date formatting + ([31422](https://github.com/civicrm/civicrm-core/pull/31422))** + +- **Api4 - Un-duplicate setLegacyDateFormat function + ([31340](https://github.com/civicrm/civicrm-core/pull/31340))** + +- **AdminUI - Add 'sticky-header' to all tables + ([31414](https://github.com/civicrm/civicrm-core/pull/31414))** + +- **Regression: resets text-rendered radio button width in confirmation screens + ([31345](https://github.com/civicrm/civicrm-core/pull/31345))** + +- **SettingsManager::bootSettings - derive $civicrm_root global if not set + ([31335](https://github.com/civicrm/civicrm-core/pull/31335))** + +- **Fix addScriptUrl missing joining / between base and file paths + ([31362](https://github.com/civicrm/civicrm-core/pull/31362))** + +- **Run successful scheduled jobs first + ([29598](https://github.com/civicrm/civicrm-core/pull/29598))** + +- **Add *.boot.setting.php meta for CIVICRM_UF_BASEURL and CIVICRM_DOMAIN_ID + ([31155](https://github.com/civicrm/civicrm-core/pull/31155))** + +- **Api3 Setting.revert - dont swallow errors, fix one reverting constant + settings ([31334](https://github.com/civicrm/civicrm-core/pull/31334))** + +- **Update the help wording for DB Entity permissions + ([31350](https://github.com/civicrm/civicrm-core/pull/31350))** + +- **OAuth - opt into scan-classes to pick up Api4 entities + ([31254](https://github.com/civicrm/civicrm-core/pull/31254))** + +- **FormBuilder: Relative datetime doesn't support time + ([dev/core#5517](https://lab.civicrm.org/dev/core/-/issues/5517): + [31257](https://github.com/civicrm/civicrm-core/pull/31257))** + +- **SearchSegmentExtraField - use AutoService rather than LegacySpecScanner + ([31230](https://github.com/civicrm/civicrm-core/pull/31230))** + +- **SearchDisplay rewrites: don't truncate long field keys + ([31333](https://github.com/civicrm/civicrm-core/pull/31333))** + +- **Increase size of url fields for website/activity + ([31420](https://github.com/civicrm/civicrm-core/pull/31420))** + +- **Drop binding current domain settings bag to CRM_Core_Config on boot + ([30899](https://github.com/civicrm/civicrm-core/pull/30899))** + +- **Advanced Search: icon for the Search Settings + ([31293](https://github.com/civicrm/civicrm-core/pull/31293))** + +- **Avoid duplicate ID on location form + ([31287](https://github.com/civicrm/civicrm-core/pull/31287))** + +- **crmSnippet - Fix regexes to match + ([31349](https://github.com/civicrm/civicrm-core/pull/31349))** + +- **Prevent CiviCRM resources from loading when not in CiviCRM admin + ([331](https://github.com/civicrm/civicrm-wordpress/pull/331))** + +- **Bugfix for windows machines + ([31265](https://github.com/civicrm/civicrm-core/pull/31265))** + +- **Notice fix + ([31434](https://github.com/civicrm/civicrm-core/pull/31434))** + +- **Fix merge + ([31431](https://github.com/civicrm/civicrm-core/pull/31431))** + +- **Fix fatal error if source is unavailable + ([335](https://github.com/civicrm/civicrm-wordpress/pull/335))** + +- **Fix deprecated warning in explode + ([31227](https://github.com/civicrm/civicrm-core/pull/31227))** + +### CiviCase + +- **CiviCase Smarty5 Compatibility: Error "Unknown modifier 'sizeof'" when + editing Case Status + ([dev/core#5516](https://lab.civicrm.org/dev/core/-/issues/5516): + [31256](https://github.com/civicrm/civicrm-core/pull/31256))** + +### CiviCampaign + +- **fix end date field in campaign form + ([31506](https://github.com/civicrm/civicrm-core/pull/31506))** + +- **add parent_id to campaign form entity fields + ([31518](https://github.com/civicrm/civicrm-core/pull/31518))** + +### CiviContribute + +- **Incorrect profile retrieved for tribute profile + ([dev/core#5510](https://lab.civicrm.org/dev/core/-/issues/5510): + [31246](https://github.com/civicrm/civicrm-core/pull/31246))** + +- **financial account mapping column on financial type admin screen shows + english account names + ([dev/financial#229](https://lab.civicrm.org/dev/financial/-/issues/229): + [31486](https://github.com/civicrm/civicrm-core/pull/31486))** + +- **Extract payment function + ([31404](https://github.com/civicrm/civicrm-core/pull/31404))** + +- **Contribution Confirm/ThankYou.tpl cleanup + ([31311](https://github.com/civicrm/civicrm-core/pull/31311))** + +- **Price Field: Field Type: remove help, simplify label + ([31269](https://github.com/civicrm/civicrm-core/pull/31269))** + +- **fix schema for financial type/account to have label_field=label + ([31483](https://github.com/civicrm/civicrm-core/pull/31483))** + +### CiviEvent + +- **Emails no longer validated on event registration + ([dev/core#5587](https://lab.civicrm.org/dev/core/-/issues/5587): + [31455](https://github.com/civicrm/civicrm-core/pull/31455))** + +- **Formbuilder/ event location: for an event creation, Existing event location + cannot be selected if update box is not ticked + ([dev/core#5526](https://lab.civicrm.org/dev/core/-/issues/5526): + [31358](https://github.com/civicrm/civicrm-core/pull/31358))** + +- **Formbuilder: event location is half created : I can see it in Manage events, + but not in Searchkit/ Location address + ([dev/core#5524](https://lab.civicrm.org/dev/core/-/issues/5524): + [31285](https://github.com/civicrm/civicrm-core/pull/31285))** + +- **set NOINDEX on non-public event registration pages + ([dev/core#5449](https://lab.civicrm.org/dev/core/-/issues/5449): + [31083](https://github.com/civicrm/civicrm-core/pull/31083))** + +- **Event confirmation emails do not populate guest details when payment is + confirmed by IPN (API) + ([dev/core#224](https://lab.civicrm.org/dev/core/-/issues/224): + [30374](https://github.com/civicrm/civicrm-core/pull/30374))** + +- **Fix poor quality markup on no events message + ([31329](https://github.com/civicrm/civicrm-core/pull/31329))** + +- **fix typo in ParticipantStatusType entity + ([31252](https://github.com/civicrm/civicrm-core/pull/31252))** + +- **Event Profiles: remove HR tags + ([31383](https://github.com/civicrm/civicrm-core/pull/31383))** + +- **Event Profile: remove the preview button from the popup + ([31384](https://github.com/civicrm/civicrm-core/pull/31384))** + +### Backdrop Integration + +- **FormBuilder on Backdrop does not show fields and elements to drag on to form + ([dev/core#5561](https://lab.civicrm.org/dev/core/-/issues/5561): + [31457](https://github.com/civicrm/civicrm-core/pull/31457))** + +### Drupal Integration + +- **searchkit download to xlsx broken in drupal 10 + ([dev/core#5620](https://lab.civicrm.org/dev/core/-/issues/5620): + [31504](https://github.com/civicrm/civicrm-core/pull/31504))** + +### Standalone Integration + +- **standalone: can no longer login + ([dev/core#5523](https://lab.civicrm.org/dev/core/-/issues/5523): + [31281](https://github.com/civicrm/civicrm-core/pull/31281))** + +- **Standalone: 'Reset Paths' in 'Cleanup Caches and Update Paths' logs the user + out ([dev/core#5406](https://lab.civicrm.org/dev/core/-/issues/5406): + [31418](https://github.com/civicrm/civicrm-core/pull/31418))** + +- **Standalone: timezone handling issues + ([dev/core#5392](https://lab.civicrm.org/dev/core/-/issues/5392): + [31225](https://github.com/civicrm/civicrm-core/pull/31225))** + +- **Disable FollowSymLinks by default in Standalone .htaccess + ([30866](https://github.com/civicrm/civicrm-core/pull/30866))** + +- **email propogation during Standalone user email creation + ([31363](https://github.com/civicrm/civicrm-core/pull/31363))** + +- **change param name for CRM_Core_Permission_Standalone::check to something + that means something. + ([31249](https://github.com/civicrm/civicrm-core/pull/31249))** + +- **Standalone System - bring default Civi::paths factories in line with + installer defaults + ([31150](https://github.com/civicrm/civicrm-core/pull/31150))** + +- **Standalone - Omit trailing `?` from query string + ([31284](https://github.com/civicrm/civicrm-core/pull/31284))** + +- **SettingsManager::bootSettings - fix providing CIVICRM_DSN directly on + Standalone ([31216](https://github.com/civicrm/civicrm-core/pull/31216))** + +- **standalone.css: lower padding around crm-container + ([31361](https://github.com/civicrm/civicrm-core/pull/31361))** + +### WordPress Integration + +- **Shortcodes don't render in my theme in Civi 5.78+ + ([dev/core#5553](https://lab.civicrm.org/dev/core/-/issues/5553): + [337](https://github.com/civicrm/civicrm-wordpress/pull/337))** + +- **revert 151-lab due to issues discovered with shortcode button + ([334](https://github.com/civicrm/civicrm-wordpress/pull/334))** + +## <a name="misc"></a>Miscellany + +- **Slightly more understandable tokens() function + ([31379](https://github.com/civicrm/civicrm-core/pull/31379))** + +- **Clean up the distmaker scripts + ([31325](https://github.com/civicrm/civicrm-core/pull/31325))** + +- **remove outdated references to getSystemDefaults in bootstrap_comments + ([31248](https://github.com/civicrm/civicrm-core/pull/31248))** + +- **Api4 - Remove unused pass-by-ref + ([31245](https://github.com/civicrm/civicrm-core/pull/31245))** + +- **Remove function that was deprecated over 2 years ago + ([31407](https://github.com/civicrm/civicrm-core/pull/31407))** + +- **Remove unreachable noisily deprecated code + ([31242](https://github.com/civicrm/civicrm-core/pull/31242))** + +- **Remove a chunk of unreachable noisily deprecated code + ([31239](https://github.com/civicrm/civicrm-core/pull/31239))** + +- **Remove noisily deprecated unreachable code + ([31223](https://github.com/civicrm/civicrm-core/pull/31223))** + +- **Remove unused variable + ([31368](https://github.com/civicrm/civicrm-core/pull/31368))** + +- **[REF] Standalone System - graduate some functions from + Civi\Standalone\Security to CRM_Utils_System_Standalone and + Civi\Authx\Standalone + ([31127](https://github.com/civicrm/civicrm-core/pull/31127))** + +- **[REF] Update PHPSpreadsheet to latest version in the 1.x series and allow + composer to install the 2.x in D10 + ([31496](https://github.com/civicrm/civicrm-core/pull/31496))** + +- **[REF] AfformGui - Update editOptions code to ES6 + ([31266](https://github.com/civicrm/civicrm-core/pull/31266))** + +- **[REF] Fix empty label accessibility issue on report elements + ([30694](https://github.com/civicrm/civicrm-core/pull/30694))** + +- **[REF] Accessibility fixes in contact summary page + ([30765](https://github.com/civicrm/civicrm-core/pull/30765))** + +- **[REF] Ensure that when copying a mailing the status is reset to draftand + start date and end date are blanked out + ([31522](https://github.com/civicrm/civicrm-core/pull/31522))** + +- **[REF] Fix setting mailing start date when the parent job starts "running" + for delivery rather than when a child job is picked up + ([31517](https://github.com/civicrm/civicrm-core/pull/31517))** + +- **[REF][PHP8.2] Declare properies in CRM_Export_Form_Select + ([31366](https://github.com/civicrm/civicrm-core/pull/31366))** + +- **[REF][PHP8.2] Declare properies in CRM_Contact_Page_View_Tag + ([31367](https://github.com/civicrm/civicrm-core/pull/31367))** + +- **(NFC) Standalone - Tweak grammar + ([31387](https://github.com/civicrm/civicrm-core/pull/31387))** + +- **(Test-Only) Fix MinkBase::login() on WordPress + ([31488](https://github.com/civicrm/civicrm-core/pull/31488))** + +- **Add unit test to validate event + ([31234](https://github.com/civicrm/civicrm-core/pull/31234))** + +## <a name="credits"></a>Credits + +This release was developed by the following code authors: + +AGH Strategies - Andie Hunt; Agileware - Justin Freeman; Artful Robot - Rich +Lott; Benjamin W; BrightMinded Ltd - Bradley Taylor; Christian Wach; CiviCRM - +Coleman Watts, Tim Otten; Coop SymbioTIC - Mathieu Lutfy, Shane Bill; Dave D; +ECOPLAN - Torben Bertram; forumZFD - Marc Michalsky; JMA Consulting - Monish +Deb, Seamus Lee; John Kingsnorth; Lemniscus - Noah Miller; Megaphone Technology +Consulting - Jon Goldberg; MJW Consulting - Matthew Wire; Mosier Consulting - +Justin Mosier; Nicol Wistreich; Outlandish - Rasmus Winter; Parlamentwatch +e.V. - Philipp Michael; Squiffle Consulting - Aidan Saunders; Tadpole +Collective - Kevin Cristiano; Wikimedia Foundation - Eileen McNaughton + +Most authors also reviewed code for this release; in addition, the following +reviewers contributed their comments: + +ASMAC (American Society of Music Arrangers and Composers) - Jeff Kellem; +Australian Greens - Andrew Cormick-Dockery; Blackfly Solutions - Alan Dixon; +Circle Interactive - Dave Jenkins; CiviCRM - Coleman Watts, Tim Otten; +CiviDesk - Yashodha Chaku; Guydn; Humanists UK - Andrew West; Jade Gaunt; +Richard van Oosterhout; Stephen Palmstrom; Third Sector Design - Michael +McAndrew, William Mortada; diff --git a/civicrm/schema/Activity/Activity.entityType.php b/civicrm/schema/Activity/Activity.entityType.php index d3c86bd4b4..58fc0999d5 100644 --- a/civicrm/schema/Activity/Activity.entityType.php +++ b/civicrm/schema/Activity/Activity.entityType.php @@ -146,7 +146,7 @@ return [ ], 'location' => [ 'title' => ts('Location'), - 'sql_type' => 'varchar(255)', + 'sql_type' => 'varchar(2048)', 'input_type' => 'Text', 'description' => ts('Location of the activity (optional, open text).'), 'add' => '1.1', diff --git a/civicrm/schema/Contribute/Product.entityType.php b/civicrm/schema/Contribute/Product.entityType.php index 6f8375e9df..140b0e9f60 100644 --- a/civicrm/schema/Contribute/Product.entityType.php +++ b/civicrm/schema/Contribute/Product.entityType.php @@ -7,7 +7,7 @@ return [ 'getInfo' => fn() => [ 'title' => ts('Product'), 'title_plural' => ts('Products'), - 'description' => ts('able - stores "product info" for premiums and can be used for non-incentive products'), + 'description' => ts('Stores "product info" for premiums and can be used for non-incentive products'), 'log' => TRUE, 'add' => '1.4', 'label_field' => 'name', diff --git a/civicrm/schema/Core/Website.entityType.php b/civicrm/schema/Core/Website.entityType.php index 526ca1856f..4495e74356 100644 --- a/civicrm/schema/Core/Website.entityType.php +++ b/civicrm/schema/Core/Website.entityType.php @@ -48,7 +48,7 @@ return [ ], 'url' => [ 'title' => ts('Website'), - 'sql_type' => 'varchar(255)', + 'sql_type' => 'varchar(2048)', 'input_type' => 'Text', 'description' => ts('Website'), 'add' => '3.2', diff --git a/civicrm/schema/Event/ParticipantStatusType.entityType.php b/civicrm/schema/Event/ParticipantStatusType.entityType.php index 6ce3ad883b..d0ebc9cdd3 100644 --- a/civicrm/schema/Event/ParticipantStatusType.entityType.php +++ b/civicrm/schema/Event/ParticipantStatusType.entityType.php @@ -60,7 +60,7 @@ return [ ], ], 'is_reserved' => [ - 'title' => ts('Participant Status Is Reserved?>'), + 'title' => ts('Participant Status Is Reserved?'), 'sql_type' => 'boolean', 'input_type' => 'CheckBox', 'required' => TRUE, diff --git a/civicrm/schema/Financial/FinancialAccount.entityType.php b/civicrm/schema/Financial/FinancialAccount.entityType.php index 9c41c4fac3..a902adbda1 100644 --- a/civicrm/schema/Financial/FinancialAccount.entityType.php +++ b/civicrm/schema/Financial/FinancialAccount.entityType.php @@ -10,7 +10,7 @@ return [ 'description' => ts('Financial Accounts'), 'log' => TRUE, 'add' => '3.2', - 'label_field' => 'name', + 'label_field' => 'label', ], 'getPaths' => fn() => [ 'add' => 'civicrm/admin/financial/financialAccount/edit?action=add&reset=1', diff --git a/civicrm/schema/Financial/FinancialType.entityType.php b/civicrm/schema/Financial/FinancialType.entityType.php index 049232d9b4..c2027d8627 100644 --- a/civicrm/schema/Financial/FinancialType.entityType.php +++ b/civicrm/schema/Financial/FinancialType.entityType.php @@ -10,7 +10,7 @@ return [ 'description' => ts('Formerly civicrm_contribution_type merged into this table in 4.3'), 'log' => TRUE, 'add' => '1.3', - 'label_field' => 'name', + 'label_field' => 'label', ], 'getPaths' => fn() => [ 'add' => 'civicrm/admin/financial/financialType/edit?action=add&reset=1', diff --git a/civicrm/settings/System.boot.setting.php b/civicrm/settings/Core.boot.setting.php similarity index 80% rename from civicrm/settings/System.boot.setting.php rename to civicrm/settings/Core.boot.setting.php index ee7b16f3e5..fac3eaba33 100644 --- a/civicrm/settings/System.boot.setting.php +++ b/civicrm/settings/Core.boot.setting.php @@ -20,7 +20,6 @@ */ return [ 'installed' => [ - 'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().', 'group_name' => 'CiviCRM Preferences', 'group' => 'core', 'name' => 'installed', @@ -35,7 +34,6 @@ return [ 'help_text' => NULL, ], 'enable_components' => [ - 'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().', 'group_name' => 'CiviCRM Preferences', 'group' => 'core', 'name' => 'enable_components', @@ -60,4 +58,20 @@ return [ 'callback' => 'CRM_Core_SelectValues::getComponentSelectValues', ], ], + 'domain' => [ + 'group_name' => 'CiviCRM Preferences', + 'group' => 'core', + 'name' => 'domain', + 'type' => 'String', + 'default' => 1, + 'title' => ts('CiviCRM Domain ID'), + 'description' => ts('The current domain if CiviCRM is running multi-site.'), + 'help_text' => NULL, + 'is_domain' => 1, + 'is_contact' => 0, + 'is_constant' => TRUE, + 'is_env_loadable' => TRUE, + 'global_name' => 'CIVICRM_DOMAIN_ID', + 'add' => '5.80', + ], ]; diff --git a/civicrm/settings/Url.boot.setting.php b/civicrm/settings/Url.boot.setting.php index 64f30b4a39..0f7f653d54 100644 --- a/civicrm/settings/Url.boot.setting.php +++ b/civicrm/settings/Url.boot.setting.php @@ -18,6 +18,22 @@ * Settings metadata file */ return [ + 'userFrameworkBaseURL' => [ + 'group_name' => 'URL Preferences', + 'group' => 'url', + 'name' => 'userFrameworkBaseURL', + 'type' => 'String', + 'default' => NULL, + 'title' => ts('User Framework Base URL'), + 'description' => ts('The base URL of the user framework or CMS that CiviCRM is running in.'), + 'help_text' => NULL, + 'is_domain' => 1, + 'is_contact' => 0, + 'is_constant' => TRUE, + 'is_env_loadable' => TRUE, + 'global_name' => 'CIVICRM_UF_BASEURL', + 'add' => '5.80', + ], 'userFrameworkResourceURL' => [ 'bootstrap_comment' => 'This is a boot setting which may be loaded during bootstrap. Defaults are loaded via SettingsBag::getSystemDefaults().', 'group' => 'url', diff --git a/civicrm/setup/plugins/init/StandaloneUsers.civi-setup.php b/civicrm/setup/plugins/init/StandaloneUsers.civi-setup.php index 956d0f66bf..bd04a8da33 100644 --- a/civicrm/setup/plugins/init/StandaloneUsers.civi-setup.php +++ b/civicrm/setup/plugins/init/StandaloneUsers.civi-setup.php @@ -161,22 +161,33 @@ if (!defined('CIVI_SETUP')) { ->execute()->indexBy('name'); // Create contact+user for admin. - $contactID = \Civi\Api4\Contact::create(FALSE) - ->setValues([ - 'contact_type' => 'Individual', - 'first_name' => 'Standalone', - 'last_name' => 'Admin', - ]) - ->execute()->first()['id']; + $adminUser = $e->getModel()->extras['adminUser']; + $adminPass = $e->getModel()->extras['adminPass']; $adminEmail = $e->getModel()->extras['adminEmail']; - $params = [ - 'cms_name' => $e->getModel()->extras['adminUser'], - 'cms_pass' => $e->getModel()->extras['adminPass'], - 'email' => $adminEmail, - 'notify' => FALSE, - 'contact_id' => $contactID, - ]; - $userID = \CRM_Core_BAO_CMSUser::create($params, 'email'); + + $contactID = \Civi\Api4\Contact::create(FALSE) + ->addValue('contact_type', 'Individual') + ->addValue('first_name', 'Standalone') + ->addValue('last_name', 'Admin') + ->execute()->single()['id']; + + // add email to the contact + \Civi\Api4\Email::create(FALSE) + ->addValue('contact_id', $contactID) + ->addValue('email', $adminEmail) + ->execute(); + + // NOTE: normally uf_name would be derived automatically + // from the contact email, and roles could be provided using + // the facade on the User entity + // BUT: User BAO pre hooks are not online in the installer + // so we need to do them directly + $userID = \Civi\Api4\User::create(FALSE) + ->addValue('contact_id', $contactID) + ->addValue('username', $adminUser) + ->addValue('password', $adminPass) + ->addValue('uf_name', $adminEmail) + ->execute()->single()['id']; // Assign 'admin' role to user \Civi\Api4\UserRole::create(FALSE) @@ -184,9 +195,9 @@ if (!defined('CIVI_SETUP')) { ->addValue('role_id', $roles['admin']['id']) ->execute(); - $message = "Created new user \"{$e->getModel()->extras['adminUser']}\" (user ID #$userID, contact ID #$contactID) with 'admin' role and "; + $message = "Created new user \"{$adminUser}\" (user ID #$userID, contact ID #$contactID) with 'admin' role and "; $message .= empty($e->getModel()->extras['adminPassWasSpecified']) - ? "random password \"" . ($e->getModel()->extras['adminPass']) . '"' + ? "random password \"" . ($adminPass) . '"' : "specified password"; \Civi::log()->notice($message); diff --git a/civicrm/setup/res/htaccess.txt b/civicrm/setup/res/htaccess.txt index 3fd51c17ef..3f92ecaa00 100644 --- a/civicrm/setup/res/htaccess.txt +++ b/civicrm/setup/res/htaccess.txt @@ -16,8 +16,9 @@ # Don't show directory listings for URLs which map to a directory. Options -Indexes -# Follow symbolic links in this directory. -Options +FollowSymLinks +# Uncomment if you need to follow symbolic links within your Standalone install +# (Disabled by default as some webhosts may not allow this) +# Options +FollowSymLinks # Make CiviCRM handle any 404 errors. ErrorDocument 404 /index.php diff --git a/civicrm/sql/civicrm_generated.mysql b/civicrm/sql/civicrm_generated.mysql index 4e7bd09d14..8a95c030c2 100644 --- a/civicrm/sql/civicrm_generated.mysql +++ b/civicrm/sql/civicrm_generated.mysql @@ -2969,7 +2969,7 @@ UNLOCK TABLES; LOCK TABLES `civicrm_domain` WRITE; /*!40000 ALTER TABLE `civicrm_domain` DISABLE KEYS */; INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES - (1,'Default Domain Name',NULL,'5.79.1',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}'); + (1,'Default Domain Name',NULL,'5.80.0',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}'); /*!40000 ALTER TABLE `civicrm_domain` ENABLE KEYS */; UNLOCK TABLES; diff --git a/civicrm/templates/CRM/Contact/Form/Search/AdvancedCriteria.tpl b/civicrm/templates/CRM/Contact/Form/Search/AdvancedCriteria.tpl index 22228d607f..96d968c329 100644 --- a/civicrm/templates/CRM/Contact/Form/Search/AdvancedCriteria.tpl +++ b/civicrm/templates/CRM/Contact/Form/Search/AdvancedCriteria.tpl @@ -13,7 +13,6 @@ CRM.$(function($) { // Bind first click of accordion header to load crm-accordion-body with snippet // everything else is taken care of by crmAccordions() - $('.crm-search_criteria_basic-accordion summary').addClass('active'); $('.crm-ajax-accordion').on('click', 'summary:not(.active)', function() { loadPanes($(this).attr('id')); }); @@ -87,15 +86,7 @@ CRM.$(function($) { {/if} {strip} - <details class="crm-accordion-bold crm-search_criteria_basic-accordion" open> - <summary> - {ts}Display Settings For Results{/ts} - </summary> - <div class="crm-accordion-body"> - {include file="CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl"} - </div> - </details> - <details class="crm-accordion-bold crm-search_criteria_basic-accordion" open> + <details class="crm-accordion-settings crm-search_criteria_basic-accordion"> <summary> {ts}Search Settings{/ts} </summary> @@ -108,6 +99,15 @@ CRM.$(function($) { {ts}Basic Criteria{/ts} </summary> <div class="crm-accordion-body"> + <div class="float-right"> + <span class="crm-submit-buttons reset-advanced-search"> + <a href="{crmURL p='civicrm/contact/search/advanced' q='reset=1'}" id="resetAdvancedSearch" class="crm-hover-button crm-inline-button" title="{ts}Clear all search criteria{/ts}"> + <i class="crm-i fa-undo" aria-hidden="true"></i> + {ts}Reset Form{/ts} + </a> + </span> + {include file="CRM/common/formButtons.tpl" location="top"} + </div> {include file="CRM/Contact/Form/Search/Criteria/Basic.tpl"} </div> </details> @@ -125,12 +125,6 @@ CRM.$(function($) { <tr> <td> {include file="CRM/common/formButtons.tpl" location="bottom"} - <div class="crm-submit-buttons reset-advanced-search"> - <a href="{crmURL p='civicrm/contact/search/advanced' q='reset=1'}" id="resetAdvancedSearch" class="crm-hover-button" title="{ts}Clear all search criteria{/ts}"> - <i class="crm-i fa-undo" aria-hidden="true"></i> - {ts}Reset Form{/ts} - </a> - </div> </td> </tr> </table> diff --git a/civicrm/templates/CRM/Contact/Form/Search/Criteria/Basic.tpl b/civicrm/templates/CRM/Contact/Form/Search/Criteria/Basic.tpl index 8b93dbbfc7..91c9476016 100644 --- a/civicrm/templates/CRM/Contact/Form/Search/Criteria/Basic.tpl +++ b/civicrm/templates/CRM/Contact/Form/Search/Criteria/Basic.tpl @@ -33,4 +33,9 @@ {include file=$fieldSpec.template} {/if} {/foreach} + {if !empty($form.deleted_contacts)} + <div class="search-field"> + {$form.deleted_contacts.html} {$form.deleted_contacts.label} + </div> + {/if} </div> diff --git a/civicrm/templates/CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl b/civicrm/templates/CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl deleted file mode 100644 index 7a969b8514..0000000000 --- a/civicrm/templates/CRM/Contact/Form/Search/Criteria/DisplaySettings.tpl +++ /dev/null @@ -1,21 +0,0 @@ -<div id="display-settings" class="form-item"> - <table> - <tr> - <td> - {if !empty($form.component_mode)} - {$form.component_mode.label} {help id="id-display-results"} - <br /> - {$form.component_mode.html} - {if !empty($form.display_relationship_type)} - <div id="crm-display_relationship_type">{$form.display_relationship_type.html}</div> - {/if} - {else} - - {/if} - </td> - <td> - {$form.uf_group_id.label} {help id="id-search-views"}<br />{$form.uf_group_id.html} - </td> - </tr> - </table> -</div> diff --git a/civicrm/templates/CRM/Contact/Form/Search/Criteria/SearchSettings.tpl b/civicrm/templates/CRM/Contact/Form/Search/Criteria/SearchSettings.tpl index b788e7f364..75166d2ddc 100644 --- a/civicrm/templates/CRM/Contact/Form/Search/Criteria/SearchSettings.tpl +++ b/civicrm/templates/CRM/Contact/Form/Search/Criteria/SearchSettings.tpl @@ -1,19 +1,20 @@ -<div id="search-settings" class="form-item"> - <table> - <tr> - <td>{$form.operator.label} {help id="id-search-operator"}<br />{$form.operator.html}</td> - <td> - {if !empty($form.deleted_contacts)}{$form.deleted_contacts.html} {$form.deleted_contacts.label}{/if} - </td> - <td class="adv-search-top-submit" colspan="2"> - {include file="CRM/common/formButtons.tpl" location="top"} - <div class="crm-submit-buttons reset-advanced-search"> - <a href="{crmURL p='civicrm/contact/search/advanced' q='reset=1'}" id="resetAdvancedSearch" class="crm-hover-button" title="{ts}Clear all search criteria{/ts}"> - <i class="crm-i fa-undo" aria-hidden="true"></i> - {ts}Reset Form{/ts} - </a> - </div> - </td> - </tr> - </table> +<div id="display-settings" class="advanced-search-fields basic-fields form-layout"> + <div class="search-field"> + {if !empty($form.component_mode)} + {$form.component_mode.label} {help id="id-display-results"} + <br /> + {$form.component_mode.html} + {if !empty($form.display_relationship_type)} + <div id="crm-display_relationship_type">{$form.display_relationship_type.html}</div> + {/if} + {else} + + {/if} + </div> + <div class="search-field"> + {$form.uf_group_id.label} {help id="id-search-views"}<br />{$form.uf_group_id.html} + </div> + <div class="search-field"> + {$form.operator.label} {help id="id-search-operator"}<br />{$form.operator.html} + </div> </div> diff --git a/civicrm/templates/CRM/Contribute/Form/Contribution/Confirm.tpl b/civicrm/templates/CRM/Contribute/Form/Contribution/Confirm.tpl index 86e887eca8..dda6377301 100644 --- a/civicrm/templates/CRM/Contribute/Form/Contribution/Confirm.tpl +++ b/civicrm/templates/CRM/Contribute/Form/Contribution/Confirm.tpl @@ -10,7 +10,7 @@ {if $action & 1024} {include file="CRM/Contribute/Form/Contribution/PreviewHeader.tpl"} {/if} - +{* Please keep Confirm.tpl and ThankYou.tpl somewhat in sync *} <div class="crm-contribution-page-id-{$contributionPageID} crm-block crm-contribution-confirm-form-block" data-page-id="{$contributionPageID}" data-page-template="confirm"> <div class="help"> <p>{ts}Please verify the information below carefully. Click <strong>Go Back</strong> if you need to make changes.{/ts} @@ -32,138 +32,136 @@ {if !$membershipBlock AND $amount OR ($isDisplayLineItems and $lineItem)}{ts}Contribution Amount{/ts}{else}{ts}Membership Fee{/ts} {/if} </div> - <div class="display-block"> - {if $isDisplayLineItems && $lineItem} - {if !$amount}{assign var="amount" value=0}{/if} - {assign var="totalAmount" value=$amount} - {include file="CRM/Price/Page/LineItem.tpl" context="Contribution" getTaxDetails=$totalTaxAmount displayLineItemFinancialType=false pricesetFieldsCount=false currencySymbol='' hookDiscount=''} - {elseif $is_separate_payment} - {if $amount AND $minimum_fee} - {$membership_name} {ts}Membership{/ts}: - <strong>{$membershipTotalAmount|crmMoney}</strong> - <br/> - {ts}Additional Contribution{/ts}: - <strong>{$nonMembershipTotalAmount|crmMoney}</strong> - <br/> - <strong> -------------------------------------------</strong> - <br/> - {ts}Total{/ts}: - <strong>{$orderTotal|crmMoney}</strong> - <br/> - {elseif $amount} - {ts}Amount{/ts}: - <strong>{$amount|crmMoney} {if $amount_level}<span class='crm-price-amount-label'> - – {$amount_level}</span>{/if}</strong> - {else} - {$membership_name} {ts}Membership{/ts}: - <strong>{$minimum_fee|crmMoney}</strong> - {/if} - {else} - {if $totalTaxAmount} - {ts 1=$taxTerm}Total %1 Amount{/ts}: - <strong>{$totalTaxAmount|crmMoney} </strong> - <br/> - {/if} - {if $amount} - {if $installments}{ts}Installment Amount{/ts}{else}{ts}Total Amount{/ts}{/if}: - <strong>{$amount|crmMoney:$currency}{if $amount_level}<span class='crm-price-amount-label'> - – {$amount_level}</span>{/if}</strong> + <div class="crm-section no-label amount_display-section"> + <div class="content"> + {if $isDisplayLineItems && $lineItem} + {if !$amount}{assign var="amount" value=0}{/if} + {assign var="totalAmount" value=$amount} + {include file="CRM/Price/Page/LineItem.tpl" context="Contribution" getTaxDetails=$totalTaxAmount displayLineItemFinancialType=false pricesetFieldsCount=false currencySymbol='' hookDiscount=''} + {elseif $is_separate_payment} + {if $amount AND $minimum_fee} + {$membership_name} {ts}Membership{/ts}: + <strong>{$membershipTotalAmount|crmMoney}</strong> + <br/> + {ts}Additional Contribution{/ts}: + <strong>{$nonMembershipTotalAmount|crmMoney}</strong> + <br/> + <strong> -------------------------------------------</strong> + <br/> + {ts}Total{/ts}: + <strong>{$orderTotal|crmMoney}</strong> + <br/> + {elseif $amount} + {ts}Amount{/ts}: + <strong>{$amount|crmMoney} {if $amount_level}<span class='crm-price-amount-label'> + – {$amount_level}</span>{/if}</strong> + {else} + {$membership_name} {ts}Membership{/ts}: + <strong>{$minimum_fee|crmMoney}</strong> + {/if} {else} - {$membership_name} {ts}Membership{/ts}: - <strong>{$minimum_fee|crmMoney}</strong> + {if $totalTaxAmount} + {ts}Tax Amount{/ts}: <strong>{$totalTaxAmount|crmMoney}</strong><br /> + {/if} + {if $amount} + {if $installments}{ts}Installment Amount{/ts}{else}{ts}Total Amount{/ts}{/if}: + <strong>{$amount|crmMoney:$currency}{if $amount_level}<span class='crm-price-amount-label'> + – {$amount_level}</span>{/if}</strong> + {else} + {$membership_name} {ts}Membership{/ts}: + <strong>{$minimum_fee|crmMoney}</strong> + {/if} {/if} - {/if} - {if $is_recur} - {if !empty($auto_renew)} {* Auto-renew membership confirmation *} - {crmRegion name="contribution-confirm-recur-membership"} - <br /> - {if $frequency_interval > 1} - {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} - {if $frequency_unit eq 'day'} - <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 days.{/ts}</strong> - {elseif $frequency_unit eq 'week'} - <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 weeks.{/ts}</strong> - {elseif $frequency_unit eq 'month'} - <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 months.{/ts}</strong> - {elseif $frequency_unit eq 'year'} - <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 years.{/ts}</strong> + {* Recurring contribution / pledge information *} + {if $is_recur} + {if !empty($auto_renew)} {* Auto-renew membership confirmation *} + {crmRegion name="contribution-confirm-recur-membership"} + <p> + {if $frequency_interval > 1} + {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} + {if $frequency_unit eq 'day'} + <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 days.{/ts}</strong> + {elseif $frequency_unit eq 'week'} + <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 weeks.{/ts}</strong> + {elseif $frequency_unit eq 'month'} + <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 months.{/ts}</strong> + {elseif $frequency_unit eq 'year'} + <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 years.{/ts}</strong> + {/if} + {else} + {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} + {if $frequency_unit eq 'day'} + <strong>{ts}This membership will be renewed automatically every day.{/ts}</strong> + {elseif $frequency_unit eq 'week'} + <strong>{ts}This membership will be renewed automatically every week.{/ts}</strong> + {elseif $frequency_unit eq 'month'} + <strong>{ts}This membership will be renewed automatically every month.{/ts}</strong> + {elseif $frequency_unit eq 'year'} + <strong>{ts}This membership will be renewed automatically every year.{/ts}</strong> + {/if} {/if} - {else} - {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} - {if $frequency_unit eq 'day'} - <strong>{ts}This membership will be renewed automatically every day.{/ts}</strong> - {elseif $frequency_unit eq 'week'} - <strong>{ts}This membership will be renewed automatically every week.{/ts}</strong> - {elseif $frequency_unit eq 'month'} - <strong>{ts}This membership will be renewed automatically every month.{/ts}</strong> - {elseif $frequency_unit eq 'year'} - <strong>{ts}This membership will be renewed automatically every year.{/ts}</strong> - {/if} - {/if} - <div class="description crm-auto-renew-cancel-info">{ts}Your initial membership fee will be processed once you complete the confirmation step. You will be able to cancel the auto-renewal option by visiting the web page link that will be included in your receipt.{/ts}</div> - {/crmRegion} - {else} - {crmRegion name="contribution-confirm-recur"} - {if $installments > 1} - {if $frequency_interval > 1} - {if $frequency_unit eq 'day'} - <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 days for a total %3 installments (including this initial contribution).{/ts}</strong></p> - {elseif $frequency_unit eq 'week'} - <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 weeks for a total %3 installments (including this initial contribution).{/ts}</strong></p> - {elseif $frequency_unit eq 'month'} - <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 months for a total %3 installments (including this initial contribution).{/ts}</strong></p> - {elseif $frequency_unit eq 'year'} - <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 years for a total %3 installments (including this initial contribution).{/ts}</strong></p> + </p> + <div class="description crm-auto-renew-cancel-info">{ts}Your initial membership fee will be processed once you complete the confirmation step. You will be able to cancel the auto-renewal option by visiting the web page link that will be included in your receipt.{/ts}</div> + {/crmRegion} + {else} + {crmRegion name="contribution-confirm-recur"} + {if $installments > 1} + {if $frequency_interval > 1} + {if $frequency_unit eq 'day'} + <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 days for a total %3 installments (including this initial contribution).{/ts}</strong></p> + {elseif $frequency_unit eq 'week'} + <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 weeks for a total %3 installments (including this initial contribution).{/ts}</strong></p> + {elseif $frequency_unit eq 'month'} + <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 months for a total %3 installments (including this initial contribution).{/ts}</strong></p> + {elseif $frequency_unit eq 'year'} + <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 years for a total %3 installments (including this initial contribution).{/ts}</strong></p> + {/if} + {else} + <p><strong>{ts 1=$frequency_unit 2=$installments}This recurring contribution will be automatically processed every %1 for a total %2 installments (including this initial contribution).{/ts}</strong></p> {/if} {else} - <p><strong>{ts 1=$frequency_unit 2=$installments}This recurring contribution will be automatically processed every %1 for a total %2 installments (including this initial contribution).{/ts}</strong></p> - {/if} - {else} - {if $frequency_interval > 1} - {if $frequency_unit eq 'day'} - <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 days.{/ts}</strong></p> - {elseif $frequency_unit eq 'week'} - <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 weeks.{/ts}</strong></p> - {elseif $frequency_unit eq 'month'} - <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 months.{/ts}</strong></p> - {elseif $frequency_unit eq 'year'} - <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 years.{/ts}</strong></p> - {/if} - {else} - {* dev/translation#32 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} - {if $frequency_unit eq 'day'} - <p><strong>{ts}This contribution will be automatically processed every day.{/ts}</strong></p> - {elseif $frequency_unit eq 'week'} - <p><strong>{ts}This contribution will be automatically processed every week.{/ts}</strong></p> - {elseif $frequency_unit eq 'month'} - <p><strong>{ts}This contribution will be automatically processed every month.{/ts}</strong></p> - {elseif $frequency_unit eq 'year'} - <p><strong>{ts}This contribution will be automatically processed every year.{/ts}</strong></p> + {if $frequency_interval > 1} + {if $frequency_unit eq 'day'} + <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 days.{/ts}</strong></p> + {elseif $frequency_unit eq 'week'} + <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 weeks.{/ts}</strong></p> + {elseif $frequency_unit eq 'month'} + <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 months.{/ts}</strong></p> + {elseif $frequency_unit eq 'year'} + <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 years.{/ts}</strong></p> + {/if} + {else} + {* dev/translation#32 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} + {if $frequency_unit eq 'day'} + <p><strong>{ts}This contribution will be automatically processed every day.{/ts}</strong></p> + {elseif $frequency_unit eq 'week'} + <p><strong>{ts}This contribution will be automatically processed every week.{/ts}</strong></p> + {elseif $frequency_unit eq 'month'} + <p><strong>{ts}This contribution will be automatically processed every month.{/ts}</strong></p> + {elseif $frequency_unit eq 'year'} + <p><strong>{ts}This contribution will be automatically processed every year.{/ts}</strong></p> + {/if} {/if} {/if} - {/if} - <p>{ts}Your initial contribution will be processed once you complete the confirmation step. You will be able to cancel the recurring contribution by visiting the web page link that will be included in your receipt.{/ts}</p> - {/crmRegion} + <p>{ts}Your initial contribution will be processed once you complete the confirmation step. You will be able to cancel the recurring contribution by visiting the web page link that will be included in your receipt.{/ts}</p> + {/crmRegion} + {/if} {/if} - {/if} - - {if $is_pledge} - {if $pledge_frequency_interval GT 1} - <p> - <strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %1 %2s for %3 installments.{/ts}</strong> - </p> - {else} - <p> - <strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %2 for %3 installments.{/ts}</strong> - </p> - {/if} - {if $is_pay_later} - <p>{ts 1=$receiptFromEmail 2=$button}Click "%2" below to register your pledge. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts}</p> - {else} - <p>{ts 1=$receiptFromEmail 2=$button}Your initial pledge payment will be processed when you click "%2" below. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts}</p> + {if $is_pledge} + {if $pledge_frequency_interval GT 1} + <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %1 %2s for %3 installments.{/ts}</strong></p> + {else} + <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %2 for %3 installments.{/ts}</strong></p> + {/if} + {if $is_pay_later} + <p>{ts 1=$receiptFromEmail 2=$button}Click "%2" below to register your pledge. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts}</p> + {else} + <p>{ts 1=$receiptFromEmail 2=$button}Your initial pledge payment will be processed when you click "%2" below. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts}</p> + {/if} {/if} - {/if} + </div> + <div class="clear"></div> </div> </div> {/if} @@ -204,51 +202,48 @@ {if $pcp_is_anonymous} <strong>{ts}anonymously{/ts}.</strong> {else} - {ts}under the name{/ts}: - <strong>{$pcp_roll_nickname}</strong> - <br/> + {ts}under the name{/ts}: <strong>{$pcp_roll_nickname}</strong><br/> {if $pcp_personal_note} - {ts}With the personal note{/ts}: - <strong>{$pcp_personal_note}</strong> + {ts}With the personal note{/ts}: <strong>{$pcp_personal_note}</strong> {else} <strong>{ts}With no personal note{/ts}</strong> {/if} {/if} - <br/> + <br /> </div> </div> {/if} - {if $billingName or $address} - <div class="crm-group billing_name_address-group"> - <div class="header-dark"> + {if $billingName or $address} + <div class="crm-group billing_name_address-group"> + <div class="header-dark"> {ts}Billing Name and Address{/ts} - </div> - <div class="crm-section no-label billing_name-section"> - <div class="content">{$billingName}</div> - <div class="clear"></div> - </div> - <div class="crm-section no-label billing_address-section"> - <div class="content">{$address|nl2br}</div> - <div class="clear"></div> - </div> </div> - {/if} - {if $email && !$emailExists} - <div class="crm-group contributor_email-group"> - <div class="header-dark"> - {ts}Your Email{/ts} + <div class="crm-section no-label billing_name-section"> + <div class="content">{$billingName}</div> + <div class="clear"></div> </div> - <div class="crm-section no-label contributor_email-section"> - <div class="content">{$email}</div> + <div class="crm-section no-label billing_address-section"> + <div class="content">{$address|nl2br}</div> <div class="clear"></div> </div> </div> {/if} + {if !$emailExists && $email} + <div class="crm-group contributor_email-group"> + <div class="header-dark"> + {ts}Your Email{/ts} + </div> + <div class="crm-section no-label contributor_email-section"> + <div class="content">{$email}</div> + <div class="clear"></div> + </div> + </div> + {/if} {* Show credit or debit card section for 'direct' mode, except for PayPal Express (detected because credit card number is empty) *} + {if in_array('credit_card_number', $paymentFields) || in_array('bank_account_number', $paymentFields) && ($amount GT 0 OR $minimum_fee GT 0)} {crmRegion name="contribution-confirm-billing-block"} - {if in_array('credit_card_number', $paymentFields) || in_array('bank_account_number', $paymentFields)} <div class="crm-group credit_card-group"> {if $paymentFieldsetLabel} <div class="header-dark"> @@ -257,10 +252,10 @@ {/if} {if in_array('bank_account_number', $paymentFields) && $bank_account_number} <div class="display-block"> - {ts}Account Holder{/ts}: {$account_holder}<br/> - {ts}Bank Account Number{/ts}: {$bank_account_number}<br/> - {ts}Bank Identification Number{/ts}: {$bank_identification_number}<br/> - {ts}Bank Name{/ts}: {$bank_name}<br/> + {ts}Account Holder{/ts}: {$account_holder}<br /> + {ts}Bank Identification Number{/ts}: {$bank_identification_number}<br /> + {ts}Bank Name{/ts}: {$bank_name}<br /> + {ts}Bank Account Number{/ts}: {$bank_account_number}<br /> </div> {if $paymentAgreementText} <div class="crm-group debit_agreement-group"> @@ -282,8 +277,8 @@ </div> {/if} </div> - {/if} {/crmRegion} + {/if} {include file="CRM/Contribute/Form/Contribution/PremiumBlock.tpl" context="confirmContribution" showPremiumSelectionFields=false preview=false} diff --git a/civicrm/templates/CRM/Contribute/Form/Contribution/MembershipBlock.tpl b/civicrm/templates/CRM/Contribute/Form/Contribution/MembershipBlock.tpl index 04cd616d8e..b91dbb3404 100644 --- a/civicrm/templates/CRM/Contribute/Form/Contribution/MembershipBlock.tpl +++ b/civicrm/templates/CRM/Contribute/Form/Contribution/MembershipBlock.tpl @@ -26,30 +26,14 @@ {/if} {/if} </div> - {strip} - <table id="membership-listings"> + <div id="membership-listings"> {foreach from=$membershipTypes item=row} - <tr valign="top"> - <td style="width: auto;"> - <span class="bold">{$row.name} - </span><br /> - {$row.description} - </td> - - <td style="width: auto;"> - </td> - </tr> - + <p> + <strong>{$row.name}</strong> + <br>{$row.description} + </p> {/foreach} - {if array_key_exists('auto_renew', $form)} - <tr id="allow_auto_renew"> - <td style="width: auto;">{$form.auto_renew.html}</td> - <td style="width: auto;"> - {$form.auto_renew.label} - </td> - </tr> - {/if} - </table> + </div> {/strip} {/if} diff --git a/civicrm/templates/CRM/Contribute/Form/Contribution/ThankYou.tpl b/civicrm/templates/CRM/Contribute/Form/Contribution/ThankYou.tpl index 5dcd0f0f48..eab284a811 100644 --- a/civicrm/templates/CRM/Contribute/Form/Contribution/ThankYou.tpl +++ b/civicrm/templates/CRM/Contribute/Form/Contribution/ThankYou.tpl @@ -10,7 +10,7 @@ {if $action & 1024} {include file="CRM/Contribute/Form/Contribution/PreviewHeader.tpl"} {/if} - +{* Please keep Confirm.tpl and ThankYou.tpl somewhat in sync *} <div class="crm-contribution-page-id-{$contributionPageID} crm-block crm-contribution-thankyou-form-block" data-page-id="{$contributionPageID}" data-page-template="thankyou"> {if $thankyou_text} <div id="thankyou_text" class="crm-section thankyou_text-section"> @@ -78,135 +78,138 @@ {if !$membershipBlock AND $amount OR ($priceSetID and $lineItem)}{ts}Contribution Information{/ts}{else}{ts}Membership Fee{/ts}{/if} </div> - <div class="display-block"> - {if $lineItem and $priceSetID} - {if !$amount}{assign var="amount" value=0}{/if} - {assign var="totalAmount" value=$amount} - {include file="CRM/Price/Page/LineItem.tpl" context="Contribution" displayLineItemFinancialType=false pricesetFieldsCount=false currencySymbol='' hookDiscount=''} - {elseif $membership_amount} - {$membership_name} {ts}Membership{/ts}: <strong>{$membership_amount|crmMoney}</strong><br /> - {if $amount} - {if !$is_separate_payment} - {ts}Contribution Amount{/ts}: <strong>{$amount|crmMoney}</strong><br /> - {else} - {ts}Additional Contribution{/ts}: <strong>{$amount|crmMoney}</strong><br /> + <div class="crm-section no-label amount_display-section"> + <div class="content"> + {if $lineItem and $priceSetID} + {if !$amount}{assign var="amount" value=0}{/if} + {assign var="totalAmount" value=$amount} + {include file="CRM/Price/Page/LineItem.tpl" context="Contribution" displayLineItemFinancialType=false pricesetFieldsCount=false currencySymbol='' hookDiscount=''} + {elseif $membership_amount} + {$membership_name} {ts}Membership{/ts}: <strong>{$membership_amount|crmMoney}</strong><br /> + {if $amount} + {if !$is_separate_payment} + {ts}Contribution Amount{/ts}: <strong>{$amount|crmMoney}</strong><br /> + {else} + {ts}Additional Contribution{/ts}: <strong>{$amount|crmMoney}</strong><br /> + {/if} {/if} + <strong> -------------------------------------------</strong><br /> + {ts}Total{/ts}: <strong>{$orderTotal|crmMoney}</strong><br /> + {else} + {if $totalTaxAmount} + {ts}Tax Amount{/ts}: <strong>{$totalTaxAmount|crmMoney}</strong><br /> + {/if} + {if $installments}{ts}Installment Amount{/ts}{else}{ts}Amount{/ts}{/if}: <strong>{$amount|crmMoney:$currency}{if $amount_level} – {$amount_level}{/if}</strong> {/if} - <strong> -------------------------------------------</strong><br /> - {ts}Total{/ts}: <strong>{$orderTotal|crmMoney}</strong><br /> - {else} - {if $totalTaxAmount} - {ts}Tax Amount{/ts}: <strong>{$totalTaxAmount|crmMoney}</strong><br /> - {/if} - {if $installments}{ts}Installment Amount{/ts}{else}{ts}Amount{/ts}{/if}: <strong>{$amount|crmMoney:$currency}{if $amount_level} – {$amount_level}{/if}</strong> - {/if} - {if $receive_date} - {ts}Date{/ts}: <strong>{$receive_date|crmDate}</strong><br /> - {/if} - {if $trxn_id} - {ts}Transaction #{/ts}: {$trxn_id}<br /> - {/if} - {if $membership_trx_id} - {ts}Membership Transaction #{/ts}: {$membership_trx_id} - {/if} + {if $receive_date} + {ts}Date{/ts}: <strong>{$receive_date|crmDate}</strong><br /> + {/if} + {if $trxn_id} + {ts}Transaction #{/ts}: {$trxn_id}<br /> + {/if} + {if $membership_trx_id} + {ts}Membership Transaction #{/ts}: {$membership_trx_id} + {/if} - {* Recurring contribution / pledge information *} - {if $is_recur} - {if !empty($auto_renew)} {* Auto-renew membership confirmation *} - {crmRegion name="contribution-thankyou-recur-membership"} - <br /> - {if $frequency_interval > 1} - {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} - {if $frequency_unit eq 'day'} - <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 days.{/ts}</strong> - {elseif $frequency_unit eq 'week'} - <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 weeks.{/ts}</strong> - {elseif $frequency_unit eq 'month'} - <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 months.{/ts}</strong> - {elseif $frequency_unit eq 'year'} - <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 years.{/ts}</strong> + {* Recurring contribution / pledge information *} + {if $is_recur} + {if !empty($auto_renew)} {* Auto-renew membership confirmation *} + {crmRegion name="contribution-thankyou-recur-membership"} + <p> + {if $frequency_interval > 1} + {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} + {if $frequency_unit eq 'day'} + <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 days.{/ts}</strong> + {elseif $frequency_unit eq 'week'} + <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 weeks.{/ts}</strong> + {elseif $frequency_unit eq 'month'} + <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 months.{/ts}</strong> + {elseif $frequency_unit eq 'year'} + <strong>{ts 1=$frequency_interval 2=$frequency_unit}This membership will be renewed automatically every %1 years.{/ts}</strong> + {/if} + {else} + {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} + {if $frequency_unit eq 'day'} + <strong>{ts}This membership will be renewed automatically every day.{/ts}</strong> + {elseif $frequency_unit eq 'week'} + <strong>{ts}This membership will be renewed automatically every week.{/ts}</strong> + {elseif $frequency_unit eq 'month'} + <strong>{ts}This membership will be renewed automatically every month.{/ts}</strong> + {elseif $frequency_unit eq 'year'} + <strong>{ts}This membership will be renewed automatically every year.{/ts}</strong> + {/if} + {/if} + </p> + <div class="description crm-auto-renew-cancel-info">{ts}You will receive an email receipt which includes information about how to cancel the auto-renewal option.{/ts}</div> + {/crmRegion} + {else} + {crmRegion name="contribution-thankyou-recur"} + {if $installments > 1} + {if $frequency_interval > 1} + {if $frequency_unit eq 'day'} + <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 days for a total %3 installments (including this initial contribution).{/ts}</strong></p> + {elseif $frequency_unit eq 'week'} + <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 weeks for a total %3 installments (including this initial contribution).{/ts}</strong></p> + {elseif $frequency_unit eq 'month'} + <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 months for a total %3 installments (including this initial contribution).{/ts}</strong></p> + {elseif $frequency_unit eq 'year'} + <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 years for a total %3 installments (including this initial contribution).{/ts}</strong></p> + {/if} + {else} + <p><strong>{ts 1=$frequency_unit 2=$installments}This recurring contribution will be automatically processed every %1 for a total %2 installments (including this initial contribution).{/ts}</strong></p> {/if} {else} - {* dev/translation#80 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} - {if $frequency_unit eq 'day'} - <strong>{ts}This membership will be renewed automatically every day.{/ts}</strong> - {elseif $frequency_unit eq 'week'} - <strong>{ts}This membership will be renewed automatically every week.{/ts}</strong> - {elseif $frequency_unit eq 'month'} - <strong>{ts}This membership will be renewed automatically every month.{/ts}</strong> - {elseif $frequency_unit eq 'year'} - <strong>{ts}This membership will be renewed automatically every year.{/ts}</strong> + {if $frequency_interval > 1} + {if $frequency_unit eq 'day'} + <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 days.{/ts}</strong></p> + {elseif $frequency_unit eq 'week'} + <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 weeks.{/ts}</strong></p> + {elseif $frequency_unit eq 'month'} + <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 months.{/ts}</strong></p> + {elseif $frequency_unit eq 'year'} + <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 years.{/ts}</strong></p> + {/if} + {else} + {* dev/translation#32 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} + {if $frequency_unit eq 'day'} + <p><strong>{ts}This contribution will be automatically processed every day.{/ts}</strong></p> + {elseif $frequency_unit eq 'week'} + <p><strong>{ts}This contribution will be automatically processed every week.{/ts}</strong></p> + {elseif $frequency_unit eq 'month'} + <p><strong>{ts}This contribution will be automatically processed every month.{/ts}</strong></p> + {elseif $frequency_unit eq 'year'} + <p><strong>{ts}This contribution will be automatically processed every year.{/ts}</strong></p> + {/if} {/if} {/if} - <div class="description crm-auto-renew-cancel-info">({ts}You will receive an email receipt which includes information about how to cancel the auto-renewal option.{/ts})</div> - {/crmRegion} - {else} - {crmRegion name="contribution-thankyou-recur"} - {if $installments > 1} - {if $frequency_interval > 1} - {if $frequency_unit eq 'day'} - <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 days for a total %3 installments (including this initial contribution).{/ts}</strong></p> - {elseif $frequency_unit eq 'week'} - <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 weeks for a total %3 installments (including this initial contribution).{/ts}</strong></p> - {elseif $frequency_unit eq 'month'} - <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 months for a total %3 installments (including this initial contribution).{/ts}</strong></p> - {elseif $frequency_unit eq 'year'} - <p><strong>{ts 1=$frequency_interval 2=$frequency_unit 3=$installments}This recurring contribution will be automatically processed every %1 years for a total %3 installments (including this initial contribution).{/ts}</strong></p> - {/if} - {else} - <p><strong>{ts 1=$frequency_unit 2=$installments}This recurring contribution will be automatically processed every %1 for a total %2 installments (including this initial contribution).{/ts}</strong></p> + {if $is_email_receipt} + <p> + {ts}You will receive an email receipt which includes information about how to update or cancel this recurring contribution.{/ts} + </p> {/if} + {/crmRegion} + {/if} + {/if} + {if $is_pledge} + {if $pledge_frequency_interval GT 1} + <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %1 %2s for %3 installments.{/ts}</strong></p> + {else} + <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %2 for %3 installments.{/ts}</strong></p> + {/if} + <p> + {if $is_pay_later} + {ts 1=$receiptFromEmail}We will record your initial pledge payment when we receive it from you. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts} {else} - {if $frequency_interval > 1} - {if $frequency_unit eq 'day'} - <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 days.{/ts}</strong></p> - {elseif $frequency_unit eq 'week'} - <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 weeks.{/ts}</strong></p> - {elseif $frequency_unit eq 'month'} - <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 months.{/ts}</strong></p> - {elseif $frequency_unit eq 'year'} - <p><strong>{ts 1=$frequency_interval}This recurring contribution will be automatically processed every %1 years.{/ts}</strong></p> - {/if} - {else} - {* dev/translation#32 All 'every %1' strings are incorrectly using ts, but focusing on the most important one until we find a better fix. *} - {if $frequency_unit eq 'day'} - <p><strong>{ts}This contribution will be automatically processed every day.{/ts}</strong></p> - {elseif $frequency_unit eq 'week'} - <p><strong>{ts}This contribution will be automatically processed every week.{/ts}</strong></p> - {elseif $frequency_unit eq 'month'} - <p><strong>{ts}This contribution will be automatically processed every month.{/ts}</strong></p> - {elseif $frequency_unit eq 'year'} - <p><strong>{ts}This contribution will be automatically processed every year.{/ts}</strong></p> - {/if} - {/if} + {ts 1=$receiptFromEmail}Your initial pledge payment has been processed. You will be able to modify or cancel future pledge payments at any time by contacting us at %1.{/ts} {/if} - {if $is_email_receipt} - <p> - {ts}You will receive an email receipt which includes information about how to update or cancel this recurring contribution.{/ts} - </p> + {if $max_reminders} + {ts 1=$initial_reminder_day}We will send you a payment reminder %1 days prior to each scheduled payment date. The reminder will include a link to a page where you can make your payment online.{/ts} {/if} - {/crmRegion} - {/if} - {/if} - - {if $is_pledge} - {if $pledge_frequency_interval GT 1} - <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %1 %2s for %3 installments.{/ts}</strong></p> - {else} - <p><strong>{ts 1=$pledge_frequency_interval 2=$pledge_frequency_unit 3=$pledge_installments}I pledge to contribute this amount every %2 for %3 installments.{/ts}</strong></p> + </p> {/if} - <p> - {if $is_pay_later} - {ts 1=$receiptFromEmail}We will record your initial pledge payment when we receive it from you. You will be able to modify or cancel future pledge payments at any time by logging in to your account or contacting us at %1.{/ts} - {else} - {ts 1=$receiptFromEmail}Your initial pledge payment has been processed. You will be able to modify or cancel future pledge payments at any time by contacting us at %1.{/ts} - {/if} - {if $max_reminders} - {ts 1=$initial_reminder_day}We will send you a payment reminder %1 days prior to each scheduled payment date. The reminder will include a link to a page where you can make your payment online.{/ts} - {/if} - </p> - {/if} + </div> + <div class="clear"></div> </div> </div> {/if} @@ -214,7 +217,7 @@ {if $onbehalfProfile && $onbehalfProfile|@count} <div class="crm-group onBehalf_display-group label-left crm-profile-view"> {include file="CRM/UF/Form/Block.tpl" fields=$onbehalfProfile prefix='onbehalf' hideFieldset=false} - </div> + </div> {/if} {if $honoreeProfileFields && $honoreeProfileFields|@count} @@ -223,12 +226,12 @@ {$soft_credit_type} </div> <div class="display-block"> - <div class="label-left crm-section honoree_profile-section"> + <div class="label-left crm-section honoree_profile-section"> <strong>{$honorName}</strong><br/> {include file="CRM/UF/Form/Block.tpl" fields=$honoreeProfileFields prefix='honor' hideFieldset=false} </div> </div> - </div> + </div> {/if} {if $customPre} @@ -277,7 +280,7 @@ {if !$emailExists && $email} <div class="crm-group contributor_email-group"> <div class="header-dark"> - {ts}Your Email{/ts} + {ts}Your Email{/ts} </div> <div class="crm-section no-label contributor_email-section"> <div class="content">{$email}</div> @@ -294,7 +297,7 @@ {$paymentFieldsetLabel} </div> {/if} - {if in_array('bank_account_number', $paymentFields) && $bank_account_number} + {if in_array('bank_account_number', $paymentFields) && $bank_account_number} <div class="display-block"> {ts}Account Holder{/ts}: {$account_holder}<br /> {ts}Bank Identification Number{/ts}: {$bank_identification_number}<br /> diff --git a/civicrm/templates/CRM/Contribute/Form/ManagePremiums.tpl b/civicrm/templates/CRM/Contribute/Form/ManagePremiums.tpl index 9bc8da609e..9ae3dde95a 100644 --- a/civicrm/templates/CRM/Contribute/Form/ManagePremiums.tpl +++ b/civicrm/templates/CRM/Contribute/Form/ManagePremiums.tpl @@ -137,7 +137,8 @@ </details> {/crmRegion} {/if} -<div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div> + {include file="CRM/common/customDataBlock.tpl" customDataType='Product' entityID=$productId} + <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div> </div> {if $action eq 1 or $action eq 2} diff --git a/civicrm/templates/CRM/Event/Form/ManageEvent/Location.tpl b/civicrm/templates/CRM/Event/Form/ManageEvent/Location.tpl index 019d5761e8..572aef78a2 100644 --- a/civicrm/templates/CRM/Event/Form/ManageEvent/Location.tpl +++ b/civicrm/templates/CRM/Event/Form/ManageEvent/Location.tpl @@ -37,7 +37,7 @@ <td id="locUsedMsg" colspan="3"> </td> </tr> - <tr id="is_show_location" class="crm-event-manage-location-form-block-is_show_location"> + <tr class="crm-event-manage-location-form-block-is_show_location"> <td class="labels"> {$form.is_show_location.label} {help id="id-is_show_location"} </td> diff --git a/civicrm/templates/CRM/Event/Page/DashBoard.tpl b/civicrm/templates/CRM/Event/Page/DashBoard.tpl index 1fb1c38ce3..19d258b7eb 100644 --- a/civicrm/templates/CRM/Event/Page/DashBoard.tpl +++ b/civicrm/templates/CRM/Event/Page/DashBoard.tpl @@ -125,13 +125,9 @@ {else} <br /> <div class="messages status no-popup"> - <table> - <tr>{icon icon="fa-info-circle"}{/icon}</tr> - <tr> - {ts}There are no active Events to display.{/ts} - {ts 1=$newEventURL}You can <a href="%1">Create a New Event</a> now.{/ts} - </tr> - </table> + {icon icon="fa-info-circle"}{/icon} + {ts}There are no active Events to display.{/ts} + {ts 1=$newEventURL}You can <a href="%1">Create a New Event</a> now.{/ts} </div> {/if} diff --git a/civicrm/templates/CRM/Mailing/Page/Report.tpl b/civicrm/templates/CRM/Mailing/Page/Report.tpl index ce763e86bd..78d3150287 100644 --- a/civicrm/templates/CRM/Mailing/Page/Report.tpl +++ b/civicrm/templates/CRM/Mailing/Page/Report.tpl @@ -152,9 +152,13 @@ <tr> <td class="label nowrap">{ts}Text Message{/ts}</td> <td> - {$report.mailing.body_text|mb_truncate:30|escape|nl2br} - <br /> - <strong><a class="crm-popup" href='{$textViewURL}'><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View complete message{/ts}</a></strong> + {if $report.mailing.sms_provider_id} + {$report.mailing.body_text|escape|nl2br} + {else} + {$report.mailing.body_text|mb_truncate:100|escape|nl2br} + <br /> + <strong><a class="crm-popup" href='{$textViewURL}'><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View complete message{/ts}</a></strong> + {/if} </td> </tr> {/if} @@ -188,25 +192,24 @@ <legend> {ts}Mailing Settings{/ts} </legend> -{strip} <table class="crm-info-panel"> <tr><td class="label">{ts}Mailing Name{/ts}</td><td>{$report.mailing.name}</td></tr> -<tr><td class="label">{ts}Subject{/ts}</td><td>{$report.mailing.subject}</td></tr> -<tr><td class="label">{ts}From{/ts}</td><td>{$report.mailing.from_name} <{$report.mailing.from_email}></td></tr> -<tr><td class="label">{ts}Reply-to email{/ts}</td><td>{$report.mailing.replyto_email|escape:'htmlall'}</td></tr> - -<tr><td class="label">{ts}Forward replies{/ts}</td><td>{if $report.mailing.forward_replies}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr> -<tr><td class="label">{ts}Auto-respond to replies{/ts}</td><td>{if $report.mailing.auto_responder}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr> - -<tr><td class="label">{ts}Open tracking{/ts}</td><td>{if $report.mailing.open_tracking}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr> -<tr><td class="label">{ts}URL Click-through tracking{/ts}</td><td>{if $report.mailing.url_tracking}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr> -{if $public_url}<td class="label">{ts}Public url{/ts}</td><td><a href="{$public_url}"> {$public_url}</a></td></tr>{/if} +{if !$report.mailing.sms_provider_id} + <tr><td class="label">{ts}Subject{/ts}</td><td>{$report.mailing.subject}</td></tr> + <tr><td class="label">{ts}From{/ts}</td><td>{$report.mailing.from_name} <{$report.mailing.from_email}></td></tr> + <tr><td class="label">{ts}Reply-to email{/ts}</td><td>{$report.mailing.replyto_email|escape:'htmlall'}</td></tr> + <tr><td class="label">{ts}Forward replies{/ts}</td><td>{if $report.mailing.forward_replies}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr> + <tr><td class="label">{ts}Auto-respond to replies{/ts}</td><td>{if $report.mailing.auto_responder}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr> + <tr><td class="label">{ts}Open tracking{/ts}</td><td>{if $report.mailing.open_tracking}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr> + <tr><td class="label">{ts}URL Click-through tracking{/ts}</td><td>{if $report.mailing.url_tracking}{ts}Enabled{/ts}{else}{ts}Disabled{/ts}{/if}</td></tr> +{/if} +{if $public_url} + <tr><td class="label">{ts}Public url{/ts}</td><td><a href="{$public_url}"> {$public_url}</a></td></tr> +{/if} {if $report.mailing.campaign} -<tr><td class="label">{ts}Campaign{/ts}</td><td>{$report.mailing.campaign}</td></tr> + <tr><td class="label">{ts}Campaign{/ts}</td><td>{$report.mailing.campaign}</td></tr> {/if} - </table> -{/strip} </fieldset> <div class="action-link"> <a href="{$backUrl}" ><i class="crm-i fa-chevron-left" aria-hidden="true"></i> {$backUrlTitle}</a> diff --git a/civicrm/templates/CRM/Member/Page/UserDashboard.tpl b/civicrm/templates/CRM/Member/Page/UserDashboard.tpl index 2f43daab19..cc6de7055d 100644 --- a/civicrm/templates/CRM/Member/Page/UserDashboard.tpl +++ b/civicrm/templates/CRM/Member/Page/UserDashboard.tpl @@ -30,7 +30,14 @@ <td class="crm-active-membership-start_date">{$activeMember.start_date|crmDate}</td> <td class="crm-active-membership-end_date">{$activeMember.end_date|crmDate}</td> <td class="crm-active-membership-status">{$activeMember.status}</td> - <td class="crm-active-membership-renew">{if $activeMember.renewPageId}<a href="{crmURL p='civicrm/contribute/transact' q="id=`$activeMember.renewPageId`&mid=`$activeMember.id`&reset=1"}">[ {ts}Renew Now{/ts} ]</a>{/if}</td> + {if ($activeMember.status !== 'Current' AND $activeMember.status !== 'Cancelled') OR !empty($activeMember.cancelSubscriptionUrl) OR !empty($activeMember.updateSubscriptionBillingUrl) OR !empty($activeMember.updateSubscriptionURL)} + <td class="crm-active-membership-renew"> + {if $activeMember.status !== 'Current' AND $activeMember.status !== 'Cancelled'}<a href="{crmURL p='civicrm/contribute/transact' q="id=`$activeMember.renewPageId`&mid=`$activeMember.id`&reset=1"}" class="button"><span class="nowrap">{ts}Renew Now{/ts}</span></a>{/if} + {if !empty($activeMember.cancelSubscriptionUrl)}<a href="{$activeMember.cancelSubscriptionUrl}" class="button"><span class="nowrap">{ts}Cancel Subscription{/ts}</span></a>{/if} + {if !empty($activeMember.updateSubscriptionBillingUrl)}<a href="{$activeMember.updateSubscriptionBillingUrl}" class="button"><span class="nowrap">{ts}Update Billing Information{/ts}</span></a>{/if} + {if !empty($activeMember.updateSubscriptionUrl)}<a href="{$activeMember.updateSubscriptionUrl}" class="button"><span class="nowrap">{ts}Chnage Subscription Amount{/ts}</span></a>{/if} + </td> + {/if} </tr> {/foreach} </table> @@ -60,6 +67,14 @@ <td class="crm-inactive-membership-start_date">{$inActiveMember.start_date|crmDate}</td> <td class="crm-inactive-membership-end_date">{$inActiveMember.end_date|crmDate}</td> <td class="crm-inactive-membership-status">{$inActiveMember.status}</td> + {if $inActiveMember.status == 'Expired' OR !empty($activeMember.cancelSubscriptionUrl) OR !empty($activeMember.updateSubscriptionBillingUrl) OR !empty($activeMember.updateSubscriptionURL)} + <td class="crm-active-membership-renew"> + {if $inActiveMember.status == 'Expired'}<a href="{crmURL p='civicrm/contribute/transact' q="id=`$inActiveMember.renewPageId`&mid=`$inActiveMember.id`&reset=1"}" class="button"><span class="nowrap">{ts}Renew Now{/ts}</span></a>{/if} + {if !empty($inActiveMember.cancelSubscriptionUrl)}<a href="{$inActiveMember.cancelSubscriptionUrl}" class="button"><span class="nowrap">{ts}Cancel Subscription{/ts}</span></a>{/if} + {if !empty($inActiveMember.updateSubscriptionBillingUrl)}<a href="{$inActiveMember.updateSubscriptionBillingUrl}" class="button"><span class="nowrap">{ts}Update Billing Information{/ts}</span></a>{/if} + {if !empty($inActiveMember.updateSubscriptionUrl)}<a href="{$inActiveMember.updateSubscriptionUrl}" class="button"><span class="nowrap">{ts}Chnage Subscription Amount{/ts}</span></a>{/if} + </td> + {/if} <td class="crm-inactive-membership-renew">{if $inActiveMember.renewPageId}<a href="{crmURL p='civicrm/contribute/transact' q="id=`$inActiveMember.renewPageId`&mid=`$inActiveMember.id`&reset=1"}">[ {ts}Renew Now{/ts} ]</a>{/if}</td> </tr> {/foreach} diff --git a/civicrm/templates/CRM/Price/Form/Field.tpl b/civicrm/templates/CRM/Price/Form/Field.tpl index f766e1c555..d9d887daac 100644 --- a/civicrm/templates/CRM/Price/Form/Field.tpl +++ b/civicrm/templates/CRM/Price/Form/Field.tpl @@ -90,25 +90,13 @@ <td>{$form.html_type.html} </td> </tr> - {if $action neq 4 and $action neq 2} - <tr> - <td> </td> - <td class="description">{ts}Select the html type used to offer options for this field{/ts} - </td> - </tr> - {/if} </table> - <div class="spacer"></div> <div id="price-block" {if $action eq 2 && $form.html_type.value.0 eq 'Text'} class="show-block" {else} class="hiddenElement" {/if}> <table class="form-layout"> <tr class="crm-price-field-form-block-price"> - <td class="label">{$form.price.label|smarty:nodefaults} <span class="crm-marker" title="{ts}This field is required.{/ts}">*</span></td> - <td>{$form.price.html} - {if $action neq 4} - <br /><span class="description">{ts}Unit price.{/ts}</span> {help id="id-negative"} - {/if} - </td> + <td class="label">{$form.price.label|smarty:nodefaults} <span class="crm-marker" title="{ts}This field is required.{/ts}">*</span> {help id="id-negative"}</td> + <td>{$form.price.html}</td> </tr> <tr class="crm-price-field-form-block-non-deductible-amount"> <td class="label">{$form.non_deductible_amount.label|smarty:nodefaults}</td> @@ -209,8 +197,8 @@ <td> {$form.is_required.html}</td> </tr> <tr class="crm-price-field-form-block-visibility_id"> - <td class="label">{$form.visibility_id.label}</td> - <td> {$form.visibility_id.html} {help id="id-visibility"}</td> + <td class="label">{$form.visibility_id.label} {help id="id-visibility"}</td> + <td> {$form.visibility_id.html}</td> </tr> <tr class="crm-price-field-form-block-is_active"> <td class="label">{$form.is_active.label}</td> diff --git a/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl b/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl index b1b7081003..7d6aadcca6 100644 --- a/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl +++ b/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl @@ -37,7 +37,12 @@ <td class="label report-contents">{if !empty($field.title)}{$field.title}{/if}</td> <td class="report-contents">{$form.$fieldOp.html}</td> <td> - <span id="{$filterVal}_cell">{$form.$filterVal.label} {$form.$filterVal.html}</span> + <span id="{$filterVal}_cell"> + <label class="sr-only" for="{$form.$filterVal.id}"> + {if !empty($field.title)}{$field.title}{else}{$field.name}{/if} filter value + </label> + {$form.$filterVal.label} {$form.$filterVal.html} + </span> <span id="{$filterMin}_max_cell"> {if array_key_exists($filterMin, $form) && $form.$filterMin}{$form.$filterMin.label} {$form.$filterMin.html} {/if} {if array_key_exists($filterMax, $form) && $form.$filterMax}{$form.$filterMax.label} {$form.$filterMax.html}{/if} diff --git a/civicrm/templates/CRM/UF/Page/ProfileTemplates.tpl b/civicrm/templates/CRM/UF/Page/ProfileTemplates.tpl index c6fdeff238..fb6e17f21e 100644 --- a/civicrm/templates/CRM/UF/Page/ProfileTemplates.tpl +++ b/civicrm/templates/CRM/UF/Page/ProfileTemplates.tpl @@ -3,19 +3,13 @@ *} <script type="text/template" id="designer_template"> <div class="crm-designer-toolbar full-height"> - <div class="crm-designer-buttonset-region ui-dialog-buttonset"> - </div> - <hr /> - <div class="crm-designer-palette-region full-height"> - </div> + <div class="crm-designer-buttonset-region ui-dialog-buttonset"></div> + <div class="crm-designer-palette-region full-height"></div> </div> <div class="crm-designer-canvas full-height scroll"> <div class="crm-designer-preview-canvas"></div> - <div class="crm-designer-form-region"> - </div> - <hr /> - <div class="crm-designer-fields-region"> - </div> + <div class="crm-designer-form-region"></div> + <div class="crm-designer-fields-region"></div> </div> </script> @@ -34,7 +28,6 @@ </select> </span> </div> - <hr> <input type="text" class="crm-form-text" placeholder="{ts}Search Fields{/ts}" /> <a class="crm-designer-palette-clear-search crm-hover-button" href="#" style="visibility:hidden" title="{ts}Clear search{/ts}"><i class="crm-i fa-times" aria-hidden="true"></i></a> <div class="crm-designer-palette-controls"> @@ -99,7 +92,6 @@ <script type="text/template" id="designer_buttons_template"> <button class="crm-designer-save">{ts}Save{/ts}</button> - <button class="crm-designer-preview">{ts}Preview{/ts}</button> </script> <script type="text/template" id="field_canvas_view_template"> diff --git a/civicrm/vendor/autoload.php b/civicrm/vendor/autoload.php index 21520050c6..86190f1705 100644 --- a/civicrm/vendor/autoload.php +++ b/civicrm/vendor/autoload.php @@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494::getLoader(); +return ComposerAutoloaderInit6af910361fa5fc09ae381c6379550e30::getLoader(); diff --git a/civicrm/vendor/composer/autoload_real.php b/civicrm/vendor/composer/autoload_real.php index 0c222b4fc8..e7f93af427 100644 --- a/civicrm/vendor/composer/autoload_real.php +++ b/civicrm/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494 +class ComposerAutoloaderInit6af910361fa5fc09ae381c6379550e30 { private static $loader; @@ -24,22 +24,22 @@ class ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494 require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit6af910361fa5fc09ae381c6379550e30', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit6af910361fa5fc09ae381c6379550e30', 'loadClassLoader')); $includePaths = require __DIR__ . '/include_paths.php'; $includePaths[] = get_include_path(); set_include_path(implode(PATH_SEPARATOR, $includePaths)); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit22d6b31e3ab44c8446106332c4473494::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit6af910361fa5fc09ae381c6379550e30::getInitializer($loader)); $loader->register(true); - $includeFiles = \Composer\Autoload\ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$files; + $includeFiles = \Composer\Autoload\ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$files; foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire22d6b31e3ab44c8446106332c4473494($fileIdentifier, $file); + composerRequire6af910361fa5fc09ae381c6379550e30($fileIdentifier, $file); } return $loader; @@ -51,7 +51,7 @@ class ComposerAutoloaderInit22d6b31e3ab44c8446106332c4473494 * @param string $file * @return void */ -function composerRequire22d6b31e3ab44c8446106332c4473494($fileIdentifier, $file) +function composerRequire6af910361fa5fc09ae381c6379550e30($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/civicrm/vendor/composer/autoload_static.php b/civicrm/vendor/composer/autoload_static.php index b0760254fb..c12c7ca360 100644 --- a/civicrm/vendor/composer/autoload_static.php +++ b/civicrm/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit22d6b31e3ab44c8446106332c4473494 +class ComposerStaticInit6af910361fa5fc09ae381c6379550e30 { public static $files = array ( 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', @@ -684,11 +684,11 @@ class ComposerStaticInit22d6b31e3ab44c8446106332c4473494 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$prefixDirsPsr4; - $loader->prefixesPsr0 = ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$prefixesPsr0; - $loader->fallbackDirsPsr0 = ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$fallbackDirsPsr0; - $loader->classMap = ComposerStaticInit22d6b31e3ab44c8446106332c4473494::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$prefixesPsr0; + $loader->fallbackDirsPsr0 = ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$fallbackDirsPsr0; + $loader->classMap = ComposerStaticInit6af910361fa5fc09ae381c6379550e30::$classMap; }, null, ClassLoader::class); } diff --git a/civicrm/vendor/composer/installed.json b/civicrm/vendor/composer/installed.json index 33be58ea14..dd750be637 100644 --- a/civicrm/vendor/composer/installed.json +++ b/civicrm/vendor/composer/installed.json @@ -2873,17 +2873,17 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "1.29.2", - "version_normalized": "1.29.2.0", + "version": "1.29.4", + "version_normalized": "1.29.4.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f" + "reference": "7ca7e325dca3adb6a598385aab81f527b8d6c75d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f", - "reference": "3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/7ca7e325dca3adb6a598385aab81f527b8d6c75d", + "reference": "7ca7e325dca3adb6a598385aab81f527b8d6c75d", "shasum": "" }, "require": { @@ -2929,7 +2929,7 @@ "mpdf/mpdf": "Option for rendering PDF with PDF Writer", "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" }, - "time": "2024-09-29T07:04:47+00:00", + "time": "2024-11-10T16:26:22+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2975,7 +2975,7 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.2" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.4" }, "install-path": "../phpoffice/phpspreadsheet" }, diff --git a/civicrm/vendor/composer/installed.php b/civicrm/vendor/composer/installed.php index 4eece9e5fa..16784d307e 100644 --- a/civicrm/vendor/composer/installed.php +++ b/civicrm/vendor/composer/installed.php @@ -1,9 +1,9 @@ <?php return array( 'root' => array( 'name' => 'civicrm/civicrm-core', - 'pretty_version' => '5.79.x-dev', - 'version' => '5.79.9999999.9999999-dev', - 'reference' => '745bcfe730c1b49bf73323e3dcef2a9160f25e78', + 'pretty_version' => '5.80.x-dev', + 'version' => '5.80.9999999.9999999-dev', + 'reference' => '86d265a74da20b9294d72517810c6580a7293cc2', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -47,9 +47,9 @@ 'dev_requirement' => false, ), 'civicrm/civicrm-core' => array( - 'pretty_version' => '5.79.x-dev', - 'version' => '5.79.9999999.9999999-dev', - 'reference' => '745bcfe730c1b49bf73323e3dcef2a9160f25e78', + 'pretty_version' => '5.80.x-dev', + 'version' => '5.80.9999999.9999999-dev', + 'reference' => '86d265a74da20b9294d72517810c6580a7293cc2', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -431,9 +431,9 @@ 'dev_requirement' => false, ), 'phpoffice/phpspreadsheet' => array( - 'pretty_version' => '1.29.2', - 'version' => '1.29.2.0', - 'reference' => '3a5a818d7d3e4b5bd2e56fb9de44dbded6eae07f', + 'pretty_version' => '1.29.4', + 'version' => '1.29.4.0', + 'reference' => '7ca7e325dca3adb6a598385aab81f527b8d6c75d', 'type' => 'library', 'install_path' => __DIR__ . '/../phpoffice/phpspreadsheet', 'aliases' => array(), diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/CHANGELOG.md b/civicrm/vendor/phpoffice/phpspreadsheet/CHANGELOG.md index 170398c36c..02794b295b 100644 --- a/civicrm/vendor/phpoffice/phpspreadsheet/CHANGELOG.md +++ b/civicrm/vendor/phpoffice/phpspreadsheet/CHANGELOG.md @@ -5,6 +5,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com) and this project adheres to [Semantic Versioning](https://semver.org). +## 1.29.4 - 2024-11-10 + +### Fixed + +- 1.29.3 omitted +- Backported security patches. +- Write ignoredErrors Tag Before Drawings. Backport of [PR #4212](https://github.com/PHPOffice/PhpSpreadsheet/pull/4212) intended for 3.4.0. +- Changes to ROUNDDOWN/ROUNDUP/TRUNC. Backport of [PR #4214](https://github.com/PHPOffice/PhpSpreadsheet/pull/4214) intended for 3.4.0. +- Replace str_starts_with in Drawing. [Issue #4215](https://github.com/PHPOffice/PhpSpreadsheet/issues/4215) + +### Added + +- Method to Test Whether Csv Will Be Affected by Php9. Backport of [PR #4189](https://github.com/PHPOffice/PhpSpreadsheet/pull/4189) intended for 3.4.0. + ## 1.29.2 - 2024-09-29 ### Fixed diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php index 94b634118a..00144137f0 100644 --- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php +++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php @@ -5,6 +5,8 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; use PhpOffice\PhpSpreadsheet\Calculation\Exception; use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError; +// following added in Php8.4 +use RoundingMode; class Round { @@ -67,22 +69,19 @@ class Round return 0.0; } - $digitsPlus1 = $digits + 1; - if ($number < 0.0) { - if ($digitsPlus1 < 0) { - return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN); - } - $result = sprintf("%.{$digitsPlus1}f", $number - 0.5 * 0.1 ** $digits); - - return round((float) $result, $digits, PHP_ROUND_HALF_DOWN); + if (PHP_VERSION_ID >= 80400) { + return round( + (float) (string) $number, + $digits, + RoundingMode::AwayFromZero //* @phpstan-ignore-line + ); } - if ($digitsPlus1 < 0) { - return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN); + if ($number < 0.0) { + return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN); } - $result = sprintf("%.{$digitsPlus1}f", $number + 0.5 * 0.1 ** $digits); - return round((float) $result, $digits, PHP_ROUND_HALF_DOWN); + return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN); } /** @@ -90,8 +89,8 @@ class Round * * Rounds a number down to a specified number of decimal places * - * @param array|float $number Number to round, or can be an array of numbers - * @param array|int $digits Number of digits to which you want to round $number, or can be an array of numbers + * @param null|array|float|string $number Number to round, or can be an array of numbers + * @param array|float|int|string $digits Number of digits to which you want to round $number, or can be an array of numbers * * @return array|float|string Rounded Number, or a string containing an error * If an array of numbers is passed as the argument, then the returned result will also be an array @@ -114,23 +113,19 @@ class Round return 0.0; } - $digitsPlus1 = $digits + 1; - if ($number < 0.0) { - if ($digitsPlus1 < 0) { - return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP); - } - $result = sprintf("%.{$digitsPlus1}f", $number + 0.5 * 0.1 ** $digits); - - return round((float) $result, $digits, PHP_ROUND_HALF_UP); + if (PHP_VERSION_ID >= 80400) { + return round( + (float) (string) $number, + $digits, + RoundingMode::TowardsZero //* @phpstan-ignore-line + ); } - if ($digitsPlus1 < 0) { - return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP); + if ($number < 0.0) { + return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP); } - $result = sprintf("%.{$digitsPlus1}f", $number - 0.5 * 0.1 ** $digits); - - return round((float) $result, $digits, PHP_ROUND_HALF_UP); + return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP); } /** @@ -141,7 +136,7 @@ class Round * @param mixed $number Expect float. Number to round, or can be an array of numbers * @param mixed $multiple Expect int. Multiple to which you want to round, or can be an array of numbers. * - * @return array|float|string Rounded Number, or a string containing an error + * @return array|float|int|string Rounded Number, or a string containing an error * If an array of numbers is passed as the argument, then the returned result will also be an array * with the same dimensions */ @@ -210,7 +205,7 @@ class Round * * @param array|float $number Number to round, or can be an array of numbers * - * @return array|float|string Rounded Number, or a string containing an error + * @return array|float|int|string Rounded Number, or a string containing an error * If an array of numbers is passed as the argument, then the returned result will also be an array * with the same dimensions */ diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php index ee60105bb1..bd128ba64d 100644 --- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php +++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php @@ -3,7 +3,6 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig; use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled; -use PhpOffice\PhpSpreadsheet\Calculation\Exception; class Trunc { @@ -13,11 +12,14 @@ class Trunc * TRUNC. * * Truncates value to the number of fractional digits by number_digits. + * This will probably not be the precise result in the unlikely + * event that the number of digits to the left of the decimal + * plus the number of digits to the right exceeds PHP_FLOAT_DIG + * (or possibly that value minus 1). + * Excel is unlikely to do any better. * - * @param array|float $value - * Or can be an array of values - * @param array|int $digits - * Or can be an array of values + * @param null|array|float|string $value Or can be an array of values + * @param array|float|int|string $digits Or can be an array of values * * @return array|float|string Truncated value, or a string containing an error * If an array of numbers is passed as an argument, then the returned result will also be an array @@ -29,33 +31,6 @@ class Trunc return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $digits); } - try { - $value = Helpers::validateNumericNullBool($value); - $digits = Helpers::validateNumericNullSubstitution($digits, null); - } catch (Exception $e) { - return $e->getMessage(); - } - - if ($value == 0) { - return $value; - } - - if ($value >= 0) { - $minusSign = ''; - } else { - $minusSign = '-'; - $value = -$value; - } - - $digits = (int) floor($digits); - if ($digits < 0) { - $power = (int) (10 ** -$digits); - $result = intdiv((int) floor($value), $power) * $power; - return ($minusSign === '') ? $result : -$result; - } - $digitsPlus1 = $digits + 1; - $result = substr($minusSign . sprintf("%.{$digitsPlus1}f", $value), 0, -1); - - return (float) $result; + return Round::down($value, $digits); } } diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php index 3feec8e885..b866892757 100644 --- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php +++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php @@ -10,6 +10,7 @@ use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException; use PhpOffice\PhpSpreadsheet\Shared\StringHelper; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style\NumberFormat; +use Throwable; class Csv extends BaseReader { @@ -85,7 +86,7 @@ class Csv extends BaseReader * It is anticipated that it will conditionally be set * to null-string for Php9 and above. */ - private static string $defaultEscapeCharacter = '\\'; + private static string $defaultEscapeCharacter = PHP_VERSION_ID < 90000 ? '\\' : ''; /** * Callback for setting defaults in construction. @@ -295,6 +296,12 @@ class Csv extends BaseReader if (!$fhandle) { throw new Exception($filename . ' is an Invalid Spreadsheet file.'); } + if ($this->inputEncoding === 'UTF-8') { + $encoding = self::guessEncodingBom($filename); + if ($encoding !== '') { + $this->inputEncoding = $encoding; + } + } if ($this->inputEncoding === self::GUESS_ENCODING) { $this->inputEncoding = self::guessEncoding($filename, $this->fallbackEncoding); } @@ -322,7 +329,7 @@ class Csv extends BaseReader private function setAutoDetect(?string $value): ?string { $retVal = null; - if ($value !== null && $this->testAutodetect) { + if ($value !== null && $this->testAutodetect && PHP_VERSION_ID < 90000) { $retVal2 = @ini_set('auto_detect_line_endings', $value); if (is_string($retVal2)) { $retVal = $retVal2; @@ -371,6 +378,20 @@ class Csv extends BaseReader // Deprecated in Php8.1 $iniset = $this->setAutoDetect('1'); + try { + $this->loadStringOrFile2($filename, $spreadsheet, $dataUri); + $this->setAutoDetect($iniset); + } catch (Throwable $e) { + $this->setAutoDetect($iniset); + + throw $e; + } + + return $spreadsheet; + } + + private function loadStringOrFile2(string $filename, Spreadsheet $spreadsheet, bool $dataUri): void + { // Open file if ($dataUri) { $this->openDataUri($filename); @@ -428,11 +449,6 @@ class Csv extends BaseReader // Close file fclose($fileHandle); - - $this->setAutoDetect($iniset); - - // Return - return $spreadsheet; } /** @@ -544,6 +560,10 @@ class Csv extends BaseReader */ public function setEscapeCharacter(string $escapeCharacter): self { + if (PHP_VERSION_ID >= 90000 && $escapeCharacter !== '') { + throw new ReaderException('Escape character must be null string for Php9+'); + } + $this->escapeCharacter = $escapeCharacter; return $this; @@ -620,17 +640,15 @@ class Csv extends BaseReader } } - private static function guessEncodingBom(string $filename): string + public static function guessEncodingBom(string $filename, ?string $convertString = null): string { $encoding = ''; - $first4 = file_get_contents($filename, false, null, 0, 4); - if ($first4 !== false) { - self::guessEncodingTestBom($encoding, $first4, self::UTF8_BOM, 'UTF-8'); - self::guessEncodingTestBom($encoding, $first4, self::UTF16BE_BOM, 'UTF-16BE'); - self::guessEncodingTestBom($encoding, $first4, self::UTF32BE_BOM, 'UTF-32BE'); - self::guessEncodingTestBom($encoding, $first4, self::UTF32LE_BOM, 'UTF-32LE'); - self::guessEncodingTestBom($encoding, $first4, self::UTF16LE_BOM, 'UTF-16LE'); - } + $first4 = $convertString ?? (string) file_get_contents($filename, false, null, 0, 4); + self::guessEncodingTestBom($encoding, $first4, self::UTF8_BOM, 'UTF-8'); + self::guessEncodingTestBom($encoding, $first4, self::UTF16BE_BOM, 'UTF-16BE'); + self::guessEncodingTestBom($encoding, $first4, self::UTF32BE_BOM, 'UTF-32BE'); + self::guessEncodingTestBom($encoding, $first4, self::UTF32LE_BOM, 'UTF-32LE'); + self::guessEncodingTestBom($encoding, $first4, self::UTF16LE_BOM, 'UTF-16LE'); return $encoding; } @@ -679,4 +697,39 @@ class Csv extends BaseReader return fgetcsv($stream, $length, $separator, $enclosure, $escape); } + + public static function affectedByPhp9( + string $filename, + string $inputEncoding = 'UTF-8', + ?string $delimiter = null, + string $enclosure = '"', + string $escapeCharacter = '\\' + ): bool { + if (PHP_VERSION_ID < 70400 || PHP_VERSION_ID >= 90000) { + throw new ReaderException('Function valid only for Php7.4 or Php8'); // @codeCoverageIgnore + } + $reader1 = new self(); + $reader1->setInputEncoding($inputEncoding) + ->setTestAutoDetect(true) + ->setEscapeCharacter($escapeCharacter) + ->setDelimiter($delimiter) + ->setEnclosure($enclosure); + $spreadsheet1 = $reader1->load($filename); + $sheet1 = $spreadsheet1->getActiveSheet(); + $array1 = $sheet1->toArray(null, false, false); + $spreadsheet1->disconnectWorksheets(); + + $reader2 = new self(); + $reader2->setInputEncoding($inputEncoding) + ->setTestAutoDetect(false) + ->setEscapeCharacter('') + ->setDelimiter($delimiter) + ->setEnclosure($enclosure); + $spreadsheet2 = $reader2->load($filename); + $sheet2 = $spreadsheet2->getActiveSheet(); + $array2 = $sheet2->toArray(null, false, false); + $spreadsheet2->disconnectWorksheets(); + + return $array1 !== $array2; + } } diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php index 19bf67b200..bfb52401aa 100644 --- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php +++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php @@ -168,7 +168,7 @@ class Html extends BaseReader private function readEnding(): string { $meta = stream_get_meta_data($this->fileHandle); - $filename = $meta['uri']; // @phpstan-ignore-line + $filename = $meta['uri']; $size = (int) filesize($filename); if ($size === 0) { diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php index 9ac5e955d1..bb743277d6 100644 --- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php +++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php @@ -6,6 +6,9 @@ use PhpOffice\PhpSpreadsheet\Reader; class XmlScanner { + private const ENCODING_PATTERN = '/encoding\\s*=\\s*(["\'])(.+?)\\1/s'; + private const ENCODING_UTF7 = '/encoding\\s*=\\s*(["\'])UTF-7\\1/si'; + /** * String used to identify risky xml elements. * @@ -114,13 +117,24 @@ class XmlScanner private function toUtf8($xml) { $charset = $this->findCharSet($xml); + $foundUtf7 = $charset === 'UTF-7'; if ($charset !== 'UTF-8') { + $testStart = '/^.{0,4}\\s*<?xml/s'; + $startWithXml1 = preg_match($testStart, $xml); $xml = self::forceString(mb_convert_encoding($xml, 'UTF-8', $charset)); - - $charset = $this->findCharSet($xml); - if ($charset !== 'UTF-8') { - throw new Reader\Exception('Suspicious Double-encoded XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); + if ($startWithXml1 === 1 && preg_match($testStart, $xml) !== 1) { + throw new Reader\Exception('Double encoding not permitted'); } + $foundUtf7 = $foundUtf7 || (preg_match(self::ENCODING_UTF7, $xml) === 1); + $xml = preg_replace(self::ENCODING_PATTERN, '', $xml) ?? $xml; + } else { + $foundUtf7 = $foundUtf7 || (preg_match(self::ENCODING_UTF7, $xml) === 1); + } + if ($foundUtf7) { + throw new Reader\Exception('UTF-7 encoding not permitted'); + } + if (substr($xml, 0, Reader\Csv::UTF8_BOM_LEN) === Reader\Csv::UTF8_BOM) { + $xml = substr($xml, Reader\Csv::UTF8_BOM_LEN); } return $xml; @@ -128,15 +142,16 @@ class XmlScanner private function findCharSet(string $xml): string { - $patterns = [ - '/encoding\\s*=\\s*"([^"]*]?)"/', - "/encoding\\s*=\\s*'([^']*?)'/", - ]; - - foreach ($patterns as $pattern) { - if (preg_match($pattern, $xml, $matches)) { - return strtoupper($matches[1]); - } + if (substr($xml, 0, 4) === "\x4c\x6f\xa7\x94") { + throw new Reader\Exception('EBCDIC encoding not permitted'); + } + $encoding = Reader\Csv::guessEncodingBom('', $xml); + if ($encoding !== '') { + return $encoding; + } + $xml = str_replace("\0", '', $xml); + if (preg_match(self::ENCODING_PATTERN, $xml, $matches)) { + return strtoupper($matches[2]); } return 'UTF-8'; @@ -151,13 +166,16 @@ class XmlScanner */ public function scan($xml) { - $xml = "$xml"; $this->disableEntityLoaderCheck(); + // Don't rely purely on libxml_disable_entity_loader() + $pattern = '/\\0*' . implode('\\0*', /** @scrutinizer ignore-type */ str_split($this->pattern)) . '\\0*/'; - $xml = $this->toUtf8($xml); + $xml = "$xml"; + if (preg_match($pattern, $xml)) { + throw new Reader\Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); + } - // Don't rely purely on libxml_disable_entity_loader() - $pattern = '/\\0?' . implode('\\0?', /** @scrutinizer ignore-type */ str_split($this->pattern)) . '\\0?/'; + $xml = $this->toUtf8($xml); if (preg_match($pattern, $xml)) { throw new Reader\Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); @@ -171,7 +189,7 @@ class XmlScanner } /** - * Scan theXML for use of <!ENTITY to prevent XXE/XEE attacks. + * Scan the XML for use of <!ENTITY to prevent XXE/XEE attacks. * * @param string $filestream * diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php index 6be26fc2c6..e60f2de4c4 100644 --- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php +++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php @@ -17,7 +17,6 @@ use PhpOffice\PhpSpreadsheet\RichText\RichText; use PhpOffice\PhpSpreadsheet\Settings; use PhpOffice\PhpSpreadsheet\Shared\Date; use PhpOffice\PhpSpreadsheet\Shared\File; -use PhpOffice\PhpSpreadsheet\Shared\StringHelper; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use SimpleXMLElement; @@ -77,10 +76,8 @@ class Xml extends BaseReader ]; // Open file - $data = file_get_contents($filename) ?: ''; - - // Why? - //$data = str_replace("'", '"', $data); // fix headers with single quote + $data = (string) file_get_contents($filename); + $data = $this->getSecurityScannerOrThrow()->scan($data); $valid = true; foreach ($signature as $match) { @@ -92,14 +89,6 @@ class Xml extends BaseReader } } - // Retrieve charset encoding - if (preg_match('/<?xml.*encoding=[\'"](.*?)[\'"].*?>/m', $data, $matches)) { - $charSet = strtoupper($matches[1]); - if (preg_match('/^ISO-8859-\d[\dL]?$/i', $charSet) === 1) { - $data = StringHelper::convertEncoding($data, 'UTF-8', $charSet); - $data = (string) preg_replace('/(<?xml.*encoding=[\'"]).*?([\'"].*?>)/um', '$1' . 'UTF-8' . '$2', $data, 1); - } - } $this->fileContents = $data; return $valid; diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php index aec54266dc..4b4d724b3f 100644 --- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php +++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php @@ -167,7 +167,7 @@ class Drawing extends BaseDrawing { $mime = (string) @mime_content_type($path); $retVal = false; - if (str_starts_with($mime, 'image/')) { + if (strpos($mime, 'image/') === 0) { $retVal = true; } elseif ($mime === 'application/octet-stream') { $extension = pathinfo($path, PATHINFO_EXTENSION); diff --git a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php index 5e453b3d86..588c5214fb 100644 --- a/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php +++ b/civicrm/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php @@ -122,6 +122,9 @@ class Worksheet extends WriterPart // Breaks $this->writeBreaks($objWriter, $worksheet); + // IgnoredErrors + $this->writeIgnoredErrors($objWriter); + // Drawings and/or Charts $this->writeDrawings($objWriter, $worksheet, $includeCharts); @@ -134,9 +137,6 @@ class Worksheet extends WriterPart // AlternateContent $this->writeAlternateContent($objWriter, $worksheet); - // IgnoredErrors - $this->writeIgnoredErrors($objWriter); - // Table $this->writeTable($objWriter, $worksheet); diff --git a/civicrm/xml/templates/joomla.tpl b/civicrm/xml/templates/joomla.tpl index f51a8cba80..d16f21e7e1 100644 --- a/civicrm/xml/templates/joomla.tpl +++ b/civicrm/xml/templates/joomla.tpl @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!-- Generated from {$smarty.template} - {$generated} --> <extension method="upgrade" type="component" version="2.5"> <name>CiviCRM</name> diff --git a/civicrm/xml/version.xml b/civicrm/xml/version.xml index eb243c5359..72925a0ea4 100644 --- a/civicrm/xml/version.xml +++ b/civicrm/xml/version.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="iso-8859-1"?> <version> - <version_no>5.79.1</version_no> - <releaseDate>2024-11-25</releaseDate> + <version_no>5.80.0</version_no> + <releaseDate>2024-12-05</releaseDate> </version> diff --git a/wp-rest/Autoloader.php b/wp-rest/Autoloader.php index a98c1f4562..7acc809f6b 100644 --- a/wp-rest/Autoloader.php +++ b/wp-rest/Autoloader.php @@ -67,7 +67,7 @@ class Autoloader { self::instance(); if (!is_readable(trailingslashit($source_path))) { - return \WP_Error('civicrm_wp_rest_error', sprintf(__('The source %s is not readable.', 'civicrm'), $source)); + return new \WP_Error('civicrm_wp_rest_error', sprintf(__('The source %s is not readable.', 'civicrm'), $source)); } self::$source_directories[] = $source_path; -- GitLab