From f547100391e0a27065bd0fa147ab834380f3fb43 Mon Sep 17 00:00:00 2001 From: Adam Charron Date: Fri, 11 Nov 2022 10:12:13 -0500 Subject: [PATCH] Syncing files from `cloud/master` to `master` --- .codecov.yml | 2 +- .gitignore | 3 + .prettierignore | 79 +- .swcrc | 27 + .vscode/launch.json | 15 + .vscode/settings.json | 7 +- ...otion-serialize-npm-1.0.3-2a28e46c06.patch | 8 +- .yarnrc.yml | 8 +- CODE_OF_CONDUCT.md | 20 +- CONTRIBUTING.md | 18 +- PULL_REQUEST_TEMPLATE.md | 12 +- addons/themes/keystone/KeystoneThemeHooks.php | 88 +- addons/themes/keystone/README.md | 18 +- .../keystone/settings/configuration.php | 18 +- .../keystone/src/scss/base/_variables.scss | 492 +- .../src/scss/base/_variables_cerulean.scss | 109 +- .../src/scss/base/_variables_classic.scss | 168 +- .../src/scss/base/_variables_coral.scss | 110 +- .../src/scss/base/_variables_dark.scss | 127 +- .../src/scss/base/_variables_dusk.scss | 162 +- .../src/scss/components/_kbicons.scss | 34 +- .../src/scss/components/_lists_cerulean.scss | 5 +- .../scss/components/_modmessage_coral.scss | 1 - .../src/scss/components/_modmessage_dark.scss | 1 - .../src/scss/components/_modmessage_dusk.scss | 1 - .../src/scss/components/_popup_dark.scss | 24 +- .../src/scss/components/_popup_dusk.scss | 24 +- .../src/scss/components/_searchbox_dark.scss | 1 - .../src/scss/components/_searchbox_dusk.scss | 1 - .../src/scss/sections/_footer_cerulean.scss | 1 - .../src/scss/sections/_header_cerulean.scss | 1 - .../src/scss/sections/_header_coral.scss | 1 - .../src/scss/sections/_header_default.scss | 1 - .../src/scss/sections/_navigation_dark.scss | 2 - .../src/scss/sections/_panel_cerulean.scss | 2 - .../src/scss/sections/_panel_classic.scss | 2 - .../src/scss/sections/_themeoptions.scss | 16 +- addons/themes/lavendermoon/README.md | 3 +- addons/themes/lavendermoon/assets/styles.css | 106 +- addons/themes/lavendermoon/assets/styles.scss | 7 +- .../themes/lavendermoon/src/scss/custom.scss | 1 - addons/themes/lavendersun/README.md | 3 +- addons/themes/lavendersun/assets/styles.css | 106 +- addons/themes/lavendersun/assets/styles.scss | 7 +- addons/themes/theme-boilerplate/README.md | 29 +- addons/themes/theme-boilerplate/package.json | 2 +- .../settings/configuration.php | 8 +- .../setup/boilerplateInstall.js | 13 +- .../theme-boilerplate/setup/src/README.md | 6 +- .../themes/theme-boilerplate/setup/utils.js | 19 +- .../theme-boilerplate/structure-variables.md | 88 +- .../theme-dashboard/views/admin.master.twig | 30 +- .../theme-foundation/assets/footer.twig | 23 +- .../themes/theme-foundation/assets/styles.css | 4 +- .../theme-foundation/assets/variables.neon | 3 - .../View/LegacyMessageInboxLayoutView.php | 13 +- .../api/ConversationsApiController.php | 471 +- .../controllers/api/MessagesApiController.php | 296 +- .../class.conversationscontroller.php | 36 +- .../controllers/class.messagescontroller.php | 396 +- .../Menu/ConversationCounterProvider.php | 10 +- applications/conversations/locale/en.php | 14 +- .../models/class.conversationmessagemodel.php | 264 +- .../models/class.conversationmodel.php | 734 +- .../models/class.conversationsmodel.php | 103 +- .../modules/class.addpeoplemodule.php | 58 +- .../modules/class.clearhistorymodule.php | 12 +- .../modules/class.inboxmodule.php | 21 +- .../class.inthisconversationmodule.php | 16 +- .../modules/class.newconversationmodule.php | 9 +- .../conversations/settings/class.hooks.php | 162 +- .../conversations/settings/configuration.php | 28 +- .../conversations/settings/structure.php | 156 +- applications/conversations/settings/stub.php | 47 +- .../Addon/DashboardContainerRules.php | 89 +- .../Addon/RecordStatusEventHandlers.php | 51 + .../Addon/UserMentionsEventHandler.php | 110 + .../Analytics/SearchMembersEventProvider.php | 35 + .../Events/AfterUserAnonymizeEvent.php | 48 + .../DiscussionStatusDefinitionEvent.php | 15 - .../Events/IdeaStatusDefinitionEvent.php | 18 - .../dashboard/Events/LogPostEvent.php | 35 +- .../dashboard/Events/NotificationEvent.php | 3 +- .../Events/RecordStatusDefinitionEvent.php | 99 - .../RecordStatusDefinitionEventHandler.php | 156 - .../dashboard/Events/SearchMembersEvent.php | 56 + .../dashboard/Events/UserDisciplineEvent.php | 59 +- applications/dashboard/Events/UserEvent.php | 41 +- .../dashboard/Events/UserPointEvent.php | 69 +- applications/dashboard/Gruntfile.js | 174 - .../Layout/View/LegacyProfileLayoutView.php | 13 +- .../View/LegacyRegistrationLayoutView.php | 13 +- .../Layout/View/LegacySigninLayoutView.php | 13 +- applications/dashboard/README.md | 11 +- .../Schemas/BaseTrackableSearchSchema.php | 52 + .../LayoutSettingsPageController.php | 15 +- .../controllers/ManageController.php | 18 +- .../Pages/AppearancePageController.php | 9 +- .../controllers/Pages/DashboardPage.php | 15 +- .../controllers/Pages/HomePageController.php | 29 +- .../controllers/Pages/LegacyDashboardPage.php | 46 +- .../controllers/RequestsController.php | 87 +- .../controllers/RobotsController.php | 16 +- .../controllers/StaticContentController.php | 12 +- .../controllers/TickApiController.php | 24 +- .../controllers/api/AbstractApiController.php | 38 +- .../controllers/api/AddonsApiController.php | 233 +- .../api/ApplicantsApiController.php | 201 +- .../controllers/api/AssetsApiController.php | 57 + .../api/AuthenticatorTypesApiController.php | 53 + .../api/AuthenticatorsApiController.php | 210 +- .../controllers/api/CallsApiController.php | 21 +- .../controllers/api/ConfigApiController.php | 107 +- .../api/DashboardApiController.php | 83 +- .../controllers/api/DbaApiController.php | 148 + .../controllers/api/InvitesApiController.php | 181 +- .../api/JobStatusesApiController.php | 106 +- .../controllers/api/LayoutsApiController.php | 499 +- .../controllers/api/LocalesApiController.php | 124 +- .../controllers/api/MediaApiController.php | 300 +- .../api/ModerationMessagesApiController.php | 34 +- .../api/NotificationsApiController.php | 162 +- .../controllers/api/OpenApiApiController.php | 77 +- .../api/ProfileFieldsApiController.php | 183 + .../api/ResourcesApiController.php | 116 +- .../api/RoleRequestsApiController.php | 336 +- .../controllers/api/RolesApiController.php | 359 +- .../controllers/api/SearchApiController.php | 36 +- .../api/SiteTotalsApiController.php | 17 +- .../api/SiteTotalsFilterOpenApi.php | 16 +- .../api/SourcemapsApiController.php | 24 +- .../controllers/api/ThemesApiController.php | 114 +- .../controllers/api/ThemesApiSchemes.php | 136 +- .../controllers/api/TokensApiController.php | 207 +- .../api/UserMentionsApiController.php | 126 + .../controllers/api/UsersApiController.php | 888 +- .../controllers/class.activitycontroller.php | 261 +- .../class.addoncachecontroller.php | 76 +- .../controllers/class.assetcontroller.php | 20 +- .../controllers/class.dashboardcontroller.php | 91 +- .../controllers/class.dbacontroller.php | 122 +- .../controllers/class.embedcontroller.php | 116 +- .../controllers/class.entrycontroller.php | 1564 +- .../controllers/class.homecontroller.php | 161 +- .../controllers/class.importcontroller.php | 141 +- .../controllers/class.logcontroller.php | 372 +- .../controllers/class.messagecontroller.php | 165 +- .../controllers/class.modulecontroller.php | 46 +- .../class.notificationscontroller.php | 92 +- .../controllers/class.plugincontroller.php | 3 +- .../controllers/class.profilecontroller.php | 1389 +- .../controllers/class.rolecontroller.php | 187 +- .../controllers/class.rootcontroller.php | 14 +- .../controllers/class.routescontroller.php | 77 +- .../controllers/class.searchcontroller.php | 63 +- .../controllers/class.sessioncontroller.php | 15 +- .../controllers/class.settingscontroller.php | 1644 +- .../controllers/class.setupcontroller.php | 294 +- .../controllers/class.socialcontroller.php | 45 +- .../class.statisticscontroller.php | 85 +- .../controllers/class.usercontroller.php | 792 +- .../controllers/class.utilitycontroller.php | 462 +- applications/dashboard/design/admin-new.css | 29 +- .../dashboard/design/admin-new.css.map | 2 +- applications/dashboard/design/admin.css | 1183 +- applications/dashboard/design/admin.css.map | 2 +- .../widgetIcons/{ctamodule.svg => cta.svg} | 0 .../widgetIcons/featuredcollections.svg | 23 + .../{guestmodule.svg => guest-cta.svg} | 0 .../design/images/widgetIcons/sitetotals.svg | 25 + .../dashboard/design/isStaticVariables.css | 2 - applications/dashboard/design/navbar.css | 49 +- applications/dashboard/design/navbar.css.map | 2 +- .../dashboard/design/style-compat.css | 176 +- .../dashboard/design/style-compat.css.map | 2 +- applications/dashboard/design/style.css | 243 +- applications/dashboard/design/style.css.map | 2 +- applications/dashboard/js/dashboard.js | 1449 +- applications/dashboard/js/entry.js | 7 + applications/dashboard/js/src/main.js | 2 +- .../dashboard/js/src/modal.dashboard.js | 2 +- applications/dashboard/js/user.js | 3 +- .../library/Jobs/ExecuteActivityQueue.php | 43 - .../library/Menu/ActivityCounterProvider.php | 18 +- .../library/Menu/LogCounterProvider.php | 21 +- .../library/Menu/RoleCounterProvider.php | 15 +- .../dashboard/library/class.emailtemplate.php | 200 +- .../library/class.nestedcollection.php | 297 +- .../library/class.nestedcollectionadapter.php | 43 +- .../library/class.rawemailtemplate.php | 31 +- .../library/class.staticinitializer.php | 9 +- .../library/interface.iemailtemplate.php | 5 +- applications/dashboard/locale/en.php | 244 +- .../dashboard/models/ActivityEmail.php | 83 +- .../dashboard/models/AggregateCountModel.php | 161 + .../dashboard/models/AggregateCountOption.php | 191 + .../models/AggregateCountableInterface.php | 23 + .../models/AuthenticatorTypeService.php | 74 + .../dashboard/models/BannerImageModel.php | 74 +- .../models/ModerationMessageStructure.php | 168 +- .../ModerationMessagesFilterOpenApi.php | 16 +- .../PermissionJunctionModelInterface.php | 3 +- .../dashboard/models/ProfileFieldModel.php | 752 + .../dashboard/models/ProfileFieldsOpenApi.php | 36 + .../models/RecordStatusActiveEvent.php | 74 + .../dashboard/models/RecordStatusLogModel.php | 209 + .../dashboard/models/RecordStatusModel.php | 583 +- .../models/RecordStatusStructureEvent.php | 15 + .../dashboard/models/ReflectionAction.php | 242 +- .../dashboard/models/RemoteResourceModel.php | 68 +- .../dashboard/models/RoleRequestMetaModel.php | 78 +- .../dashboard/models/RoleRequestModel.php | 209 +- .../models/ShortCircuitException.php | 8 +- .../dashboard/models/SsoUsersExpander.php | 36 +- .../dashboard/models/SwaggerModel.php | 94 +- .../dashboard/models/UserFragment.php | 37 +- .../models/UserLeaderProviderInterface.php | 6 +- .../dashboard/models/UserLeaderQuery.php | 21 +- .../dashboard/models/UserLeaderService.php | 94 +- .../models/UserMentionsInterface.php | 23 + .../dashboard/models/UserMentionsModel.php | 450 + .../dashboard/models/UserPointsModel.php | 189 +- .../models/UserSiteTotalProvider.php | 20 +- .../dashboard/models/UserVisitUpdater.php | 66 +- .../dashboard/models/UsersExpander.php | 37 +- .../dashboard/models/class.activitymodel.php | 1909 +-- .../models/class.attachmentmodel.php | 133 +- .../dashboard/models/class.banmodel.php | 281 +- .../dashboard/models/class.dbamodel.php | 229 +- .../dashboard/models/class.exportmodel.php | 169 +- .../dashboard/models/class.importmodel.php | 1387 +- .../models/class.invitationmodel.php | 158 +- .../dashboard/models/class.localemodel.php | 107 +- .../dashboard/models/class.logmodel.php | 704 +- .../dashboard/models/class.mediamodel.php | 288 +- .../dashboard/models/class.messagemodel.php | 192 +- .../models/class.permissionmodel.php | 866 +- .../dashboard/models/class.regardingmodel.php | 42 +- .../dashboard/models/class.rolemodel.php | 461 +- .../dashboard/models/class.sessionmodel.php | 261 +- .../models/class.smf2importmodel.php | 35 +- .../dashboard/models/class.spammodel.php | 124 +- .../dashboard/models/class.tagmodel.php | 855 +- .../dashboard/models/class.updatemodel.php | 428 +- .../class.userauthenticationnoncemodel.php | 54 +- .../class.userauthenticationtokenmodel.php | 51 +- .../dashboard/models/class.usermetamodel.php | 437 +- .../dashboard/models/class.usermodel.php | 3928 ++--- .../models/class.vanilla1importmodel.php | 17 +- .../models/class.vbulletinimportmodel.php | 86 +- applications/dashboard/models/tiny_diff.php | 55 +- .../modules/CommunityLeadersModule.php | 86 +- .../modules/RoleApplicationLinksModule.php | 29 +- .../modules/class.activityfiltermodule.php | 12 +- .../modules/class.conditionmodule.php | 46 +- .../modules/class.configurationmodule.php | 101 +- .../modules/class.cropimagemodule.php | 112 +- .../modules/class.dashboardnavmodule.php | 269 +- .../modules/class.dropdownmodule.php | 90 +- .../dashboard/modules/class.guestmodule.php | 87 +- .../dashboard/modules/class.headmodule.php | 327 +- .../modules/class.mediaitemmodule.php | 216 +- .../dashboard/modules/class.memodule.php | 16 +- .../dashboard/modules/class.menumodule.php | 136 +- .../dashboard/modules/class.messagemodule.php | 18 +- .../modules/class.morepagermodule.php | 126 +- .../dashboard/modules/class.navmodule.php | 63 +- .../dashboard/modules/class.pagermodule.php | 352 +- .../modules/class.profilefiltermodule.php | 12 +- .../modules/class.profileoptionsmodule.php | 89 +- .../modules/class.recentactivitymodule.php | 27 +- .../modules/class.recentusermodule.php | 24 +- .../modules/class.settingsmodule.php | 24 +- .../modules/class.sidemenumodule.php | 172 +- .../modules/class.signedinmodule.php | 11 +- .../dashboard/modules/class.sitenavmodule.php | 183 +- .../modules/class.sitetotalsmodule.php | 81 +- .../modules/class.tablesummarymodule.php | 69 +- .../modules/class.togglemenumodule.php | 45 +- .../dashboard/modules/class.tracemodule.php | 21 +- .../dashboard/modules/class.userbanmodule.php | 39 +- .../dashboard/modules/class.userboxmodule.php | 14 +- .../modules/class.userinfomodule.php | 36 +- .../modules/class.userphotomodule.php | 21 +- applications/dashboard/openapi/assets.yml | 13 + .../dashboard/openapi/authenticator-types.yml | 30 + .../dashboard/openapi/authenticators.yml | 156 +- applications/dashboard/openapi/config.yml | 116 +- applications/dashboard/openapi/dba.yml | 72 + applications/dashboard/openapi/layouts.yml | 56 +- applications/dashboard/openapi/media.yml | 140 +- .../dashboard/openapi/notifications.yml | 12 + .../dashboard/openapi/profile-fields.yml | 420 + applications/dashboard/openapi/statuses.yml | 12 + applications/dashboard/openapi/tick.yml | 124 + .../dashboard/openapi/user-mentions.yml | 118 + applications/dashboard/openapi/users.yml | 105 +- applications/dashboard/package.json | 37 +- applications/dashboard/scss/admin-new.scss | 5 +- applications/dashboard/scss/admin.scss | 29 +- .../dashboard/scss/compatibility/_groups.scss | 15 +- .../scss/compatibility/_image-cropper.scss | 3 +- .../dashboard/scss/compatibility/_mixins.scss | 5 +- .../dashboard/scss/compatibility/_popups.scss | 4 +- .../scss/compatibility/_utilities.scss | 1 - .../editor/_mixin.legacyEditor.scss | 12 +- .../editor/_mixin.legacyMobileStyles.scss | 2 +- .../editor/_richEditorLegacy.scss | 32 +- .../dashboard/scss/extensions/README.md | 2 +- .../dashboard/scss/extensions/_alert.scss | 309 +- .../dashboard/scss/extensions/_buttons.scss | 4 +- .../dashboard/scss/extensions/_feed.scss | 133 +- .../dashboard/scss/extensions/_forms.scss | 16 +- .../dashboard/scss/extensions/_modal.scss | 20 +- .../dashboard/scss/extensions/_toasters.scss | 38 +- .../dashboard/scss/legacy/_jcrop.scss | 170 +- .../dashboard/scss/legacy/_style.scss | 4811 +++--- .../dashboard/scss/legacy/_utilities.scss | 12 +- .../dashboard/scss/legacy/_variables.scss | 2 +- applications/dashboard/scss/maps/README.md | 2 +- .../scss/maps/_bootstrapAnimation.scss | 2 +- .../dashboard/scss/maps/_bootstrapMixins.scss | 66 +- .../scss/maps/_bootstrapVariables.scss | 2 +- .../dashboard/scss/maps/_dashboard.scss | 58 +- .../dashboard/scss/maps/_extensions.scss | 12 +- .../dashboard/scss/maps/_vanillicon.scss | 6 +- .../dashboard/scss/maps/_vendorSubset.scss | 18 +- applications/dashboard/scss/navbar.scss | 16 +- .../new-components/_authenticateUser.scss | 12 +- .../scss/new-components/_buttons.scss | 4 +- .../_checkboxAndRadioButton.scss | 18 +- .../scss/new-components/_followButton.scss | 28 +- .../scss/new-components/_formElements.scss | 18 +- .../scss/new-components/_pageHeading.scss | 2 - .../new-components/_passwordStrength.scss | 8 +- .../scss/new-components/_selectBox.scss | 15 +- .../dashboard/scss/src/_admin_variables.scss | 334 +- applications/dashboard/scss/src/_alert.scss | 32 +- .../dashboard/scss/src/_analytics.scss | 218 +- .../dashboard/scss/src/_breadcrumbs.scss | 64 +- applications/dashboard/scss/src/_buttons.scss | 413 +- applications/dashboard/scss/src/_card.scss | 134 +- .../dashboard/scss/src/_chart-svg.scss | 264 +- .../dashboard/scss/src/_daterangepicker.scss | 586 +- .../dashboard/scss/src/_dropdown.scss | 34 +- applications/dashboard/scss/src/_footer.scss | 90 +- applications/dashboard/scss/src/_forms.scss | 77 +- applications/dashboard/scss/src/_helpers.scss | 78 +- applications/dashboard/scss/src/_hero.scss | 44 +- applications/dashboard/scss/src/_icons.scss | 32 +- applications/dashboard/scss/src/_media.scss | 277 +- applications/dashboard/scss/src/_mixins.scss | 421 +- applications/dashboard/scss/src/_modal.scss | 275 +- applications/dashboard/scss/src/_nav.scss | 331 +- applications/dashboard/scss/src/_navbar.scss | 210 +- .../dashboard/scss/src/_nestable.scss | 52 +- applications/dashboard/scss/src/_panel.scss | 170 +- applications/dashboard/scss/src/_plank.scss | 6 +- .../dashboard/scss/src/_prettyprint.scss | 21 +- .../dashboard/scss/src/_scaffold.scss | 234 +- applications/dashboard/scss/src/_tables.scss | 12 +- .../dashboard/scss/src/_toasters.scss | 82 +- applications/dashboard/scss/src/_toolbar.scss | 96 +- .../dashboard/scss/src/_tutorials.scss | 90 +- applications/dashboard/scss/src/_tweaks.scss | 54 +- applications/dashboard/scss/src/_type.scss | 432 +- applications/dashboard/scss/src/_utility.scss | 38 +- .../dashboard/scss/src/_variables.scss | 308 +- applications/dashboard/scss/src/styleguide.md | 99 +- applications/dashboard/scss/style.scss | 12 +- .../scss/vanillicon/_vanillicon-icons.scss | 2 +- .../scss/vanillicon/_vanillicon-mixins.scss | 24 +- .../scss/vanillicon/_vanillicon.scss | 458 +- .../scss/vendors/bootstrap/scss/_card.scss | 2 +- .../scss/vendors/bootstrap/scss/_images.scss | 2 +- .../vendors/bootstrap/scss/_jumbotron.scss | 2 +- .../bootstrap/scss/_responsive-embed.scss | 10 +- .../scss/vendors/bootstrap/scss/_type.scss | 2 +- .../vendors/bootstrap/scss/_variables.scss | 8 +- .../scss/mixins/_grid-framework.scss | 4 +- .../vendors/bootstrap/scss/mixins/_grid.scss | 24 +- .../bootstrap/scss/mixins/_nav-divider.scss | 2 +- .../dashboard/settings/class.hooks.php | 1056 +- .../dashboard/settings/configuration.php | 10 +- applications/dashboard/settings/structure.php | 1580 +- .../src/scripts/@types/api/comment.ts | 5 +- .../src/scripts/@types/api/discussion.ts | 12 +- .../scripts/__tests__/_adminStylesNested.scss | 7 + .../components/LayoutPreviewCard.tsx | 6 +- .../appearance/nav/AppearanceNav.classes.ts | 2 +- .../appearance/nav/AppearanceNav.hooks.ts | 81 +- .../scripts/appearance/nav/AppearanceNav.tsx | 8 +- .../appearance/pages/BrandingAndSEOPage.tsx | 93 +- .../pages/CategoriesLegacyLayoutsPage.tsx | 22 +- .../pages/DiscussionsLegacyLayoutsPage.tsx | 20 +- .../pages/HomepageLegacyLayoutsPage.tsx | 20 +- .../pages/LayoutOverviewPage.classes.ts | 6 + .../appearance/pages/LayoutOverviewPage.tsx | 167 +- .../appearance/pages/LegacyLayoutsPage.tsx | 7 +- .../compatibilityStyles/buttonStylesCompat.ts | 1 + .../src/scripts/compatibilityStyles/cssOut.ts | 6 + .../src/scripts/compatibilityStyles/index.ts | 2 +- .../compatibilityStyles/inputStyles.ts | 2 +- .../compatibilityStyles/textLinkStyles.ts | 1 - .../scripts/components/AdminEditTitleBar.tsx | 1 - .../src/scripts/components/AdminHeader.tsx | 2 +- .../scripts/components/AdminLayout.classes.ts | 24 +- .../src/scripts/components/AdminLayout.tsx | 8 +- .../components/AdminTitleBar.classes.ts | 51 +- .../src/scripts/components/AdminTitleBar.tsx | 8 +- .../scripts/components/ColorPicker.styles.ts | 8 + .../src/scripts/components/ColorPicker.tsx | 33 +- .../components/DashboardTitleBar.classes.ts | 17 +- .../scripts/components/DashboardTitleBar.tsx | 16 +- .../src/scripts/components/Member.story.tsx | 7 +- .../src/scripts/components/Member.tsx | 9 +- .../src/scripts/components/Table.story.tsx | 207 + .../src/scripts/components/Table.styles.ts | 164 + .../src/scripts/components/Table.tsx | 353 + .../src/scripts/components/Table.variables.ts | 44 + .../navigation/NavigationLinkItem.styles.ts | 195 + .../navigation/NavigationLinkItem.tsx | 328 + .../navigation/NavigationLinks.styles.ts | 74 + .../components/navigation/NavigationLinks.tsx | 328 + .../navigation/NavigationLinksModal.story.tsx | 101 + .../navigation/NavigationLinksModal.styles.ts | 47 + .../navigation/NavigationLinksModal.tsx | 161 + .../panels/PlacesSearchFilterPanel.tsx | 3 +- .../panels/registerMemberSearchDomain.tsx | 44 +- .../panels/registerPlaceSearchDomain.tsx | 31 +- .../dashboard/src/scripts/entries/admin.tsx | 8 + .../dashboard/src/scripts/entries/common.tsx | 4 - .../dashboard/src/scripts/entries/forum.tsx | 25 +- .../src/scripts/forms/DashboardCheckBox.tsx | 8 +- .../src/scripts/forms/DashboardCodeEditor.tsx | 17 +- .../forms/DashboardFormColorPicker.tsx | 2 + .../scripts/forms/DashboardFormControl.tsx | 112 +- .../src/scripts/forms/DashboardFormGroup.tsx | 12 +- .../src/scripts/forms/DashboardFormLabel.tsx | 27 +- .../forms/DashboardImageUploadGroup.tsx | 3 + .../scripts/forms/DashboardRadioGroups.tsx | 6 +- .../src/scripts/forms/dashboardStyles.ts | 19 +- .../scripts/labs/CustomLayoutLabItem.spec.tsx | 88 + .../src/scripts/labs/CustomLayoutLabItem.svg | 1 + .../src/scripts/labs/CustomLayoutLabItem.tsx | 71 + .../scripts/labs/NewEmbedSystemLabItem.svg | 39 + .../scripts/labs/NewEmbedSystemLabItem.tsx | 24 + .../src/scripts/labs/VanillaLabsItem.tsx | 22 +- .../languages/LocaleConfigurationModal.tsx | 6 +- .../src/scripts/languages/LocaleSettings.tsx | 11 +- .../MachineTranslationConfigurationModal.tsx | 6 +- .../languages/MachineTranslationSettings.tsx | 2 +- .../layout/editor/LayoutEditor.classes.ts | 8 + .../layout/editor/LayoutEditor.hooks.ts | 103 +- .../layout/editor/LayoutEditor.sections.tsx | 22 +- .../scripts/layout/editor/LayoutEditor.tsx | 39 +- .../layout/editor/LayoutEditorAddWidget.tsx | 98 +- .../layout/editor/LayoutEditorAssetUtils.tsx | 98 + .../editor/LayoutEditorContents.spec.ts | 101 + .../layout/editor/LayoutEditorContents.tsx | 30 +- .../layout/editor/LayoutEditorPreviewData.tsx | 278 +- .../editor/LayoutEditorSectionToolbar.tsx | 29 +- .../layout/editor/LayoutEditorTitleBar.tsx | 61 +- .../editor/LayoutEditorWidgetContext.tsx | 2 + .../editor/LayoutEditorWidgetToolbar.tsx | 175 +- .../__fixtures__/LayoutEditor.fixtures.ts | 90 - .../__fixtures__/LayoutEditor.fixtures.tsx | 210 + .../thumbnails/LayoutSectionsThumbnails.tsx | 21 +- .../thumbnails/LayoutThumbnailsModal.spec.tsx | 38 + .../LayoutThumbnailsModal.story.tsx | 22 +- .../thumbnails/LayoutThumbnailsModal.tsx | 7 +- .../LayoutWidgetThumbnails.spec.tsx | 75 + .../thumbnails/LayoutWidgetsThumbnails.tsx | 11 +- .../WidgetSchemaTransformer.tsx | 256 + .../widgetSettings/WidgetSettings.classes.ts | 267 + .../widgetSettings/WidgetSettings.spec.ts | 98 + .../editor/widgetSettings/WidgetSettings.tsx | 62 + .../WidgetSettingsAccordion.classes.ts | 44 + .../WidgetSettingsAccordion.tsx | 27 + .../WidgetSettingsFormGroupWrapper.tsx | 24 + .../WidgetSettingsModal.story.tsx | 184 + .../widgetSettings/WidgetSettingsModal.tsx | 125 + .../widgetSettings/WidgetSettingsPreview.tsx | 101 + .../overrides/QuickLinksListAsModal.tsx | 52 + .../overrides/SiteTotalsAsModal.tsx | 99 + .../widgetSettings/overrides/TabsAsModal.tsx | 85 + .../src/scripts/layout/hooks/layoutHooks.ts | 4 +- .../LayoutActionsContextProvider.tsx | 172 + .../layoutSettings/LayoutSettings.actions.ts | 86 +- ...ings.hooks.ts => LayoutSettings.hooks.tsx} | 108 +- .../layoutSettings/LayoutSettings.slice.ts | 136 +- .../layoutSettings/LayoutSettings.types.ts | 26 +- .../layout/overview/LayoutOverview.tsx | 38 +- .../overview/LayoutOverviewSkeleton.tsx | 8 +- .../scripts/layout/pages/LayoutEditorPage.tsx | 105 +- .../scripts/pages/VanillaLabsPage.spec.tsx | 102 + .../src/scripts/pages/VanillaLabsPage.tsx | 15 +- .../src/scripts/roles/MultiRoleInput.tsx | 7 +- .../userProfiles/UserProfileSettings.spec.tsx | 41 + .../userProfiles/UserProfileSettings.tsx | 101 + .../components/ProfileFieldDelete.spec.tsx | 61 + .../components/ProfileFieldDelete.tsx | 116 + .../components/ProfileFieldForm.classes.ts | 24 + .../components/ProfileFieldForm.tsx | 361 + .../components/ProfileFields.fixtures.tsx | 129 + .../components/ProfileFieldsList.classes.ts | 87 + .../components/ProfileFieldsList.spec.tsx | 85 + .../components/ProfileFieldsList.tsx | 176 + .../components/ProfileRedirectForm.classes.ts | 25 + .../components/ProfileRedirectForm.spec.tsx | 105 + .../components/ProfileRedirectForm.tsx | 159 + .../state/UserProfiles.actions.ts | 95 + .../userProfiles/state/UserProfiles.hooks.ts | 143 + .../userProfiles/state/UserProfiles.slice.ts | 140 + .../userProfiles/types/UserProfiles.types.ts | 106 + .../src/scripts/userProfiles/utils.ts | 172 + ...sx => WidgetFormGenerator.story_fixme.tsx} | 44 +- applications/dashboard/styleguide/index.html | 238 - .../dashboard/styleguide/public/admin.css | 10984 -------------- .../dashboard/styleguide/public/dashboard.js | 9430 ------------ .../dashboard/styleguide/public/github.less | 123 - .../styleguide/public/global-stub.js | 55 - .../styleguide/public/highlight.pack.js | 1 - .../dashboard/styleguide/public/html5shiv.js | 8 - .../styleguide/public/jquery-1.9.1.min.js | 5 - .../dashboard/styleguide/public/kss.css | 159 - .../dashboard/styleguide/public/kss.js | 47 - .../dashboard/styleguide/public/kss.less | 430 - .../dashboard/styleguide/public/main.js | 90 - .../dashboard/styleguide/public/prettify.css | 52 - .../dashboard/styleguide/public/prettify.js | 1477 -- .../resources/fonts/vanillicon/vanillicon.eot | Bin 50170 -> 0 bytes .../resources/fonts/vanillicon/vanillicon.svg | 859 -- .../resources/fonts/vanillicon/vanillicon.ttf | Bin 49984 -> 0 bytes .../fonts/vanillicon/vanillicon.woff | Bin 27468 -> 0 bytes .../resources/pages/example-modal-form.json | 3 - .../public/resources/pages/example-modal.json | 3 - .../dashboard/styleguide/section-1.html | 579 - .../dashboard/styleguide/section-10.html | 479 - .../dashboard/styleguide/section-11.html | 153 - .../dashboard/styleguide/section-12.html | 286 - .../dashboard/styleguide/section-13.html | 141 - .../dashboard/styleguide/section-14.html | 288 - .../dashboard/styleguide/section-15.html | 230 - .../dashboard/styleguide/section-16.html | 149 - .../dashboard/styleguide/section-17.html | 347 - .../dashboard/styleguide/section-18.html | 139 - .../dashboard/styleguide/section-2.html | 448 - .../dashboard/styleguide/section-3.html | 183 - .../dashboard/styleguide/section-4.html | 271 - .../dashboard/styleguide/section-5.html | 876 -- .../dashboard/styleguide/section-6.html | 421 - .../dashboard/styleguide/section-7.html | 655 - .../dashboard/styleguide/section-8.html | 297 - .../dashboard/styleguide/section-9.html | 207 - applications/dashboard/template/index.html | 148 - .../dashboard/template/public/admin.css | 10984 -------------- .../dashboard/template/public/dashboard.js | 9430 ------------ .../dashboard/template/public/github.less | 123 - .../dashboard/template/public/global-stub.js | 55 - .../template/public/highlight.pack.js | 1 - .../dashboard/template/public/html5shiv.js | 8 - .../template/public/jquery-1.9.1.min.js | 5 - .../dashboard/template/public/kss.css | 159 - applications/dashboard/template/public/kss.js | 47 - .../dashboard/template/public/kss.less | 430 - .../dashboard/template/public/main.js | 90 - .../dashboard/template/public/prettify.css | 52 - .../dashboard/template/public/prettify.js | 1477 -- .../resources/fonts/vanillicon/vanillicon.eot | Bin 50170 -> 0 bytes .../resources/fonts/vanillicon/vanillicon.svg | 859 -- .../resources/fonts/vanillicon/vanillicon.ttf | Bin 49984 -> 0 bytes .../fonts/vanillicon/vanillicon.woff | Bin 27468 -> 0 bytes .../public/resources/images/baby-seal.jpg | Bin 47544 -> 0 bytes .../public/resources/images/clean-piggy.jpg | Bin 40025 -> 0 bytes .../public/resources/images/dirty-rodent.jpg | Bin 59131 -> 0 bytes .../public/resources/images/kitten.jpg | Bin 42418 -> 0 bytes .../public/resources/images/little-chick.jpg | Bin 34022 -> 0 bytes .../public/resources/images/puppy.jpg | Bin 52743 -> 0 bytes .../public/resources/images/smart-puppy.jpg | Bin 27767 -> 0 bytes .../public/resources/images/snow-dog.jpg | Bin 58224 -> 0 bytes .../public/resources/images/vanilla-black.png | Bin 4618 -> 0 bytes .../public/resources/images/vanilla-black.svg | 1 - .../public/resources/images/vanilla-white.png | Bin 4310 -> 0 bytes .../public/resources/images/vanilla-white.svg | 1 - .../resources/pages/example-modal-form.json | 3 - .../public/resources/pages/example-modal.json | 3 - .../dashboard/tests/BannerImageModelTest.php | 103 +- .../Controllers/SecuritySettingsTest.php | 98 +- .../dashboard/tests/DropdownModuleTest.php | 76 +- .../tests/EntryControllerConnectTestTrait.php | 136 +- .../tests/Library/EmailTemplateTest.php | 43 + .../tests/LocalRemoteResourceJobTest.php | 170 +- .../dashboard/tests/MediaModelTest.php | 57 +- .../dashboard/tests/Models/SpamModelTest.php | 35 +- .../tests/Models/UserMentionsModelTest.php | 197 + .../tests/Models/UserSiteTotalTest.php | 19 +- .../tests/Models/UserVisitUpdaterTest.php | 144 +- .../ModerationMessageDataMigrationTest.php | 16 +- .../tests/Pages/LegacyDashboardPageTest.php | 7 +- .../tests/RemoteResourceModelTest.php | 124 +- .../dashboard/tests/UserLeaderServiceTest.php | 76 + .../Controllers/ActivityControllerTest.php | 103 +- .../EntryControllerConnectTest.php | 605 +- .../Tests/Controllers/HomeControllerTest.php | 58 +- .../Tests/Modules/DashboardNavModuleTest.php | 31 +- .../Modules/GuestModuleStorybookTest.php | 14 +- .../tests/settings/StructureTest.php | 46 + .../views/authenticate/connectuser.php | 124 +- .../dashboard/views/entry/connect.php | 14 +- .../dashboard/views/entry/passwordrequest.php | 1 + .../dashboard/views/entry/recaptcha.php | 34 + .../views/entry/registerapproval.php | 8 +- .../dashboard/views/entry/registerbasic.php | 10 +- .../dashboard/views/modules/userinfo.php | 199 +- .../dashboard/views/settings/profile.twig | 21 +- .../views/settings/recaptchaoptions.php | 1 + .../dashboard/views/settings/security.php | 212 +- applications/dashboard/views/setup.master | 2 +- applications/dashboard/views/user/edit.php | 4 +- applications/dashboard/webpack.config.js | 41 + .../dashboard/webpack.style.config.js | 85 + applications/dashboard/yarn.lock | 9048 ++++++----- .../vanilla/Addon/ForumContainerRules.php | 94 +- .../vanilla/Addon/PageViewEventHandler.php | 51 + .../Factories/CommentEmbedFactory.php | 16 +- .../Factories/DiscussionEmbedFactory.php | 18 +- applications/vanilla/Events/CategoryEvent.php | 17 +- applications/vanilla/Events/CommentEvent.php | 49 +- .../vanilla/Events/DirtyRecordEvent.php | 3 +- .../vanilla/Events/DiscussionEvent.php | 144 +- .../vanilla/Events/DiscussionStatusEvent.php | 38 +- .../vanilla/Events/DiscussionTagEvent.php | 29 +- applications/vanilla/Events/PageViewEvent.php | 105 + .../vanilla/Events/RunnerInterface.php | 4 +- .../vanilla/Events/SearchDiscussionEvent.php | 55 + .../vanilla/Layout/CategoryRecordProvider.php | 41 +- .../Layout/Definitions/discussionList.json | 72 + .../Middleware/CategoryFilterMiddleware.php | 42 +- .../Layout/View/DiscussionListLayoutView.php | 72 + .../View/LegacyCategoryListLayoutView.php | 13 +- .../View/LegacyDiscussionListLayoutView.php | 37 - .../View/LegacyDiscussionThreadLayoutView.php | 13 +- .../View/LegacyNewDiscussionLayoutView.php | 13 +- .../Schemas/AbstractTabSearchFormSchema.php | 7 +- .../Schemas/CategoryFragmentSchema.php | 25 +- .../vanilla/Schemas/PostFragmentSchema.php | 31 +- .../CategorySearchExclusionInterface.php | 4 +- .../vanilla/Search/CategorySearchType.php | 137 +- .../Search/CommentSearchResultItem.php | 3 +- .../vanilla/Search/CommentSearchType.php | 138 +- .../Search/DiscussionSearchResultItem.php | 24 +- .../vanilla/Search/DiscussionSearchType.php | 292 +- .../vanilla/Search/UserSearchResultItem.php | 13 +- .../vanilla/Search/UserSearchType.php | 171 +- .../vanilla/Widgets/CallToActionWidget.php | 89 + .../Widgets/CallToActionWidgetTrait.php | 182 + .../vanilla/Widgets/CategoriesWidget.php | 218 +- .../vanilla/Widgets/CategoriesWidgetTrait.php | 194 + .../Widgets/DiscussionAnnouncementsWidget.php | 27 +- .../Widgets/DiscussionDiscussionsWidget.php | 39 +- .../vanilla/Widgets/DiscussionListAsset.php | 121 + .../Widgets/DiscussionsWidgetSchemaTrait.php | 347 + .../Widgets/FeaturedCollectionsWidget.php | 126 + .../Widgets/GuestCallToActionWidget.php | 95 + .../vanilla/Widgets/NewPostWidget.php | 268 + applications/vanilla/Widgets/RSSWidget.php | 84 +- .../vanilla/Widgets/RssWidgetTrait.php | 115 +- .../vanilla/Widgets/SiteTotalsWidget.php | 429 + applications/vanilla/Widgets/TabsWidget.php | 39 + applications/vanilla/Widgets/TagWidget.php | 104 +- .../vanilla/Widgets/UserSpotlightWidget.php | 71 +- .../Widgets/UserSpotlightWidgetTrait.php | 40 +- applications/vanilla/bootstrap.php | 58 +- .../Pages/DiscussionListPageController.php | 54 + .../api/CategoriesApiController.php | 559 +- .../api/CollectionsApiController.php | 316 + .../controllers/api/CommentsApiController.php | 438 +- .../api/CommunitySearchSchemaTrait.php | 37 +- .../api/DiscussionExpandSchema.php | 86 +- .../api/DiscussionsApiController.php | 1144 +- .../api/DiscussionsApiIndexSchema.php | 260 +- .../controllers/api/DraftsApiController.php | 276 +- .../api/SchedulerApiController.php | 28 +- .../controllers/api/SessionsApiController.php | 107 + .../controllers/api/TagsApiController.php | 218 +- .../controllers/api/WidgetsApiController.php | 16 +- .../class.categoriescontroller.php | 529 +- .../controllers/class.categorycontroller.php | 71 +- .../class.discussioncontroller.php | 633 +- .../class.discussionscontroller.php | 657 +- .../controllers/class.draftscontroller.php | 76 +- .../class.moderationcontroller.php | 357 +- .../controllers/class.postcontroller.php | 758 +- .../controllers/class.tagscontroller.php | 14 +- .../controllers/class.vanillacontroller.php | 43 +- .../class.vanillasettingscontroller.php | 865 +- applications/vanilla/js/categoryfilter.js | 4 +- applications/vanilla/js/post.js | 2 + .../library/Menu/UserCounterProvider.php | 10 +- .../Navigation/ForumBreadcrumbProvider.php | 27 +- .../Navigation/ForumCategoryRecordType.php | 13 +- .../library/class.categorycollection.php | 364 +- applications/vanilla/locale/en.php | 20 +- .../models/AuthenticatorTypeInterface.php | 21 + .../models/CategoryCollectionProvider.php | 66 + .../vanilla/models/CollectionModel.php | 482 + .../CollectionRecordProviderInterface.php | 37 + .../models/CommunityNotificationGenerator.php | 727 + .../vanilla/models/DirtyRecordModel.php | 54 +- .../models/DiscussionCollectionProvider.php | 89 + .../vanilla/models/DiscussionJsonLD.php | 19 +- .../vanilla/models/DiscussionMergeModel.php | 188 +- .../vanilla/models/DiscussionStatusModel.php | 237 + .../vanilla/models/DiscussionTypeHandler.php | 41 +- .../models/ForumQuickLinksProvider.php | 46 +- .../Totals/CategorySiteTotalProvider.php | 18 +- .../Totals/CommentSiteTotalProvider.php | 41 +- .../Totals/DiscussionSiteTotalProvider.php | 39 +- .../models/Totals/PostSiteTotalProvider.php | 23 +- .../vanilla/models/class.categorymodel.php | 3154 ++-- .../vanilla/models/class.commentmodel.php | 1290 +- .../vanilla/models/class.discussionmodel.php | 3373 +++-- .../vanilla/models/class.draftmodel.php | 133 +- .../vanilla/models/class.vanillamodel.php | 21 +- .../modules/AnnouncementWidgetModule.php | 19 +- .../modules/BaseDiscussionWidgetModule.php | 368 +- .../vanilla/modules/CallToActionModule.php | 197 +- .../vanilla/modules/CategoriesModule.php | 46 +- .../vanilla/modules/DiscussionListModule.php | 41 +- .../vanilla/modules/DiscussionTabFactory.php | 63 +- .../modules/DiscussionWidgetModule.php | 12 +- .../FoundationCategoriesGridModule.php | 13 +- .../modules/FoundationCategoriesShim.php | 86 +- .../modules/FoundationDiscussionsShim.php | 45 +- .../vanilla/modules/FoundationShimOptions.php | 33 +- applications/vanilla/modules/RSSModule.php | 106 +- .../vanilla/modules/SearchWidgetModule.php | 89 +- .../vanilla/modules/UserSpotlightModule.php | 71 +- .../modules/class.bookmarkedmodule.php | 53 +- .../modules/class.categoriesmodule.php | 33 +- .../class.categoryfollowtogglemodule.php | 29 +- .../class.categorymoderatorsmodule.php | 34 +- .../modules/class.discussionfiltermodule.php | 17 +- .../modules/class.discussionsmodule.php | 62 +- .../modules/class.discussionsortermodule.php | 23 +- .../class.discussionssortfiltermodule.php | 113 +- .../vanilla/modules/class.draftsmodule.php | 17 +- .../modules/class.flatcategorymodule.php | 51 +- .../class.followedcategoriesmodule.php | 26 +- .../modules/class.newdiscussionmodule.php | 111 +- .../modules/class.promotedcontentmodule.php | 465 +- .../vanilla/modules/class.tagmodule.php | 122 +- .../modules/class.usercommentsmodule.php | 32 +- .../modules/class.userdiscussionsmodule.php | 34 +- applications/vanilla/openapi/categories.yml | 152 +- applications/vanilla/openapi/collections.yml | 376 + applications/vanilla/openapi/discussions.yml | 199 +- applications/vanilla/openapi/sessions.yml | 77 + applications/vanilla/openapi/tags.yml | 7 +- applications/vanilla/settings/class.hooks.php | 1010 +- .../vanilla/settings/configuration.php | 54 +- applications/vanilla/settings/structure.php | 743 +- applications/vanilla/settings/stub.php | 31 +- .../categories/CategoryFollowDropdown.tsx | 15 +- .../categories/CategorySuggestionActions.ts | 1 - .../vanilla/src/scripts/entries/admin-new.tsx | 12 + .../vanilla/src/scripts/entries/admin.tsx | 4 +- .../vanilla/src/scripts/entries/forum.tsx | 20 +- .../vanilla/src/scripts/entries/layouts.tsx | 19 + .../scripts/forms/CommunityCategoryInput.tsx | 4 +- .../scripts/forms/CommunityMemberInput.tsx | 125 + .../vanilla/src/scripts/forms/autosave.ts | 54 +- .../scripts/legacy/legacyHashScrolling.tsx | 2 +- .../search/CollapseCommentsSearchMeta.tsx | 3 +- .../search/CommunityPostTypeFilter.tsx | 2 +- .../scripts/search/CommunitySearchProvider.ts | 7 +- .../search/SearchFilterPanelCommunity.tsx | 1 + .../search/registerCommunitySearchDomain.tsx | 27 +- .../src/scripts/tag/TagWidget.preview.tsx | 20 + .../vanilla/src/scripts/tag/TagWidget.tsx | 2 +- .../tests/CommentNotificationsTest.php | 659 + .../CategoriesControllerDiscussionsTest.php | 46 +- .../Controllers/CategoriesControllerTest.php | 194 +- .../Controllers/CategoryFeaturedTest.php | 191 +- .../Controllers/CategoryMaxDepthTest.php | 191 +- .../CategoryValidationConflictsTest.php | 197 +- .../Controllers/DiscussionSortHotTopTest.php | 262 +- .../Controllers/DiscussionsApiExpandTest.php | 115 +- .../Controllers/DiscussionsControllerTest.php | 153 +- .../FileUploadPostPermissionTest.php | 50 +- .../Controllers/ModerationControllerTest.php | 80 +- .../Page/DiscussionListPageControllerTest.php | 107 + .../PostAndDraftsControllerTest.php | 583 +- .../tests/DiscussionNotificationsTest.php | 82 + .../Factories/CommentEmbedFactoryTest.php | 67 +- .../Factories/DiscussionEmbedFactoryTest.php | 73 +- .../tests/Events/CategoryEventTests.php | 99 +- .../CategoryFilterMiddlewareTest.php | 79 +- .../vanilla/tests/MockTagSearchFormSchema.php | 19 +- .../Modules/CallToActionStorybookTest.php | 22 +- .../Modules/CommunityLeadersModuleTest.php | 79 +- .../DiscussionsModuleStorybookTest.php | 69 +- .../Modules/FoundationDiscussionShimTest.php | 131 +- .../tests/Modules/RSSModuleStorybookTest.php | 129 +- .../SearchWidgetModuleStorybookTest.php | 85 +- .../UserSpotlightModuleStorybookTest.php | 72 +- .../Search/AbstractCommunitySearchTests.php | 777 +- .../tests/Search/MysqlCommunitySearchTest.php | 12 +- .../Storybook/CommunityStorybookTest.php | 231 +- .../tests/Utils/CommunityApiTestTrait.php | 215 +- .../Utils/TestModerationControllerTrait.php | 18 +- .../vanilla/tests/VanillaStructureTest.php | 50 +- .../tests/Widgets/CallToActionWidgetTest.php | 92 + .../tests/Widgets/CategoriesWidgetTest.php | 156 +- .../Widgets/FeaturedCollectionsWidgetTest.php | 68 + .../tests/Widgets/HtmlReactWidgetTest.php | 86 +- .../tests/Widgets/NewPostWidgetTest.php | 95 + .../tests/Widgets/SiteTotalsWidgetTest.php | 211 + .../vanilla/tests/Widgets/TagWidgetTest.php | 65 + .../views/categories/helper_functions.php | 2 +- .../vanilla/views/discussions/table.php | 13 +- .../views/vanillasettings/editcategory.twig | 3 +- babel.config.js | 8 +- bin/scripts/buildRelease.js | 4 +- bin/scripts/package.json | 10 +- bin/scripts/setReleaseVersion.js | 2 +- bin/scripts/yarn.lock | 388 +- bootstrap.php | 343 +- build/.storybook/main.js | 4 +- build/.storybook/preview-head.html | 6 +- build/.storybook/webpack.config.js | 4 +- build/entries/public-path.ts | 2 +- build/scripts/Builder.ts | 76 +- build/scripts/KarmaRunner.ts | 6 +- build/scripts/build.ts | 2 +- build/scripts/buildOptions.ts | 10 +- build/scripts/configReader.php | 4 +- build/scripts/configThemeWriter.php | 20 +- build/scripts/configs/makeBaseConfig.ts | 115 +- build/scripts/configs/makeDevConfig.ts | 17 +- build/scripts/configs/makeEmbedConfig.ts | 73 + build/scripts/configs/makeManifestPlugin.ts | 71 + build/scripts/configs/makePolyfillConfig.ts | 2 +- build/scripts/configs/makeProdConfig.ts | 80 +- build/scripts/configs/postcss.config.js | 11 +- build/scripts/env.ts | 1 + build/scripts/install.ts | 2 +- build/scripts/scaffold/index.ts | 4 +- build/scripts/test.ts | 2 +- build/scripts/utility/EntryModel.ts | 114 +- build/webpack.aliases.js | 4 +- cli/README.md | 12 +- cli/composer.json | 3 +- cli/src/Cloud/Commands/CloneCommand.php | 168 +- cli/src/Cloud/Commands/SyncOssCommand.php | 106 +- cli/src/Cloud/Utils/VanillaConsole.php | 20 +- cli/src/Cloud/VanillaCloudCli.php | 11 +- cli/src/Commands/BackportCommand.php | 59 +- cli/src/Commands/InstallCommand.php | 10 +- cli/src/Commands/LintCommand.php | 13 +- .../UserMentionIndex/IndexMentionCommand.php | 242 + cli/src/Commands/VanillaCacheCommand.php | 7 +- .../Exception/UnsupportedShellException.php | 7 +- cli/src/Utils/DatabaseCommand.php | 123 + cli/src/Utils/ShellException.php | 3 +- cli/src/Utils/ShellHttp.php | 30 +- cli/src/Utils/ShellProfile.php | 38 +- cli/src/Utils/ShellUtils.php | 42 +- cli/src/Utils/SimpleScriptLogger.php | 64 +- cli/src/VanillaCli.php | 179 +- composer.json | 13 +- composer.lock | 235 +- conf/config-defaults.php | 6 +- environment.php | 54 +- index.php | 8 +- jest.config.js | 74 +- jest.setup.js | 7 +- js/embed.js | 15 +- js/global.js | 38 - js/vanilla.embed.js | 12 +- library/Garden/ArrayContainer.php | 21 +- library/Garden/BasePathTrait.php | 13 +- library/Garden/ClassLocator.php | 10 +- library/Garden/Controller.php | 4 +- library/Garden/CustomExceptionHandler.php | 3 +- library/Garden/EventHandlersInterface.php | 3 +- library/Garden/EventManager.php | 136 +- library/Garden/Events/BulkUpdateEvent.php | 28 +- .../Garden/Events/EventFromRowInterface.php | 4 +- .../Garden/Events/GenericResourceEvent.php | 7 +- library/Garden/Events/ResourceEvent.php | 72 +- .../Events/ResourceEventLimitException.php | 7 +- .../Garden/Events/TrackingEventInterface.php | 8 +- .../Exception/ContainerNotFoundException.php | 4 +- library/Garden/JsonFilterTrait.php | 18 +- library/Garden/LazyEventHandler.php | 6 +- library/Garden/MetaTrait.php | 21 +- library/Garden/PsrEventHandlersInterface.php | 4 +- library/Garden/StaticCacheConfigTrait.php | 6 +- library/Garden/StaticCacheTrait.php | 14 +- .../Garden/StaticCacheTranslationTrait.php | 10 +- .../Garden/StaticCacheViewLocationTrait.php | 8 +- library/Garden/Web/Action.php | 28 +- .../Garden/Web/ControllerDispatchedEvent.php | 52 + library/Garden/Web/Cookie.php | 102 +- library/Garden/Web/Data.php | 234 +- library/Garden/Web/Dispatcher.php | 178 +- .../Garden/Web/DispatcherExceptionEvent.php | 52 + .../Garden/Web/Exception/ClientException.php | 9 +- .../Web/Exception/ForbiddenException.php | 9 +- .../Garden/Web/Exception/HttpException.php | 168 +- .../Exception/MethodNotAllowedException.php | 21 +- .../Web/Exception/NotFoundException.php | 13 +- .../Exception/PartialCompletionException.php | 30 +- library/Garden/Web/Exception/Pass.php | 3 +- .../Web/Exception/ResponseException.php | 11 +- .../Garden/Web/Exception/ServerException.php | 9 +- library/Garden/Web/MiddlewareAwareTrait.php | 11 +- library/Garden/Web/PageControllerRoute.php | 20 +- library/Garden/Web/PreflightRoute.php | 31 +- library/Garden/Web/Redirect.php | 8 +- library/Garden/Web/RequestInterface.php | 4 +- library/Garden/Web/ResourceRoute.php | 146 +- library/Garden/Web/Route.php | 108 +- library/Garden/Web/ViewInterface.php | 3 +- library/SmartyPlugins/block.column.php | 7 +- library/SmartyPlugins/block.columns.php | 11 +- library/SmartyPlugins/block.container.php | 11 +- library/SmartyPlugins/block.layoutWidget.php | 8 +- library/SmartyPlugins/block.permission.php | 8 +- library/SmartyPlugins/block.widget.php | 8 +- library/SmartyPlugins/block.widgetBody.php | 8 +- library/SmartyPlugins/block.widgetFooter.php | 8 +- library/SmartyPlugins/block.widgetHeader.php | 12 +- .../SmartyPlugins/block.widgetTitleBar.php | 14 +- .../SmartyPlugins/function.activity_link.php | 13 +- library/SmartyPlugins/function.asset.php | 31 +- .../function.banner_image_url.php | 3 +- .../SmartyPlugins/function.bookmarks_link.php | 13 +- .../SmartyPlugins/function.breadcrumbs.php | 10 +- .../function.categories_link.php | 13 +- .../SmartyPlugins/function.category_link.php | 17 +- .../function.community_chooser.php | 3 +- .../SmartyPlugins/function.custom_menu.php | 21 +- .../SmartyPlugins/function.dashboard_link.php | 17 +- .../function.discussions_link.php | 13 +- .../SmartyPlugins/function.drafts_link.php | 13 +- library/SmartyPlugins/function.event.php | 7 +- .../SmartyPlugins/function.follow_button.php | 7 +- .../function.forum_root_link.php | 13 +- .../function.hero_image_link.php | 3 +- library/SmartyPlugins/function.home_link.php | 13 +- .../SmartyPlugins/function.homepage_title.php | 5 +- library/SmartyPlugins/function.inbox_link.php | 13 +- .../SmartyPlugins/function.include_file.php | 15 +- .../SmartyPlugins/function.knowledge_link.php | 15 +- library/SmartyPlugins/function.link.php | 37 +- library/SmartyPlugins/function.logo.php | 29 +- .../SmartyPlugins/function.mobile_logo.php | 9 +- library/SmartyPlugins/function.module.php | 9 +- .../function.mydiscussions_link.php | 13 +- .../SmartyPlugins/function.nomobile_link.php | 18 +- library/SmartyPlugins/function.photo_link.php | 13 +- library/SmartyPlugins/function.pocket.php | 13 +- .../SmartyPlugins/function.profile_link.php | 13 +- library/SmartyPlugins/function.searchbox.php | 29 +- .../SmartyPlugins/function.signin_link.php | 11 +- .../SmartyPlugins/function.signinout_link.php | 13 +- library/SmartyPlugins/function.t.php | 7 +- library/SmartyPlugins/function.text.php | 5 +- library/SmartyPlugins/function.user_link.php | 13 +- library/SmartyPlugins/function.vanillaurl.php | 5 +- library/SmartyPlugins/modifier.asset_url.php | 3 +- library/SmartyPlugins/modifier.date.php | 5 +- library/SmartyPlugins/modifier.translate.php | 5 +- library/Vanilla/AbstractTypeHandler.php | 12 +- library/Vanilla/Addon.php | 686 +- .../Vanilla/AddonConfigurationDefaults.php | 4 +- library/Vanilla/AddonContainerRules.php | 15 +- library/Vanilla/AddonCronJobs.php | 10 +- library/Vanilla/AddonManager.php | 509 +- library/Vanilla/AddonSpecialClasses.php | 96 +- library/Vanilla/AddonStructure.php | 4 +- library/Vanilla/AliasLoader.php | 11 +- library/Vanilla/AliasProviderTrait.php | 19 +- library/Vanilla/Analytics/ActionConstants.php | 3 +- .../Analytics/AnalyticsActionsProvider.php | 22 +- library/Vanilla/Analytics/Client.php | 12 +- .../Analytics/EventProviderInterface.php | 30 + .../Analytics/EventProviderService.php | 59 + .../Analytics/PageViewEventProvider.php | 69 + .../Analytics/SearchAllEventProvider.php | 53 + .../SearchDiscussionEventProvider.php | 59 + .../Analytics/SearchPlacesEventProvider.php | 46 + .../Analytics/TrackableCommunityModel.php | 184 +- .../Vanilla/Analytics/TrackableDateUtils.php | 49 +- .../Analytics/TrackableDecoratorInterface.php | 4 +- .../Analytics/TrackableDecoratorTrait.php | 7 +- .../TrackableLegacyControllerInterface.php | 8 +- .../Vanilla/Analytics/TrackableUserModel.php | 104 +- library/Vanilla/ApiUtils.php | 138 +- library/Vanilla/ArrayAccessTrait.php | 18 +- library/Vanilla/Attributes.php | 12 +- .../Vanilla/Authenticator/Authenticator.php | 152 +- .../Authenticator/PasswordAuthenticator.php | 63 +- .../Authenticator/SSOAuthenticator.php | 232 +- .../Authenticator/ShimAuthenticator.php | 40 +- library/Vanilla/BodyFormatValidator.php | 20 +- library/Vanilla/Bootstrap.php | 158 +- .../Addons/EventListenerConfigInterface.php | 3 +- .../Contracts/Addons/WidgetInterface.php | 4 +- .../Contracts/Analytics/ClientInterface.php | 4 +- .../Contracts/ConfigurationInterface.php | 5 +- .../Formatting/FormatFieldInterface.php | 4 +- .../Contracts/Formatting/FormatInterface.php | 23 +- .../Vanilla/Contracts/Formatting/Heading.php | 16 +- .../Formatting/HeadingProviderInterface.php | 4 +- library/Vanilla/Contracts/LocaleInterface.php | 3 +- ...achedSiteSectionTotalProviderInterface.php | 3 +- .../Contracts/Models/CrawlableInterface.php | 3 +- .../Models/FragmentFetcherInterface.php | 4 +- .../Models/FragmentProviderInterface.php | 3 +- .../SiteSectionTotalProviderInterface.php | 3 +- .../Models/SiteTotalProviderInterface.php | 3 +- .../Models/UserProviderInterface.php | 3 +- library/Vanilla/Contracts/RecordInterface.php | 3 +- .../Contracts/Site/AbstractSiteProvider.php | 16 +- .../Contracts/Site/ApplicationInterface.php | 3 +- .../Site/ApplicationProviderInterface.php | 3 +- library/Vanilla/Contracts/Site/Site.php | 49 +- .../SiteSectionChildIDProviderInterface.php | 4 +- .../Site/SiteSectionCountStasherInterface.php | 4 +- .../Site/SiteSectionCounterInterface.php | 9 +- .../Contracts/Site/SiteSectionInterface.php | 26 +- .../Site/SiteSectionProviderInterface.php | 15 +- .../Contracts/Site/TranslationItem.php | 29 +- .../Site/TranslationProviderInterface.php | 3 +- .../Site/TranslationResourceInterface.php | 3 +- .../AbstractResourceTypeSiteSynchronizer.php | 20 +- .../SiteSync/AbstractSiteSyncConsumer.php | 229 +- .../SiteSync/AbstractSiteSyncProducer.php | 19 +- .../SiteSync/SiteSyncConsumerInterface.php | 6 +- .../SiteSync/SiteSyncProducerInterface.php | 4 +- ...eSyncResourceTypeSynchronizerInterface.php | 4 +- .../Vanilla/Contracts/Web/AssetInterface.php | 3 +- .../Contracts/Web/FileUploadHandler.php | 4 +- .../Web/LegacyViewHandlerInterface.php | 3 +- .../Web/RequestModifierInterface.php | 4 +- .../Contracts/Web/UASnifferInterface.php | 4 +- .../Controllers/SearchRootController.php | 15 +- library/Vanilla/CurrentTimeStamp.php | 49 +- library/Vanilla/Database/Operation.php | 90 +- .../Operation/BooleanFieldProcessor.php | 22 +- .../Operation/CurrentDateFieldProcessor.php | 30 +- .../Operation/CurrentIPAddressProcessor.php | 38 +- .../Operation/CurrentUserFieldProcessor.php | 39 +- .../Operation/InvalidateCallbackProcessor.php | 10 +- .../Database/Operation/JsonFieldProcessor.php | 22 +- .../Vanilla/Database/Operation/Pipeline.php | 26 +- .../Vanilla/Database/Operation/Processor.php | 4 +- .../Database/Operation/PruneProcessor.php | 12 +- .../Operation/ResourceEventProcessor.php | 73 +- .../Operation/StatusFieldProcessor.php | 56 +- .../Database/Operation/UpdateProcessor.php | 10 +- .../Database/SetLiterals/Increment.php | 14 +- .../Vanilla/Database/SetLiterals/MinMax.php | 21 +- .../Database/SetLiterals/SetLiteral.php | 3 +- library/Vanilla/DateFilterSchema.php | 230 +- library/Vanilla/DiscussionTypeConverter.php | 20 +- .../Vanilla/EmbeddedContent/AbstractEmbed.php | 67 +- .../EmbeddedContent/AbstractEmbedFactory.php | 24 +- .../Vanilla/EmbeddedContent/EmbedCache.php | 20 +- .../Vanilla/EmbeddedContent/EmbedConfig.php | 52 +- .../EmbeddedContent/EmbedCreatorInterface.php | 3 +- .../EmbeddedContent/EmbedFilterInterface.php | 4 +- .../Vanilla/EmbeddedContent/EmbedService.php | 82 +- .../Vanilla/EmbeddedContent/EmbedUtils.php | 24 +- .../EmbeddedContentException.php | 7 +- .../Embeds/BrightcoveEmbed.php | 19 +- .../EmbeddedContent/Embeds/CodePenEmbed.php | 33 +- .../EmbeddedContent/Embeds/ErrorEmbed.php | 34 +- .../EmbeddedContent/Embeds/FileEmbed.php | 33 +- .../Embeds/GettyImagesEmbed.php | 18 +- .../EmbeddedContent/Embeds/GiphyEmbed.php | 21 +- .../EmbeddedContent/Embeds/IFrameEmbed.php | 21 +- .../EmbeddedContent/Embeds/ImageEmbed.php | 28 +- .../EmbeddedContent/Embeds/ImgurEmbed.php | 26 +- .../EmbeddedContent/Embeds/InstagramEmbed.php | 29 +- .../EmbeddedContent/Embeds/KalturaEmbed.php | 17 +- .../EmbeddedContent/Embeds/LinkEmbed.php | 15 +- .../EmbeddedContent/Embeds/MuralEmbed.php | 10 +- .../EmbeddedContent/Embeds/PanoptoEmbed.php | 22 +- .../EmbeddedContent/Embeds/QuoteEmbed.php | 117 +- .../Embeds/QuoteEmbedDisplayOptions.php | 71 +- .../Embeds/QuoteEmbedFilter.php | 56 +- .../Embeds/SoundCloudEmbed.php | 19 +- .../EmbeddedContent/Embeds/TwitchEmbed.php | 52 +- .../Embeds/TwitchEmbedFilter.php | 16 +- .../EmbeddedContent/Embeds/TwitterEmbed.php | 23 +- .../EmbeddedContent/Embeds/VimeoEmbed.php | 37 +- .../EmbeddedContent/Embeds/WistiaEmbed.php | 37 +- .../EmbeddedContent/Embeds/YouTubeEmbed.php | 24 +- .../Factories/AbstractOwnSiteEmbedFactory.php | 30 +- .../Factories/BrightcoveEmbedFactory.php | 47 +- .../Factories/CodePenEmbedFactory.php | 45 +- .../Factories/GettyImagesEmbedFactory.php | 31 +- .../Factories/GiphyEmbedFactory.php | 37 +- .../Factories/ImgurEmbedFactory.php | 31 +- .../Factories/InstagramEmbedFactory.php | 20 +- .../Factories/KalturaEmbedFactory.php | 55 +- .../Factories/MuralEmbedFactory.php | 22 +- .../Factories/PanoptoEmbedFactory.php | 38 +- .../Factories/ScrapeEmbedFactory.php | 49 +- .../Factories/SoundCloudEmbedFactory.php | 43 +- .../Factories/TwitchEmbedFactory.php | 34 +- .../Factories/TwitterEmbedFactory.php | 25 +- .../Factories/VimeoEmbedFactory.php | 21 +- .../Factories/WistiaEmbedFactory.php | 28 +- .../Factories/YouTubeEmbedFactory.php | 45 +- .../EmbeddedContent/FallbackEmbedFactory.php | 11 +- .../EmbeddedContent/LegacyEmbedReplacer.php | 201 +- library/Vanilla/Events/DirtyRecordTrait.php | 26 +- library/Vanilla/Events/EventAction.php | 38 +- .../Vanilla/Events/LegacyDirtyRecordTrait.php | 7 +- library/Vanilla/Events/SearchAllEvent.php | 59 + library/Vanilla/Events/SearchPlacesEvent.php | 55 + .../Exception/ConfigurationException.php | 3 +- .../Exception/Database/NoResultsException.php | 6 +- library/Vanilla/Exception/ExitException.php | 8 +- .../Exception/FeatureNotEnabledException.php | 3 +- .../Vanilla/Exception/PermissionException.php | 23 +- library/Vanilla/FeatureFlagHelper.php | 24 +- library/Vanilla/FileUtils.php | 63 +- library/Vanilla/FloodControlTrait.php | 85 +- library/Vanilla/Formatting/Attachment.php | 51 +- library/Vanilla/Formatting/BaseFormat.php | 65 +- library/Vanilla/Formatting/DateConfig.php | 35 +- .../Vanilla/Formatting/DateTimeFormatter.php | 210 +- .../Exception/FormatterNotFoundException.php | 3 +- .../Exception/FormattingException.php | 3 +- .../ExtendedContentFormatService.php | 9 +- .../Vanilla/Formatting/FormatCompatTrait.php | 10 +- .../Formatting/FormatCompatibilityService.php | 15 +- library/Vanilla/Formatting/FormatConfig.php | 30 +- .../Vanilla/Formatting/FormatFieldTrait.php | 12 +- library/Vanilla/Formatting/FormatService.php | 135 +- library/Vanilla/Formatting/FormatText.php | 7 +- library/Vanilla/Formatting/FormatUtil.php | 352 +- .../Formatting/Formats/BBCodeFormat.php | 45 +- .../Formatting/Formats/DisplayFormat.php | 83 +- .../Vanilla/Formatting/Formats/HtmlFormat.php | 98 +- .../Formatting/Formats/MarkdownFormat.php | 32 +- .../Formatting/Formats/NotFoundFormat.php | 73 +- .../Vanilla/Formatting/Formats/RichFormat.php | 206 +- .../Formatting/Formats/TextExFormat.php | 10 +- .../Vanilla/Formatting/Formats/TextFormat.php | 82 +- .../Formatting/Formats/WysiwygFormat.php | 56 +- library/Vanilla/Formatting/Html/DomUtils.php | 133 +- .../Vanilla/Formatting/Html/HtmlDocument.php | 85 +- .../Vanilla/Formatting/Html/HtmlEnhancer.php | 13 +- .../Html/HtmlPlainTextConverter.php | 95 +- .../Vanilla/Formatting/Html/HtmlSanitizer.php | 48 +- .../Processor/AttachmentHtmlProcessor.php | 26 +- .../Html/Processor/ExternalLinksProcessor.php | 34 +- .../Html/Processor/HeadingHtmlProcessor.php | 26 +- .../Html/Processor/HtmlProcessor.php | 7 +- .../Html/Processor/HtmlProcessorTrait.php | 30 +- .../Html/Processor/ImageHtmlProcessor.php | 27 +- .../PregReplaceCallbackProcessor.php | 33 +- .../Html/Processor/StripEmbedsProcessor.php | 10 +- .../Html/Processor/StripImagesProcessor.php | 10 +- .../Html/Processor/TrimWordsProcessor.php | 16 +- .../Processor/UserContentCssProcessor.php | 39 +- .../Processor/ZendeskWysiwygProcessor.php | 33 +- .../Formatting/HtmlDomAttributeFragment.php | 21 +- .../Formatting/HtmlDomElementFragment.php | 22 +- .../Formatting/HtmlDomRangeFragment.php | 33 +- .../Formatting/ParsableDOMInterface.php | 3 +- .../Vanilla/Formatting/Quill/BlotGroup.php | 100 +- .../Formatting/Quill/BlotGroupCollection.php | 57 +- .../Quill/BlotGroupTextFragment.php | 21 +- .../Quill/BlotPointerTextFragment.php | 17 +- .../Formatting/Quill/Blots/AbstractBlot.php | 40 +- .../Blots/Embeds/AbstractInlineEmbedBlot.php | 15 +- .../Quill/Blots/Embeds/EmojiBlot.php | 15 +- .../Quill/Blots/Embeds/ExternalBlot.php | 41 +- .../Quill/Blots/Embeds/MentionBlot.php | 24 +- .../Quill/Blots/FormattableTextTrait.php | 13 +- .../Lines/AbstractLineTerminatorBlot.php | 12 +- .../Lines/BlockquoteLineTerminatorBlot.php | 25 +- .../Blots/Lines/CodeLineTerminatorBlot.php | 26 +- .../Blots/Lines/HeadingTerminatorBlot.php | 45 +- .../Blots/Lines/ListLineTerminatorBlot.php | 75 +- .../Lines/ParagraphLineTerminatorBlot.php | 26 +- .../Blots/Lines/SpoilerLineTerminatorBlot.php | 32 +- .../Formatting/Quill/Blots/NullBlot.php | 19 +- .../Formatting/Quill/Blots/TextBlot.php | 28 +- library/Vanilla/Formatting/Quill/Filterer.php | 40 +- .../Quill/Formats/AbstractFormat.php | 40 +- .../Vanilla/Formatting/Quill/Formats/Bold.php | 18 +- .../Vanilla/Formatting/Quill/Formats/Code.php | 16 +- .../Formatting/Quill/Formats/Italic.php | 19 +- .../Vanilla/Formatting/Quill/Formats/Link.php | 20 +- .../Formatting/Quill/Formats/Strike.php | 20 +- .../Formatting/Quill/HtmlToBlotsParser.php | 43 +- .../Quill/Nesting/InvalidNestingException.php | 3 +- .../Quill/Nesting/NestableItemInterface.php | 3 +- .../Quill/Nesting/NestingParentInterface.php | 4 +- .../NestingParentRendererInterface.php | 3 +- library/Vanilla/Formatting/Quill/Parser.php | 73 +- library/Vanilla/Formatting/Quill/README.md | 37 +- library/Vanilla/Formatting/Quill/Renderer.php | 7 +- .../Quill/TextFragmentCollection.php | 22 +- .../Vanilla/Formatting/TextDOMInterface.php | 3 +- .../TextFragmentCollectionInterface.php | 3 +- .../Formatting/TextFragmentInterface.php | 4 +- .../Vanilla/Formatting/TextFragmentType.php | 13 +- library/Vanilla/Formatting/TimeUnit.php | 3 +- .../Vanilla/Formatting/UpdateMediaTrait.php | 34 +- .../Vanilla/Formatting/UserMentionsTrait.php | 105 + library/Vanilla/Forms/ApiFormChoices.php | 34 +- .../Vanilla/Forms/FieldMatchConditional.php | 15 +- .../Vanilla/Forms/FormChoicesInterface.php | 4 +- .../Vanilla/Forms/FormFieldMatchInterface.php | 4 +- library/Vanilla/Forms/FormOptions.php | 35 +- library/Vanilla/Forms/SchemaForm.php | 201 +- library/Vanilla/Forms/StaticFormChoices.php | 12 +- library/Vanilla/Http/InternalClient.php | 109 +- library/Vanilla/Http/InternalRequest.php | 128 +- library/Vanilla/Http/InternalResponse.php | 35 + library/Vanilla/HttpCacheMiddleware.php | 18 +- library/Vanilla/ImageResizer.php | 201 +- .../ImageResizeProviderInterface.php | 3 +- library/Vanilla/ImageSrcSet/ImageSrcSet.php | 9 +- .../ImageSrcSet/ImageSrcSetService.php | 17 +- .../Vanilla/ImageSrcSet/MainImageSchema.php | 23 +- .../Providers/DefaultImageResizeProvider.php | 8 +- library/Vanilla/InjectableInterface.php | 3 +- library/Vanilla/InteropContainer.php | 12 +- library/Vanilla/Invalid.php | 15 +- .../Layout/Asset/AbstractLayoutAsset.php | 10 +- .../Vanilla/Layout/Asset/BreadcrumbAsset.php | 112 - .../Vanilla/Layout/Asset/LayoutFormAsset.php | 140 + library/Vanilla/Layout/Definitions/home.json | 88 +- .../Vanilla/Layout/GlobalRecordProvider.php | 37 +- .../Vanilla/Layout/HydrateAwareInterface.php | 25 + library/Vanilla/Layout/HydrateAwareTrait.php | 57 + .../Layout/LayoutAssetAwareInterface.php | 4 +- .../Vanilla/Layout/LayoutAssetAwareTrait.php | 13 +- library/Vanilla/Layout/LayoutHydrator.php | 145 +- library/Vanilla/Layout/LayoutModel.php | 192 +- library/Vanilla/Layout/LayoutPage.php | 90 +- library/Vanilla/Layout/LayoutService.php | 37 +- library/Vanilla/Layout/LayoutViewModel.php | 251 +- .../LayoutPermissionFilterMiddleware.php | 76 +- .../Middleware/VisibilityMiddleware.php | 46 +- .../Providers/FileBasedLayoutProvider.php | 47 +- .../Providers/LayoutProviderInterface.php | 4 +- .../LayoutViewRecordProviderInterface.php | 12 +- .../MutableLayoutProviderInterface.php | 4 +- .../Vanilla/Layout/Resolvers/ApiResolver.php | 49 +- .../Resolvers/ReactLayoutExceptionHandler.php | 34 +- .../Layout/Resolvers/ReactResolver.php | 58 +- .../Layout/Resolvers/TranslateResolver.php | 28 +- library/Vanilla/Layout/RootRecordProvider.php | 68 + .../Layout/Section/AbstractLayoutSection.php | 17 +- .../Layout/Section/SectionFullWidth.php | 27 +- .../Layout/Section/SectionOneColumn.php | 31 +- .../Layout/Section/SectionThreeColumns.php | 39 +- .../Layout/Section/SectionTwoColumns.php | 43 +- .../Layout/View/AbstractCustomLayoutView.php | 25 +- .../Vanilla/Layout/View/CommonLayoutView.php | 71 +- .../Vanilla/Layout/View/HomeLayoutView.php | 28 +- .../Layout/View/LayoutViewInterface.php | 3 +- .../Layout/View/LegacyLayoutViewInterface.php | 3 +- library/Vanilla/Logger.php | 57 +- library/Vanilla/Logging/ErrorLogger.php | 67 +- library/Vanilla/Logging/LogDecorator.php | 106 +- library/Vanilla/Logging/LogEntry.php | 47 +- .../Logging/LoggableEventInterface.php | 4 +- .../Vanilla/Logging/LoggableEventTrait.php | 27 +- library/Vanilla/Logging/LoggerUtils.php | 17 +- .../Vanilla/Logging/ResourceEventLogger.php | 30 +- library/Vanilla/Logging/TraceCollector.php | 10 +- library/Vanilla/Menu/Counter.php | 22 +- library/Vanilla/Menu/CounterModel.php | 10 +- .../Vanilla/Menu/CounterProviderInterface.php | 3 +- library/Vanilla/Message.php | 22 +- .../Metadata/Parser/AbstractXmlParser.php | 35 +- .../Vanilla/Metadata/Parser/JsonLDParser.php | 55 +- .../Metadata/Parser/OpenGraphParser.php | 29 +- library/Vanilla/Metadata/Parser/Parser.php | 3 +- .../Vanilla/Metadata/Parser/RSSFeedParser.php | 72 +- library/Vanilla/Models/AddonDisabledEvent.php | 37 + library/Vanilla/Models/AddonModel.php | 242 +- library/Vanilla/Models/AuthenticatorModel.php | 227 +- .../AuthenticatorTypeFragmentSchema.php | 23 + .../Vanilla/Models/CrawlableRecordSchema.php | 145 +- .../Models/CurrentUserPreloadProvider.php | 16 +- .../Models/DashboardPreloadProvider.php | 18 +- library/Vanilla/Models/DraftModel.php | 28 +- library/Vanilla/Models/FormatSchema.php | 23 +- library/Vanilla/Models/FragmentService.php | 14 +- .../Vanilla/Models/FullRecordCacheModel.php | 24 +- library/Vanilla/Models/GenericRecord.php | 13 +- library/Vanilla/Models/InstallModel.php | 225 +- library/Vanilla/Models/LegacyModelUtils.php | 58 +- .../Vanilla/Models/LimitedPipelineModel.php | 38 +- .../Vanilla/Models/LocalePreloadProvider.php | 19 +- library/Vanilla/Models/LocalizedIDTrait.php | 9 +- library/Vanilla/Models/LockService.php | 84 + library/Vanilla/Models/Model.php | 135 +- library/Vanilla/Models/ModelCache.php | 94 +- .../ModelCacheInvalidationProcessor.php | 7 +- library/Vanilla/Models/ModelFactory.php | 50 +- .../Models/PermissionFragmentSchema.php | 23 +- library/Vanilla/Models/PipelineModel.php | 37 +- .../Models/PrimaryKeyCrawlInfoTrait.php | 38 +- library/Vanilla/Models/ReactionModel.php | 7 +- library/Vanilla/Models/ReactionOwnerModel.php | 18 +- library/Vanilla/Models/SSOData.php | 72 +- library/Vanilla/Models/SSOModel.php | 284 +- library/Vanilla/Models/SiteMeta.php | 246 +- library/Vanilla/Models/SiteMetaExtra.php | 4 +- library/Vanilla/Models/SiteTotalService.php | 77 +- library/Vanilla/Models/TrustedDomainModel.php | 51 +- .../Vanilla/Models/UserAttributesModel.php | 27 +- .../Models/UserAuthenticationModel.php | 7 +- ...erAuthenticationProviderFragmentSchema.php | 49 +- library/Vanilla/Models/UserFragmentSchema.php | 68 +- library/Vanilla/Models/VanillaMediaSchema.php | 75 +- library/Vanilla/Navigation/Breadcrumb.php | 22 +- .../Vanilla/Navigation/BreadcrumbModel.php | 17 +- .../BreadcrumbProviderInterface.php | 3 +- .../BreadcrumbProviderNotFoundException.php | 7 +- library/Vanilla/Navigation/NavLinkSchema.php | 45 +- library/Vanilla/OpenAPIBuilder.php | 146 +- library/Vanilla/PageScraper.php | 127 +- library/Vanilla/Permissions.php | 311 +- .../Vanilla/PermissionsTranslationTrait.php | 116 +- library/Vanilla/PlainTextLengthValidator.php | 23 +- library/Vanilla/PrunableTrait.php | 44 +- library/Vanilla/ReCaptchaVerification.php | 14 +- .../RemoteResource/LocalRemoteResourceJob.php | 81 +- .../RemoteResourceHttpClient.php | 7 +- library/Vanilla/Scheduler/Auth/AdHocAuth.php | 18 +- .../Scheduler/Auth/AdHocAuth401Exception.php | 8 +- .../Scheduler/Auth/AdHocAuth403Exception.php | 8 +- .../Scheduler/Auth/AdHocAuth412Exception.php | 8 +- .../Scheduler/Auth/AdHocAuthException.php | 7 +- library/Vanilla/Scheduler/CronModel.php | 113 + ...mmyScheduler.php => DeferredScheduler.php} | 274 +- .../Descriptor/CronJobDescriptor.php | 24 +- .../Descriptor/CronJobDescriptorInterface.php | 4 +- .../Descriptor/JobDescriptorInterface.php | 10 +- .../Descriptor/NormalJobDescriptor.php | 59 +- .../Scheduler/Driver/DriverInterface.php | 4 +- .../Scheduler/Driver/DriverSlipInterface.php | 4 +- .../Vanilla/Scheduler/Driver/LocalDriver.php | 28 +- .../Scheduler/Driver/LocalDriverSlip.php | 42 +- library/Vanilla/Scheduler/Job/CallbackJob.php | 14 +- .../Vanilla/Scheduler/Job/HttpRequestJob.php | 61 +- .../Scheduler/Job/JobDelayAwareInterface.php | 4 +- .../Scheduler/Job/JobExecutionProgress.php | 24 +- .../Scheduler/Job/JobExecutionStatus.php | 88 +- .../Scheduler/Job/JobExecutionType.php | 26 +- .../Vanilla/Scheduler/Job/JobInterface.php | 4 +- library/Vanilla/Scheduler/Job/JobPriority.php | 31 +- .../Job/JobPriorityAwareInterface.php | 4 +- .../Vanilla/Scheduler/Job/JobStatusModel.php | 188 +- .../Scheduler/Job/JobTypeAwareInterface.php | 4 +- .../Scheduler/Job/LocalApiBulkDeleteJob.php | 55 +- library/Vanilla/Scheduler/Job/LocalApiJob.php | 10 +- .../Scheduler/Job/LocalJobInterface.php | 4 +- .../Vanilla/Scheduler/Job/LongRunnerJob.php | 29 +- .../Job/LongRunnerJobMessageTrait.php | 7 +- .../Job/TrackableJobAwareInterface.php | 4 +- .../Scheduler/Job/TrackableJobAwareTrait.php | 16 +- library/Vanilla/Scheduler/LongRunner.php | 271 +- .../Vanilla/Scheduler/LongRunnerAction.php | 113 +- .../Vanilla/Scheduler/LongRunnerFailedID.php | 17 +- .../LongRunnerItemResultInterface.php | 8 +- .../Scheduler/LongRunnerMiddleware.php | 20 +- .../Scheduler/LongRunnerMultiAction.php | 24 + .../Vanilla/Scheduler/LongRunnerNextArgs.php | 26 +- .../Scheduler/LongRunnerQuantityTotal.php | 30 +- .../Vanilla/Scheduler/LongRunnerResult.php | 88 +- .../Vanilla/Scheduler/LongRunnerSuccessID.php | 14 +- .../Scheduler/LongRunnerTimeoutException.php | 3 +- .../Scheduler/Meta/SchedulerControlMeta.php | 48 - .../Scheduler/Meta/SchedulerMetaDao.php | 78 - .../Vanilla/Scheduler/SchedulerInterface.php | 51 +- library/Vanilla/Scheduler/TrackingSlip.php | 85 +- .../Vanilla/Scheduler/TrackingSlipData.php | 17 +- .../Scheduler/TrackingSlipInterface.php | 4 +- library/Vanilla/Schema/BasicSchemaSchema.php | 110 +- .../Vanilla/Schema/DateRangeExpression.php | 42 +- .../Schema/LegacyDateRangeExpression.php | 83 +- library/Vanilla/Schema/RangeExpression.php | 194 +- library/Vanilla/SchemaFactory.php | 31 +- .../Vanilla/Search/AbstractSearchDriver.php | 78 +- library/Vanilla/Search/AbstractSearchType.php | 85 +- .../Search/BoostableSearchQueryInterface.php | 4 +- .../CollapsableSearchQueryInterface.php | 4 +- library/Vanilla/Search/GlobalSearchType.php | 136 +- .../Vanilla/Search/LegacySearchAdapter.php | 124 +- library/Vanilla/Search/MysqlSearchDriver.php | 27 +- library/Vanilla/Search/MysqlSearchQuery.php | 53 +- library/Vanilla/Search/SearchOptions.php | 13 +- library/Vanilla/Search/SearchQuery.php | 151 +- library/Vanilla/Search/SearchResultItem.php | 353 +- library/Vanilla/Search/SearchResults.php | 46 +- library/Vanilla/Search/SearchService.php | 70 +- .../Vanilla/Search/SearchTypeCollection.php | 53 +- .../Search/SearchTypeCollectorInterface.php | 4 +- .../SearchTypeQueryExtenderInterface.php | 4 +- library/Vanilla/Site/Application.php | 14 +- library/Vanilla/Site/ApplicationProvider.php | 13 +- library/Vanilla/Site/DefaultSiteSection.php | 120 +- library/Vanilla/Site/OwnSite.php | 15 +- library/Vanilla/Site/OwnSiteProvider.php | 29 +- library/Vanilla/Site/RootSiteSection.php | 201 + .../Vanilla/Site/RootSiteSectionProvider.php | 58 + .../Site/SingleSiteSectionProvider.php | 24 +- library/Vanilla/Site/SiteSectionModel.php | 108 +- library/Vanilla/Site/SiteSectionSchema.php | 45 +- library/Vanilla/Site/SiteSyncService.php | 10 +- library/Vanilla/Site/TranslationModel.php | 9 +- library/Vanilla/Site/TranslationProvider.php | 15 +- library/Vanilla/SmartyBC.php | 46 +- library/Vanilla/Theme/Asset/CssThemeAsset.php | 28 +- .../Vanilla/Theme/Asset/HtmlThemeAsset.php | 30 +- .../Vanilla/Theme/Asset/ImageThemeAsset.php | 34 +- .../Theme/Asset/JavascriptThemeAsset.php | 19 +- .../Vanilla/Theme/Asset/JsonThemeAsset.php | 65 +- .../Vanilla/Theme/Asset/NeonThemeAsset.php | 25 +- library/Vanilla/Theme/Asset/ThemeAsset.php | 53 +- .../Vanilla/Theme/Asset/TwigThemeAsset.php | 37 +- library/Vanilla/Theme/BoxThemeShim.php | 37 +- library/Vanilla/Theme/FsThemeProvider.php | 40 +- library/Vanilla/Theme/Theme.php | 267 +- library/Vanilla/Theme/ThemeAssetFactory.php | 77 +- library/Vanilla/Theme/ThemeFeatures.php | 85 +- .../Vanilla/Theme/ThemePreloadProvider.php | 88 +- library/Vanilla/Theme/ThemePreview.php | 53 +- .../Theme/ThemeProviderCleanupInterface.php | 3 +- .../Vanilla/Theme/ThemeProviderInterface.php | 9 +- .../Theme/ThemeProviderWriteInterface.php | 4 +- library/Vanilla/Theme/ThemeSectionModel.php | 16 +- library/Vanilla/Theme/ThemeService.php | 183 +- library/Vanilla/Theme/ThemeServiceHelper.php | 97 +- .../VariableDefaultsProviderInterface.php | 4 +- .../Theme/VariableProviders/QuickLink.php | 32 +- .../QuickLinkProviderInterface.php | 4 +- .../VariableProviders/QuickLinksModule.php | 22 +- .../QuickLinksVariableProvider.php | 32 +- .../Theme/VariablesProviderInterface.php | 10 +- library/Vanilla/TokenSigningTrait.php | 66 +- library/Vanilla/UploadedFile.php | 178 +- library/Vanilla/UploadedFileSchema.php | 134 +- library/Vanilla/Utility/ArrayUtils.php | 174 +- library/Vanilla/Utility/CamelCaseScheme.php | 76 +- library/Vanilla/Utility/CapitalCaseScheme.php | 39 +- library/Vanilla/Utility/ContainerUtils.php | 38 +- library/Vanilla/Utility/DebugUtils.php | 45 +- library/Vanilla/Utility/DelimitedScheme.php | 25 +- library/Vanilla/Utility/Deprecation.php | 54 +- .../Vanilla/Utility/FileGeneratorUtils.php | 67 + library/Vanilla/Utility/HtmlParserTrait.php | 7 +- library/Vanilla/Utility/HtmlUtils.php | 92 +- .../Utility/InstanceValidatorSchema.php | 14 +- library/Vanilla/Utility/ModelUtils.php | 115 +- library/Vanilla/Utility/NameScheme.php | 10 +- library/Vanilla/Utility/ObjectUtils.php | 15 +- library/Vanilla/Utility/PhpClassParsed.php | 90 + library/Vanilla/Utility/PocketService.php | 16 +- library/Vanilla/Utility/SchemaFilters.php | 14 +- library/Vanilla/Utility/SchemaUtils.php | 55 +- .../SerializedPublicPropertiesToJsonTrait.php | 21 + library/Vanilla/Utility/SqlUtils.php | 18 +- library/Vanilla/Utility/StringUtils.php | 196 +- library/Vanilla/Utility/Timers.php | 138 +- library/Vanilla/Utility/TreeBuilder.php | 36 +- library/Vanilla/Utility/UrlUtils.php | 70 +- library/Vanilla/VanillaClassLocator.php | 23 +- library/Vanilla/VanillaMailer.php | 38 +- library/Vanilla/Web/APIExpandMiddleware.php | 88 +- library/Vanilla/Web/AbstractApiExpander.php | 16 +- library/Vanilla/Web/AbstractJsonLDItem.php | 7 +- library/Vanilla/Web/ApiFilterMiddleware.php | 19 +- .../Vanilla/Web/Asset/AssetPreloadModel.php | 35 +- library/Vanilla/Web/Asset/AssetPreloader.php | 15 +- .../Web/Asset/DeploymentCacheBuster.php | 10 +- library/Vanilla/Web/Asset/ExternalAsset.php | 13 +- library/Vanilla/Web/Asset/HotBuildAsset.php | 13 +- .../Web/Asset/InlinePolyfillContent.js.twig | 1 + .../Vanilla/Web/Asset/LegacyAssetModel.php | 280 +- library/Vanilla/Web/Asset/LocaleAsset.php | 15 +- library/Vanilla/Web/Asset/PolyfillAsset.php | 11 +- library/Vanilla/Web/Asset/SiteAsset.php | 37 +- .../Vanilla/Web/Asset/ThemeScriptAsset.php | 13 +- .../Vanilla/Web/Asset/WebpackAddonAsset.php | 15 +- library/Vanilla/Web/Asset/WebpackAsset.php | 29 +- .../Web/Asset/WebpackAssetDefinition.php | 35 +- .../WebpackAssetDefinitionCollection.php | 145 +- .../Web/Asset/WebpackAssetProvider.php | 80 +- .../WebpackContentSecurityPolicyProvider.php | 13 +- library/Vanilla/Web/BreadcrumbJsonLD.php | 25 +- .../Web/CacheControlConstantsInterface.php | 16 +- .../Vanilla/Web/CacheControlMiddleware.php | 20 +- library/Vanilla/Web/CacheControlTrait.php | 22 +- .../ContentSecurityPolicyModel.php | 72 +- ...ContentSecurityPolicyProviderInterface.php | 3 +- .../DefaultContentSecurityPolicyProvider.php | 40 +- ...WhitelistContentSecurityPolicyProvider.php | 22 +- .../Web/ContentSecurityPolicy/Policy.php | 46 +- ...WhitelistContentSecurityPolicyProvider.php | 13 +- .../Web/ContentSecurityPolicyMiddleware.php | 17 +- library/Vanilla/Web/Controller.php | 35 +- library/Vanilla/Web/CsvView.php | 17 + library/Vanilla/Web/CurlWrapper.php | 8 +- .../Web/DeploymentHeaderMiddleware.php | 23 +- .../Web/Events/PageRenderBeforeEvent.php | 13 +- .../HttpStrictTransportSecurityMiddleware.php | 16 +- .../Web/HttpStrictTransportSecurityModel.php | 57 +- .../Web/JsInterpop/AbstractReactModule.php | 20 +- .../Web/JsInterpop/PhpAsJsVariable.php | 10 +- .../Vanilla/Web/JsInterpop/RawReduxAction.php | 38 + .../Vanilla/Web/JsInterpop/ReduxAction.php | 15 +- .../JsInterpop/ReduxActionPreloadTrait.php | 15 +- .../ReduxActionProviderInterface.php | 3 +- .../Web/JsInterpop/ReduxErrorAction.php | 16 +- library/Vanilla/Web/JsonView.php | 15 +- library/Vanilla/Web/LegacyTwigViewHandler.php | 15 +- library/Vanilla/Web/MasterViewRenderer.php | 74 +- .../Web/Middleware/CookiePassMiddleware.php | 16 +- .../Middleware/LogTransactionMiddleware.php | 15 +- .../Middleware/RoleTokenAuthMiddleware.php | 46 +- .../Web/Middleware/SystemTokenMiddleware.php | 13 +- .../Web/Middleware/ValidateJSONMiddleware.php | 35 + .../Web/Middleware/ValidateUTF8Middleware.php | 57 + library/Vanilla/Web/Page.php | 88 +- .../Vanilla/Web/PageDispatchController.php | 19 +- library/Vanilla/Web/PageHead.php | 139 +- library/Vanilla/Web/PageHead.twig | 2 +- .../Vanilla/Web/PageHeadAwareInterface.php | 4 +- library/Vanilla/Web/PageHeadAwareTrait.php | 7 +- library/Vanilla/Web/PageHeadInterface.php | 12 +- library/Vanilla/Web/PageHeadProxyTrait.php | 60 +- .../Web/Pagination/ApiPaginationIterator.php | 15 +- .../Pagination/FlatApiPaginationIterator.php | 6 +- library/Vanilla/Web/Pagination/WebLinking.php | 61 +- library/Vanilla/Web/PermissionCheckTrait.php | 19 +- .../Web/PrivateCommunityMiddleware.php | 26 +- library/Vanilla/Web/RequestValidator.php | 10 +- library/Vanilla/Web/Robots.php | 20 +- library/Vanilla/Web/RoleToken.php | 58 +- library/Vanilla/Web/RoleTokenAuthTrait.php | 16 +- library/Vanilla/Web/RoleTokenFactory.php | 23 +- library/Vanilla/Web/SafeCurlHttpHandler.php | 28 +- library/Vanilla/Web/SimpleTitlePage.php | 10 +- library/Vanilla/Web/SmartIDMiddleware.php | 94 +- .../Vanilla/Web/SystemCallableInterface.php | 4 +- library/Vanilla/Web/SystemTokenUtils.php | 23 +- library/Vanilla/Web/ThemedPage.php | 10 +- library/Vanilla/Web/TwigEnhancer.php | 143 +- library/Vanilla/Web/TwigFormWrapper.php | 82 +- library/Vanilla/Web/TwigRenderTrait.php | 15 +- library/Vanilla/Web/TwigRenderer.php | 17 +- library/Vanilla/Web/TwigStaticRenderer.php | 24 +- library/Vanilla/Web/UASniffer.php | 16 +- library/Vanilla/Web/UserSmartIDResolver.php | 38 +- .../Widgets/AbstractHomeWidgetModule.php | 341 +- .../Widgets/AbstractTabWidgetTabFactory.php | 16 +- .../Vanilla/Widgets/AbstractWidgetModule.php | 22 +- .../HomeWidgetContainerSchemaTrait.php | 312 +- .../Widgets/LimitableWidgetInterface.php | 3 +- .../Vanilla/Widgets/React/AllSectionTrait.php | 33 + .../Widgets/React/BannerContentWidget.php | 82 +- .../Widgets/React/BannerFullWidget.php | 178 +- .../React/CombinedPropsWidgetInterface.php | 4 +- .../React/CombinedPropsWidgetTrait.php | 10 +- .../Widgets/React/DefaultSectionTrait.php | 27 + .../Vanilla/Widgets/React/HtmlReactWidget.php | 69 +- .../Widgets/React/LeaderboardWidget.php | 106 +- .../Widgets/React/QuickLinksWidget.php | 46 +- .../Widgets/React/ReactWidgetInterface.php | 9 +- .../Widgets/React/SectionAwareInterface.php | 19 - .../React/WidgetContainerReactWidget.php | 73 - .../Widgets/Schema/ReactChildrenSchema.php | 13 +- .../Widgets/Schema/ReactSingleChildSchema.php | 25 +- .../Widgets/Schema/WidgetBackgroundSchema.php | 105 +- library/Vanilla/Widgets/TabWidgetModule.php | 127 +- .../Vanilla/Widgets/TabWidgetTabService.php | 16 +- library/Vanilla/Widgets/WidgetFactory.php | 77 +- library/Vanilla/Widgets/WidgetItemSchema.php | 25 +- library/Vanilla/Widgets/WidgetSchemaTrait.php | 274 +- library/Vanilla/Widgets/WidgetService.php | 16 +- .../class.passwordauthenticator.php | 65 +- library/core/caching/LockStolenException.php | 23 + library/core/caching/StealableLock.php | 80 + .../class.userattributecacheadapter.php | 32 +- library/core/class.accesstokenmodel.php | 201 +- library/core/class.auth.php | 307 +- .../class.authenticationprovidermodel.php | 221 +- library/core/class.authenticator.php | 248 +- library/core/class.bbcode.php | 420 +- library/core/class.cache.php | 217 +- library/core/class.captcha.php | 142 +- library/core/class.configuration.php | 283 +- library/core/class.configurationmodel.php | 39 +- library/core/class.configurationsource.php | 174 +- library/core/class.controller.php | 1283 +- library/core/class.cookieidentity.php | 309 +- library/core/class.dirtycache.php | 53 +- library/core/class.dispatcher.php | 603 +- library/core/class.email.php | 345 +- library/core/class.emoji.php | 401 +- library/core/class.filecache.php | 134 +- library/core/class.filesystem.php | 140 +- library/core/class.form.php | 2098 +-- library/core/class.format.php | 966 +- library/core/class.formatterchain.php | 37 +- library/core/class.gdn.php | 240 +- library/core/class.librarymap.php | 106 +- library/core/class.locale.php | 216 +- library/core/class.logger.php | 87 +- library/core/class.markdownvanilla.php | 114 +- library/core/class.memcached.php | 225 +- library/core/class.model.php | 336 +- library/core/class.module.php | 139 +- library/core/class.modulecollection.php | 22 +- library/core/class.oauth2.php | 964 +- library/core/class.pagerfactory.php | 11 +- library/core/class.passwordhash.php | 139 +- library/core/class.pclzipadapter.php | 52 +- library/core/class.pluggable.php | 43 +- library/core/class.plugin.php | 149 +- library/core/class.pluginmanager.php | 482 +- library/core/class.proxyrequest.php | 302 +- library/core/class.regarding.php | 117 +- library/core/class.regardingentity.php | 201 +- library/core/class.request.php | 866 +- library/core/class.router.php | 163 +- library/core/class.sanitizeduserexception.php | 8 +- library/core/class.schema.php | 48 +- library/core/class.session.php | 349 +- library/core/class.smarty.php | 187 +- library/core/class.smartysecurityvanilla.php | 19 +- library/core/class.ssoaddon.php | 12 +- library/core/class.statistics.php | 545 +- library/core/class.theme.php | 359 +- library/core/class.thememanager.php | 290 +- library/core/class.timer.php | 30 +- library/core/class.upload.php | 246 +- library/core/class.uploadimage.php | 157 +- library/core/class.uploadsvg.php | 19 +- library/core/class.userexception.php | 9 +- library/core/class.validation.php | 352 +- library/core/class.vanillahtmlformatter.php | 358 +- library/core/functions.compatibility.php | 206 +- library/core/functions.error.php | 404 +- library/core/functions.framework.php | 998 +- library/core/functions.general.php | 751 +- library/core/functions.render.php | 1120 +- library/core/functions.validation.php | 346 +- .../core/helpers/class.floodcontrolhelper.php | 37 +- library/core/helpers/class.ssoutils.php | 97 +- library/core/interface.ihandshake.php | 4 +- library/core/interface.iidentity.php | 4 +- library/core/interface.imodule.php | 6 +- library/core/interface.iplugin.php | 4 +- library/database/AlterDatabaseException.php | 3 +- library/database/class.database.php | 377 +- library/database/class.databasestructure.php | 368 +- library/database/class.dataset.php | 174 +- library/database/class.mysqldriver.php | 262 +- library/database/class.mysqlstructure.php | 422 +- library/database/class.sqldriver.php | 870 +- .../deprecated/class.applicationmanager.php | 88 +- library/deprecated/class.autoloader.php | 452 +- library/deprecated/class.baselogger.php | 36 +- library/deprecated/class.condition.php | 53 +- library/deprecated/class.dummy.php | 19 +- library/deprecated/class.loglevel.php | 3 +- library/deprecated/class.memcache.php | 85 +- library/deprecated/class.url.php | 23 +- library/deprecated/functions.deprecated.php | 630 +- .../deprecated/interface.loggerinterface.php | 3 +- library/setup/ComposerHelper.php | 67 +- library/src/scripts/@types/api/core.ts | 23 + library/src/scripts/Router.tsx | 18 +- library/src/scripts/VanillaGlobals.ts | 25 + .../scripts/__tests__/TestReduxProvider.tsx | 4 + .../scripts/aboutMeWidget/AboutMe.hooks.tsx | 109 + .../scripts/aboutMeWidget/AboutMeWidget.tsx | 55 + .../src/scripts/addons/AddonList.story.tsx | 6 +- .../scripts/analytics/AnalyticsData.spec.tsx | 23 + .../src/scripts/analytics/AnalyticsData.tsx | 10 - .../src/scripts/analytics/tracking.spec.ts | 37 + library/src/scripts/analytics/tracking.ts | 48 + library/src/scripts/apiv2.tsx | 1 + library/src/scripts/banner/Banner.spec.tsx | 70 + library/src/scripts/banner/Banner.styles.ts | 865 +- library/src/scripts/banner/Banner.tsx | 94 +- .../src/scripts/banner/Banner.variables.ts | 157 +- .../banner/BannerContentWidget.preview.tsx | 22 + .../scripts/banner/BannerContentWidget.tsx | 15 + .../scripts/banner/BannerWidget.preview.tsx | 20 + library/src/scripts/banner/BannerWidget.tsx | 52 + .../src/scripts/banner/CommunityBanner.tsx | 9 +- .../src/scripts/banner/DefaultBannerBg.tsx | 10 +- library/src/scripts/banner/banner.story.tsx | 22 +- .../scripts/banner/contentBannerStyles.tsx | 6 +- library/src/scripts/bootstrap.ts | 173 +- .../callToAction/CallToAction.spec.tsx | 66 + .../callToAction/CallToAction.styles.ts | 66 +- .../src/scripts/callToAction/CallToAction.tsx | 43 +- .../callToAction/CallToAction.variables.ts | 4 +- .../callToAction/CallToActionWidget.tsx | 71 + .../callToAction/GuestCallToActionWidget.tsx | 37 + .../src/scripts/carousel/Carousel.story.tsx | 6 +- library/src/scripts/carousel/useCarousel.ts | 29 +- .../CategoriesWidget.preview.tsx | 19 +- .../categoriesWidget/CategoriesWidget.tsx | 15 +- library/src/scripts/config/configActions.ts | 22 +- library/src/scripts/config/configHooks.ts | 23 +- library/src/scripts/config/configReducer.ts | 25 +- .../scripts/content/CollapsableContent.tsx | 5 +- .../src/scripts/content/ResponsiveImage.tsx | 2 +- .../scripts/content/TruncatedText.styles.ts | 4 + .../src/scripts/content/UserContent.styles.ts | 2 +- .../content/collapsableContentStyles.tsx | 13 +- .../contexts/HamburgerMenuContext.spec.tsx | 175 + .../scripts/contexts/HamburgerMenuContext.tsx | 151 + .../src/scripts/contexts/SearchContext.tsx | 2 +- .../__fixtures__/HamburgerContextFixture.tsx | 46 + .../src/scripts/dataLists/DataList.spec.tsx | 126 + library/src/scripts/dataLists/DataList.tsx | 132 +- .../src/scripts/dataLists/dataList.story.tsx | 89 +- .../src/scripts/dataLists/dataListStyles.ts | 53 +- .../discussions/DiscussionsWidget.preview.tsx | 49 + .../src/scripts/embed/ModernEmbedSettings.tsx | 189 + library/src/scripts/embed/embedEvents.ts | 29 + .../scripts/embed/modernEmbed.local.spec.ts | 144 + .../src/scripts/embed/modernEmbed.local.ts | 186 + .../scripts/embed/modernEmbed.remote.spec.ts | 167 + .../src/scripts/embed/modernEmbed.remote.ts | 314 + .../embeddedContent/FormElements.story.tsx | 149 - .../src/scripts/embeddedContent/LinkEmbed.tsx | 8 +- .../embeddedContent/StoryExampleModal.tsx | 4 +- .../components/EmbedContainer.tsx | 6 +- .../embeddedContent/components/embedStyles.ts | 7 +- .../embeddedContent/quoteEmbedStyles.ts | 16 +- library/src/scripts/entries/admin-new.tsx | 36 +- library/src/scripts/entries/forum.ts | 15 + library/src/scripts/entries/knowledge.ts | 13 + library/src/scripts/entries/layouts.tsx | 114 +- .../scripts/errorPages/ErrorPageBoundary.tsx | 46 + .../Collections.variables.ts | 82 + .../featuredCollections/CollectionsActions.ts | 100 + .../CollectionsForm.loadable.tsx | 297 + .../CollectionsForm.styles.ts | 82 + .../featuredCollections/CollectionsForm.tsx | 27 + .../CollectionsOptionButton.tsx | 31 + .../featuredCollections/CollectionsUtils.ts | 13 + .../FeaturedCollectionRecord.tsx | 37 + .../FeaturedCollections.spec.tsx | 36 + .../FeaturedCollections.story.tsx | 118 + .../FeaturedCollections.style.ts | 20 + .../FeaturedCollections.tsx | 76 + .../FeaturedCollectionsWidget.preview.tsx | 49 + .../FeaturedCollectionsWidget.tsx | 46 + .../featuredCollections/collectionsHooks.tsx | 102 + .../featuredCollections/collectionsReducer.ts | 154 + .../features/Layout/LayoutErrorBoundary.tsx | 41 +- .../features/Layout/LayoutPage.actions.tsx | 17 +- .../scripts/features/Layout/LayoutPage.tsx | 37 +- .../features/Layout/LayoutRenderer.story.tsx | 4 +- .../features/Layout/LayoutRenderer.tsx | 20 +- .../features/Layout/LayoutRenderer.types.ts | 3 +- .../features/__fixtures__/User.fixture.ts | 152 + .../features/discussions/BulkActionsModal.tsx | 5 +- .../features/discussions/BulkActionsToast.tsx | 36 +- .../features/discussions/DiscussionActions.ts | 61 +- .../discussions/DiscussionCheckboxContext.tsx | 38 +- .../discussions/DiscussionGridModule.tsx | 33 + .../discussions/DiscussionGridView.tsx | 84 + .../discussions/DiscussionList.classes.ts | 292 +- .../discussions/DiscussionList.story.tsx | 207 +- .../features/discussions/DiscussionList.tsx | 31 +- .../discussions/DiscussionList.variables.ts | 380 +- .../discussions/DiscussionList.views.tsx | 12 +- .../discussions/DiscussionListAsset.tsx | 246 + .../DiscussionListAssetCategoryFilter.tsx | 55 + .../discussions/DiscussionListAssetHeader.tsx | 54 + .../discussions/DiscussionListItem.tsx | 136 +- .../DiscussionListLoader.story.tsx | 190 + .../discussions/DiscussionListLoader.tsx | 316 + .../discussions/DiscussionListModule.tsx | 21 +- .../discussions/DiscussionListSelectAll.tsx | 10 +- .../discussions/DiscussionOptionsAnnounce.tsx | 9 +- .../DiscussionOptionsChangeType.tsx | 9 +- .../discussions/DiscussionOptionsDelete.tsx | 25 +- .../discussions/DiscussionOptionsMenu.tsx | 21 +- .../discussions/DiscussionOptionsMove.tsx | 9 +- .../discussions/DiscussionVoteCounter.tsx | 18 +- .../discussions/DiscussionsWidget.tsx | 58 + .../features/discussions/discussionHooks.tsx | 109 +- .../discussions/discussionsReducer.ts | 75 +- .../BulkCloseDiscussionsForm.loadable.tsx | 115 + .../forms/BulkCloseDiscussionsForm.tsx | 22 + .../BulkDeleteDiscussionsForm.loadable.tsx | 12 +- .../BulkMergeDiscussionsForm.loadable.tsx | 20 +- .../forms/TagDiscussionForm.loadable.tsx | 1 + .../features/numberedPager/NextPrevButton.tsx | 45 + .../numberedPager/NumberedPager.spec.tsx | 133 + .../numberedPager/NumberedPager.story.tsx | 111 + .../numberedPager/NumberedPager.styles.ts | 98 + .../features/numberedPager/NumberedPager.tsx | 189 + .../numberedPager/NumberedPager.variables.ts | 229 + .../numberedPager/NumberedPagerJumper.tsx | 78 + .../features/search/SearchBar.styles.ts | 7 +- .../src/scripts/features/search/SearchBar.tsx | 11 +- .../scripts/features/search/SearchOption.tsx | 2 +- .../scripts/features/swagger/SwaggerUI.tsx | 2 +- .../features/swagger/swaggerStyles.scss | 123 +- .../src/scripts/features/tags/TagsInput.tsx | 14 +- .../src/scripts/features/tags/TagsReducer.tsx | 1 + .../scripts/features/toaster/ToastContext.tsx | 4 + .../features/userCard/UserCard.spec.tsx | 95 + .../features/userCard/UserCard.styles.ts | 47 +- .../scripts/features/userCard/UserCard.tsx | 14 +- .../features/userCard/UserCard.variables.ts | 15 - .../features/userCard/UserCard.views.tsx | 113 +- .../scripts/features/users/MultiUserInput.tsx | 5 +- .../features/users/ui/InviteUserCard.tsx | 6 +- library/src/scripts/flyouts/DropDown.tsx | 125 +- .../src/scripts/flyouts/DropDownContents.tsx | 49 +- library/src/scripts/flyouts/FlyoutToggle.tsx | 6 +- library/src/scripts/flyouts/Hamburger.tsx | 30 +- library/src/scripts/flyouts/NewPostMenu.tsx | 29 - .../scripts/flyouts/NewPostMenuDropdown.tsx | 72 - .../flyouts/StoryExampleDropDownSearch.tsx | 49 - library/src/scripts/flyouts/dropDownStyles.ts | 3 +- .../src/scripts/flyouts/newPostMenuStyles.ts | 279 - .../panelNav/DropDownPanelNav.story.tsx | 6 +- library/src/scripts/forms/Checkbox.tsx | 61 +- .../forms/DashboardFormFields.story.tsx | 567 + .../forms/FrontEndFormFields.story.tsx | 272 + .../src/scripts/forms/InputBlockStyles.tsx | 2 +- library/src/scripts/forms/checkRadioStyles.ts | 7 +- library/src/scripts/forms/inputStyles.ts | 5 + .../radioInputAsButtons.story.tsx | 10 +- .../rangePicker/AdvancedRangePicker.styles.ts | 49 + .../forms/rangePicker/AdvancedRangePicker.tsx | 60 + .../forms/rangePicker/DatePickerNav.tsx | 26 + .../forms/rangePicker/IntervalPicker.tsx | 113 + .../forms/rangePicker/RangeForm.styles.ts | 32 + .../scripts/forms/rangePicker/RangeForm.tsx | 232 + .../forms/rangePicker/RangePicker.styles.ts | 110 + .../scripts/forms/rangePicker/RangePicker.tsx | 86 + .../forms/rangePicker/RangePresets.tsx | 94 + .../forms/rangePicker/icons/ChevronLeft.tsx | 28 + .../forms/rangePicker/icons/ChevronRight.tsx | 28 + .../src/scripts/forms/rangePicker/types.ts | 64 + .../scripts/forms/rangePicker/utils.spec.ts | 126 + .../src/scripts/forms/rangePicker/utils.ts | 78 + .../src/scripts/forms/select/LazyTokens.tsx | 17 - .../src/scripts/forms/select/SelectBox.tsx | 3 +- .../src/scripts/forms/select/SelectOne.tsx | 2 + .../scripts/forms/select/Tokens.loadable.tsx | 221 + library/src/scripts/forms/select/Tokens.tsx | 228 +- .../forms/select/TokensInputInLegacyForm.tsx | 65 + .../src/scripts/forms/select/overwrites.tsx | 2 +- .../src/scripts/forms/select/tokensStyles.ts | 21 +- .../forms/themeEditor/ThemeBuilderContext.tsx | 2 +- .../forms/themeEditor/ThemeBuilderUpload.tsx | 5 +- .../forms/themeEditor/ThemeColorPicker.tsx | 5 +- .../forms/themeEditor/ThemeEditor.story.tsx | 7 +- .../headers/mebox/pieces/CompactMeBox.tsx | 6 +- .../mebox/pieces/DashboardMeBox.spec.tsx | 47 + .../headers/mebox/pieces/DashboardMeBox.tsx | 4 - .../headers/mebox/pieces/TitleBarNavItem.tsx | 4 +- .../headers/mebox/pieces/UserPhoto.tsx | 2 + .../mebox/pieces/compactSearchStyles.ts | 4 +- .../scripts/headers/pieces/MobileDropDown.tsx | 6 +- .../scripts/homeWidget/HomeWidget.story.tsx | 3 +- library/src/scripts/homeWidget/HomeWidget.tsx | 6 +- .../homeWidget/HomeWidgetContainer.styles.ts | 48 +- .../homeWidget/HomeWidgetContainer.tsx | 29 +- .../homeWidget/HomeWidgetItem.spec.tsx | 78 + .../homeWidget/HomeWidgetItem.styles.ts | 6 + .../src/scripts/homeWidget/HomeWidgetItem.tsx | 42 +- .../homeWidget/HomeWidgetItemDefaultImage.tsx | 40 + .../scripts/htmlWidget/HtmlWidget.preview.tsx | 26 + library/src/scripts/htmlWidget/HtmlWidget.tsx | 77 + .../htmlWidget/HtmlWidgetEditor.classes.ts | 28 + .../scripts/htmlWidget/HtmlWidgetEditor.d.ts | 91 + .../scripts/htmlWidget/HtmlWidgetEditor.tsx | 80 + library/src/scripts/icons/editorIcons.tsx | 3 +- library/src/scripts/icons/iconStyles.ts | 40 +- library/src/scripts/icons/icons.story.tsx | 2 +- library/src/scripts/icons/titleBar.tsx | 45 +- library/src/scripts/layout/HtmlWidget.tsx | 30 - .../src/scripts/layout/PageBox.context.tsx | 2 +- library/src/scripts/layout/PageHeading.tsx | 2 +- .../layout/PanelLayoutTwoColumns.story.tsx | 12 +- library/src/scripts/layout/Section.story.tsx | 20 +- library/src/scripts/layout/Section.tsx | 9 +- .../src/scripts/layout/Section.variables.ts | 422 +- .../src/scripts/layout/SectionFullWidth.tsx | 2 + .../src/scripts/layout/SectionOneColumn.tsx | 2 + .../src/scripts/layout/ThreeColumnSection.tsx | 4 +- .../src/scripts/layout/TwoColumnSection.tsx | 15 +- library/src/scripts/layout/Widget.tsx | 14 +- .../src/scripts/layout/WidgetLayout.story.tsx | 6 +- library/src/scripts/layout/bodyStyles.ts | 9 - .../src/scripts/layout/frame/FrameHeader.tsx | 1 + .../layout/types/layout.threeColumns.ts | 190 +- .../scripts/layout/types/layout.twoColumns.ts | 292 +- .../LeaderboardWidget.preview.tsx | 14 + .../LeaderboardWidget.story.tsx | 127 +- .../LeaderboardWidget.styles.ts | 5 +- .../leaderboardWidget/LeaderboardWidget.tsx | 45 +- .../src/scripts/lists/List.widget.story.tsx | 4 +- library/src/scripts/lists/ListItem.story.tsx | 54 +- library/src/scripts/lists/ListItem.styles.ts | 398 +- library/src/scripts/lists/ListItem.tsx | 165 +- .../src/scripts/lists/ListItem.variables.ts | 5 + .../src/scripts/lists/ListItemMedia.styles.ts | 12 +- library/src/scripts/lists/ListItemMedia.tsx | 28 +- library/src/scripts/messages/Message.tsx | 2 +- .../scripts/messages/fixedMessage.story.tsx | 13 +- library/src/scripts/metas/TokenItem.styles.ts | 29 + library/src/scripts/metas/TokenItem.tsx | 22 + library/src/scripts/modal/LazyModal.tsx | 19 - library/src/scripts/modal/Modal.loadable.tsx | 306 + library/src/scripts/modal/Modal.story.tsx | 8 +- library/src/scripts/modal/Modal.tsx | 333 +- library/src/scripts/modal/ModalConfirm.tsx | 17 +- library/src/scripts/modal/ModalLoader.tsx | 6 +- library/src/scripts/modal/ModalView.tsx | 14 +- library/src/scripts/modal/modalStyles.ts | 11 +- library/src/scripts/modal/mountModal.tsx | 14 + library/src/scripts/navigation/QuickLinks.tsx | 52 +- .../scripts/navigation/QuickLinks.view.tsx | 4 +- .../scripts/navigation/SimplePagerModel.ts | 4 +- library/src/scripts/navigation/SiteNav.tsx | 31 +- .../src/scripts/navigation/SiteNavContext.tsx | 27 +- .../navLinksWithHeadings.storyData.tsx | 9 +- .../scripts/navigation/quicklinks.story.tsx | 6 +- .../NewPostBackground.tsx | 6 +- .../newPostMenu/NewPostMenu.preview.tsx | 21 + .../src/scripts/newPostMenu/NewPostMenu.tsx | 65 + .../newPostMenu/NewPostMenuDropdown.tsx | 147 + .../NewPostMenuFAB.tsx | 7 +- .../newPostBackgroundStyles.ts | 2 +- .../newPostMenu.story.tsx | 26 +- .../scripts/newPostMenu/newPostMenuStyles.ts | 340 + .../ProfileAnalyticsWidget.styles.ts | 35 + .../ProfileAnalyticsWidget.tsx | 60 + .../ProfileOverviewWidget.tsx | 47 + library/src/scripts/redux/ReduxActions.ts | 33 +- library/src/scripts/redux/reducerRegistry.ts | 2 + library/src/scripts/result/Result.tsx | 10 +- .../src/scripts/result/ResultList.spec.tsx | 111 + library/src/scripts/result/ResultMeta.tsx | 7 +- .../src/scripts/routing/LinkAsButton.spec.tsx | 41 + library/src/scripts/routing/LinkAsButton.tsx | 72 +- library/src/scripts/routing/NotFoundPage.tsx | 66 +- .../routing/links/LinkContextProvider.tsx | 11 +- .../scripts/rssWidget/RSSWidget.preview.tsx | 30 + library/src/scripts/rssWidget/RSSWidget.tsx | 52 +- .../scripts/rssWidget/rssFeedPlaceholder.png | Bin 0 -> 227944 bytes .../scripts/search/PlacesSearchListing.tsx | 12 +- library/src/scripts/search/SearchActions.ts | 6 +- library/src/scripts/search/SearchContext.tsx | 10 +- .../search/SearchFormContextProvider.tsx | 42 +- .../scripts/search/SearchInFilter.story.tsx | 10 +- library/src/scripts/search/SearchPage.tsx | 21 +- .../scripts/search/SearchPageResults.spec.tsx | 67 + .../src/scripts/search/SearchPageResults.tsx | 60 +- library/src/scripts/search/SearchService.tsx | 67 +- .../search/SearchSourcesContextProvider.tsx | 3 +- .../search/__fixtures__/Search.fixture.ts | 43 +- .../search/searchAnalyticsData.spec.ts | 26 +- .../src/scripts/search/searchAnalyticsData.ts | 22 +- library/src/scripts/search/searchConstants.ts | 10 +- library/src/scripts/search/searchReducer.ts | 20 +- library/src/scripts/search/searchTypes.ts | 102 +- library/src/scripts/sectioning/Tabs.tsx | 4 +- .../siteTotalsWidget/SiteTotals.classes.ts | 68 + .../siteTotalsWidget/SiteTotals.spec.tsx | 227 + .../siteTotalsWidget/SiteTotals.story.tsx | 181 + .../scripts/siteTotalsWidget/SiteTotals.tsx | 80 + .../siteTotalsWidget/SiteTotals.variables.ts | 193 + .../SiteTotalsWidget.preview.tsx | 25 + .../siteTotalsWidget/SiteTotalsWidget.tsx | 42 + library/src/scripts/stats/Stat.story.tsx.tsx | 46 + library/src/scripts/stats/Stat.styles.ts | 128 + library/src/scripts/stats/Stat.tsx | 43 + library/src/scripts/stats/StatTable.tsx | 60 + .../src/scripts/storybook/StoryBookStyles.ts | 8 - library/src/scripts/storybook/storyData.tsx | 118 + library/src/scripts/styles/Mixins.ts | 11 +- library/src/scripts/styles/cssUtilsTypes.ts | 2 + library/src/scripts/styles/styleHelpers.ts | 2 +- library/src/scripts/styles/styleUnit.ts | 2 +- library/src/scripts/styles/styleUtils.ts | 4 +- .../scripts/tabWidget/TabWidget.preview.tsx | 61 + library/src/scripts/tabWidget/TabWidget.tsx | 8 +- library/src/scripts/textEditor/TextEditor.tsx | 35 +- .../src/scripts/theming/ThemeChooserInput.tsx | 2 +- .../src/scripts/theming/ThemePreviewCard.tsx | 27 +- .../theming/currentThemeInfo.story.tsx | 3 +- .../src/scripts/theming/loadThemeShadowDom.ts | 2 + library/src/scripts/toolTip/ToolTip.tsx | 26 +- library/src/scripts/tree/FormTree.classes.ts | 12 +- library/src/scripts/tree/FormTree.story.tsx | 4 +- library/src/scripts/tree/FormTreeControl.tsx | 19 +- .../src/scripts/tree/FormTreeRowEditModal.tsx | 6 +- library/src/scripts/tree/Tree.tsx | 10 +- library/src/scripts/tree/utils.ts | 2 +- .../scripts/userSpotlight/UserSpotlight.tsx | 13 +- .../UserSpotlightWidget.preview.tsx | 3 +- .../userSpotlight/UserSpotlightWidget.tsx | 20 +- .../__fixtures__/MockLazyComponent.tsx | 7 + library/src/scripts/utility/appUtils.spec.ts | 37 + library/src/scripts/utility/appUtils.tsx | 26 +- .../utility/componentRegistry.spec.tsx | 50 + .../src/scripts/utility/componentRegistry.tsx | 26 +- library/src/scss/_base.scss | 3 +- library/src/scss/_coreVariables.scss | 485 +- library/src/scss/embeds/_embedGiphy.scss | 1 - library/src/scss/embeds/_embedGlobal.scss | 2 +- .../scss/embeds/_embedGlobalVariables.scss | 18 +- library/src/scss/embeds/_embedIFrame.scss | 1 - library/src/scss/embeds/_embedImage.scss | 3 +- library/src/scss/embeds/_embedInstagram.scss | 3 +- library/src/scss/embeds/_embedLink.scss | 4 +- library/src/scss/embeds/_embedLoader.scss | 13 +- library/src/scss/embeds/_embedQuote.scss | 4 +- library/src/scss/embeds/_embedText.scss | 5 +- library/src/scss/embeds/_embedVideo.scss | 15 +- library/src/scss/layouts/_columns.scss | 17 +- library/src/scss/layouts/_flexColumns.scss | 4 +- .../scss/social/_socialMediaVariables.scss | 22 +- library/src/scss/userContent/_lists.scss | 3 +- library/src/scss/utility/_icons.scss | 4 +- library/src/scss/utility/_scaffolding.scss | 23 +- package.json | 126 +- packages/updateTsconfig.js | 4 +- packages/vanilla-babel-preset/index.js | 18 +- packages/vanilla-babel-preset/package.json | 24 +- packages/vanilla-dom-utils/package.json | 2 +- packages/vanilla-dom-utils/src/scripts.ts | 4 +- packages/vanilla-eslint-config/index.js | 4 +- packages/vanilla-eslint-config/package.json | 2 +- packages/vanilla-eslint-plugin/package.json | 2 +- .../rules/noCloudImportsInCore.js | 2 +- .../rules/noUnconventionalImports.js | 1 - packages/vanilla-i18n/package.json | 2 +- packages/vanilla-icons/generateIconTypes.js | 2 +- packages/vanilla-icons/icons/data-article.svg | 3 + packages/vanilla-icons/icons/data-online.svg | 6 + .../vanilla-icons/icons/data-site-metric.svg | 3 + .../icons/navigation-collapseAll.svg | 3 + .../icons/navigation-expandAll.svg | 4 + .../vanilla-icons/icons/navigation-skip.svg | 3 + .../vanilla-icons/icons/profile-crown.svg | 6 + packages/vanilla-icons/icons/profile-lock.svg | 6 + .../vanilla-icons/icons/reaction-comments.svg | 3 + .../vanilla-icons/icons/search-answered.svg | 3 + .../vanilla-icons/icons/search-categories.svg | 5 + .../vanilla-icons/icons/search-discussion.svg | 3 + .../vanilla-icons/icons/search-groups.svg | 5 + packages/vanilla-icons/icons/search-ideas.svg | 14 + packages/vanilla-icons/icons/search-kb.svg | 8 + .../vanilla-icons/icons/search-members.svg | 3 + .../vanilla-icons/icons/search-post-count.svg | 3 + .../vanilla-icons/icons/search-questions.svg | 4 + packages/vanilla-icons/icons/vanilla-logo.svg | 15 +- packages/vanilla-icons/package.json | 2 +- packages/vanilla-icons/src/Icon.tsx | 3 +- packages/vanilla-icons/src/IconType.ts | 59 +- .../vanilla-json-schema-forms/package.json | 2 +- .../src/FormControlWrapper.tsx | 10 +- .../src/JsonSchemaForm.tsx | 93 +- .../src/PartialSchemaForm.tsx | 116 +- .../src/TabbedSchemaForm.tsx | 20 +- .../src/ValidationContext.spec.tsx | 71 + .../src/ValidationContext.tsx | 108 + .../vanilla-json-schema-forms/src/types.ts | 17 + .../vanilla-json-schema-forms/src/utils.ts | 2 +- packages/vanilla-polyfill/index.js | 29 +- packages/vanilla-polyfill/package.json | 2 +- packages/vanilla-prettier-config/index.js | 1 + packages/vanilla-prettier-config/package.json | 2 +- packages/vanilla-react-utils/package.json | 4 +- .../src/StackingContext.spec.tsx | 43 + .../src}/StackingContext.tsx | 0 .../src/createContextProvider.tsx | 2 +- .../src/deconstructAttributesFromElement.ts | 2 +- packages/vanilla-react-utils/src/index.ts | 1 + packages/vanilla-react-utils/src/mounting.tsx | 2 +- .../vanilla-react-utils/src/useAsyncFn.ts | 2 +- .../src/useRouteChangePrompt.tsx | 2 +- .../src/useSessionStorage.tsx | 6 +- packages/vanilla-redux-utils/package.json | 2 +- packages/vanilla-redux-utils/src/MockStore.ts | 6 +- packages/vanilla-theme-core/package.json | 2 +- packages/vanilla-theme-core/scss/_core.scss | 1 - .../vanilla-theme-core/scss/base/_icons.scss | 34 +- .../scss/base/_typography.scss | 2 +- .../scss/base/_utilities.scss | 85 +- .../scss/base/_variables.scss | 497 +- .../scss/components/_breadcrumbs.scss | 20 +- .../scss/components/_catalogueDisplay.scss | 6 +- .../scss/components/_count.scss | 20 +- .../scss/components/_datepicker.scss | 31 +- .../scss/components/_flyouts.scss | 69 +- .../scss/components/_forms.scss | 39 +- .../scss/components/_hamburger.scss | 28 +- .../scss/components/_lists.scss | 193 +- .../scss/components/_mebox.scss | 11 +- .../scss/components/_pager.scss | 63 +- .../scss/components/_polls.scss | 2 +- .../scss/components/_popup.scss | 24 +- .../scss/components/_reactions.scss | 4 +- .../scss/components/_richEditor.scss | 6 - .../scss/components/_searchbox.scss | 29 +- .../scss/components/_swtichslider.scss | 3 +- .../scss/components/_tables.scss | 31 +- .../scss/components/_tags.scss | 23 +- .../scss/components/_userContent.scss | 32 +- packages/vanilla-theme-core/scss/dynamic.scss | 2 +- .../scss/mixins/_mixin.absolute.scss | 101 +- .../scss/mixins/_mixin.backLink.scss | 10 +- .../scss/mixins/_mixin.bg.scss | 34 +- .../scss/mixins/_mixin.disabled.scss | 8 +- .../scss/mixins/_mixin.flex.scss | 52 +- .../scss/mixins/_mixin.formElements.scss | 144 +- .../scss/mixins/_mixin.objectFit.scss | 1 - .../scss/mixins/_mixin.shadows.scss | 10 +- .../scss/mixins/_mixin.spinnerLoader.scss | 1 - .../scss/mixins/_mixin.transitions.scss | 2 +- .../scss/mixins/_mixin.utilities.scss | 27 +- .../scss/pages/_activity.scss | 3 - .../scss/pages/_badges.scss | 4 - .../scss/pages/_bestof.scss | 8 +- .../scss/pages/_drafts.scss | 1 - .../vanilla-theme-core/scss/pages/_entry.scss | 10 +- .../scss/pages/_groups.scss | 51 +- .../vanilla-theme-core/scss/pages/_inbox.scss | 5 - .../vanilla-theme-core/scss/pages/_post.scss | 2 - .../scss/pages/_profile.scss | 27 +- .../scss/patches/_core-patches.scss | 31 +- .../scss/patches/_core-variables.scss | 522 +- .../patches/_vanillicon-general-patches.scss | 11 +- .../patches/_vanillicon-panel-patches.scss | 12 +- .../scss/sections/_footer.scss | 5 +- .../scss/sections/_frame.scss | 2 - .../scss/sections/_header.scss | 2 - .../scss/sections/_navigation.scss | 5 - .../scss/sections/_panel.scss | 50 +- packages/vanilla-theme-core/scss/static.scss | 4 +- packages/vanilla-tsconfig/package.json | 2 +- packages/vanilla-ui/package.json | 4 +- .../forms/autoComplete/AutoComplete.story.tsx | 19 +- .../forms/autoComplete/AutoComplete.styles.ts | 36 +- .../src/forms/autoComplete/AutoComplete.tsx | 79 +- .../autoComplete/AutoCompleteContext.tsx | 4 +- .../AutoCompleteLookupOptions.tsx | 92 +- .../forms/autoComplete/AutoCompleteOption.tsx | 10 +- .../src/forms/formGroup/FormGroup.story.tsx | 78 - .../src/forms/numberBox/NumberBox.story.tsx | 62 - .../src/forms/textBox/TextBox.story.tsx | 61 - packages/vanilla-utils/package.json | 2 +- .../vanilla-utils/src/promiseUtils.test.ts | 6 +- packages/vanilla-utils/src/promiseUtils.ts | 4 +- .../vanilla-utils/src/stringUtils.spec.ts | 18 +- packages/vanilla-utils/src/stringUtils.ts | 10 + packages/vanilla-variable-parser/package.json | 4 +- .../vanilla-webpack-interface/package.json | 4 +- patches/@emotion+serialize+0.11.16.patch | 54 - patches/@reach+combobox+0.15.1.patch | 306 - plugins/Akismet/LICENSE.md | 29 +- plugins/Akismet/class.akismet.php | 154 +- plugins/Akismet/class.akismet.plugin.php | 126 +- plugins/Akismet/class.socketwriteread.php | 33 +- plugins/AllViewed/class.allviewed.plugin.php | 105 +- plugins/CivilTongueEx/LICENSE.md | 29 +- .../CivilTongueEx/Library/ContentFilter.php | 32 +- .../class.civiltongueex.plugin.php | 345 +- plugins/CivilTongueEx/settings/bootstrap.php | 8 +- .../tests/Models/ContentFilterTest.php | 69 +- plugins/Facebook/FacebookAuthenticator.php | 30 +- plugins/Facebook/class.facebook.plugin.php | 390 +- plugins/Flagging/class.flagging.plugin.php | 316 +- plugins/GettingStarted/addon.json | 15 - plugins/GettingStarted/default.php | 164 - plugins/GettingStarted/design/check.png | Bin 246 -> 0 bytes .../GettingStarted/design/getting-started.css | 47 - plugins/GettingStarted/icon.png | Bin 505 -> 0 bytes .../GooglePlus/GooglePlusAuthenticator.php | 39 +- .../GooglePlus/class.googleplus.plugin.php | 389 +- .../class.googleprettify.plugin.php | 143 +- plugins/Gravatar/default.php | 92 +- plugins/Ignore/class.ignore.plugin.php | 452 +- plugins/Ignore/locale/en.php | 8 +- plugins/Ignore/tests/IgnorePluginTest.php | 23 +- plugins/Ignore/views/confirm.php | 1 + .../IndexPhotos/class.indexphotos.plugin.php | 65 +- plugins/InvisibilityCloak/LICENSE.md | 29 +- .../class.invisibilitycloak.plugin.php | 15 +- plugins/Multilingual/LICENSE.md | 29 +- .../class.multilingual.plugin.php | 79 +- .../modules/class.localechoosermodule.php | 32 +- .../tests/MultilingualPluginTest.php | 33 +- plugins/OpenID/class.lightopenid.php | 393 +- plugins/OpenID/class.openid.plugin.php | 232 +- plugins/Participated/LICENSE.md | 29 +- .../ParticipatedCounterProvider.php | 10 +- .../ParticipatedQuickLinksProvider.php | 16 +- plugins/Participated/bootstrap.php | 2 +- .../class.participated.plugin.php | 164 +- .../Addon/ProfileExtenderContainerRules.php | 13 +- .../Models/ExtendedUsersExpander.php | 44 +- .../class.profileextender.plugin.php | 744 +- plugins/ProfileExtender/locale/en.php | 4 +- .../tests/APIv2/ProfileExtenderAddonTest.php | 331 +- .../APIv2/ProfileExtenderWithSSOTest.php | 103 +- .../tests/ProfileExtendStorybookTest.php | 29 +- .../tests/ProfileExtenderTestTrait.php | 61 +- plugins/QnA/Addon/QnAContainerRules.php | 19 +- plugins/QnA/Addon/QnaCronJobs.php | 11 +- plugins/QnA/Events/AnswerEvent.php | 31 +- plugins/QnA/Job/QnaFollowupJob.php | 16 +- plugins/QnA/LICENSE.md | 29 +- .../View/LegacyNewQuestionLayoutView.php | 13 +- plugins/QnA/QnAPlugin.php | 1605 +- plugins/QnA/README.md | 18 +- .../QnA/Widgets/DiscussionQuestionsWidget.php | 26 +- plugins/QnA/bootstrap.php | 9 +- plugins/QnA/locale/en.php | 17 +- .../QnA/models/AcceptedSiteTotalProvider.php | 27 +- plugins/QnA/models/AnswerModel.php | 88 +- plugins/QnA/models/AnswerSearchType.php | 26 +- plugins/QnA/models/QnAJsonLD.php | 64 +- plugins/QnA/models/QnaModel.php | 227 +- plugins/QnA/models/QnaQuickLinksProvider.php | 14 +- plugins/QnA/models/QnaTypeHandler.php | 33 +- plugins/QnA/models/QuestionSearchType.php | 27 +- .../QnA/models/QuestionSiteTotalProvider.php | 26 +- plugins/QnA/modules/NewQuestionModule.php | 20 +- plugins/QnA/modules/QnAModule.php | 99 +- plugins/QnA/modules/QnATabFactory.php | 41 +- plugins/QnA/modules/QnAWidgetModule.php | 67 +- plugins/QnA/src/scripts/AjaxModal.tsx | 6 +- plugins/QnA/src/scripts/entries/forum.tsx | 18 +- plugins/QnA/src/scripts/entries/knowledge.tsx | 11 + .../common.tsx => registerQnaSearchTypes.tsx} | 15 +- plugins/QnA/structure.php | 263 +- .../QnA/tests/APIv2/CommentsAnswerTest.php | 490 +- .../tests/APIv2/DiscussionsQuestionTest.php | 251 +- .../tests/APIv2/DiscussionsStatusesTest.php | 118 + plugins/QnA/tests/APIv2/QnASiteTotalsTest.php | 35 +- plugins/QnA/tests/APIv2/QnaApiTestTrait.php | 129 +- plugins/QnA/tests/LegacyDiscussionTest.php | 44 + .../tests/Modules/QnaModuleStorybookTest.php | 26 +- plugins/QnA/tests/QnAEventsTest.php | 206 +- .../QnA/tests/QnAPaginationFilterDataTest.php | 71 +- plugins/QnA/tests/QnAStructuredDataTest.php | 217 +- plugins/QnA/tests/QnaModelTest.php | 23 +- plugins/QnA/tests/QnaPluginTest.php | 145 + plugins/QnA/views/configuration.php | 2 +- plugins/Quotes/class.quotes.plugin.php | 371 +- plugins/Quotes/css/cleditor.css | 2 +- .../Addon/ReactionsContainerRules.php | 37 + plugins/Reactions/BestOfFilterModule.php | 43 +- plugins/Reactions/Events/ReactionEvent.php | 27 +- plugins/Reactions/ReactionModel.php | 1091 +- plugins/Reactions/ReactionsFilterOpenApi.php | 13 +- plugins/Reactions/ReactionsPlugin.php | 1317 +- plugins/Reactions/bootstrap.php | 10 +- .../controllers/ReactionsController.php | 323 +- .../api/ReactionsApiController.php | 90 +- plugins/Reactions/locale/en.php | 7 +- .../models/ReactionsQuickLinksProvider.php | 14 +- plugins/Reactions/models/UserTagModel.php | 3 +- plugins/Reactions/modules/ReactionsModule.php | 51 +- plugins/Reactions/structure.php | 286 +- .../tests/APIv2/ReactionsReactTest.php | 505 +- .../Reactions/tests/APIv2/ReactionsTest.php | 100 +- .../tests/APIv2/ReactionsUsersTest.php | 54 +- plugins/Reactions/tests/BestOfTest.php | 21 +- .../Modules/ReactionModuleStoryBookTest.php | 27 +- .../tests/Modules/ReactionsModuleTest.php | 28 +- plugins/Reactions/tests/ReactionsEditTest.php | 29 +- .../Reactions/tests/ReactionsEventsTest.php | 74 +- .../Reactions/tests/ReactionsOpenApiTest.php | 8 +- .../Reactions/views/reaction_functions.php | 126 + plugins/Redirector/LICENSE.md | 29 +- .../Redirector/class.redirector.plugin.php | 535 +- plugins/Signatures/LICENSE.md | 29 +- .../Signatures/class.signatures.plugin.php | 627 +- plugins/Signatures/tests/SignaturesTest.php | 55 +- plugins/Sitemaps/LICENSE.md | 29 +- plugins/Sitemaps/class.sitemaps.plugin.php | 220 +- .../SplitMerge/class.splitmerge.plugin.php | 211 +- plugins/SplitMerge/locale/en.php | 2 +- plugins/Spoof/LICENSE.md | 29 +- plugins/Spoof/Library/SpoofMiddleware.php | 13 +- plugins/Spoof/class.spoof.plugin.php | 139 +- .../tests/Library/SpoofMiddlewareTest.php | 82 +- plugins/SteamConnect/LICENSE.md | 29 +- plugins/SteamConnect/README.md | 1 + .../class.steamconnect.plugin.php | 129 +- .../class.stopforumspam.plugin.php | 154 +- plugins/Twitter/TwitterAuthenticator.php | 39 +- plugins/Twitter/class.twitter.plugin.php | 516 +- .../class.inthisdiscussionmodule.php | 58 +- plugins/VanillaInThisDiscussion/default.php | 36 +- .../class.vanillastats.plugin.php | 167 +- plugins/categoryaslink/README.md | 34 +- .../class.categoryaslink.plugin.php | 122 +- plugins/editor/class.editor.plugin.php | 1431 +- plugins/editor/generate_thumbnail.php | 762 +- plugins/editor/mimetypes.php | 2482 ++-- plugins/editor/scss/editor.scss | 709 +- plugins/editor/scss/partials/_fileupload.scss | 343 +- plugins/editor/scss/settings.scss | 14 +- plugins/editor/scss/wysiwyg.scss | 253 +- .../EmojiExtenderAddonContainerRules.php | 26 + .../Addon/EmojiExtenderEventHandlers.php | 70 + plugins/emojiextender/EmojiExtenderModel.php | 125 + plugins/emojiextender/EmojiExtenderPlugin.php | 204 - plugins/emojiextender/ExtendedEmoji.php | 50 + .../emojiextender/emoji/little/manifest.php | 236 +- .../emojiextender/emoji/little/preview.html | 553 +- plugins/emojiextender/emoji/none/manifest.php | 14 +- plugins/emojiextender/emoji/rice/manifest.php | 174 +- plugins/emojiextender/emoji/rice/preview.html | 387 +- .../emojiextender/emoji/twitter/manifest.php | 275 +- .../emojiextender/emoji/twitter/preview.html | 669 +- .../emojiextender/emoji/yahoo/manifest.php | 309 +- .../emojiextender/emoji/yahoo/preview.html | 757 +- plugins/emojiextender/gen-manifest.php | 95 +- .../tests/EmojiExtenderTests.php | 33 + plugins/googlesignin/README.md | 92 +- .../class.googlesignin.plugin.php | 100 +- .../Addon/JsConnectContainerRules.php | 27 + plugins/jsconnect/LICENSE.md | 29 +- .../JsConnectAuthenticatorTypeProvider.php | 103 + .../jsconnect/Models/JsConnectValidation.php | 54 + plugins/jsconnect/class.jsconnect.plugin.php | 1129 +- plugins/jsconnect/tests/JsConnectApiTest.php | 196 + .../jsconnect/tests/JsConnectPluginTest.php | 188 + .../jsconnect/tests/JsconnectPluginTest.php | 67 - plugins/oauth2/Addon/OAuth2ContainerRules.php | 30 + plugins/oauth2/OAuth2Authenticator.php | 32 +- plugins/oauth2/class.oauth2.plugin.php | 203 +- .../controllers/OAuth2SettingsController.php | 16 +- .../OAuth2AuthenticationTypeProvider.php | 115 + .../oauth2/src/scripts/AuthenticatorTypes.ts | 1 + .../scripts/pages/AuthenticatorAddEdit.tsx | 25 +- .../scripts/pages/AuthenticatorIndexPage.tsx | 6 +- plugins/oauth2/tests/APIv2/OAuth2Test.php | 72 +- .../oauth2/tests/Models/OAuth2PluginTest.php | 438 +- .../pockets/Addon/PocketsContainerRules.php | 13 +- .../Controllers/Api/PocketsApiController.php | 417 +- plugins/pockets/LICENSE.md | 29 +- plugins/pockets/PocketsModel.php | 301 +- plugins/pockets/PocketsPlugin.php | 644 +- plugins/pockets/library/Pocket.php | 144 +- plugins/pockets/locale/en.php | 12 +- plugins/pockets/tests/APIv2/PocketsTest.php | 223 +- plugins/pockets/tests/PocketsModelTest.php | 153 +- plugins/pockets/tests/PocketsRenderTest.php | 150 +- plugins/pockets/tests/TagModuleTest.php | 91 +- plugins/recaptcha/addon.json | 17 - plugins/recaptcha/class.recaptcha.plugin.php | 232 - plugins/recaptcha/recaptcha_support.png | Bin 74101 -> 0 bytes plugins/recaptcha/views/display/captcha.php | 5 - plugins/rich-editor/RichEditorPlugin.php | 152 +- .../RichEditorStylesController.php | 15 +- .../controllers/api/RichApiController.php | 36 +- plugins/rich-editor/locale/en.php | 136 +- .../src/scripts/__tests__/quillUtils.tsx | 4 +- .../src/scripts/editor/EditorContent.tsx | 12 +- .../scripts/editor/pieces/ImageEmbedModal.tsx | 6 +- .../src/scripts/quill/KeyboardBindings.ts | 4 +- .../quill/NewLineClickInsertionModule.test.ts | 12 +- .../src/scripts/quill/SyntaxModule.ts | 4 +- .../scripts/quill/blots/lists/ListLineBlot.ts | 6 +- .../Storybook/RichEditorStorybookTest.php | 46 +- plugins/stubcontent/README.md | 1 - .../stubcontent/class.stubcontent.plugin.php | 504 +- plugins/swagger-ui/README.md | 32 +- plugins/swagger-ui/SwaggerUIPlugin.php | 33 +- .../swagger-ui/src/scripts/entries/admin.tsx | 2 +- plugins/vanillaconnect/LICENSE.md | 29 +- plugins/vanillaconnect/README.md | 2 - .../VanillaConnectAuthenticator.php | 225 +- .../vanillaconnect/VanillaConnectPlugin.php | 344 +- .../vanillicon/class.vanillicon.plugin.php | 78 +- preload.php | 60 + psalm.xml | 1 - resources/design/vanillicon.css | 1 + resources/sass/_vanillicon-font.scss | 8 - resources/sass/_vanillicon.scss | 1 + storyshots/index.js | 38 +- tests/APIv0/APIv0.php | 248 +- tests/APIv0/AltTest.php | 113 +- tests/APIv0/BaseTest.php | 23 +- .../ModerationControllerSmokeTest.php | 387 +- tests/APIv0/README.md | 6 +- tests/APIv0/SmokeTest.php | 417 +- tests/APIv0/TestDispatcher.php | 170 +- tests/APIv2/AbstractAPIv2Test.php | 100 +- tests/APIv2/AbstractApiControllerTest.php | 46 +- tests/APIv2/AbstractResourceTest.php | 170 +- tests/APIv2/AddonsTest.php | 166 +- tests/APIv2/ApplicantsTest.php | 115 +- tests/APIv2/AssertLoggingTrait.php | 15 +- tests/APIv2/AuthenticatorTypesTest.php | 29 + tests/APIv2/AuthenticatorsTest.php | 228 +- tests/APIv2/CallsTest.php | 255 +- tests/APIv2/CategoriesTest.php | 606 +- tests/APIv2/CategoryPreferencesTest.php | 381 +- tests/APIv2/CollectionApiControllerTest.php | 586 + tests/APIv2/CommentsSortDateUpdatedTest.php | 34 +- tests/APIv2/CommentsTest.php | 232 +- tests/APIv2/CommunityScopeTest.php | 88 +- tests/APIv2/ConfigTest.php | 143 +- .../ConversationsAllowModerationTest.php | 14 +- tests/APIv2/ConversationsTest.php | 149 +- tests/APIv2/CounterProvidersTest.php | 40 +- tests/APIv2/DashboardTest.php | 9 +- tests/APIv2/DbaRecalculateCountsTest.php | 389 + tests/APIv2/DiscussionApiStatusTest.php | 234 + tests/APIv2/DiscussionsDeleteTest.php | 270 +- tests/APIv2/DiscussionsMergeTest.php | 216 +- tests/APIv2/DiscussionsTest.php | 1282 +- tests/APIv2/DraftsTest.php | 145 +- tests/APIv2/InvitesTest.php | 50 +- tests/APIv2/JobStatusTest.php | 123 +- tests/APIv2/LayoutsApiControllerTest.php | 739 +- tests/APIv2/LocalesTest.php | 191 +- tests/APIv2/MediaTest.php | 358 +- tests/APIv2/MessagesAllowModerationTest.php | 20 +- tests/APIv2/MessagesTest.php | 157 +- .../ModerationMessagesApiControllerTest.php | 176 +- tests/APIv2/NewCommentLabelTestApi.php | 79 +- tests/APIv2/NoGetEditTestTrait.php | 9 +- tests/APIv2/NotificationsApiTest.php | 203 +- tests/APIv2/OAuth2TokenTest.php | 83 +- .../APIv2/ProfileFieldsApiControllerTest.php | 545 + tests/APIv2/ResourcesTest.php | 90 +- tests/APIv2/RoleRequestsTest.php | 493 +- tests/APIv2/RolesTest.php | 423 +- tests/APIv2/SessionTest.php | 275 +- tests/APIv2/SiteTotalsApiControllerTest.php | 26 +- tests/APIv2/TagsTest.php | 275 +- tests/APIv2/TestCrawlTrait.php | 31 +- tests/APIv2/TestExpandTrait.php | 59 +- tests/APIv2/TestFilterDirtyRecordsTrait.php | 23 +- tests/APIv2/TestFilterTrait.php | 10 +- .../APIv2/TestPrimaryKeyRangeFilterTrait.php | 37 +- tests/APIv2/TestPrivateProfile.php | 243 +- tests/APIv2/TestPutFieldTrait.php | 16 +- tests/APIv2/TestSortingTrait.php | 18 +- tests/APIv2/ThemesTest.php | 217 +- tests/APIv2/TickTest.php | 24 +- tests/APIv2/TokensTest.php | 122 +- tests/APIv2/UserMentionsTest.php | 225 + tests/APIv2/UserPermissionsTest.php | 283 +- tests/APIv2/UserPointsTest.php | 322 +- tests/APIv2/UsersTest.php | 1006 +- tests/APIv2/WidgetsApiTest.php | 32 +- tests/Bootstrap.php | 327 +- tests/BootstrapTestCase.php | 21 +- tests/BootstrapTrait.php | 156 +- tests/CapturedEmail.php | 20 +- tests/CapturedEmailAddress.php | 6 +- tests/CategoryAndDiscussionApiTestTrait.php | 69 +- tests/Controllers/BaseControllerTest.php | 32 +- tests/Controllers/EntryControllerTest.php | 347 +- tests/Controllers/LogControllerTest.php | 264 +- tests/Controllers/MessagesControllerTest.php | 113 +- tests/Controllers/ProfileControllerTest.php | 331 +- tests/Controllers/RequestsControllerTest.php | 190 +- tests/Controllers/UtilityControllerTest.php | 30 +- .../VanillaSettingsControllerTest.php | 168 +- tests/DatabaseTestTrait.php | 21 +- tests/EventSpyTestTrait.php | 170 +- tests/ExpectExceptionTrait.php | 27 +- tests/ExpectedNotification.php | 66 + tests/InvokeMethodTrait.php | 9 +- tests/IsolatedTestCase.php | 3 +- tests/Layout/Asset/MockAsset.php | 74 + tests/Layout/LayoutHydratorTest.php | 244 +- tests/Layout/LayoutTestTrait.php | 81 +- .../Middleware/RoleFilterMiddlewareTest.php | 146 +- .../Middleware/VisibilityMiddlewareTest.php | 48 +- tests/Layout/MockWebpackAssetProvider.php | 62 +- tests/Layout/Resolvers/ApiResolverTest.php | 49 +- .../Resolvers/TranslateResolverTest.php | 68 +- tests/Library/Core/AbsoluteSourceTest.php | 30 +- tests/Library/Core/AnonymizeIPTest.php | 24 +- tests/Library/Core/ArrayFunctionsTest.php | 112 +- tests/Library/Core/ArrayHasValueTest.php | 82 +- tests/Library/Core/ArrayKeyExistsITest.php | 40 +- tests/Library/Core/ArrayReplaceConfigTest.php | 60 +- tests/Library/Core/ArraySearchITest.php | 34 +- tests/Library/Core/ArrayTranslateTest.php | 76 +- tests/Library/Core/AttributeTest.php | 30 +- tests/Library/Core/BetterRandomStringTest.php | 48 +- .../Library/Core/BreadcrumbStructureTest.php | 151 +- tests/Library/Core/BuildUrlTest.php | 54 +- tests/Library/Core/Cache/MemcachedTest.php | 2 +- .../Core/CalculateNumberOfPagesTest.php | 40 +- tests/Library/Core/ChangeBaseNameTest.php | 18 +- tests/Library/Core/CheckUtf8Test.php | 45 +- tests/Library/Core/ChrUtf8Test.php | 40 +- tests/Library/Core/CombinePathsTest.php | 34 +- tests/Library/Core/ConcatSepTest.php | 48 +- tests/Library/Core/ControllerTest.php | 42 +- tests/Library/Core/CookieIdentityTest.php | 42 +- tests/Library/Core/DataSetTest.php | 71 +- .../Core/DatabaseSchemaGenerationTest.php | 91 +- tests/Library/Core/DatabaseTest.php | 49 +- tests/Library/Core/DateCompareTest.php | 28 +- tests/Library/Core/DateTimeTest.php | 37 +- tests/Library/Core/DbEncodeDecodeTest.php | 56 +- tests/Library/Core/DebugMethodTest.php | 34 +- tests/Library/Core/DebugTest.php | 39 +- tests/Library/Core/DeprecatedTest.php | 19 +- tests/Library/Core/DomGetContentTest.php | 18 +- tests/Library/Core/DomGetImagesTest.php | 26 +- tests/Library/Core/EmailTest.php | 36 +- tests/Library/Core/ExplodeTrimTest.php | 47 +- tests/Library/Core/ExternalUrlTest.php | 42 +- tests/Library/Core/FactoryTest.php | 71 +- tests/Library/Core/ForceBoolTest.php | 82 +- tests/Library/Core/ForceIPv4Test.php | 25 +- tests/Library/Core/ForeignIDHashTest.php | 14 +- tests/Library/Core/FormTest.php | 267 +- tests/Library/Core/FormatTest.php | 56 +- tests/Library/Core/GdnConfigurationTest.php | 140 +- ...spatcherTest.php => GdnDispatcherTest.php} | 104 +- tests/Library/Core/Gdn_ThemeTest.php | 144 +- tests/Library/Core/GeneralFunctionsTest.php | 116 +- tests/Library/Core/GetAllMentionsTest.php | 35 +- .../Library/Core/GetConnectionStringTest.php | 31 +- tests/Library/Core/GetValueRTest.php | 45 +- tests/Library/Core/HtmlEntityDecodeTest.php | 29 +- tests/Library/Core/ImplodeAssocTest.php | 38 +- tests/Library/Core/InArrayITest.php | 28 +- tests/Library/Core/InSubArrayTest.php | 64 +- .../Core/IpEncodeDecodeNonRecursiveTest.php | 39 +- tests/Library/Core/IpEncodeDecodeTest.php | 163 +- tests/Library/Core/IsTimestampTest.php | 35 +- tests/Library/Core/IsUrlTest.php | 45 +- tests/Library/Core/JsonFilterTest.php | 62 +- tests/Library/Core/LoggerTest.php | 71 +- tests/Library/Core/ModelTest.php | 127 +- tests/Library/Core/OffsetLimitTest.php | 52 +- tests/Library/Core/PageNumberTest.php | 50 +- tests/Library/Core/PasswordTest.php | 77 +- tests/Library/Core/PluginManagerTest.php | 41 +- tests/Library/Core/PrefixStringTest.php | 40 +- tests/Library/Core/RandomStringTest.php | 48 +- .../Core/RemoveKeysFromNestedArrayTest.php | 29 +- tests/Library/Core/RenderFunctionsTest.php | 196 +- tests/Library/Core/RequestTest.php | 711 +- tests/Library/Core/RouterTest.php | 41 +- tests/Library/Core/SafeGlobTest.php | 33 +- tests/Library/Core/SafeImageTest.php | 46 +- tests/Library/Core/SafePrintTest.php | 50 +- tests/Library/Core/SafeUnlinkTest.php | 23 +- tests/Library/Core/SetValueTest.php | 33 +- tests/Library/Core/SignInUrlTest.php | 15 +- tests/Library/Core/SliceParagraphTest.php | 38 +- tests/Library/Core/SliceStringTest.php | 33 +- tests/Library/Core/SlugifyTest.php | 41 +- tests/Library/Core/SmartyTest.php | 106 +- tests/Library/Core/SsoUtilsTest.php | 30 +- tests/Library/Core/StringBeginsWithTest.php | 74 +- tests/Library/Core/StringEndsWithTest.php | 74 +- .../Library/Core/StringIsNullOrEmptyTest.php | 25 +- tests/Library/Core/TagFullNameTest.php | 10 +- tests/Library/Core/TouchFolderTest.php | 29 +- tests/Library/Core/TouchValueTest.php | 43 +- tests/Library/Core/TrustedDomainsTest.php | 69 +- tests/Library/Core/UserAgentTypeTest.php | 54 +- tests/Library/Core/ValidateBooleanTest.php | 40 +- .../Core/ValidateCategoryUrlCodeTest.php | 30 +- tests/Library/Core/ValidateDateTest.php | 24 +- tests/Library/Core/ValidateDecimalTest.php | 37 +- tests/Library/Core/ValidateEmailTest.php | 17 +- tests/Library/Core/ValidateEnumTest.php | 10 +- tests/Library/Core/ValidateIntegerTest.php | 40 +- tests/Library/Core/ValidateNoLinksTest.php | 14 +- ...ValidateOneOrMoreArrayItemRequiredTest.php | 15 +- tests/Library/Core/ValidatePhoneIntTest.php | 14 +- tests/Library/Core/ValidatePhoneNATest.php | 17 +- .../Core/ValidateRequiredArrayTest.php | 15 +- tests/Library/Core/ValidateRequiredTest.php | 86 +- tests/Library/Core/ValidateStringTest.php | 30 +- .../Core/ValidateUrlStringRelaxedTest.php | 14 +- tests/Library/Core/ValidateUrlStringTest.php | 18 +- tests/Library/Core/ValidateUrlTest.php | 19 +- tests/Library/Core/ValidateUsernameTest.php | 61 +- tests/Library/Core/ValidateVersionTest.php | 17 +- tests/Library/Core/ValidateWebAddressTest.php | 19 +- tests/Library/Core/ValidateZipCodeTest.php | 17 +- .../Library/Core/ValidationFunctionsTest.php | 37 +- tests/Library/Core/ValidationTest.php | 161 +- tests/Library/Core/WalkAllRecursiveTest.php | 23 +- tests/Library/Core/WriteIniStringTest.php | 29 +- .../Database/DatabaseStructureTest.php | 118 +- tests/Library/Database/MySQLDriverTest.php | 320 +- tests/Library/Database/MySQLStructureTest.php | 193 +- tests/Library/Garden/ClassLocatorTest.php | 17 +- tests/Library/Garden/EventManagerPsrTest.php | 51 +- tests/Library/Garden/EventManagerTest.php | 315 +- .../Garden/Events/ResourceEventTest.php | 21 +- tests/Library/Garden/Web/ActionTest.php | 36 +- tests/Library/Garden/Web/CookieTest.php | 226 +- tests/Library/Garden/Web/DataTest.php | 319 +- tests/Library/Garden/Web/DispatcherTest.php | 168 +- .../Web/Exception/HttpExceptionTest.php | 52 +- .../PartialCompletionExceptionTest.php | 10 +- .../Garden/Web/MiddlewareAwareTraitTest.php | 24 +- .../Garden/Web/PageControllerRouteTest.php | 28 +- .../Library/Garden/Web/ResourceRouteTest.php | 213 +- tests/Library/LongRunnerTest.php | 170 +- .../AbstractAddonEnableDisableTest.php | 38 +- tests/Library/Vanilla/AddonManagerTest.php | 553 +- tests/Library/Vanilla/AddonTest.php | 28 +- .../Vanilla/AddonsEnableDisablePart1Test.php | 7 +- .../Vanilla/AddonsEnableDisablePart2Test.php | 7 +- .../Vanilla/AddonsEnableDisablePart3Test.php | 7 +- .../Vanilla/AliasProviderTraitTest.php | 39 +- tests/Library/Vanilla/ApiUtilsTest.php | 123 +- tests/Library/Vanilla/AttributesTest.php | 28 +- .../AuthenticatorCssColorValidation.php | 56 +- .../Authenticator/AuthenticatorTest.php | 6 +- .../Authenticator/SSOAuthenticatorTest.php | 22 +- tests/Library/Vanilla/BootstrapTest.php | 9 +- tests/Library/Vanilla/CheckVersionTest.php | 96 +- .../ContentSecurityPolicyModelTest.php | 66 +- tests/Library/Vanilla/CsvProviderTrait.php | 71 + .../Library/Vanilla/CurrentTimeStampTest.php | 113 +- .../CurrentDateFieldProcessorTest.php | 23 +- .../CurrentIPAddressProcessorTest.php | 50 +- .../CurrentUserFieldProcessorTest.php | 24 +- .../Database/JsonFieldProcessorTest.php | 29 +- .../Vanilla/Database/PruneProcessorTest.php | 50 +- .../Database/ResourceEventProcessorTest.php | 117 +- .../Vanilla/Database/SetLiteralTest.php | 14 +- .../Database/StatusFieldProcessorTest.php | 120 +- .../Library/Vanilla/DateFilterSchemaTest.php | 434 +- .../AbstractEmbedFactoryTest.php | 43 +- .../EmbeddedContent/EmbedServiceTest.php | 69 +- .../Embeds/CodePenEmbedTest.php | 6 +- .../EmbeddedContent/Embeds/FileEmbedTest.php | 6 +- .../Embeds/GettyImagesEmbedTest.php | 6 +- .../EmbeddedContent/Embeds/GiphyEmbedTest.php | 6 +- .../EmbeddedContent/Embeds/ImgurEmbedTest.php | 6 +- .../Embeds/InstagramEmbedTest.php | 6 +- .../EmbeddedContent/Embeds/LinkEmbedTest.php | 6 +- .../Embeds/QuoteEmbedFilterTest.php | 127 +- .../EmbeddedContent/Embeds/QuoteEmbedTest.php | 27 +- .../Embeds/SoundCloudEmbedTest.php | 6 +- .../Embeds/TwitchEmbedFilterTest.php | 20 +- .../Embeds/TwitchEmbedTest.php | 6 +- .../Embeds/TwitterEmbedTest.php | 6 +- .../EmbeddedContent/Embeds/VimeoEmbedTest.php | 6 +- .../Embeds/WistiaEmbedTest.php | 6 +- .../Embeds/YouTubeEmbedTest.php | 6 +- .../Factories/BrightcoveEmbedFactoryTest.php | 43 +- .../Factories/CodePenEmbedFactoryTest.php | 55 +- .../Factories/GettyImagesEmbedFactoryTest.php | 28 +- .../Factories/GiphyEmbedFactoryTest.php | 55 +- .../Factories/ImgurEmbedFactoryTest.php | 31 +- .../Factories/InstagramEmbedFactoryTest.php | 23 +- .../Factories/KalturaEmbedFactoryTest.php | 116 +- .../Factories/MuralEmbedFactoryTest.php | 34 +- .../Factories/PanoptoEmbedFactoryTest.php | 41 +- .../Factories/ScrapeEmbedFactoryTest.php | 65 +- .../Factories/SoundCloudEmbedFactoryTest.php | 59 +- .../Factories/TwitchEmbedFactoryTest.php | 60 +- .../Factories/TwitterEmbedFactoryTest.php | 20 +- .../Factories/VimeoEmbedFactoryTest.php | 37 +- .../Factories/WistiaEmbedFactoryTest.php | 35 +- .../Factories/YouTubeEmbedFactoryTest.php | 31 +- tests/Library/Vanilla/ExpandTest.php | 139 +- .../AssertsFixtureRenderingTrait.php | 22 +- .../Formatting/DateTimeFormatterTest.php | 274 +- .../ExtendedContentFormatServiceTest.php | 62 +- .../FormatCompatibilityServiceTest.php | 38 +- .../Formats/AbstractFormatTestCase.php | 134 +- .../Formatting/Formats/BBCodeFormatTest.php | 51 +- .../Formatting/Formats/HtmlFormatTest.php | 35 +- .../Formatting/Formats/MarkdownFormatTest.php | 32 +- .../Formatting/Formats/NotFoundFormatTest.php | 40 +- .../Formatting/Formats/RichFormatTest.php | 127 +- .../Formatting/Formats/TextExFormatTest.php | 25 +- .../Formatting/Formats/TextFormatTest.php | 25 +- .../Formatting/Formats/WysiwygFormatTest.php | 38 +- .../Vanilla/Formatting/GdnFormatLinksTest.php | 176 +- .../Vanilla/Formatting/GdnFormatTest.php | 98 +- .../Processor/ExternalLinksProcessorTest.php | 41 +- .../Html/Processor/ImageHtmlProcessorTest.php | 43 +- .../Vanilla/Formatting/HtmlDocumentTest.php | 18 +- .../Vanilla/Formatting/HtmlNormalizeTrait.php | 24 +- .../Quill/BlotGroupCollectionTest.php | 13 +- .../Formatting/Quill/BlotGroupTest.php | 20 +- .../Quill/BlotPointerTextFragmentTest.php | 46 +- .../Vanilla/Formatting/Quill/FiltererTest.php | 44 +- .../Vanilla/Formatting/Quill/FormatTest.php | 72 +- .../Quill/HtmlToBlotsParserTest.php | 19 +- .../Vanilla/Formatting/Quill/ParserTest.php | 227 +- .../Vanilla/Formatting/Quill/RendererTest.php | 19 +- .../Quill/Sanitize/BlockQuoteSanitizeTest.php | 11 +- .../Sanitize/BulletedListSanitizeTest.php | 22 +- .../Quill/Sanitize/CodeBlockSanitizeTest.php | 13 +- .../Sanitize/Embeds/CodePenSanitizeTest.php | 28 +- .../Sanitize/Embeds/EmojiSanitizeTest.php | 17 +- .../Sanitize/Embeds/GettySanitizeTest.php | 21 +- .../Sanitize/Embeds/GiphySanitizeTest.php | 7 +- .../Sanitize/Embeds/ImgurSanitizeTest.php | 7 +- .../Sanitize/Embeds/LinkSanitizeTest.php | 6 +- .../Sanitize/Embeds/MentionSanitizeTest.php | 19 +- .../Embeds/SoundCloudSanitizeTest.php | 7 +- .../Sanitize/Embeds/TwitchSanitizeTest.php | 7 +- .../Sanitize/Embeds/TwitterSanitizeTest.php | 7 +- .../Sanitize/Embeds/VimeoSanitizeTest.php | 7 +- .../Sanitize/Embeds/WistiaSanitizeTest.php | 7 +- .../Sanitize/Embeds/YouTubeSanitizeTest.php | 7 +- .../Sanitize/Formats/BoldSanitizeTest.php | 11 +- .../Sanitize/Formats/CodeSanitizeTest.php | 11 +- .../Sanitize/Formats/ItalicSanitizeTest.php | 11 +- .../Sanitize/Formats/LinkSanitizeTest.php | 20 +- .../Sanitize/Formats/StrikeSanitizeTest.php | 11 +- .../Quill/Sanitize/HeadingSanitizeTest.php | 20 +- .../Quill/Sanitize/LinkSanitizeTrait.php | 14 +- .../Sanitize/OrderedListSanitizeTest.php | 22 +- .../Quill/Sanitize/SanitizeTest.php | 32 +- .../Quill/Sanitize/SpoilerSanitizeTest.php | 11 +- .../Quill/Sanitize/TestAttributesTrait.php | 17 +- .../Quill/Sanitize/TextSanitizeTest.php | 11 +- .../Quill/TextFragmentCollectionTest.php | 25 +- .../TextFragments/HtmlFragmentTest.php | 31 +- .../TextFragments/RichTextFragmentTest.php | 117 +- .../Formatting/UserMentionTestTraits.php | 82 + .../Formatting/UserMentionsRemovalTest.php | 596 + .../Vanilla/Http/InternalClientTest.php | 7 +- tests/Library/Vanilla/ImageResizerTest.php | 256 +- .../ImageSrcSet/ImageSrcSetServiceTest.php | 38 +- .../Vanilla/Layout/LayoutModelTest.php | 78 +- .../Library/Vanilla/Layout/LayoutPageTest.php | 152 + .../Vanilla/Layout/LayoutViewModelTest.php | 139 +- tests/Library/Vanilla/LoggerTest.php | 35 +- .../Vanilla/Logging/ErrorLoggerTest.php | 299 +- .../Vanilla/Logging/LogDecoratorTest.php | 144 +- .../Library/Vanilla/Logging/LogEntryTest.php | 49 +- .../Vanilla/Logging/LoggerUtilsTest.php | 11 +- .../Logging/ResourceEventLoggerTest.php | 43 +- .../Logging/TestErrorLoggerCollection.php | 23 +- tests/Library/Vanilla/MediaSchemaTest.php | 23 +- .../Metadata/AbstractXmlParserTest.php | 43 +- .../Vanilla/Metadata/RSSFeedParserTest.php | 44 +- .../Vanilla/Models/LegacyModelUtilsTest.php | 62 +- .../Models/ModelCacheMemcachedTest.php | 4 +- .../Library/Vanilla/Models/ModelCacheTest.php | 177 +- .../Vanilla/Models/ModelFactoryTest.php | 58 +- tests/Library/Vanilla/Models/ModelTest.php | 78 +- .../Vanilla/Models/PipelineModelTest.php | 27 +- .../Vanilla/Models/SiteTotalServiceTest.php | 46 +- tests/Library/Vanilla/Models/TestModel.php | 8 +- .../Models/UserAttributesModelTest.php | 52 +- tests/Library/Vanilla/OpenAPIBuilderTest.php | 79 +- tests/Library/Vanilla/PageScraperTest.php | 211 +- tests/Library/Vanilla/PermissionsTest.php | 757 +- .../Vanilla/PlainTextLengthValidatorTest.php | 74 +- tests/Library/Vanilla/RangeExpressionTest.php | 254 +- .../Vanilla/Scheduler/AdHocAuthTest.php | 47 +- .../Vanilla/Scheduler/BootstrapTest.php | 196 - .../Vanilla/Scheduler/CallbackTest.php | 161 +- tests/Library/Vanilla/Scheduler/CronTest.php | 217 +- .../Scheduler/JobExecutionStatusTest.php | 46 +- .../Scheduler/JobExecutionTypeTest.php | 16 +- .../Vanilla/Scheduler/JobPriorityTest.php | 19 +- .../Vanilla/Scheduler/LocalDriverTest.php | 13 +- .../Vanilla/Scheduler/SchedulerTest.php | 319 +- .../Vanilla/Scheduler/SchedulerTestCase.php | 76 +- tests/Library/Vanilla/SchemaFactoryTest.php | 33 +- .../Search/SearchTypeCollectionTest.php | 145 +- .../Vanilla/Site/DefaultSiteSectionTest.php | 11 +- .../Vanilla/Site/OwnSiteProviderTest.php | 44 +- .../Site/RootSiteSectionProviderTest.php | 74 + .../Vanilla/Site/RootSiteSectionTest.php | 117 + .../Site/SingleSiteSectionProviderTest.php | 26 +- tests/Library/Vanilla/TestLogger.php | 43 +- .../Vanilla/Theme/JsonThemeAssetTest.php | 80 +- .../Vanilla/Theme/MockThemeTestCase.php | 22 +- .../Vanilla/Theme/NeonThemeAssetTest.php | 68 +- .../Library/Vanilla/Theme/QuickLinksTest.php | 65 +- .../Theme/QuickLinksVariableProviderTest.php | 60 +- .../Vanilla/Theme/ThemeAssetFactoryTest.php | 86 +- .../Library/Vanilla/Theme/ThemeCacheTest.php | 69 +- .../Vanilla/Theme/ThemeFeaturesTest.php | 26 +- .../Vanilla/Theme/ThemeServiceCurrentTest.php | 207 +- .../Vanilla/Theme/ThemeServiceHelperTest.php | 153 +- .../Theme/ThemeServiceNoProviderTest.php | 35 +- .../Vanilla/Theme/ThemeServiceParentTest.php | 34 +- tests/Library/Vanilla/Theme/TwigAssetTest.php | 26 +- tests/Library/Vanilla/TwigValidatorTest.php | 16 +- .../Vanilla/UploadedFileSchemaTest.php | 244 +- tests/Library/Vanilla/UploadedFileTest.php | 136 +- .../Vanilla/Utility/ArrayUtilsTest.php | 470 +- .../Vanilla/Utility/ContainerUtilsTest.php | 27 +- .../Vanilla/Utility/DebugUtilsTest.php | 32 +- .../Utility/DomUtilsProcessorsTest.php | 46 +- .../Library/Vanilla/Utility/DomUtilsTest.php | 306 +- .../Utility/FileGeneratorUtilsTest.php | 59 + .../Library/Vanilla/Utility/FileUtilsTest.php | 10 +- .../Library/Vanilla/Utility/HtmlUtilsTest.php | 129 +- .../Vanilla/Utility/ModelUtilsTest.php | 21 +- .../Vanilla/Utility/NameSchemeTest.php | 24 +- .../Vanilla/Utility/ObjectUtilsTest.php | 45 +- .../Vanilla/Utility/SchemaFiltersTest.php | 28 +- .../Vanilla/Utility/SchemaUtilsTest.php | 130 +- .../Library/Vanilla/Utility/SqlUtilsTest.php | 89 +- .../Vanilla/Utility/StringUtilsTest.php | 170 +- tests/Library/Vanilla/Utility/TimersTest.php | 124 +- .../Vanilla/Utility/TreeBuilderTest.php | 205 +- .../Library/Vanilla/Utility/UrlUtilsTest.php | 179 +- .../Vanilla/VanillaClassLocatorTest.php | 31 +- .../Vanilla/Web/APIExpandMiddlewareTest.php | 299 +- .../Vanilla/Web/ApiExtensionHandlingTest.php | 48 + .../Vanilla/Web/ApiFilterMiddlewareTest.php | 105 +- .../Web/Asset/AssetPreloadModelTest.php | 26 +- .../Library/Vanilla/Web/Asset/AssetsTest.php | 7 +- .../Web/Asset/DeploymentCacheBusterTest.php | 32 +- .../Web/Asset/WebpackAssetProviderTest.php | 120 +- .../Vanilla/Web/Asset/WebpackAssetTest.php | 64 +- .../Web/CacheControlMiddleWareTest.php | 99 +- .../Vanilla/Web/MasterViewRendererTest.php | 12 +- .../Middleware/CookiePassMiddlewareTest.php | 25 +- .../LogTransactionMiddlewareTest.php | 29 +- .../RoleTokenAuthMiddlewareTest.php | 198 +- .../Middleware/ValidateJSONMiddlewareTest.php | 55 + .../Middleware/ValidateUTF8MiddlewareTest.php | 107 + tests/Library/Vanilla/Web/PageHeadTest.php | 23 +- tests/Library/Vanilla/Web/PageTest.php | 33 +- .../Pagination/ApiPaginationIteratorTest.php | 138 +- .../Vanilla/Web/Pagination/WebLinkingTest.php | 108 +- tests/Library/Vanilla/Web/RoleTokenTest.php | 113 +- .../Vanilla/Web/SafeCurlHttpHandlerTest.php | 15 +- .../Vanilla/Web/SmartIDMiddlewareTest.php | 172 +- .../Vanilla/Web/SystemTokenMiddlewareTest.php | 51 +- .../Vanilla/Web/TestSmartIDMiddleware.php | 13 +- .../Library/Vanilla/Web/TwigEnhancerTest.php | 34 +- tests/Library/Vanilla/Web/UASnifferTest.php | 18 +- .../Vanilla/Web/WebApiSecurityHeadersTest.php | 49 +- .../Vanilla/Widgets/WidgetFactoryTest.php | 33 +- tests/LogModelTestTrait.php | 10 +- tests/MemcachedTestTrait.php | 49 +- tests/MinimalContainerTestCase.php | 86 +- tests/Models/AbstractCountsTest.php | 132 +- tests/Models/AccessTokenModelTest.php | 97 +- tests/Models/ActivityModelTest.php | 191 +- tests/Models/CategoryModelTest.php | 1549 +- tests/Models/CategoryPermissionTest.php | 35 +- tests/Models/CollectionModelTest.php | 77 + tests/Models/CommentModelTest.php | 178 +- tests/Models/ConversationMessageModelTest.php | 79 +- tests/Models/ConversationModelTest.php | 49 +- tests/Models/CrawlableRecordSchemaTest.php | 84 +- tests/Models/DirtyRecordModelTest.php | 44 +- tests/Models/DiscussionMergeCountsTest.php | 146 +- tests/Models/DiscussionModelCountsTest.php | 22 +- tests/Models/DiscussionModelTest.php | 846 +- tests/Models/InstallModelTest.php | 20 +- tests/Models/LogModelTest.php | 17 +- tests/Models/ModelTestTrait.php | 10 +- tests/Models/PermissionModelJunctionTest.php | 42 +- tests/Models/PermissionModelTest.php | 206 +- tests/Models/ProfileFieldModelTest.php | 224 + tests/Models/RecordStatusModelTest.php | 396 + tests/Models/RoleModelTest.php | 58 +- tests/Models/SSOModel/CreateUserTest.php | 143 +- tests/Models/SSOModel/GetUserByTest.php | 172 +- .../SSOModel/LinkUserFromCredentialsTest.php | 136 +- .../SSOModel/LinkUserFromSessionTest.php | 71 +- tests/Models/SessionModelTest.php | 196 +- tests/Models/SpamModelTest.php | 28 +- tests/Models/TagModelTest.php | 356 +- tests/Models/TestCategoryModelTrait.php | 61 +- tests/Models/TestCommentModelTrait.php | 23 +- tests/Models/TestDate.php | 14 +- tests/Models/TestDiscussionModelTrait.php | 42 +- tests/Models/TokenSigningTraitTest.php | 29 +- .../UserAuthenticationNonceModelTest.php | 17 +- .../UserModelExpandUserFragmentTest.php | 111 +- tests/Models/UserModelSSOTest.php | 241 +- tests/Models/UserModelTest.php | 754 +- tests/Modules/MorePagerModuleTest.php | 17 +- tests/Modules/NewDiscussionModuleTest.php | 274 +- tests/Modules/PagerModuleTest.php | 48 +- tests/NoPatchTestTrait.php | 9 +- tests/NotificationsApiTestTrait.php | 118 + tests/NullContainer.php | 22 +- tests/ObjectTestTrait.php | 9 +- tests/OpenAPIBuilderTrait.php | 17 +- tests/PrivateAccessTrait.php | 9 +- tests/SchedulerTestTrait.php | 42 +- tests/Search/AbstractLegacySearchTest.php | 11 +- tests/Search/AbstractSearchTest.php | 56 +- tests/Search/LegacySearchTestTrait.php | 10 +- tests/Search/SearchServiceTest.php | 44 + tests/SetsGeneratorTrait.php | 8 +- tests/SetupTraitsTrait.php | 36 +- tests/SharedBootstrapTestCase.php | 11 +- tests/Site/MockOwnSite.php | 7 +- tests/Site/MockSiteProvider.php | 16 +- tests/Site/MockSiteTestTrait.php | 73 +- tests/SiteTestCase.php | 15 +- tests/SiteTestTrait.php | 206 +- tests/StaticCleanupTestExtension.php | 7 +- .../Storybook/StorybookGenerationTestCase.php | 39 +- tests/TestDatabase.php | 26 +- tests/TestInstallModel.php | 106 +- tests/TestLogger.php | 27 +- tests/TestLoggerTrait.php | 53 +- tests/UsersAndRolesApiTestTrait.php | 168 +- tests/VanillaTestCase.php | 91 +- tests/addons/test-oauth/TestOAuthPlugin.php | 40 +- .../test/Controllers/TestController.php | 22 +- tests/conf/config-defaults.php | 6 + tests/definitions.php | 8 +- tests/fixtures/MiddlewareAware.php | 6 +- tests/fixtures/TestApiController.php | 6 +- tests/fixtures/TestMySQLStructure.php | 6 +- .../plugin-in-addons/PluginInAddonsPlugin.php | 6 +- .../addons/addons/plugin-in-addons/addon.json | 14 +- .../ThemeInAddonsThemeHooks.php | 6 +- .../CustomDirNamespaceClass.php | 4 +- .../Controllers/.HiddenController.php | 5 +- .../.archive/ArchiveController.php | 5 +- .../Controllers/Api/NewApiController.php | 5 +- .../Controllers/OldApiController.php | 5 +- .../CustomDirNamespaceClass.php | 4 +- .../test-old-application/settings/about.php | 14 +- .../settings/bootstrap.php | 4 +- .../settings/class.hooks.php | 10 +- .../settings/structure.php | 4 +- .../bad-addons/CobbSalad 1.1/addon.json | 6 +- .../bad-themes/KingFrank 1.2/addon.json | 6 +- tests/fixtures/error-index.php | 2 +- tests/fixtures/formats/rich/all/input.json | 2 +- tests/fixtures/formats/rich/all/output.html | 2 +- tests/fixtures/formats/rich/all/output.txt | 2 +- .../Addon/BadStructureStructure.php | 9 +- ...ss.multiclass-namespaced-plugin.plugin.php | 42 +- .../class.namespaced-plugin.plugin.php | 26 +- .../class.test-old-plugin.plugin.php | 30 +- tests/fixtures/plugins/test-plugin/addon.json | 44 +- tests/fixtures/src/AddonsController.php | 15 +- .../fixtures/src/Aliases/ExtendsNewClass.php | 3 +- tests/fixtures/src/Aliases/NewClass.php | 3 +- .../fixtures/src/Aliases/TestAliasLoader.php | 7 +- tests/fixtures/src/ArticlesHelpController.php | 7 +- .../Authenticator/CssColorAuthenticator.php | 61 +- .../src/Authenticator/MockAuthenticator.php | 59 +- .../Authenticator/MockSSOAuthenticator.php | 76 +- tests/fixtures/src/BasicEventHandlers.php | 40 +- tests/fixtures/src/BasicPipelineModel.php | 15 +- tests/fixtures/src/CommentsController.php | 19 +- tests/fixtures/src/Container.php | 12 +- .../src/Database/ProcessorFixture.php | 10 +- tests/fixtures/src/DiscussionsController.php | 124 +- tests/fixtures/src/DumbArray.php | 18 +- .../src/EmbeddedContent/EmbedFixtures.php | 21 +- .../EmbeddedContent/LegacyEmbedFixtures.php | 10 +- .../src/EmbeddedContent/MockEmbed.php | 26 +- .../src/EmbeddedContent/MockEmbedFactory.php | 28 +- .../src/EmbeddedContent/MockEmbedFilter.php | 13 +- .../src/Events/TestPsrEventHandler.php | 14 +- .../fixtures/src/Events/TestResourceEvent.php | 4 +- tests/fixtures/src/ExactRoute.php | 27 +- tests/fixtures/src/FileUtils.php | 12 +- tests/fixtures/src/FooBarController.php | 20 +- .../fixtures/src/Formatting/FormatFixture.php | 65 +- .../src/Formatting/FormatFixtureFactory.php | 14 +- tests/fixtures/src/Html/TestHtmlDocument.php | 80 +- tests/fixtures/src/IterableArray.php | 7 +- tests/fixtures/src/LocalFilePageScraper.php | 15 +- tests/fixtures/src/Locale.php | 7 +- tests/fixtures/src/MockAddon.php | 24 +- tests/fixtures/src/MockAddonManager.php | 16 +- tests/fixtures/src/MockConfig.php | 37 +- tests/fixtures/src/MockEmail.php | 7 +- tests/fixtures/src/MockHttpClient.php | 12 +- .../fixtures/src/MockImageSrcSetProvider.php | 8 +- tests/fixtures/src/MockLocale.php | 7 +- .../fixtures/src/MockNewDiscussionModule.php | 10 +- tests/fixtures/src/MockPageScraper.php | 12 +- tests/fixtures/src/MockResponseTrait.php | 14 +- tests/fixtures/src/MockSiteMetaExtra.php | 9 +- tests/fixtures/src/MockSiteSection.php | 73 +- .../fixtures/src/MockSiteSectionProvider.php | 77 +- tests/fixtures/src/MockTrackingEvent.php | 18 +- tests/fixtures/src/MockUASniffer.php | 10 +- .../fixtures/src/MockWidgets/MockWidget1.php | 62 +- .../fixtures/src/MockWidgets/MockWidget2.php | 7 +- .../fixtures/src/MockWidgets/MockWidget3.php | 7 +- .../fixtures/src/Models/MockUserProvider.php | 42 +- tests/fixtures/src/NullCache.php | 41 +- tests/fixtures/src/OfflineNullCache.php | 10 +- tests/fixtures/src/PageFixture.php | 12 +- .../MockQuickLinkProviderInterface1.php | 14 +- .../MockQuickLinkProviderInterface2.php | 15 +- .../MockQuickLinkProviderInterface3.php | 15 +- tests/fixtures/src/RecursiveSerializable.php | 9 +- tests/fixtures/src/Request.php | 118 +- tests/fixtures/src/RootHelpController.php | 10 +- tests/fixtures/src/Scheduler/EchoAwareJob.php | 29 +- tests/fixtures/src/Scheduler/EchoJob.php | 15 +- .../src/Scheduler/InstantScheduler.php | 36 +- .../src/Scheduler/LongRunnerFixture.php | 67 +- .../src/Scheduler/MockTrackableJob.php | 12 +- .../src/Scheduler/NonCompliantDriver.php | 10 +- .../src/Scheduler/NonCompliantDriverSlip.php | 36 +- .../src/Scheduler/NonCompliantJob.php | 15 +- tests/fixtures/src/Scheduler/NonDroveJob.php | 21 +- tests/fixtures/src/Scheduler/ParentJob.php | 15 +- .../src/Scheduler/ThrowableDriver.php | 17 +- .../src/Scheduler/ThrowableEchoJob.php | 13 +- tests/fixtures/src/Scheduler/VoidDriver.php | 13 +- tests/fixtures/src/Search/MockSearchType.php | 74 +- tests/fixtures/src/SomeController.php | 9 +- tests/fixtures/src/SpyingEventManager.php | 22 +- tests/fixtures/src/TestAddonManager.php | 23 +- tests/fixtures/src/TestCache.php | 29 +- tests/fixtures/src/TestEvent.php | 16 +- tests/fixtures/src/TestEventChild.php | 4 +- tests/fixtures/src/TestUploader.php | 44 +- .../fixtures/src/Theme/MockThemeProvider.php | 86 +- tests/fixtures/src/TokenTestingModel.php | 11 +- tests/fixtures/src/Tuple.php | 21 +- tests/fixtures/src/UnitTestGdnDispatcher.php | 15 +- tests/fixtures/src/Web/TestPageController.php | 14 +- .../asset-test-no-parent/assets/styles.css | 2 +- .../themes/asset-test/assets/styles.css | 2 +- .../themes/asset-test2/assets/styles.css | 2 +- tests/fixtures/themes/basic-parent/addon.json | 6 +- .../themes/sitesdeclaredtheme/addon.json | 6 +- tests/fixtures/themes/test-old/about.php | 20 +- .../themes/test-old/class.themehooks.php | 10 +- tests/phpunit.php | 34 +- .../templates/vanilla/cgi-bin/saveconfig.php | 108 +- themes/mobile/class.mobilethemehooks.php | 96 +- tsconfig.json | 1 + version.json | 2 +- yarn.lock | 12377 +++++++--------- 3072 files changed, 183564 insertions(+), 172290 deletions(-) create mode 100644 .swcrc rename patches/@emotion+css++@emotion+serialize+1.0.2.patch => .yarn/patches/@emotion-serialize-npm-1.0.3-2a28e46c06.patch (77%) create mode 100644 applications/dashboard/Addon/RecordStatusEventHandlers.php create mode 100644 applications/dashboard/Addon/UserMentionsEventHandler.php create mode 100644 applications/dashboard/Analytics/SearchMembersEventProvider.php create mode 100644 applications/dashboard/Events/AfterUserAnonymizeEvent.php delete mode 100644 applications/dashboard/Events/DiscussionStatusDefinitionEvent.php delete mode 100644 applications/dashboard/Events/IdeaStatusDefinitionEvent.php delete mode 100644 applications/dashboard/Events/RecordStatusDefinitionEvent.php delete mode 100644 applications/dashboard/Events/RecordStatusDefinitionEventHandler.php create mode 100644 applications/dashboard/Events/SearchMembersEvent.php delete mode 100644 applications/dashboard/Gruntfile.js create mode 100644 applications/dashboard/Schemas/BaseTrackableSearchSchema.php create mode 100644 applications/dashboard/controllers/api/AssetsApiController.php create mode 100644 applications/dashboard/controllers/api/AuthenticatorTypesApiController.php create mode 100644 applications/dashboard/controllers/api/DbaApiController.php create mode 100644 applications/dashboard/controllers/api/ProfileFieldsApiController.php create mode 100644 applications/dashboard/controllers/api/UserMentionsApiController.php rename applications/dashboard/design/images/widgetIcons/{ctamodule.svg => cta.svg} (100%) create mode 100644 applications/dashboard/design/images/widgetIcons/featuredcollections.svg rename applications/dashboard/design/images/widgetIcons/{guestmodule.svg => guest-cta.svg} (100%) create mode 100644 applications/dashboard/design/images/widgetIcons/sitetotals.svg delete mode 100644 applications/dashboard/library/Jobs/ExecuteActivityQueue.php create mode 100644 applications/dashboard/models/AggregateCountModel.php create mode 100644 applications/dashboard/models/AggregateCountOption.php create mode 100644 applications/dashboard/models/AggregateCountableInterface.php create mode 100644 applications/dashboard/models/AuthenticatorTypeService.php create mode 100644 applications/dashboard/models/ProfileFieldModel.php create mode 100644 applications/dashboard/models/ProfileFieldsOpenApi.php create mode 100644 applications/dashboard/models/RecordStatusActiveEvent.php create mode 100644 applications/dashboard/models/RecordStatusLogModel.php create mode 100644 applications/dashboard/models/RecordStatusStructureEvent.php create mode 100644 applications/dashboard/models/UserMentionsInterface.php create mode 100644 applications/dashboard/models/UserMentionsModel.php create mode 100644 applications/dashboard/openapi/assets.yml create mode 100644 applications/dashboard/openapi/authenticator-types.yml create mode 100644 applications/dashboard/openapi/dba.yml create mode 100644 applications/dashboard/openapi/profile-fields.yml create mode 100644 applications/dashboard/openapi/user-mentions.yml create mode 100644 applications/dashboard/src/scripts/components/Table.story.tsx create mode 100644 applications/dashboard/src/scripts/components/Table.styles.ts create mode 100644 applications/dashboard/src/scripts/components/Table.tsx create mode 100644 applications/dashboard/src/scripts/components/Table.variables.ts create mode 100644 applications/dashboard/src/scripts/components/navigation/NavigationLinkItem.styles.ts create mode 100644 applications/dashboard/src/scripts/components/navigation/NavigationLinkItem.tsx create mode 100644 applications/dashboard/src/scripts/components/navigation/NavigationLinks.styles.ts create mode 100644 applications/dashboard/src/scripts/components/navigation/NavigationLinks.tsx create mode 100644 applications/dashboard/src/scripts/components/navigation/NavigationLinksModal.story.tsx create mode 100644 applications/dashboard/src/scripts/components/navigation/NavigationLinksModal.styles.ts create mode 100644 applications/dashboard/src/scripts/components/navigation/NavigationLinksModal.tsx create mode 100644 applications/dashboard/src/scripts/labs/CustomLayoutLabItem.spec.tsx create mode 100644 applications/dashboard/src/scripts/labs/CustomLayoutLabItem.svg create mode 100644 applications/dashboard/src/scripts/labs/CustomLayoutLabItem.tsx create mode 100644 applications/dashboard/src/scripts/labs/NewEmbedSystemLabItem.svg create mode 100644 applications/dashboard/src/scripts/labs/NewEmbedSystemLabItem.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/LayoutEditorAssetUtils.tsx delete mode 100644 applications/dashboard/src/scripts/layout/editor/__fixtures__/LayoutEditor.fixtures.ts create mode 100644 applications/dashboard/src/scripts/layout/editor/__fixtures__/LayoutEditor.fixtures.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/thumbnails/LayoutThumbnailsModal.spec.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/thumbnails/LayoutWidgetThumbnails.spec.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/WidgetSchemaTransformer.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/WidgetSettings.classes.ts create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/WidgetSettings.spec.ts create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/WidgetSettings.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/WidgetSettingsAccordion.classes.ts create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/WidgetSettingsAccordion.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/WidgetSettingsFormGroupWrapper.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/WidgetSettingsModal.story.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/WidgetSettingsModal.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/WidgetSettingsPreview.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/overrides/QuickLinksListAsModal.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/overrides/SiteTotalsAsModal.tsx create mode 100644 applications/dashboard/src/scripts/layout/editor/widgetSettings/overrides/TabsAsModal.tsx create mode 100644 applications/dashboard/src/scripts/layout/layoutSettings/LayoutActionsContextProvider.tsx rename applications/dashboard/src/scripts/layout/layoutSettings/{LayoutSettings.hooks.ts => LayoutSettings.hooks.tsx} (55%) create mode 100644 applications/dashboard/src/scripts/pages/VanillaLabsPage.spec.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/UserProfileSettings.spec.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/UserProfileSettings.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileFieldDelete.spec.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileFieldDelete.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileFieldForm.classes.ts create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileFieldForm.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileFields.fixtures.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileFieldsList.classes.ts create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileFieldsList.spec.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileFieldsList.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileRedirectForm.classes.ts create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileRedirectForm.spec.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/components/ProfileRedirectForm.tsx create mode 100644 applications/dashboard/src/scripts/userProfiles/state/UserProfiles.actions.ts create mode 100644 applications/dashboard/src/scripts/userProfiles/state/UserProfiles.hooks.ts create mode 100644 applications/dashboard/src/scripts/userProfiles/state/UserProfiles.slice.ts create mode 100644 applications/dashboard/src/scripts/userProfiles/types/UserProfiles.types.ts create mode 100644 applications/dashboard/src/scripts/userProfiles/utils.ts rename applications/dashboard/src/scripts/widgets/{WidgetFormGenerator.story.tsx => WidgetFormGenerator.story_fixme.tsx} (86%) delete mode 100644 applications/dashboard/styleguide/index.html delete mode 100644 applications/dashboard/styleguide/public/admin.css delete mode 100644 applications/dashboard/styleguide/public/dashboard.js delete mode 100755 applications/dashboard/styleguide/public/github.less delete mode 100644 applications/dashboard/styleguide/public/global-stub.js delete mode 100755 applications/dashboard/styleguide/public/highlight.pack.js delete mode 100755 applications/dashboard/styleguide/public/html5shiv.js delete mode 100755 applications/dashboard/styleguide/public/jquery-1.9.1.min.js delete mode 100644 applications/dashboard/styleguide/public/kss.css delete mode 100755 applications/dashboard/styleguide/public/kss.js delete mode 100644 applications/dashboard/styleguide/public/kss.less delete mode 100755 applications/dashboard/styleguide/public/main.js delete mode 100755 applications/dashboard/styleguide/public/prettify.css delete mode 100755 applications/dashboard/styleguide/public/prettify.js delete mode 100644 applications/dashboard/styleguide/public/resources/fonts/vanillicon/vanillicon.eot delete mode 100644 applications/dashboard/styleguide/public/resources/fonts/vanillicon/vanillicon.svg delete mode 100644 applications/dashboard/styleguide/public/resources/fonts/vanillicon/vanillicon.ttf delete mode 100644 applications/dashboard/styleguide/public/resources/fonts/vanillicon/vanillicon.woff delete mode 100644 applications/dashboard/styleguide/public/resources/pages/example-modal-form.json delete mode 100644 applications/dashboard/styleguide/public/resources/pages/example-modal.json delete mode 100644 applications/dashboard/styleguide/section-1.html delete mode 100644 applications/dashboard/styleguide/section-10.html delete mode 100644 applications/dashboard/styleguide/section-11.html delete mode 100644 applications/dashboard/styleguide/section-12.html delete mode 100644 applications/dashboard/styleguide/section-13.html delete mode 100644 applications/dashboard/styleguide/section-14.html delete mode 100644 applications/dashboard/styleguide/section-15.html delete mode 100644 applications/dashboard/styleguide/section-16.html delete mode 100644 applications/dashboard/styleguide/section-17.html delete mode 100644 applications/dashboard/styleguide/section-18.html delete mode 100644 applications/dashboard/styleguide/section-2.html delete mode 100644 applications/dashboard/styleguide/section-3.html delete mode 100644 applications/dashboard/styleguide/section-4.html delete mode 100644 applications/dashboard/styleguide/section-5.html delete mode 100644 applications/dashboard/styleguide/section-6.html delete mode 100644 applications/dashboard/styleguide/section-7.html delete mode 100644 applications/dashboard/styleguide/section-8.html delete mode 100644 applications/dashboard/styleguide/section-9.html delete mode 100755 applications/dashboard/template/index.html delete mode 100644 applications/dashboard/template/public/admin.css delete mode 100644 applications/dashboard/template/public/dashboard.js delete mode 100755 applications/dashboard/template/public/github.less delete mode 100644 applications/dashboard/template/public/global-stub.js delete mode 100755 applications/dashboard/template/public/highlight.pack.js delete mode 100755 applications/dashboard/template/public/html5shiv.js delete mode 100755 applications/dashboard/template/public/jquery-1.9.1.min.js delete mode 100644 applications/dashboard/template/public/kss.css delete mode 100755 applications/dashboard/template/public/kss.js delete mode 100644 applications/dashboard/template/public/kss.less delete mode 100755 applications/dashboard/template/public/main.js delete mode 100755 applications/dashboard/template/public/prettify.css delete mode 100755 applications/dashboard/template/public/prettify.js delete mode 100644 applications/dashboard/template/public/resources/fonts/vanillicon/vanillicon.eot delete mode 100644 applications/dashboard/template/public/resources/fonts/vanillicon/vanillicon.svg delete mode 100644 applications/dashboard/template/public/resources/fonts/vanillicon/vanillicon.ttf delete mode 100644 applications/dashboard/template/public/resources/fonts/vanillicon/vanillicon.woff delete mode 100644 applications/dashboard/template/public/resources/images/baby-seal.jpg delete mode 100644 applications/dashboard/template/public/resources/images/clean-piggy.jpg delete mode 100644 applications/dashboard/template/public/resources/images/dirty-rodent.jpg delete mode 100644 applications/dashboard/template/public/resources/images/kitten.jpg delete mode 100644 applications/dashboard/template/public/resources/images/little-chick.jpg delete mode 100644 applications/dashboard/template/public/resources/images/puppy.jpg delete mode 100644 applications/dashboard/template/public/resources/images/smart-puppy.jpg delete mode 100644 applications/dashboard/template/public/resources/images/snow-dog.jpg delete mode 100644 applications/dashboard/template/public/resources/images/vanilla-black.png delete mode 100644 applications/dashboard/template/public/resources/images/vanilla-black.svg delete mode 100644 applications/dashboard/template/public/resources/images/vanilla-white.png delete mode 100644 applications/dashboard/template/public/resources/images/vanilla-white.svg delete mode 100644 applications/dashboard/template/public/resources/pages/example-modal-form.json delete mode 100644 applications/dashboard/template/public/resources/pages/example-modal.json create mode 100644 applications/dashboard/tests/Library/EmailTemplateTest.php create mode 100644 applications/dashboard/tests/Models/UserMentionsModelTest.php create mode 100644 applications/dashboard/tests/UserLeaderServiceTest.php create mode 100644 applications/dashboard/tests/settings/StructureTest.php create mode 100644 applications/dashboard/views/entry/recaptcha.php rename plugins/recaptcha/views/settings/registration.php => applications/dashboard/views/settings/recaptchaoptions.php (97%) create mode 100644 applications/dashboard/webpack.config.js create mode 100644 applications/dashboard/webpack.style.config.js create mode 100644 applications/vanilla/Addon/PageViewEventHandler.php create mode 100644 applications/vanilla/Events/PageViewEvent.php create mode 100644 applications/vanilla/Events/SearchDiscussionEvent.php create mode 100644 applications/vanilla/Layout/Definitions/discussionList.json create mode 100644 applications/vanilla/Layout/View/DiscussionListLayoutView.php delete mode 100644 applications/vanilla/Layout/View/LegacyDiscussionListLayoutView.php create mode 100644 applications/vanilla/Widgets/CallToActionWidget.php create mode 100644 applications/vanilla/Widgets/CallToActionWidgetTrait.php create mode 100644 applications/vanilla/Widgets/CategoriesWidgetTrait.php create mode 100644 applications/vanilla/Widgets/DiscussionListAsset.php create mode 100644 applications/vanilla/Widgets/DiscussionsWidgetSchemaTrait.php create mode 100644 applications/vanilla/Widgets/FeaturedCollectionsWidget.php create mode 100644 applications/vanilla/Widgets/GuestCallToActionWidget.php create mode 100644 applications/vanilla/Widgets/NewPostWidget.php create mode 100644 applications/vanilla/Widgets/SiteTotalsWidget.php create mode 100644 applications/vanilla/Widgets/TabsWidget.php create mode 100644 applications/vanilla/controllers/Pages/DiscussionListPageController.php create mode 100644 applications/vanilla/controllers/api/CollectionsApiController.php create mode 100644 applications/vanilla/controllers/api/SessionsApiController.php create mode 100644 applications/vanilla/models/AuthenticatorTypeInterface.php create mode 100644 applications/vanilla/models/CategoryCollectionProvider.php create mode 100644 applications/vanilla/models/CollectionModel.php create mode 100644 applications/vanilla/models/CollectionRecordProviderInterface.php create mode 100644 applications/vanilla/models/CommunityNotificationGenerator.php create mode 100644 applications/vanilla/models/DiscussionCollectionProvider.php create mode 100644 applications/vanilla/models/DiscussionStatusModel.php create mode 100644 applications/vanilla/openapi/collections.yml create mode 100644 applications/vanilla/openapi/sessions.yml create mode 100644 applications/vanilla/src/scripts/entries/admin-new.tsx create mode 100644 applications/vanilla/src/scripts/entries/layouts.tsx create mode 100644 applications/vanilla/src/scripts/forms/CommunityMemberInput.tsx create mode 100644 applications/vanilla/src/scripts/tag/TagWidget.preview.tsx create mode 100644 applications/vanilla/tests/CommentNotificationsTest.php create mode 100644 applications/vanilla/tests/Controllers/Page/DiscussionListPageControllerTest.php create mode 100644 applications/vanilla/tests/DiscussionNotificationsTest.php create mode 100644 applications/vanilla/tests/Widgets/CallToActionWidgetTest.php create mode 100644 applications/vanilla/tests/Widgets/FeaturedCollectionsWidgetTest.php create mode 100644 applications/vanilla/tests/Widgets/NewPostWidgetTest.php create mode 100644 applications/vanilla/tests/Widgets/SiteTotalsWidgetTest.php create mode 100644 applications/vanilla/tests/Widgets/TagWidgetTest.php create mode 100644 build/scripts/configs/makeEmbedConfig.ts create mode 100644 build/scripts/configs/makeManifestPlugin.ts create mode 100644 cli/src/Commands/UserMentionIndex/IndexMentionCommand.php create mode 100644 cli/src/Utils/DatabaseCommand.php create mode 100644 library/Garden/Web/ControllerDispatchedEvent.php create mode 100644 library/Garden/Web/DispatcherExceptionEvent.php create mode 100644 library/Vanilla/Analytics/EventProviderInterface.php create mode 100644 library/Vanilla/Analytics/EventProviderService.php create mode 100644 library/Vanilla/Analytics/PageViewEventProvider.php create mode 100644 library/Vanilla/Analytics/SearchAllEventProvider.php create mode 100644 library/Vanilla/Analytics/SearchDiscussionEventProvider.php create mode 100644 library/Vanilla/Analytics/SearchPlacesEventProvider.php create mode 100644 library/Vanilla/Events/SearchAllEvent.php create mode 100644 library/Vanilla/Events/SearchPlacesEvent.php create mode 100644 library/Vanilla/Formatting/UserMentionsTrait.php create mode 100644 library/Vanilla/Http/InternalResponse.php delete mode 100644 library/Vanilla/Layout/Asset/BreadcrumbAsset.php create mode 100644 library/Vanilla/Layout/Asset/LayoutFormAsset.php create mode 100644 library/Vanilla/Layout/HydrateAwareInterface.php create mode 100644 library/Vanilla/Layout/HydrateAwareTrait.php create mode 100644 library/Vanilla/Layout/RootRecordProvider.php create mode 100644 library/Vanilla/Models/AddonDisabledEvent.php create mode 100644 library/Vanilla/Models/AuthenticatorTypeFragmentSchema.php create mode 100644 library/Vanilla/Models/LockService.php create mode 100644 library/Vanilla/Scheduler/CronModel.php rename library/Vanilla/Scheduler/{DummyScheduler.php => DeferredScheduler.php} (62%) create mode 100644 library/Vanilla/Scheduler/LongRunnerMultiAction.php delete mode 100644 library/Vanilla/Scheduler/Meta/SchedulerControlMeta.php delete mode 100644 library/Vanilla/Scheduler/Meta/SchedulerMetaDao.php create mode 100644 library/Vanilla/Site/RootSiteSection.php create mode 100644 library/Vanilla/Site/RootSiteSectionProvider.php create mode 100644 library/Vanilla/Utility/FileGeneratorUtils.php create mode 100644 library/Vanilla/Utility/PhpClassParsed.php create mode 100644 library/Vanilla/Utility/SerializedPublicPropertiesToJsonTrait.php create mode 100644 library/Vanilla/Web/CsvView.php create mode 100644 library/Vanilla/Web/JsInterpop/RawReduxAction.php create mode 100644 library/Vanilla/Web/Middleware/ValidateJSONMiddleware.php create mode 100644 library/Vanilla/Web/Middleware/ValidateUTF8Middleware.php create mode 100644 library/Vanilla/Widgets/React/AllSectionTrait.php create mode 100644 library/Vanilla/Widgets/React/DefaultSectionTrait.php delete mode 100644 library/Vanilla/Widgets/React/SectionAwareInterface.php delete mode 100644 library/Vanilla/Widgets/React/WidgetContainerReactWidget.php create mode 100644 library/core/caching/LockStolenException.php create mode 100644 library/core/caching/StealableLock.php create mode 100644 library/src/scripts/VanillaGlobals.ts create mode 100644 library/src/scripts/aboutMeWidget/AboutMe.hooks.tsx create mode 100644 library/src/scripts/aboutMeWidget/AboutMeWidget.tsx create mode 100644 library/src/scripts/analytics/AnalyticsData.spec.tsx create mode 100644 library/src/scripts/analytics/tracking.spec.ts create mode 100644 library/src/scripts/analytics/tracking.ts create mode 100644 library/src/scripts/banner/Banner.spec.tsx create mode 100644 library/src/scripts/banner/BannerContentWidget.preview.tsx create mode 100644 library/src/scripts/banner/BannerContentWidget.tsx create mode 100644 library/src/scripts/banner/BannerWidget.preview.tsx create mode 100644 library/src/scripts/banner/BannerWidget.tsx create mode 100644 library/src/scripts/callToAction/CallToAction.spec.tsx create mode 100644 library/src/scripts/callToAction/CallToActionWidget.tsx create mode 100644 library/src/scripts/callToAction/GuestCallToActionWidget.tsx create mode 100644 library/src/scripts/contexts/HamburgerMenuContext.spec.tsx create mode 100644 library/src/scripts/contexts/HamburgerMenuContext.tsx create mode 100644 library/src/scripts/contexts/__fixtures__/HamburgerContextFixture.tsx create mode 100644 library/src/scripts/dataLists/DataList.spec.tsx create mode 100644 library/src/scripts/discussions/DiscussionsWidget.preview.tsx create mode 100644 library/src/scripts/embed/ModernEmbedSettings.tsx create mode 100644 library/src/scripts/embed/embedEvents.ts create mode 100644 library/src/scripts/embed/modernEmbed.local.spec.ts create mode 100644 library/src/scripts/embed/modernEmbed.local.ts create mode 100644 library/src/scripts/embed/modernEmbed.remote.spec.ts create mode 100644 library/src/scripts/embed/modernEmbed.remote.ts delete mode 100644 library/src/scripts/embeddedContent/FormElements.story.tsx create mode 100644 library/src/scripts/entries/forum.ts create mode 100644 library/src/scripts/entries/knowledge.ts create mode 100644 library/src/scripts/errorPages/ErrorPageBoundary.tsx create mode 100644 library/src/scripts/featuredCollections/Collections.variables.ts create mode 100644 library/src/scripts/featuredCollections/CollectionsActions.ts create mode 100644 library/src/scripts/featuredCollections/CollectionsForm.loadable.tsx create mode 100644 library/src/scripts/featuredCollections/CollectionsForm.styles.ts create mode 100644 library/src/scripts/featuredCollections/CollectionsForm.tsx create mode 100644 library/src/scripts/featuredCollections/CollectionsOptionButton.tsx create mode 100644 library/src/scripts/featuredCollections/CollectionsUtils.ts create mode 100644 library/src/scripts/featuredCollections/FeaturedCollectionRecord.tsx create mode 100644 library/src/scripts/featuredCollections/FeaturedCollections.spec.tsx create mode 100644 library/src/scripts/featuredCollections/FeaturedCollections.story.tsx create mode 100644 library/src/scripts/featuredCollections/FeaturedCollections.style.ts create mode 100644 library/src/scripts/featuredCollections/FeaturedCollections.tsx create mode 100644 library/src/scripts/featuredCollections/FeaturedCollectionsWidget.preview.tsx create mode 100644 library/src/scripts/featuredCollections/FeaturedCollectionsWidget.tsx create mode 100644 library/src/scripts/featuredCollections/collectionsHooks.tsx create mode 100644 library/src/scripts/featuredCollections/collectionsReducer.ts create mode 100644 library/src/scripts/features/__fixtures__/User.fixture.ts create mode 100644 library/src/scripts/features/discussions/DiscussionGridModule.tsx create mode 100644 library/src/scripts/features/discussions/DiscussionGridView.tsx create mode 100644 library/src/scripts/features/discussions/DiscussionListAsset.tsx create mode 100644 library/src/scripts/features/discussions/DiscussionListAssetCategoryFilter.tsx create mode 100644 library/src/scripts/features/discussions/DiscussionListAssetHeader.tsx create mode 100644 library/src/scripts/features/discussions/DiscussionListLoader.story.tsx create mode 100644 library/src/scripts/features/discussions/DiscussionListLoader.tsx create mode 100644 library/src/scripts/features/discussions/DiscussionsWidget.tsx create mode 100644 library/src/scripts/features/discussions/forms/BulkCloseDiscussionsForm.loadable.tsx create mode 100644 library/src/scripts/features/discussions/forms/BulkCloseDiscussionsForm.tsx create mode 100644 library/src/scripts/features/numberedPager/NextPrevButton.tsx create mode 100644 library/src/scripts/features/numberedPager/NumberedPager.spec.tsx create mode 100644 library/src/scripts/features/numberedPager/NumberedPager.story.tsx create mode 100644 library/src/scripts/features/numberedPager/NumberedPager.styles.ts create mode 100644 library/src/scripts/features/numberedPager/NumberedPager.tsx create mode 100644 library/src/scripts/features/numberedPager/NumberedPager.variables.ts create mode 100644 library/src/scripts/features/numberedPager/NumberedPagerJumper.tsx create mode 100644 library/src/scripts/features/userCard/UserCard.spec.tsx delete mode 100644 library/src/scripts/flyouts/NewPostMenu.tsx delete mode 100644 library/src/scripts/flyouts/NewPostMenuDropdown.tsx delete mode 100644 library/src/scripts/flyouts/StoryExampleDropDownSearch.tsx delete mode 100644 library/src/scripts/flyouts/newPostMenuStyles.ts create mode 100644 library/src/scripts/forms/DashboardFormFields.story.tsx create mode 100644 library/src/scripts/forms/FrontEndFormFields.story.tsx create mode 100644 library/src/scripts/forms/rangePicker/AdvancedRangePicker.styles.ts create mode 100644 library/src/scripts/forms/rangePicker/AdvancedRangePicker.tsx create mode 100644 library/src/scripts/forms/rangePicker/DatePickerNav.tsx create mode 100644 library/src/scripts/forms/rangePicker/IntervalPicker.tsx create mode 100644 library/src/scripts/forms/rangePicker/RangeForm.styles.ts create mode 100644 library/src/scripts/forms/rangePicker/RangeForm.tsx create mode 100644 library/src/scripts/forms/rangePicker/RangePicker.styles.ts create mode 100644 library/src/scripts/forms/rangePicker/RangePicker.tsx create mode 100644 library/src/scripts/forms/rangePicker/RangePresets.tsx create mode 100644 library/src/scripts/forms/rangePicker/icons/ChevronLeft.tsx create mode 100644 library/src/scripts/forms/rangePicker/icons/ChevronRight.tsx create mode 100644 library/src/scripts/forms/rangePicker/types.ts create mode 100644 library/src/scripts/forms/rangePicker/utils.spec.ts create mode 100644 library/src/scripts/forms/rangePicker/utils.ts delete mode 100644 library/src/scripts/forms/select/LazyTokens.tsx create mode 100644 library/src/scripts/forms/select/Tokens.loadable.tsx create mode 100644 library/src/scripts/forms/select/TokensInputInLegacyForm.tsx create mode 100644 library/src/scripts/headers/mebox/pieces/DashboardMeBox.spec.tsx create mode 100644 library/src/scripts/homeWidget/HomeWidgetItem.spec.tsx create mode 100644 library/src/scripts/homeWidget/HomeWidgetItemDefaultImage.tsx create mode 100644 library/src/scripts/htmlWidget/HtmlWidget.preview.tsx create mode 100644 library/src/scripts/htmlWidget/HtmlWidget.tsx create mode 100644 library/src/scripts/htmlWidget/HtmlWidgetEditor.classes.ts create mode 100644 library/src/scripts/htmlWidget/HtmlWidgetEditor.d.ts create mode 100644 library/src/scripts/htmlWidget/HtmlWidgetEditor.tsx delete mode 100644 library/src/scripts/layout/HtmlWidget.tsx create mode 100644 library/src/scripts/leaderboardWidget/LeaderboardWidget.preview.tsx create mode 100644 library/src/scripts/metas/TokenItem.styles.ts create mode 100644 library/src/scripts/metas/TokenItem.tsx delete mode 100644 library/src/scripts/modal/LazyModal.tsx create mode 100644 library/src/scripts/modal/Modal.loadable.tsx create mode 100644 library/src/scripts/modal/mountModal.tsx rename library/src/scripts/{flyouts => newPostMenu}/NewPostBackground.tsx (92%) create mode 100644 library/src/scripts/newPostMenu/NewPostMenu.preview.tsx create mode 100644 library/src/scripts/newPostMenu/NewPostMenu.tsx create mode 100644 library/src/scripts/newPostMenu/NewPostMenuDropdown.tsx rename library/src/scripts/{flyouts => newPostMenu}/NewPostMenuFAB.tsx (99%) rename library/src/scripts/{flyouts => newPostMenu}/newPostBackgroundStyles.ts (93%) rename library/src/scripts/{flyouts => newPostMenu}/newPostMenu.story.tsx (75%) create mode 100644 library/src/scripts/newPostMenu/newPostMenuStyles.ts create mode 100644 library/src/scripts/profileAnalyticsWidget/ProfileAnalyticsWidget.styles.ts create mode 100644 library/src/scripts/profileAnalyticsWidget/ProfileAnalyticsWidget.tsx create mode 100644 library/src/scripts/profileOverviewWidget/ProfileOverviewWidget.tsx create mode 100644 library/src/scripts/result/ResultList.spec.tsx create mode 100644 library/src/scripts/routing/LinkAsButton.spec.tsx create mode 100644 library/src/scripts/rssWidget/RSSWidget.preview.tsx create mode 100644 library/src/scripts/rssWidget/rssFeedPlaceholder.png create mode 100644 library/src/scripts/search/SearchPageResults.spec.tsx create mode 100644 library/src/scripts/siteTotalsWidget/SiteTotals.classes.ts create mode 100644 library/src/scripts/siteTotalsWidget/SiteTotals.spec.tsx create mode 100644 library/src/scripts/siteTotalsWidget/SiteTotals.story.tsx create mode 100644 library/src/scripts/siteTotalsWidget/SiteTotals.tsx create mode 100644 library/src/scripts/siteTotalsWidget/SiteTotals.variables.ts create mode 100644 library/src/scripts/siteTotalsWidget/SiteTotalsWidget.preview.tsx create mode 100644 library/src/scripts/siteTotalsWidget/SiteTotalsWidget.tsx create mode 100644 library/src/scripts/stats/Stat.story.tsx.tsx create mode 100644 library/src/scripts/stats/Stat.styles.ts create mode 100644 library/src/scripts/stats/Stat.tsx create mode 100644 library/src/scripts/stats/StatTable.tsx create mode 100644 library/src/scripts/tabWidget/TabWidget.preview.tsx create mode 100644 library/src/scripts/utility/__fixtures__/MockLazyComponent.tsx create mode 100644 library/src/scripts/utility/componentRegistry.spec.tsx create mode 100644 packages/vanilla-icons/icons/data-article.svg create mode 100644 packages/vanilla-icons/icons/data-online.svg create mode 100644 packages/vanilla-icons/icons/data-site-metric.svg create mode 100644 packages/vanilla-icons/icons/navigation-collapseAll.svg create mode 100644 packages/vanilla-icons/icons/navigation-expandAll.svg create mode 100644 packages/vanilla-icons/icons/navigation-skip.svg create mode 100644 packages/vanilla-icons/icons/profile-crown.svg create mode 100644 packages/vanilla-icons/icons/profile-lock.svg create mode 100644 packages/vanilla-icons/icons/reaction-comments.svg create mode 100644 packages/vanilla-icons/icons/search-answered.svg create mode 100644 packages/vanilla-icons/icons/search-categories.svg create mode 100644 packages/vanilla-icons/icons/search-discussion.svg create mode 100644 packages/vanilla-icons/icons/search-groups.svg create mode 100644 packages/vanilla-icons/icons/search-ideas.svg create mode 100644 packages/vanilla-icons/icons/search-kb.svg create mode 100644 packages/vanilla-icons/icons/search-members.svg create mode 100644 packages/vanilla-icons/icons/search-post-count.svg create mode 100644 packages/vanilla-icons/icons/search-questions.svg create mode 100644 packages/vanilla-json-schema-forms/src/ValidationContext.spec.tsx create mode 100644 packages/vanilla-json-schema-forms/src/ValidationContext.tsx create mode 100644 packages/vanilla-react-utils/src/StackingContext.spec.tsx rename {library/src/scripts/modal => packages/vanilla-react-utils/src}/StackingContext.tsx (100%) delete mode 100644 packages/vanilla-ui/src/forms/formGroup/FormGroup.story.tsx delete mode 100644 packages/vanilla-ui/src/forms/numberBox/NumberBox.story.tsx delete mode 100644 packages/vanilla-ui/src/forms/textBox/TextBox.story.tsx delete mode 100644 patches/@emotion+serialize+0.11.16.patch delete mode 100644 patches/@reach+combobox+0.15.1.patch delete mode 100644 plugins/GettingStarted/addon.json delete mode 100644 plugins/GettingStarted/default.php delete mode 100644 plugins/GettingStarted/design/check.png delete mode 100644 plugins/GettingStarted/design/getting-started.css delete mode 100644 plugins/GettingStarted/icon.png create mode 100644 plugins/QnA/src/scripts/entries/knowledge.tsx rename plugins/QnA/src/scripts/{entries/common.tsx => registerQnaSearchTypes.tsx} (77%) create mode 100644 plugins/QnA/tests/APIv2/DiscussionsStatusesTest.php create mode 100644 plugins/QnA/tests/LegacyDiscussionTest.php create mode 100644 plugins/QnA/tests/QnaPluginTest.php create mode 100644 plugins/Reactions/Addon/ReactionsContainerRules.php create mode 100644 plugins/emojiextender/Addon/EmojiExtenderAddonContainerRules.php create mode 100644 plugins/emojiextender/Addon/EmojiExtenderEventHandlers.php create mode 100644 plugins/emojiextender/EmojiExtenderModel.php delete mode 100644 plugins/emojiextender/EmojiExtenderPlugin.php create mode 100644 plugins/emojiextender/ExtendedEmoji.php create mode 100644 plugins/emojiextender/tests/EmojiExtenderTests.php create mode 100644 plugins/jsconnect/Addon/JsConnectContainerRules.php create mode 100644 plugins/jsconnect/Models/JsConnectAuthenticatorTypeProvider.php create mode 100644 plugins/jsconnect/Models/JsConnectValidation.php create mode 100644 plugins/jsconnect/tests/JsConnectApiTest.php create mode 100644 plugins/jsconnect/tests/JsConnectPluginTest.php delete mode 100644 plugins/jsconnect/tests/JsconnectPluginTest.php create mode 100644 plugins/oauth2/Addon/OAuth2ContainerRules.php create mode 100644 plugins/oauth2/models/OAuth2AuthenticationTypeProvider.php delete mode 100644 plugins/recaptcha/addon.json delete mode 100644 plugins/recaptcha/class.recaptcha.plugin.php delete mode 100755 plugins/recaptcha/recaptcha_support.png delete mode 100644 plugins/recaptcha/views/display/captcha.php create mode 100644 preload.php delete mode 100644 resources/sass/_vanillicon-font.scss create mode 100644 tests/APIv2/AuthenticatorTypesTest.php create mode 100644 tests/APIv2/CollectionApiControllerTest.php create mode 100644 tests/APIv2/DbaRecalculateCountsTest.php create mode 100644 tests/APIv2/DiscussionApiStatusTest.php create mode 100644 tests/APIv2/ProfileFieldsApiControllerTest.php create mode 100644 tests/APIv2/UserMentionsTest.php create mode 100644 tests/ExpectedNotification.php create mode 100644 tests/Layout/Asset/MockAsset.php rename tests/Library/Core/{DispatcherTest.php => GdnDispatcherTest.php} (53%) create mode 100644 tests/Library/Vanilla/CsvProviderTrait.php create mode 100644 tests/Library/Vanilla/Formatting/UserMentionTestTraits.php create mode 100644 tests/Library/Vanilla/Formatting/UserMentionsRemovalTest.php create mode 100644 tests/Library/Vanilla/Layout/LayoutPageTest.php delete mode 100644 tests/Library/Vanilla/Scheduler/BootstrapTest.php create mode 100644 tests/Library/Vanilla/Site/RootSiteSectionProviderTest.php create mode 100644 tests/Library/Vanilla/Site/RootSiteSectionTest.php create mode 100644 tests/Library/Vanilla/Utility/FileGeneratorUtilsTest.php create mode 100644 tests/Library/Vanilla/Web/ApiExtensionHandlingTest.php create mode 100644 tests/Library/Vanilla/Web/Middleware/ValidateJSONMiddlewareTest.php create mode 100644 tests/Library/Vanilla/Web/Middleware/ValidateUTF8MiddlewareTest.php create mode 100644 tests/Models/CollectionModelTest.php create mode 100644 tests/Models/ProfileFieldModelTest.php create mode 100644 tests/Models/RecordStatusModelTest.php create mode 100644 tests/NotificationsApiTestTrait.php create mode 100644 tests/Search/SearchServiceTest.php create mode 100644 tests/conf/config-defaults.php diff --git a/.codecov.yml b/.codecov.yml index 7dadeb38bed..bf67e6c3490 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -12,7 +12,7 @@ coverage: informational: true patch: front-end: - informational: true + informational: true changes: no parsers: diff --git a/.gitignore b/.gitignore index 3a8695b4049..53370825ba2 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ /build/* !/build/.storybook !/build/entries +/build/entries/dynamic !/build/scripts !/build/tsconfig.json !/build/.htaccess @@ -122,8 +123,10 @@ phpcs-diff.json yarn-error.log .pnp.* .yarn/* +/bin/scripts/.yarn !.yarn/patches !.yarn/plugins !.yarn/releases !.yarn/sdks !.yarn/versions +applications/dashboard/.yarn/* diff --git a/.prettierignore b/.prettierignore index c5eba0a2934..8433c047aa4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,9 +1,80 @@ +# vendor files bower_components node_modules +vendor +.yarn + +# App writeable directories +uploads cache -.idea -*.min.js -cgi-bin +conf + +# Generally a totally separate repo +locales + +# Build directory dist +storyshots + +# IDE Config +.vscode +.idea + +# Legacy Frontend files +design +js +resources + +# Test output .phpunit.result.cache -.htaccess.dist \ No newline at end of file +.htaccess.dist +.coverage +coverage +.storybookAppPages +**/*.png +**/*.jpg +**/*.jpeg +**/*.lock +tests/fixtures/formats +tests/fixtures/**/*.html +tests/fixtures/**/*.htm + +# Plain JS Files (es5) +**/js/** + +# Legacy Design directories (coming soon?) +**/design/** +applications/dashboard/scss/vendors + +# PHP files with mixed HTML +**/views/** + +# These classes have mixed HTML. +./applications/dashboard/models/class.attachmentmodel.php +./cloud/applications/groups/modules/class.groupinfomodule.php +./cloud/applications/groups/modules/class.groupleadersmodule.php +./cloud/applications/groups/modules/class.groupmembersmodule.php +./cloud/plugins/CustomProfileFields/class.customprofilefields.plugin.php +./cloud/plugins/NoCaps/class.nocaps.plugin.php +./cloud/plugins/Online/modules/class.onlinecountmodule.php +./cloud/plugins/Online/modules/class.onlinemodule.php +./cloud/plugins/TwitterFeeds/default.php +./cloud/plugins/gigya/GSSDK.php +./cloud/plugins/github/class.github.plugin.php +./cloud/plugins/ideation/IdeaConterModule.php +./cloud/plugins/samlsso/saml/Metadata.php +./cloud/utility/invoiceparse/simple_html_dom.php +./cloud/utility/sendup/library/class.rackspace.php +./library/Vanilla/Formatting/FormatUtil.php +./library/Vanilla/Formatting/Formats/HtmlFormat.php +./library/Vanilla/Formatting/Formats/TextFormat.php +./library/Vanilla/Formatting/Html/HtmlPlainTextConverter.php +./library/Vanilla/PageScraper.php +./library/core/class.configurationsource.php +./library/core/class.controller.php +./library/core/class.markdownvanilla.php +./library/deprecated/functions.deprecated.php +./plugins/OpenID/class.lightopenid.php +./plugins/Quotes/class.quotes.plugin.php +./plugins/Reactions/ReactionsPlugin.php +./plugins/VanillaInThisDiscussion/class.inthisdiscussionmodule.php diff --git a/.swcrc b/.swcrc new file mode 100644 index 00000000000..3f11aa7d7cf --- /dev/null +++ b/.swcrc @@ -0,0 +1,27 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": true, + "dynamicImport": false, + "privateMethod": false, + "functionBind": false, + "exportDefaultFrom": false, + "exportNamespaceFrom": false, + "decorators": false, + "decoratorsBeforeExport": false, + "topLevelAwait": false, + "importMeta": false + }, + "transform": { + "react": { + "useBuiltins": true + } + }, + "target": "es2016", + "loose": false, + "externalHelpers": false, + // Requires v1.2.50 or upper and requires target to be es2016 or upper. + "keepClassNames": true + } +} diff --git a/.vscode/launch.json b/.vscode/launch.json index 4ecaca00800..488ea1de32b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,21 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "Debug Production Build Process", + "request": "launch", + "runtimeArgs": [ + "run-script", + "build:assets", + "--sections layouts" + ], + "runtimeExecutable": "npm", + "skipFiles": [ + "/**" + ], + "type": "node" + }, + { // Execute "yarn test:browser:debug" prior to attaching. "type": "chrome", diff --git a/.vscode/settings.json b/.vscode/settings.json index 18b1ddc4e8a..607fa65acf4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,6 +22,7 @@ "**/.hg": true, "**/CVS": true, "**/.DS_Store": true, + "**/.yarn": true, "cloud/plugins": true, "cloud/applications": true, "cloud/themes": true, @@ -36,7 +37,8 @@ "yarn.lock": true, "composer.lock": true, "**/node_modules": true, - "dist": true + "dist": true, + "coverage": true }, "[json]": { "editor.defaultFormatter": "esbenp.prettier-vscode" @@ -72,6 +74,9 @@ }, "emmet.excludeLanguages": ["ts", "tsx", "js", "jsx"], "editor.wordWrapColumn": 120, + "typescript.preferences.autoImportFileExcludePatterns": [ + "jquery*" + ], // Inteliphense instead. "php.suggest.basic": false, diff --git a/patches/@emotion+css++@emotion+serialize+1.0.2.patch b/.yarn/patches/@emotion-serialize-npm-1.0.3-2a28e46c06.patch similarity index 77% rename from patches/@emotion+css++@emotion+serialize+1.0.2.patch rename to .yarn/patches/@emotion-serialize-npm-1.0.3-2a28e46c06.patch index 71629f94482..3e7e36732ec 100644 --- a/patches/@emotion+css++@emotion+serialize+1.0.2.patch +++ b/.yarn/patches/@emotion-serialize-npm-1.0.3-2a28e46c06.patch @@ -1,7 +1,7 @@ -diff --git a/node_modules/@emotion/css/node_modules/@emotion/serialize/types/index.d.ts b/node_modules/@emotion/css/node_modules/@emotion/serialize/types/index.d.ts -index 9d32022..f1d83cd 100644 ---- a/node_modules/@emotion/css/node_modules/@emotion/serialize/types/index.d.ts -+++ b/node_modules/@emotion/css/node_modules/@emotion/serialize/types/index.d.ts +diff --git a/types/index.d.ts b/types/index.d.ts +index 9d32022d203c1de72a1a001aa7542feaa1acc047..f1d83cd3177afb5f08838d4ba718011d9d92d0b0 100644 +--- a/types/index.d.ts ++++ b/types/index.d.ts @@ -10,12 +10,12 @@ export type CSSProperties = CSS.PropertiesFallback export type CSSPropertiesWithMultiValues = { [K in keyof CSSProperties]: diff --git a/.yarnrc.yml b/.yarnrc.yml index 04e07131c23..95208cef2b3 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,9 +1,9 @@ nodeLinker: node-modules plugins: - - path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs - spec: "@yarnpkg/plugin-interactive-tools" - - path: .yarn/plugins/@yarnpkg/plugin-licenses.cjs - spec: "https://raw.githubusercontent.com/mhassan1/yarn-plugin-licenses/v0.7.2/bundles/@yarnpkg/plugin-licenses.js" + - path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs + spec: "@yarnpkg/plugin-interactive-tools" + - path: .yarn/plugins/@yarnpkg/plugin-licenses.cjs + spec: "https://raw.githubusercontent.com/mhassan1/yarn-plugin-licenses/v0.7.2/bundles/@yarnpkg/plugin-licenses.js" yarnPath: .yarn/releases/yarn-3.1.1.cjs diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index b478618dd81..4af9e11a4ca 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -8,19 +8,19 @@ In the interest of fostering an open and welcoming environment, we as contributo Examples of behavior that contributes to creating a positive environment include: -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members Examples of unacceptable behavior by participants include: -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting +- The use of sexualized language or imagery and unwelcome sexual attention or advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 82ef0d81c18..ecf27a88b26 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,14 +2,14 @@ Here are some quick and easy ways to get involved in the Vanilla Forums project. -* Troubleshoot issues you run into on the [community forum](https://open.vanillaforums.com/discussions) so everyone can help & reference it later. -* Improve our [public documentation](https://docs.vanillaforums.com/) by sending us suggested [edits as pull requests](https://github.com/vanilla/docs). -* File detailed [issues](https://github.com/vanilla/vanilla/issues) on GitHub (version number, what you did, and actual vs expected outcomes). -* Sign the [Contributors' Agreement](https://cla-assistant.io/vanilla/vanilla) to send us code. -* Create new pull requests against the `master` branch. -* Keep our to-do list fresh by reviewing our open issues for resolved or duplicated items. -* Got an idea or suggestion? Use the [community forum](https://open.vanillaforums.com/discussions) to discuss it. -* Identify broken addons in the [community directory](https://open.vanillaforums.com/addons). -* Improve our custom features on the community forum by helping in the [community repo](https://github.com/vanilla/community). +- Troubleshoot issues you run into on the [community forum](https://open.vanillaforums.com/discussions) so everyone can help & reference it later. +- Improve our [public documentation](https://docs.vanillaforums.com/) by sending us suggested [edits as pull requests](https://github.com/vanilla/docs). +- File detailed [issues](https://github.com/vanilla/vanilla/issues) on GitHub (version number, what you did, and actual vs expected outcomes). +- Sign the [Contributors' Agreement](https://cla-assistant.io/vanilla/vanilla) to send us code. +- Create new pull requests against the `master` branch. +- Keep our to-do list fresh by reviewing our open issues for resolved or duplicated items. +- Got an idea or suggestion? Use the [community forum](https://open.vanillaforums.com/discussions) to discuss it. +- Identify broken addons in the [community directory](https://open.vanillaforums.com/addons). +- Improve our custom features on the community forum by helping in the [community repo](https://github.com/vanilla/community). And add to and improve this list! diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 0609b1d6a5e..5cde3d32369 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,8 +1,8 @@ Please make sure these points are completed: -* [ ] Title is formatted in present imperative (ex: "Fix X by doing Y"). -* [ ] Title makes sense as a release note, not a literal technical description. -* [ ] An issue was filed, and this links to it. -* [ ] Any related PRs are cross-referenced via link. -* [ ] Your description tells the story of why _this_ is the right change. -* [ ] You list QA steps or testing criteria if appropriate. +- [ ] Title is formatted in present imperative (ex: "Fix X by doing Y"). +- [ ] Title makes sense as a release note, not a literal technical description. +- [ ] An issue was filed, and this links to it. +- [ ] Any related PRs are cross-referenced via link. +- [ ] Your description tells the story of why _this_ is the right change. +- [ ] You list QA steps or testing criteria if appropriate. diff --git a/addons/themes/keystone/KeystoneThemeHooks.php b/addons/themes/keystone/KeystoneThemeHooks.php index 8e3e4c70848..ef7c4d8fc11 100644 --- a/addons/themes/keystone/KeystoneThemeHooks.php +++ b/addons/themes/keystone/KeystoneThemeHooks.php @@ -15,8 +15,8 @@ /** * Class KeystoneThemeHooks */ -class KeystoneThemeHooks extends \Gdn_Plugin { - +class KeystoneThemeHooks extends \Gdn_Plugin +{ use TwigRenderTrait; /** @@ -24,8 +24,9 @@ class KeystoneThemeHooks extends \Gdn_Plugin { * * @return void */ - public function setup() { - saveToConfig([ 'Garden.MobileTheme' => 'keystone' ]); + public function setup() + { + saveToConfig(["Garden.MobileTheme" => "keystone"]); } /** @@ -35,25 +36,26 @@ public function setup() { * * @return void */ - public function base_render_before($sender) { - if (inSection('Dashboard')) { + public function base_render_before($sender) + { + if (inSection("Dashboard")) { return; } - $hasAdvancedSearch = class_exists('AdvancedSearchPlugin'); + $hasAdvancedSearch = class_exists("AdvancedSearchPlugin"); //set "hasAdvancedSearch" to smarty - $sender->setData('hasAdvancedSearch', $hasAdvancedSearch); + $sender->setData("hasAdvancedSearch", $hasAdvancedSearch); // For backwards compatibility in CustomizeTheme $imageUrl = BannerImageModel::getCurrentBannerImageLink(); - $sender->setData('heroImageUrl', $imageUrl); + $sender->setData("heroImageUrl", $imageUrl); //set ThemeOptions to smarty $themeOptions = c("Garden.ThemeOptions"); foreach ($themeOptions as $key => &$value) { - $sender->setData("ThemeOptions.".$key, $value); + $sender->setData("ThemeOptions." . $key, $value); } } @@ -62,7 +64,8 @@ public function base_render_before($sender) { * * @param \DiscussionsController $sender */ - public function discussionsController_render_before($sender) { + public function discussionsController_render_before($sender) + { $this->setSanitizedDescription($sender); } @@ -71,7 +74,8 @@ public function discussionsController_render_before($sender) { * * @param \CategoriesController $sender */ - public function categoriesController_render_before($sender) { + public function categoriesController_render_before($sender) + { $this->setSanitizedDescription($sender); } @@ -80,13 +84,14 @@ public function categoriesController_render_before($sender) { * * @param \Gdn_Controller $sender */ - private function setSanitizedDescription($sender) { - if ($sender->Data['_Description']) { + private function setSanitizedDescription($sender) + { + if ($sender->Data["_Description"]) { /** @var $htmlSanitizer */ $htmlSanitizer = \Gdn::getContainer()->get(\Vanilla\Formatting\Html\HtmlSanitizer::class); - $description = $htmlSanitizer->filter($sender->Data['_Description']); + $description = $htmlSanitizer->filter($sender->Data["_Description"]); } - $sender->setData('sanitizedDescription', $description); + $sender->setData("sanitizedDescription", $description); } /** @@ -96,9 +101,10 @@ private function setSanitizedDescription($sender) { * * @return void */ - public function settingsController_afterCustomStyles_handler($sender) { + public function settingsController_afterCustomStyles_handler($sender) + { $form = $sender->Form; - echo $this->renderTwig("@keystone/customStyles.twig", ['form' => new TwigFormWrapper($form)]); + echo $this->renderTwig("@keystone/customStyles.twig", ["form" => new TwigFormWrapper($form)]); } /** @@ -106,35 +112,37 @@ public function settingsController_afterCustomStyles_handler($sender) { * * @param \SettingsController $sender */ - public function settingsController_themeOptions_create($sender) { - $sender->permission('Garden.Settings.Manage'); + public function settingsController_themeOptions_create($sender) + { + $sender->permission("Garden.Settings.Manage"); $form = $sender->Form; - $sender->addJsFile('addons.js'); - $sender->setHighlightRoute('dashboard/settings/themeoptions'); + $sender->addJsFile("addons.js"); + $sender->setHighlightRoute("dashboard/settings/themeoptions"); $themeManager = \Gdn::themeManager(); - $sender->setData('ThemeInfo', $themeManager->enabledThemeInfo()); - $sender->setData('hasAdvancedSearch', class_exists('AdvancedSearchPlugin')); + $sender->setData("ThemeInfo", $themeManager->enabledThemeInfo()); + $sender->setData("hasAdvancedSearch", class_exists("AdvancedSearchPlugin")); //get toggle values from config $checkboxes = c("Garden.ThemeOptions.Options"); foreach ($checkboxes as $key => $value) { - $form->setValue("ThemeOptions.Options.".$key, $value); + $form->setValue("ThemeOptions.Options." . $key, $value); } if ($form->authenticatedPostBack()) { // Save the styles to the config. - $styleKey = $form->getFormValue('StyleKey'); + $styleKey = $form->getFormValue("StyleKey"); $configSaveData = [ - 'Garden.ThemeOptions.Styles.Key' => $styleKey, - 'Garden.ThemeOptions.Styles.Value' => $sender->data("ThemeInfo.Options.Styles.$styleKey.Basename")]; + "Garden.ThemeOptions.Styles.Key" => $styleKey, + "Garden.ThemeOptions.Styles.Value" => $sender->data("ThemeInfo.Options.Styles.$styleKey.Basename"), + ]; // Save the text to the locale. - foreach ($sender->data('ThemeInfo.Options.Text', []) as $key => $default) { - $value = $form->getFormValue($form->escapeFieldName('Text_'.$key)); + foreach ($sender->data("ThemeInfo.Options.Text", []) as $key => $default) { + $value = $form->getFormValue($form->escapeFieldName("Text_" . $key)); $configSaveData["ThemeOption.{$key}"] = $value; } @@ -147,24 +155,24 @@ public function settingsController_themeOptions_create($sender) { $sender->informMessage(t("Your changes have been saved.")); } - $sender->setData('ThemeOptions', c('Garden.ThemeOptions')); - $styleKey = $sender->data('ThemeOptions.Styles.Key'); + $sender->setData("ThemeOptions", c("Garden.ThemeOptions")); + $styleKey = $sender->data("ThemeOptions.Styles.Key"); if (!$form->isPostBack()) { - foreach ($sender->data('ThemeInfo.Options.Text', []) as $key => $options) { - $default = val('Default', $options, ''); - $value = c("ThemeOption.{$key}", '#DEFAULT#'); - if ($value === '#DEFAULT#') { + foreach ($sender->data("ThemeInfo.Options.Text", []) as $key => $options) { + $default = val("Default", $options, ""); + $value = c("ThemeOption.{$key}", "#DEFAULT#"); + if ($value === "#DEFAULT#") { $value = $default; } - $form->setValue($form->escapeFieldName('Text_'.$key), $value); + $form->setValue($form->escapeFieldName("Text_" . $key), $value); } } - $sender->setData('ThemeFolder', $themeManager->getEnabledDesktopThemeKey()); - $sender->title(t('Theme Options')); - $form->addHidden('StyleKey', $styleKey); + $sender->setData("ThemeFolder", $themeManager->getEnabledDesktopThemeKey()); + $sender->title(t("Theme Options")); + $form->addHidden("StyleKey", $styleKey); $sender->render(); } diff --git a/addons/themes/keystone/README.md b/addons/themes/keystone/README.md index 44faa9422e5..5d30130f71d 100644 --- a/addons/themes/keystone/README.md +++ b/addons/themes/keystone/README.md @@ -1,28 +1,30 @@ # Keystone - ## Description A responsive Vanilla theme with customization options. - ## Customizations -- Javascript to animate the open and close of the mobile navigation menu. -- Sets its own flyout open/close listeners. -- Dependency on the [theme-boilerplate](https://www.npmjs.com/package/@vanillaforums/theme-boilerplate). -- Overwrites the `themeOptions_create` to support `hasHeroBanner`, `hasFeatureSearchbox` and `panelToLeft` customized options. -- Custom options `hasHeroBanner`, `hasFeatureSearchbox` are dependent on the Hero Image Plugin. -- If Advanced Search Plugin is enabled, the theme will render advanced search module, otherwise, it will render the search module. +- Javascript to animate the open and close of the mobile navigation menu. +- Sets its own flyout open/close listeners. +- Dependency on the [theme-boilerplate](https://www.npmjs.com/package/@vanillaforums/theme-boilerplate). +- Overwrites the `themeOptions_create` to support `hasHeroBanner`, `hasFeatureSearchbox` and `panelToLeft` customized options. +- Custom options `hasHeroBanner`, `hasFeatureSearchbox` are dependent on the Hero Image Plugin. +- If Advanced Search Plugin is enabled, the theme will render advanced search module, otherwise, it will render the search module. ## Building Styles / Javascript / Images This theme is built with the [Vanilla Cli](https://docs.vanillaforums.com/developer/vanilla-cli/) and does not come with its own build toolchain. With that installed you can simply run: + ```bash vanilla build ``` + or + ```bash vanilla build --watch ``` + to build your styles/js/images. Documentation for the CLI can be found [here](https://docs.vanillaforums.com/developer/vanilla-cli/#build-tools). diff --git a/addons/themes/keystone/settings/configuration.php b/addons/themes/keystone/settings/configuration.php index 795a0242ff3..0586f39b424 100644 --- a/addons/themes/keystone/settings/configuration.php +++ b/addons/themes/keystone/settings/configuration.php @@ -5,12 +5,12 @@ * @license GPL-2.0-only */ -$Configuration['Garden']['MobileTheme'] = 'keystone'; -$Configuration['Badges']['BadgesModule']['Target'] = 'AfterUserInfo'; -$Configuration['Feature']['NewFlyouts']['Enabled'] = true; -$Configuration['Garden']['ThemeOptions']['Styles']['Key'] = 'Default'; -$Configuration['Garden']['ThemeOptions']['Styles']['Value'] = '%s_default'; -$Configuration['Garden']['ThemeOptions']['Options']['hasHeroBanner'] = false; -$Configuration['Garden']['ThemeOptions']['Options']['hasFeatureSearchbox'] = false; -$Configuration['Garden']['ThemeOptions']['Options']['panelToLeft'] = false; -$Configuration['Feature']['DataDrivenTitleBar']['Enabled'] = false; +$Configuration["Garden"]["MobileTheme"] = "keystone"; +$Configuration["Badges"]["BadgesModule"]["Target"] = "AfterUserInfo"; +$Configuration["Feature"]["NewFlyouts"]["Enabled"] = true; +$Configuration["Garden"]["ThemeOptions"]["Styles"]["Key"] = "Default"; +$Configuration["Garden"]["ThemeOptions"]["Styles"]["Value"] = "%s_default"; +$Configuration["Garden"]["ThemeOptions"]["Options"]["hasHeroBanner"] = false; +$Configuration["Garden"]["ThemeOptions"]["Options"]["hasFeatureSearchbox"] = false; +$Configuration["Garden"]["ThemeOptions"]["Options"]["panelToLeft"] = false; +$Configuration["Feature"]["DataDrivenTitleBar"]["Enabled"] = false; diff --git a/addons/themes/keystone/src/scss/base/_variables.scss b/addons/themes/keystone/src/scss/base/_variables.scss index 2fb91098237..cf9d47e8a71 100644 --- a/addons/themes/keystone/src/scss/base/_variables.scss +++ b/addons/themes/keystone/src/scss/base/_variables.scss @@ -8,395 +8,401 @@ Brand Colors \* -------------------------------------------------------------- */ -$global-color_vanillaBlue: #0291DB; -$global-color_pink: #D0021B; -$global-color_grey: #555A62; -$global-color_whitesmoke: #BCBEC1; +@use "sass:math"; -$global-color_black: #000; -$global-color_white: #fff; -$global-color_transparent: transparent; +$global-color_vanillaBlue: #0291db; +$global-color_pink: #d0021b; +$global-color_grey: #555a62; +$global-color_whitesmoke: #bcbec1; + +$global-color_black: #000; +$global-color_white: #fff; +$global-color_transparent: transparent; /* -------------------------------------------------------------- *\ Utility Variables \* -------------------------------------------------------------- */ -$utility-baseUnit: 6px; -$utility-baseUnitHalf: $utility-baseUnit / 2; // Derived -$utility-baseUnitDouble: $utility-baseUnit * 2; // Derived -$utility-baseUnitTriple: $utility-baseUnit * 3; // Derived -$utility-percentage_third: (100% / 3); -$utility-percentage_nineSixteenths: (9 / 16 * 100%); -$utility-SVGEncoding: "data:image/svg+xml,"; +$utility-baseUnit: 6px; +$utility-baseUnitHalf: $utility-baseUnit * 0.5; // Derived +$utility-baseUnitDouble: $utility-baseUnit * 2; // Derived +$utility-baseUnitTriple: $utility-baseUnit * 3; // Derived +$utility-percentage_third: math.div(100%, 3); +$utility-percentage_nineSixteenths: (math.div(9, 16) * 100%); +$utility-SVGEncoding: "data:image/svg+xml,"; /* -------------------------------------------------------------- *\ Global Font \* -------------------------------------------------------------- */ -$global-normal_fontWeight: 400 !default; -$global-semibold_fontWeight: 600 !default; -$global-bold_fontWeight: 700 !default; +$global-normal_fontWeight: 400 !default; +$global-semibold_fontWeight: 600 !default; +$global-bold_fontWeight: 700 !default; -$global-heading_fontFamily: "Open Sans", HelveticaNeue-Light, "Segoe UI", "Helvetica Neue", Helvetica, Raleway, Arial, sans-serif !default; -$global-heading_fontWeight: $global-bold_fontWeight !default; +$global-heading_fontFamily: "Open Sans", HelveticaNeue-Light, "Segoe UI", "Helvetica Neue", Helvetica, Raleway, Arial, + sans-serif !default; +$global-heading_fontWeight: $global-bold_fontWeight !default; -$global-body_fontFamily: "Open Sans", "Segoe UI", "Helvetica Neue", Helvetica, Raleway, Arial, sans-serif !default; -$global-body_fontWeight: $global-normal_fontWeight !default; +$global-body_fontFamily: "Open Sans", "Segoe UI", "Helvetica Neue", Helvetica, Raleway, Arial, sans-serif !default; +$global-body_fontWeight: $global-normal_fontWeight !default; -$global-large_fontSize: 16px !default; -$global-medium_fontSize: 14px !default; -$global-small_fontSize: 12px !default; +$global-large_fontSize: 16px !default; +$global-medium_fontSize: 14px !default; +$global-small_fontSize: 12px !default; -$global-title_fontSize: 32px !default; -$global-smallTitle_fontSize: 20px !default; -$global-title_mobile_fontSize: 26px !default; -$global-subTitle_fontSize: 18px !default; +$global-title_fontSize: 32px !default; +$global-smallTitle_fontSize: 20px !default; +$global-title_mobile_fontSize: 26px !default; +$global-subTitle_fontSize: 18px !default; -$global-base_lineHeight: 1.5 !default; -$global-condensed_lineHeight: 1.25 !default; +$global-base_lineHeight: 1.5 !default; +$global-condensed_lineHeight: 1.25 !default; /* -------------------------------------------------------------- *\ User Content \* -------------------------------------------------------------- */ -$userContent_fontSize: $global-medium_fontSize !default; // 14 for forums, but 16 for KB +$userContent_fontSize: $global-medium_fontSize !default; // 14 for forums, but 16 for KB -$userContent-fontSizeH1: 2em !default; -$userContent-fontSizeH2: 1.5em !default; -$userContent-fontSizeH3: 1.25em !default; -$userContent-fontSizeH4: 1em !default; -$userContent-fontSizeH5: .875em !default; -$userContent-fontSizeH6: .85em !default; +$userContent-fontSizeH1: 2em !default; +$userContent-fontSizeH2: 1.5em !default; +$userContent-fontSizeH3: 1.25em !default; +$userContent-fontSizeH4: 1em !default; +$userContent-fontSizeH5: 0.875em !default; +$userContent-fontSizeH6: 0.85em !default; /* -------------------------------------------------------------- *\ Global Overwrites \* -------------------------------------------------------------- */ -$global-heading_topMargin: 1.5 * $global-medium_fontSize; -$global-block_margin: $userContent_fontSize !default; - -$global_spacer: $userContent_fontSize * $global-base_lineHeight !default; -$global-default_timing: 0.35s !default; +$global-heading_topMargin: 1.5 * $global-medium_fontSize; +$global-block_margin: $userContent_fontSize !default; -$global-color_primary: $global-color_vanillaBlue !default; -$global-color_primaryAlt: darken($global-color_primary, 8%) !default; -$global-color_secondary: $global-color_pink !default; +$global_spacer: $userContent_fontSize * $global-base_lineHeight !default; +$global-default_timing: 0.35s !default; -$global-color_bg: $global-color_white !default; -$global-color_fg: $global-color_grey !default; // text color | should have high contrast between $global-color_bg +$global-color_primary: $global-color_vanillaBlue !default; +$global-color_primaryAlt: darken($global-color_primary, 8%) !default; +$global-color_secondary: $global-color_pink !default; -$global-border_color: mix($global-color_fg, $global-color_bg, 24%) !default; // Note it's off by default due to the border width -$global-border-width: 1px; -$global-border-style: solid; -$global_borderRadius: 6px !default; +$global-color_bg: $global-color_white !default; +$global-color_fg: $global-color_grey !default; // text color | should have high contrast between $global-color_bg -$global-body_bg: $global-color_bg !default; +$global-border_color: mix( + $global-color_fg, + $global-color_bg, + 24% +) !default; // Note it's off by default due to the border width +$global-border-width: 1px; +$global-border-style: solid; +$global_borderRadius: 6px !default; -$link-default_color: $global-color_primary !default; -$link-default-hover_color: $global-color_primary !default; -$link-default_visited_color: $global-color_primary !default; +$global-body_bg: $global-color_bg !default; +$link-default_color: $global-color_primary !default; +$link-default-hover_color: $global-color_primary !default; +$link-default_visited_color: $global-color_primary !default; /* -------------------------------------------------------------- *\ Theme Colors \* -------------------------------------------------------------- */ -$theme-border_color: mix($global-color_fg, $global-color_bg, 24%) !default; -$theme-hover_color: mix($global-color_fg, $global-color_bg, 6%) !default; +$theme-border_color: mix($global-color_fg, $global-color_bg, 24%) !default; +$theme-hover_color: mix($global-color_fg, $global-color_bg, 6%) !default; -$theme-link-hover_textDecoration: none !default; +$theme-link-hover_textDecoration: none !default; -$theme-heading_color: $global-color_primary !default; -$theme-heading-hover_color: $global-color_primary !default; +$theme-heading_color: $global-color_primary !default; +$theme-heading-hover_color: $global-color_primary !default; /* -------------------------------------------------------------- *\ Buttons Colors \* -------------------------------------------------------------- */ -$button-basic_fg: $global-color_grey !default; -$button-basic_bg: transparent !default; -$button-basic_border: $global-color_whitesmoke !default; +$button-basic_fg: $global-color_grey !default; +$button-basic_bg: transparent !default; +$button-basic_border: $global-color_whitesmoke !default; -$button-basic-hover_fg: $global-color_primary !default; -$button-basic-hover_bg: transparent !default; -$button-basic-hover_border: $global-color_primary !default; +$button-basic-hover_fg: $global-color_primary !default; +$button-basic-hover_bg: transparent !default; +$button-basic-hover_border: $global-color_primary !default; -$button-primary_fg: $global-color_white !default; -$button-primary_bg: $global-color_primary !default; -$button-primary_border: $global-color_primary !default; +$button-primary_fg: $global-color_white !default; +$button-primary_bg: $global-color_primary !default; +$button-primary_border: $global-color_primary !default; -$button-primary-hover_fg: $global-color_white !default; -$button-primary-hover_bg: $global-color_primaryAlt !default; -$button-primary-hover_border: $global-color_primaryAlt !default; +$button-primary-hover_fg: $global-color_white !default; +$button-primary-hover_bg: $global-color_primaryAlt !default; +$button-primary-hover_border: $global-color_primaryAlt !default; /* -------------------------------------------------------------- *\ Icons \* -------------------------------------------------------------- */ -$icon-large_size: 32px !default; -$icon-default_size: 20px !default; -$icon-small_size: 16px !default; +$icon-large_size: 32px !default; +$icon-default_size: 20px !default; +$icon-small_size: 16px !default; /* -------------------------------------------------------------- *\ Theme User Photos \* -------------------------------------------------------------- */ -$theme-photo_size: 42px !default; -$theme-photo-small_size: 38px !default; -$theme-photo_round: true !default; -$theme-photo_borderRadius: $global_borderRadius !default; +$theme-photo_size: 42px !default; +$theme-photo-small_size: 38px !default; +$theme-photo_round: true !default; +$theme-photo_borderRadius: $global_borderRadius !default; -$theme_stickFooter: true !default; +$theme_stickFooter: true !default; /* -------------------------------------------------------------- *\ Links \* -------------------------------------------------------------- */ -$link-body_fontFamily: $global-body_fontFamily !default; -$link-body_fontWeight: $global-normal_fontWeight !default; -$link-body_fontSize: $global-medium_fontSize !default; +$link-body_fontFamily: $global-body_fontFamily !default; +$link-body_fontWeight: $global-normal_fontWeight !default; +$link-body_fontSize: $global-medium_fontSize !default; -$link-heading_fontFamily: $global-body_fontFamily !default; -$link-heading_fontWeight: $global-bold_fontWeight !default; -$link-heading_fontSize: $global-large_fontSize !default; +$link-heading_fontFamily: $global-body_fontFamily !default; +$link-heading_fontWeight: $global-bold_fontWeight !default; +$link-heading_fontSize: $global-large_fontSize !default; /* -------------------------------------------------------------- *\ Layout \* -------------------------------------------------------------- */ -$global-gutter_size: $global_spacer; -$global-gutter_halfSize: $global-gutter_size / 2; -$global-gutter_quarterSize: $global-gutter_size / 4; +$global-gutter_size: $global_spacer; +$global-gutter_halfSize: $global-gutter_size * 0.5; +$global-gutter_quarterSize: $global-gutter_size * 0.25; /* -------------------------------------------------------------- *\ Body \* -------------------------------------------------------------- */ -$body_bg: $global-body_bg !default; -$body_backgroundImage: "" !default; -$body_backgroundRepeat: no-repeat !default; -$body_backgroundSize: cover !default; -$body_backgroundPosition: center center !default; +$body_bg: $global-body_bg !default; +$body_backgroundImage: "" !default; +$body_backgroundRepeat: no-repeat !default; +$body_backgroundSize: cover !default; +$body_backgroundPosition: center center !default; /* -------------------------------------------------------------- *\ Frame \* -------------------------------------------------------------- */ -$count_borderRadius: 20px !default; -$frame_bg: transparent !default; -$frame_border: none !default; -$frame_boxShadow: none !default; -$frame_padding: $utility-baseUnitTriple !default; -$frame-mobile_padding: $utility-baseUnitDouble !default; +$count_borderRadius: 20px !default; +$frame_bg: transparent !default; +$frame_border: none !default; +$frame_boxShadow: none !default; +$frame_padding: $utility-baseUnitTriple !default; +$frame-mobile_padding: $utility-baseUnitDouble !default; /* -------------------------------------------------------------- *\ Header \* -------------------------------------------------------------- */ -$header_minHeight: 48px !default; -$header_bg: $global-color_primary !default; -$header_fg: $global-color_white !default; -$header-link_color: $global-color_white !default; -$header-link-hover_color: $global-color_white !default; -$header_border: 0 !default; -$header_boxShadow: none !default; +$header_minHeight: 48px !default; +$header_bg: $global-color_primary !default; +$header_fg: $global-color_white !default; +$header-link_color: $global-color_white !default; +$header-link-hover_color: $global-color_white !default; +$header_border: 0 !default; +$header_boxShadow: none !default; -$headerButton_bg: transparent !default; -$headerButton_fg: $header-link_color !default; -$headerButton_borderColor: $header-link_color !default; +$headerButton_bg: transparent !default; +$headerButton_fg: $header-link_color !default; +$headerButton_borderColor: $header-link_color !default; -$headerButton-hover_bg: mix($header-link_color, $header_bg, 12%) !default; -$headerButton-hover_fg: $header-link_color !default; -$headerButton-hover_borderColor: $header-link_color !default; +$headerButton-hover_bg: mix($header-link_color, $header_bg, 12%) !default; +$headerButton-hover_fg: $header-link_color !default; +$headerButton-hover_borderColor: $header-link_color !default; -$headerMebutton_bg: transparent !default; -$headerMebutton_fg: $header-link_color !default; -$headerMebutton-hover_fg: $header-link_color !default; -$headerMebutton-hover_bg: mix($global-color_fg, $header_bg, 26%) !default; -$headerMebutton-active_bg: mix($headerMebutton_fg, $header_bg, 12%) !default; +$headerMebutton_bg: transparent !default; +$headerMebutton_fg: $header-link_color !default; +$headerMebutton-hover_fg: $header-link_color !default; +$headerMebutton-hover_bg: mix($global-color_fg, $header_bg, 26%) !default; +$headerMebutton-active_bg: mix($headerMebutton_fg, $header_bg, 12%) !default; -$headerMeBoxAlert_fg: $headerMebutton_fg !default; -$headerMeBoxAlert_bg: $global-color_secondary !default; -$headerMeBoxAlert_borderColor: $global-color_secondary !default; +$headerMeBoxAlert_fg: $headerMebutton_fg !default; +$headerMeBoxAlert_bg: $global-color_secondary !default; +$headerMeBoxAlert_borderColor: $global-color_secondary !default; /* -------------------------------------------------------------- *\ Navigation \* -------------------------------------------------------------- */ -$navigation_bg: $global-color_bg !default; -$navigation_fg: $global-color_fg !default; -$navigation-boxShadow: 0 5px 10px 0 rgba(0,0,0,0.30); -$navigation-hover_fg: $global-color_primary !default; -$navigation_border: darken($navigation_bg, 8%)!default; -$navigation_borderRadius: $global_borderRadius !default; -$navigation_fontSize: $global-large_fontSize !default; -$navigation_paddingSide: $utility-baseUnitDouble !default; -$navigation_vertical_paddingSide: 0 !default; -$navigation-item_height: 32px !default; -$navigation-item_fontWeight: $global-normal_fontWeight !default; -$navigation-easing-transition: cubic-bezier(0, 1, 0, 1) !default; - -$navigationButton_bg: $button-primary_bg !default; -$navigationButton_fg: $button-primary_fg !default; -$navigationButton_border: $button-primary_border !default; - -$navigationButton-hover_bg: $button-primary-hover_bg !default; -$navigationButton-hover_fg: $button-primary-hover_fg !default; -$navigationButton-hover_border: $button-primary-hover_border !default; +$navigation_bg: $global-color_bg !default; +$navigation_fg: $global-color_fg !default; +$navigation-boxShadow: 0 5px 10px 0 rgba(0, 0, 0, 0.3); +$navigation-hover_fg: $global-color_primary !default; +$navigation_border: darken($navigation_bg, 8%) !default; +$navigation_borderRadius: $global_borderRadius !default; +$navigation_fontSize: $global-large_fontSize !default; +$navigation_paddingSide: $utility-baseUnitDouble !default; +$navigation_vertical_paddingSide: 0 !default; +$navigation-item_height: 32px !default; +$navigation-item_fontWeight: $global-normal_fontWeight !default; +$navigation-easing-transition: cubic-bezier(0, 1, 0, 1) !default; + +$navigationButton_bg: $button-primary_bg !default; +$navigationButton_fg: $button-primary_fg !default; +$navigationButton_border: $button-primary_border !default; + +$navigationButton-hover_bg: $button-primary-hover_bg !default; +$navigationButton-hover_fg: $button-primary-hover_fg !default; +$navigationButton-hover_border: $button-primary-hover_border !default; /* -------------------------------------------------------------- *\ Mobile Mebox \* -------------------------------------------------------------- */ -$MobileMeBox_bg: mix($global-color_white, $header_bg, 12%) !default; -$MobileMeBox_fg: $header-link_color !default; -$MobileMeBox-hover_fg: $header-link-hover_color !default; +$MobileMeBox_bg: mix($global-color_white, $header_bg, 12%) !default; +$MobileMeBox_fg: $header-link_color !default; +$MobileMeBox-hover_fg: $header-link-hover_color !default; -$MobileMeBoxAlert_fg: $MobileMeBox_fg !default; -$MobileMeBoxAlert_bg: $global-color_secondary !default; -$MobileMeBoxAlert_borderColor: $global-color_secondary !default; +$MobileMeBoxAlert_fg: $MobileMeBox_fg !default; +$MobileMeBoxAlert_bg: $global-color_secondary !default; +$MobileMeBoxAlert_borderColor: $global-color_secondary !default; /* -------------------------------------------------------------- *\ Content \* -------------------------------------------------------------- */ -$content_bg: transparent !default; -$content_border: none !default; -$content_padding: 0 !default; -$content_borderRadius: 0 !default; +$content_bg: transparent !default; +$content_border: none !default; +$content_padding: 0 !default; +$content_borderRadius: 0 !default; /* -------------------------------------------------------------- *\ Panel \* -------------------------------------------------------------- */ -$panel_toLeft: false !default; -$panel_width: 220px !default; -$panel_gap: 40px !default; -$panel_bg: $content_bg !default; -$panel_fg: $global-color_fg !default; -$panel_padding: $content_padding !default; -$panel-border: $content_border !default; -$panel_borderRadius: $content_borderRadius !default; +$panel_toLeft: false !default; +$panel_width: 220px !default; +$panel_gap: 40px !default; +$panel_bg: $content_bg !default; +$panel_fg: $global-color_fg !default; +$panel_padding: $content_padding !default; +$panel-border: $content_border !default; +$panel_borderRadius: $content_borderRadius !default; -$panel-item-showIcons: false !default; -$panel-item_spacing: 0 !default; -$panel-item_borderRadius: $global_borderRadius !default; -$panel-item_padding: 5px !default; +$panel-item-showIcons: false !default; +$panel-item_spacing: 0 !default; +$panel-item_borderRadius: $global_borderRadius !default; +$panel-item_padding: 5px !default; -$panel-item_bg: transparent !default; -$panel-item_fg: $link-default_color !default; -$panel-item_border: none !default; +$panel-item_bg: transparent !default; +$panel-item_fg: $link-default_color !default; +$panel-item_border: none !default; -$panel-item-hover_bg: transparent !default; -$panel-item-hover_fg: $global-color_primary !default; -$panel-item-hover_border: $panel-item_border !default; +$panel-item-hover_bg: transparent !default; +$panel-item-hover_fg: $global-color_primary !default; +$panel-item-hover_border: $panel-item_border !default; /* -------------------------------------------------------------- *\ Footer \* -------------------------------------------------------------- */ -$footer_bg: $theme-hover_color !default; -$footer_color: $global-color_fg !default; -$footer-link_color: $global-color_primary !default; -$footer-link-hover_color: $global-color_primaryAlt !default; -$footer-base_fontSize: $global-medium_fontSize !default; -$footer-base_lineHeight: $global-base_lineHeight !default; +$footer_bg: $theme-hover_color !default; +$footer_color: $global-color_fg !default; +$footer-link_color: $global-color_primary !default; +$footer-link-hover_color: $global-color_primaryAlt !default; +$footer-base_fontSize: $global-medium_fontSize !default; +$footer-base_lineHeight: $global-base_lineHeight !default; /* -------------------------------------------------------------- *\ Components \* -------------------------------------------------------------- */ -$component-item_spacing: 0 !default; -$component-vertical_padding: 16px !default; -$component-horizontal_padding: 8px !default; -$component-base_padding: #{$component-vertical_padding} #{$component-horizontal_padding} !default; -$component_bg: $content_bg !default; -$component_borderWidth: 1px !default; -$component_lateralBorder: false !default; -$component_borderColor: $theme-border_color !default; -$component_border: #{$theme-border_color} #{$component_borderWidth} solid !default; -$component_boxShadow: none !default; -$component_borderRadius: 0 !default; - -$component-header_bg: transparent !default; - -$component-base_color: $global-color_fg !default; -$component-base_fontSize: $global-medium_fontSize !default; -$component-base_fontWeight: $global-normal_fontWeight !default; -$component-base_lineHeight: $global-base_lineHeight !default; - -$component-title_color: $global-color_fg !default; -$component-title-hover_color: $global-color_primary !default; -$component-title_fontSize: $global-large_fontSize !default; -$component-title_fontWeight: $global-semibold_fontWeight !default; -$component-title_lineHeight: $global-base_lineHeight !default; - -$component-meta_color: mix($global-color_bg, $global-color_fg, 12%) !default; -$component-meta-link_color: $component-meta_color !default; -$component-meta-link-hover_color: $theme-heading-hover_color !default; -$component-meta_fontSize: $global-small_fontSize !default; -$component-meta_fontWeight: $global-normal_fontWeight !default; -$component-meta_lineHeight: $global-base_lineHeight !default; +$component-item_spacing: 0 !default; +$component-vertical_padding: 16px !default; +$component-horizontal_padding: 8px !default; +$component-base_padding: #{$component-vertical_padding} #{$component-horizontal_padding} !default; +$component_bg: $content_bg !default; +$component_borderWidth: 1px !default; +$component_lateralBorder: false !default; +$component_borderColor: $theme-border_color !default; +$component_border: #{$theme-border_color} #{$component_borderWidth} solid !default; +$component_boxShadow: none !default; +$component_borderRadius: 0 !default; + +$component-header_bg: transparent !default; + +$component-base_color: $global-color_fg !default; +$component-base_fontSize: $global-medium_fontSize !default; +$component-base_fontWeight: $global-normal_fontWeight !default; +$component-base_lineHeight: $global-base_lineHeight !default; + +$component-title_color: $global-color_fg !default; +$component-title-hover_color: $global-color_primary !default; +$component-title_fontSize: $global-large_fontSize !default; +$component-title_fontWeight: $global-semibold_fontWeight !default; +$component-title_lineHeight: $global-base_lineHeight !default; + +$component-meta_color: mix($global-color_bg, $global-color_fg, 12%) !default; +$component-meta-link_color: $component-meta_color !default; +$component-meta-link-hover_color: $theme-heading-hover_color !default; +$component-meta_fontSize: $global-small_fontSize !default; +$component-meta_fontWeight: $global-normal_fontWeight !default; +$component-meta_lineHeight: $global-base_lineHeight !default; /* -------------------------------------------------------------- *\ Form Elements \* -------------------------------------------------------------- */ -$formElement_height: $utility-baseUnit * 6; -$formElement_paddingVertical: $utility-baseUnitHalf !default; -$formElement_paddingHorizontal: $utility-baseUnitDouble !default; -$formElement_color: $global-color_black !default; -$formElement_borderColor: lighten($global-color_black, 60%) !default; -$formElement_placeholderColor: $formElement_borderColor !default; -$formElement_border: 1px solid $formElement_borderColor !default; -$formElement_fontSize: $global-medium_fontSize !default; -$formElement_fontWeight: $global-medium_fontSize !default; -$formElement_borderRadius: $global_borderRadius !default; +$formElement_height: $utility-baseUnit * 6; +$formElement_paddingVertical: $utility-baseUnitHalf !default; +$formElement_paddingHorizontal: $utility-baseUnitDouble !default; +$formElement_color: $global-color_black !default; +$formElement_borderColor: lighten($global-color_black, 60%) !default; +$formElement_placeholderColor: $formElement_borderColor !default; +$formElement_border: 1px solid $formElement_borderColor !default; +$formElement_fontSize: $global-medium_fontSize !default; +$formElement_fontWeight: $global-medium_fontSize !default; +$formElement_borderRadius: $global_borderRadius !default; /* -------------------------------------------------------------- *\ Form Buttons \* -------------------------------------------------------------- */ -$formButton_bg: $button-primary_bg !default; -$formButton-hover_bg: $button-primary_hover_fg !default; -$formButton_color: $button-primary_fg !default; -$formButton_fontFamily: $global-body_fontFamily !default; -$formButton_fontWeight: $global-normal_fontWeight !default; -$formButton_fontSize: $global-medium_fontSize !default; -$formButton_maxWidth: 360px !default; -$formButton_padding: $utility-baseUnitDouble !default; -$formButton_height: $formElement_height !default; -$formButton_borderRadius: $formElement_borderRadius !default; -$formButton_border: 1px solid !default; +$formButton_bg: $button-primary_bg !default; +$formButton-hover_bg: $button-primary_hover_fg !default; +$formButton_color: $button-primary_fg !default; +$formButton_fontFamily: $global-body_fontFamily !default; +$formButton_fontWeight: $global-normal_fontWeight !default; +$formButton_fontSize: $global-medium_fontSize !default; +$formButton_maxWidth: 360px !default; +$formButton_padding: $utility-baseUnitDouble !default; +$formButton_height: $formElement_height !default; +$formButton_borderRadius: $formElement_borderRadius !default; +$formButton_border: 1px solid !default; /* -------------------------------------------------------------- *\ HeroBanner \* -------------------------------------------------------------- */ -$herobanner_height: 370px !default; -$herobanner_bg: #3F3E46 !default; -$herobanner_fg: $global-color_white !default; -$herobanner_dropShadow: 0 0 1px $global-color_fg !default; -$herobanner_bgFilter: 0.75 !default; -$herobanner_fontSize: 48px !default; +$herobanner_height: 370px !default; +$herobanner_bg: #3f3e46 !default; +$herobanner_fg: $global-color_white !default; +$herobanner_dropShadow: 0 0 1px $global-color_fg !default; +$herobanner_bgFilter: 0.75 !default; +$herobanner_fontSize: 48px !default; /* -------------------------------------------------------------- *\ Searchbox Featured \* -------------------------------------------------------------- */ -$SearchboxFeaturedBtn_fg: $global-color_white !default; -$SearchboxFeaturedBtn_bg: transparent !default; -$SearchboxFeatured_height: 40px !default; -$SearchboxFeatured_width: 673px !default; -$SearchboxFeatured_border: 1px solid $global-color_white !default; +$SearchboxFeaturedBtn_fg: $global-color_white !default; +$SearchboxFeaturedBtn_bg: transparent !default; +$SearchboxFeatured_height: 40px !default; +$SearchboxFeatured_width: 673px !default; +$SearchboxFeatured_border: 1px solid $global-color_white !default; /* -------------------------------------------------------------- *\ Breakpoints \* -------------------------------------------------------------- */ -$theme-breakpoint_smallMobile: 350px !default; -$theme-breakpoint_mobile: 410px !default; -$theme-breakpoint_smallTable: 768px !default; -$theme-breakpoint_tablet: 992px !default; +$theme-breakpoint_smallMobile: 350px !default; +$theme-breakpoint_mobile: 410px !default; +$theme-breakpoint_smallTable: 768px !default; +$theme-breakpoint_tablet: 992px !default; -$theme-breakpoint_base: $theme-breakpoint_smallTable !default; +$theme-breakpoint_base: $theme-breakpoint_smallTable !default; diff --git a/addons/themes/keystone/src/scss/base/_variables_cerulean.scss b/addons/themes/keystone/src/scss/base/_variables_cerulean.scss index 10ec4ece544..ed81aa409bf 100644 --- a/addons/themes/keystone/src/scss/base/_variables_cerulean.scss +++ b/addons/themes/keystone/src/scss/base/_variables_cerulean.scss @@ -8,111 +8,116 @@ Utility Variables \* -------------------------------------------------------------- */ -$utility-baseUnit: 6px; -$utility-baseUnitHalf: $utility-baseUnit / 2; // Derived -$utility-baseUnitDouble: $utility-baseUnit * 2; // Derived -$utility-baseUnitTriple: $utility-baseUnit * 3; // Derived -$utility-percentage_third: (100% / 3); -$utility-percentage_nineSixteenths: (9 / 16 * 100%); -$utility-SVGEncoding: "data:image/svg+xml,"; +@use "sass:math"; + +$utility-baseUnit: 6px; +$utility-baseUnitHalf: $utility-baseUnit * 0.5; // Derived +$utility-baseUnitDouble: $utility-baseUnit * 2; // Derived +$utility-baseUnitTriple: $utility-baseUnit * 3; // Derived +$utility-percentage_third: math.div(100%, 3); +$utility-percentage_nineSixteenths: (math.div(9, 16) * 100%); +$utility-SVGEncoding: "data:image/svg+xml,"; /* -------------------------------------------------------------- *\ Global Overwrites \* -------------------------------------------------------------- */ -$global_borderRadius: 4px !default; +$global_borderRadius: 4px !default; -$global-color_black: #000; -$global-color_white: #FFF; -$global-color_transparent: transparent; +$global-color_black: #000; +$global-color_white: #fff; +$global-color_transparent: transparent; -$global-color_cerulean: #6B7A8F; -$global-color_apricot: #E77A2F; -$global-color_powderblue: #3d8ac1; +$global-color_cerulean: #6b7a8f; +$global-color_apricot: #e77a2f; +$global-color_powderblue: #3d8ac1; -$global-color_primary: $global-color_powderblue !default; -$global-color_primaryAlt: darken($global-color_primary, 8%) !default; -$global-color_secondary: $global-color_apricot !default; +$global-color_primary: $global-color_powderblue !default; +$global-color_primaryAlt: darken($global-color_primary, 8%) !default; +$global-color_secondary: $global-color_apricot !default; -$global-color_bg: $global-color_white !default; -$global-color_fg: darken(desaturate($global-color_cerulean, 1%), 10%) !default; // text color | should have high contrast between $global-color_bg -$global-medium_fontSize: 14px !default; -$global-block_margin: $global-medium_fontSize !default; +$global-color_bg: $global-color_white !default; +$global-color_fg: darken( + desaturate($global-color_cerulean, 1%), + 10% +) !default; // text color | should have high contrast between $global-color_bg +$global-medium_fontSize: 14px !default; +$global-block_margin: $global-medium_fontSize !default; /* -------------------------------------------------------------- *\ Theme \* -------------------------------------------------------------- */ -$theme-border_color: mix($global-color_fg, $global-color_bg, 24%) !default; +$theme-border_color: mix($global-color_fg, $global-color_bg, 24%) !default; -$theme-link-hover_textDecoration: underline !default; -$theme-photo_size: 52px !default; +$theme-link-hover_textDecoration: underline !default; +$theme-photo_size: 52px !default; /* -------------------------------------------------------------- *\ Header \* -------------------------------------------------------------- */ -$header_minHeight: 50px !default; -$header_bg: $global-color_cerulean !default; -$header_color: $global-color_white !default; -$header-hover_color: $global-color_white !default; -$header_border: 1px solid rgba($header_bg, .3) !default; +$header_minHeight: 50px !default; +$header_bg: $global-color_cerulean !default; +$header_color: $global-color_white !default; +$header-hover_color: $global-color_white !default; +$header_border: 1px solid rgba($header_bg, 0.3) !default; /* -------------------------------------------------------------- *\ Navigation \* -------------------------------------------------------------- */ -$navigation_fg: $global-color_white !default; +$navigation_fg: $global-color_white !default; /* -------------------------------------------------------------- *\ Panel \* -------------------------------------------------------------- */ -$panel-hover_bg: transparent !default; +$panel-hover_bg: transparent !default; -$panel_item-spacing: $utility-baseUnit !default; -$panel-item_padding: $utility-baseUnit !default; -$panel_item-borderRadius: $global_borderRadius !default; +$panel_item-spacing: $utility-baseUnit !default; +$panel-item_padding: $utility-baseUnit !default; +$panel_item-borderRadius: $global_borderRadius !default; /* -------------------------------------------------------------- *\ Footer \* -------------------------------------------------------------- */ -$footer_bg: $global-color_white !default; -$footer_color: $global-color_fg !default; -$footer-link_color: $global-color_secondary !default; -$footer-link-hover_color: darken($global-color_secondary, 8%) !default; +$footer_bg: $global-color_white !default; +$footer_color: $global-color_fg !default; +$footer-link_color: $global-color_secondary !default; +$footer-link-hover_color: darken($global-color_secondary, 8%) !default; /* -------------------------------------------------------------- *\ Navigation \* -------------------------------------------------------------- */ -$navigation_bg: darken($global-color_cerulean, 8%) !default; -$navigation_color: $global-color_white !default; -$navigation_button-bg: $global-color_primary !default; -$navigation_button-hover-bg: $global-color_primaryAlt !default; +$navigation_bg: darken($global-color_cerulean, 8%) !default; +$navigation_color: $global-color_white !default; +$navigation_button-bg: $global-color_primary !default; +$navigation_button-hover-bg: $global-color_primaryAlt !default; /* -------------------------------------------------------------- *\ Hamburger \* -------------------------------------------------------------- */ -$hamburger_color: $global-color_white !default; +$hamburger_color: $global-color_white !default; /* -------------------------------------------------------------- *\ Components \* -------------------------------------------------------------- */ -$component-vertical_padding: $global-block_margin !default; -$component-horizontal_padding: $global-block_margin !default; -$component_lateralBorder: true !default; -$component-item_spacing: $utility-baseUnitDouble !default; -$component_borderWidth: 0 !default; -$component_borderRadius: $global_borderRadius !default; -$component_borderColor: $theme-border_color !default; -$component_boxShadow: 0 1px 4px 0 rgba(0,0,0, .3) !default; +$component-vertical_padding: $global-block_margin !default; +$component-horizontal_padding: $global-block_margin !default; +$component_lateralBorder: true !default; +$component-item_spacing: $utility-baseUnitDouble !default; +$component_borderWidth: 0 !default; +$component_borderRadius: $global_borderRadius !default; +$component_borderColor: $theme-border_color !default; +$component_boxShadow: 0 1px 4px 0 rgba(0, 0, 0, 0.3) !default; /* -------------------------------------------------------------- *\ Pager \* -------------------------------------------------------------- */ -$pager_border: 1px solid $component_borderColor !default; +$pager_border: 1px solid $component_borderColor !default; diff --git a/addons/themes/keystone/src/scss/base/_variables_classic.scss b/addons/themes/keystone/src/scss/base/_variables_classic.scss index ddd8901fa2b..263a301bb7e 100644 --- a/addons/themes/keystone/src/scss/base/_variables_classic.scss +++ b/addons/themes/keystone/src/scss/base/_variables_classic.scss @@ -8,143 +8,147 @@ Global Overwrites \* -------------------------------------------------------------- */ -$global-color_black: #000; -$global-color_white: #FFF; -$global-color_transparent: transparent; +$global-color_black: #000; +$global-color_white: #fff; +$global-color_transparent: transparent; -$global-color_classic: #008cba; -$global-color_coal: #333; -$global-color_steel: #969fa8; -$global-color_grey: #e8e8e8; -$global-color_whitesmoke: #fafafa; +$global-color_classic: #008cba; +$global-color_coal: #333; +$global-color_steel: #969fa8; +$global-color_grey: #e8e8e8; +$global-color_whitesmoke: #fafafa; /* -------------------------------------------------------------- *\ Global Overwrites \* -------------------------------------------------------------- */ -$global-color_primary: $global-color_classic !default; -$global-color_primaryAlt: darken($global-color_primary, 6%) !default; -$global-color_secondary: $global-color_steel !default; +$global-color_primary: $global-color_classic !default; +$global-color_primaryAlt: darken($global-color_primary, 6%) !default; +$global-color_secondary: $global-color_steel !default; -$global-color_bg: $global-color_white !default; -$global-color_fg: $global-color_coal !default; // text color | should have high contrast between $global-color_bg +$global-color_bg: $global-color_white !default; +$global-color_fg: $global-color_coal !default; // text color | should have high contrast between $global-color_bg -$global-border_color: mix($global-color_fg, $global-color_bg, 24%) !default; // Note it's off by default due to the border width -$global-border-width: 1px; -$global-border-style: solid; -$global_borderRadius: 3px !default; +$global-border_color: mix( + $global-color_fg, + $global-color_bg, + 24% +) !default; // Note it's off by default due to the border width +$global-border-width: 1px; +$global-border-style: solid; +$global_borderRadius: 3px !default; -$global-body_bg: $global-color_bg !default; +$global-body_bg: $global-color_bg !default; -$link-default_color: $global-color_primary !default; -$link-default-hover_color: $global-color_primaryAlt !default; -$link-default_visited_color: $global-color_primary !default; +$link-default_color: $global-color_primary !default; +$link-default-hover_color: $global-color_primaryAlt !default; +$link-default_visited_color: $global-color_primary !default; -$theme-link-hover_textDecoration: underline !default; +$theme-link-hover_textDecoration: underline !default; -$theme-border_color: mix($global-color_fg, $global-color_bg, 24%) !default; -$theme-hover_color: mix($global-color_fg, $global-color_bg, 6%) !default; +$theme-border_color: mix($global-color_fg, $global-color_bg, 24%) !default; +$theme-hover_color: mix($global-color_fg, $global-color_bg, 6%) !default; /* -------------------------------------------------------------- *\ Buttons Colors \* -------------------------------------------------------------- */ -$button-basic_fg: $global-color_steel !default; -$button-basic_bg: transparent !default; -$button-basic_border: $global-color_steel !default; +$button-basic_fg: $global-color_steel !default; +$button-basic_bg: transparent !default; +$button-basic_border: $global-color_steel !default; -$button-basic-hover_fg: $global-color_primary !default; -$button-basic-hover_bg: transparent !default; -$button-basic-hover_border: $global-color_primary !default; +$button-basic-hover_fg: $global-color_primary !default; +$button-basic-hover_bg: transparent !default; +$button-basic-hover_border: $global-color_primary !default; -$button-primary_fg: $global-color_white !default; -$button-primary_bg: $global-color_primary !default; -$button-primary_border: $global-color_primary !default; +$button-primary_fg: $global-color_white !default; +$button-primary_bg: $global-color_primary !default; +$button-primary_border: $global-color_primary !default; -$button-primary-hover_fg: $global-color_white !default; -$button-primary-hover_bg: $global-color_primaryAlt !default; -$button-primary-hover_border: $global-color_primaryAlt !default; +$button-primary-hover_fg: $global-color_white !default; +$button-primary-hover_bg: $global-color_primaryAlt !default; +$button-primary-hover_border: $global-color_primaryAlt !default; /* -------------------------------------------------------------- *\ Header \* -------------------------------------------------------------- */ -$header_bg: $global-color_coal !default; -$header_fg: $global-color_white !default; -$header-link_color: $global-color_white !default; -$header-link-hover_color: $global-color_white !default; -$header_border: 0 !default; -$header_boxShadow: none !default; +$header_bg: $global-color_coal !default; +$header_fg: $global-color_white !default; +$header-link_color: $global-color_white !default; +$header-link-hover_color: $global-color_white !default; +$header_border: 0 !default; +$header_boxShadow: none !default; -$headerButton_bg: transparent !default; -$headerButton_fg: $header-link_color !default; -$headerButton_borderColor: $header-link_color !default; +$headerButton_bg: transparent !default; +$headerButton_fg: $header-link_color !default; +$headerButton_borderColor: $header-link_color !default; -$headerButton-hover_bg: mix($header-link_color, $header_bg, 12%) !default; -$headerButton-hover_fg: $header-link_color !default; -$headerButton-hover_borderColor: $header-link_color !default; +$headerButton-hover_bg: mix($header-link_color, $header_bg, 12%) !default; +$headerButton-hover_fg: $header-link_color !default; +$headerButton-hover_borderColor: $header-link_color !default; -$headerMebutton_bg: transparent !default; -$headerMebutton_fg: $header-link_color !default; -$headerMebutton-hover_fg: $header-link_color !default; -$headerMebutton-hover_bg: mix($global-color_white, $header_bg, 12%) !default; -$headerMebutton-active_bg: mix($headerMebutton_fg, $header_bg, 12%) !default; +$headerMebutton_bg: transparent !default; +$headerMebutton_fg: $header-link_color !default; +$headerMebutton-hover_fg: $header-link_color !default; +$headerMebutton-hover_bg: mix($global-color_white, $header_bg, 12%) !default; +$headerMebutton-active_bg: mix($headerMebutton_fg, $header_bg, 12%) !default; -$headerMeBoxAlert_bg: $global-color_primary !default; -$headerMeBoxAlert_borderColor: $global-color_primary !default; +$headerMeBoxAlert_bg: $global-color_primary !default; +$headerMeBoxAlert_borderColor: $global-color_primary !default; /* -------------------------------------------------------------- *\ Navigation \* -------------------------------------------------------------- */ -$navigation_borderRadius: 0 !default; -$navigation_bg: $header_bg !default; -$navigation_fg: $global-color_white !default; -$navigation_border: mix($global-color_white, $header_bg, 8%) !default; +$navigation_borderRadius: 0 !default; +$navigation_bg: $header_bg !default; +$navigation_fg: $global-color_white !default; +$navigation_border: mix($global-color_white, $header_bg, 8%) !default; /* -------------------------------------------------------------- *\ Mebox \* -------------------------------------------------------------- */ -$meboxCount_bg: $global-color_primary !default; -$meboxCount_fg: $global-color_white !default; -$meboxCount_borderColor: $global-color_primary !default; +$meboxCount_bg: $global-color_primary !default; +$meboxCount_fg: $global-color_white !default; +$meboxCount_borderColor: $global-color_primary !default; -$MobileMeBox_bg: mix($global-color_black, $header_bg, 10%) !default; +$MobileMeBox_bg: mix($global-color_black, $header_bg, 10%) !default; -$MobileMeBoxAlert_bg: $global-color_primary !default; -$MobileMeBoxAlert_borderColor: $global-color_primary !default; +$MobileMeBoxAlert_bg: $global-color_primary !default; +$MobileMeBoxAlert_borderColor: $global-color_primary !default; /* -------------------------------------------------------------- *\ Panel \* -------------------------------------------------------------- */ -$panel-item-showIcons: false !default; -$panel-item_spacing: 0 !default; -$panel-item_borderRadius: 0 !default; -$panel-item_border: 1px solid $theme-border_color !default; +$panel-item-showIcons: false !default; +$panel-item_spacing: 0 !default; +$panel-item_borderRadius: 0 !default; +$panel-item_border: 1px solid $theme-border_color !default; -$panel-item_bg: transparent !default; -$panel-item_fg: $global-color_fg !default; -$panel-item_border: none !default; +$panel-item_bg: transparent !default; +$panel-item_fg: $global-color_fg !default; +$panel-item_border: none !default; -$panel-item-hover_bg: $theme-hover_color !default; -$panel-item-hover_fg: $panel-item_fg !default; +$panel-item-hover_bg: $theme-hover_color !default; +$panel-item-hover_fg: $panel-item_fg !default; /* -------------------------------------------------------------- *\ Tags \* -------------------------------------------------------------- */ -$tag_bg: $button-basic_bg !default; -$tag_fg: $button-basic_fg !default; -$tag_borderColor: $button-basic_border !default; -$tag-hover_bg: $button-basic-hover_bg !default; -$tag-hover_fg: $global-color_primary !default; -$tag-hover_borderColor: $global-color_primary !default; +$tag_bg: $button-basic_bg !default; +$tag_fg: $button-basic_fg !default; +$tag_borderColor: $button-basic_border !default; +$tag-hover_bg: $button-basic-hover_bg !default; +$tag-hover_fg: $global-color_primary !default; +$tag-hover_borderColor: $global-color_primary !default; /* -------------------------------------------------------------- *\ Components \* -------------------------------------------------------------- */ -$component_lateralBorder: true !default; -$component_borderRadius: $global_borderRadius !default; +$component_lateralBorder: true !default; +$component_borderRadius: $global_borderRadius !default; diff --git a/addons/themes/keystone/src/scss/base/_variables_coral.scss b/addons/themes/keystone/src/scss/base/_variables_coral.scss index bc2cd762052..9703b436ddd 100644 --- a/addons/themes/keystone/src/scss/base/_variables_coral.scss +++ b/addons/themes/keystone/src/scss/base/_variables_coral.scss @@ -8,124 +8,128 @@ Utility Variables \* -------------------------------------------------------------- */ -$utility-baseUnit: 6px; -$utility-baseUnitHalf: $utility-baseUnit / 2; // Derived -$utility-baseUnitDouble: $utility-baseUnit * 2; // Derived -$utility-baseUnitTriple: $utility-baseUnit * 3; // Derived -$utility-percentage_third: (100% / 3); -$utility-percentage_nineSixteenths: (9 / 16 * 100%); -$utility-SVGEncoding: "data:image/svg+xml,"; +@use "sass:math"; + +$utility-baseUnit: 6px; +$utility-baseUnitHalf: $utility-baseUnit * 0.5; // Derived +$utility-baseUnitDouble: $utility-baseUnit * 2; // Derived +$utility-baseUnitTriple: $utility-baseUnit * 3; // Derived +$utility-percentage_third: math.div(100%, 3); +$utility-percentage_nineSixteenths: (math.div(9, 16) * 100%); +$utility-SVGEncoding: "data:image/svg+xml,"; /* -------------------------------------------------------------- *\ Global Overwrites \* -------------------------------------------------------------- */ -$global_borderRadius: 4px !default; +$global_borderRadius: 4px !default; -$global-color_black: #000; -$global-color_white: #fff; -$global-color_transparent: transparent; +$global-color_black: #000; +$global-color_white: #fff; +$global-color_transparent: transparent; -$global-color_navy: #22252C; -$global-color_butter: #E9B000; -$global-color_coral: #E14658; +$global-color_navy: #22252c; +$global-color_butter: #e9b000; +$global-color_coral: #e14658; -$global-color_primary: $global-color_coral !default; -$global-color_primaryAlt: darken($global-color_primary, 8%) !default; -$global-color_secondary: $global-color_navy !default; +$global-color_primary: $global-color_coral !default; +$global-color_primaryAlt: darken($global-color_primary, 8%) !default; +$global-color_secondary: $global-color_navy !default; -$global-color_bg: $global-color_white !default; -$global-color_fg: darken(desaturate($global-color_primary, 70%), 12%) !default; // text color | should have high contrast between $global-color_bg +$global-color_bg: $global-color_white !default; +$global-color_fg: darken( + desaturate($global-color_primary, 70%), + 12% +) !default; // text color | should have high contrast between $global-color_bg -$global-body_bg: $global-color_bg !default; +$global-body_bg: $global-color_bg !default; /* -------------------------------------------------------------- *\ Theme Colors \* -------------------------------------------------------------- */ -$theme-border_color: rgba(mix($global-color_fg, $global-color_secondary, 34%), .2) !default; -$theme-hover_color: rgba(mix($global-color_fg, $global-color_primary, 12%), .2) !default; +$theme-border_color: rgba(mix($global-color_fg, $global-color_secondary, 34%), 0.2) !default; +$theme-hover_color: rgba(mix($global-color_fg, $global-color_primary, 12%), 0.2) !default; -$theme-link-hover_textDecoration: underline !default; +$theme-link-hover_textDecoration: underline !default; -$theme-heading_color: $global-color_primary !default; -$theme-heading-hover_color: $global-color_primary !default; +$theme-heading_color: $global-color_primary !default; +$theme-heading-hover_color: $global-color_primary !default; /* -------------------------------------------------------------- *\ Header \* -------------------------------------------------------------- */ -$header_minHeight: 48px !default; -$header_bg: $global-color_navy !default; +$header_minHeight: 48px !default; +$header_bg: $global-color_navy !default; /* -------------------------------------------------------------- *\ Navigation \* -------------------------------------------------------------- */ -$navigation_button-bg: $global-color_butter !default; +$navigation_button-bg: $global-color_butter !default; /* -------------------------------------------------------------- *\ Panel \* -------------------------------------------------------------- */ -$panel-item_height: 2.5em !default; -$panel_item-borderRadius: $panel-item_height !default; +$panel-item_height: 2.5em !default; +$panel_item-borderRadius: $panel-item_height !default; /* -------------------------------------------------------------- *\ Footer \* -------------------------------------------------------------- */ -$footer_bg: rgba($global-color_secondary, .2) !default; +$footer_bg: rgba($global-color_secondary, 0.2) !default; /* -------------------------------------------------------------- *\ Navigation \* -------------------------------------------------------------- */ -$navigation_bg: lighten($header_bg, 10%) !default; -$navigation_fg: $global-color_white !default; +$navigation_bg: lighten($header_bg, 10%) !default; +$navigation_fg: $global-color_white !default; -$navigation-hover_fg: $navigation_fg !default; +$navigation-hover_fg: $navigation_fg !default; -$headerMeBoxAlert_fg: $navigation_fg !default; -$headerMeBoxAlert_bg: $global-color_butter !default; -$headerMeBoxAlert_borderColor: $global-color_butter !default; +$headerMeBoxAlert_fg: $navigation_fg !default; +$headerMeBoxAlert_bg: $global-color_butter !default; +$headerMeBoxAlert_borderColor: $global-color_butter !default; /* -------------------------------------------------------------- *\ Components \* -------------------------------------------------------------- */ -$component-item_spacing: 0 !default; - -$component-title_color: $global-color_secondary !default; -$component-title-hover_color: darken($global-color_secondary, 8%) !default; -$component-meta-link-hover_color: darken($global-color_secondary, 8%) !default; +$component-item_spacing: 0 !default; -$component-casual-message_bg: #f3f3f3; -$component-casual-message_borderColor: #c3c3c3; -$component-casual-message_link-color: #676767; +$component-title_color: $global-color_secondary !default; +$component-title-hover_color: darken($global-color_secondary, 8%) !default; +$component-meta-link-hover_color: darken($global-color_secondary, 8%) !default; +$component-casual-message_bg: #f3f3f3; +$component-casual-message_borderColor: #c3c3c3; +$component-casual-message_link-color: #676767; /* -------------------------------------------------------------- *\ Mebox \* -------------------------------------------------------------- */ -$mebox_hover_bg: mix($global-color_black, $header-bg, 12%) !default; +$mebox_hover_bg: mix($global-color_black, $header-bg, 12%) !default; -$MobileMeBox_bg: $navigation_bg !default; +$MobileMeBox_bg: $navigation_bg !default; -$MobileMeBoxAlert_bg: $global-color_primary !default; -$MobileMeBoxAlert_borderColor: $global-color_primary !default; +$MobileMeBoxAlert_bg: $global-color_primary !default; +$MobileMeBoxAlert_borderColor: $global-color_primary !default; /* -------------------------------------------------------------- *\ Form Elements \* -------------------------------------------------------------- */ -$formElement_height: $utility-baseUnit * 6 !default; -$formElement_borderRadius: 18px !default; // $formElement_height / 2 +$formElement_height: $utility-baseUnit * 6 !default; +$formElement_borderRadius: 18px !default; // $formElement_height / 2 /* -------------------------------------------------------------- *\ Buttons \* -------------------------------------------------------------- */ -$formButton_height: $formElement_height !default; -$formButton_borderRadius: 18px !default; // $formButton_height / 2 +$formButton_height: $formElement_height !default; +$formButton_borderRadius: 18px !default; // $formButton_height / 2 diff --git a/addons/themes/keystone/src/scss/base/_variables_dark.scss b/addons/themes/keystone/src/scss/base/_variables_dark.scss index 03fd8604f6f..ab6dcbc419d 100644 --- a/addons/themes/keystone/src/scss/base/_variables_dark.scss +++ b/addons/themes/keystone/src/scss/base/_variables_dark.scss @@ -8,150 +8,147 @@ Global Overwrites \* -------------------------------------------------------------- */ -$global-color_black: #000; -$global-color_white: #fff; -$global-color_transparent: transparent; +$global-color_black: #000; +$global-color_white: #fff; +$global-color_transparent: transparent; -$global-color_void: #1f201f; -$global-color_darkgrey: #202020; -$global-color_grey: #a3a3a3; -$global-color_dijon: #f2ae09; -$global-color_rust: #984B43; +$global-color_void: #1f201f; +$global-color_darkgrey: #202020; +$global-color_grey: #a3a3a3; +$global-color_dijon: #f2ae09; +$global-color_rust: #984b43; -$global-color_primary: $global-color_dijon; -$global-color_primaryAlt: lighten($global-color_primary, 8%); -$global-color_secondary: $global-color_rust !default; +$global-color_primary: $global-color_dijon; +$global-color_primaryAlt: lighten($global-color_primary, 8%); +$global-color_secondary: $global-color_rust !default; -$global-color_bg: $global-color_black !default; -$global-color_fg: $global-color_white !default; // text color | should have high contrast between $global-color_bg +$global-color_bg: $global-color_black !default; +$global-color_fg: $global-color_white !default; // text color | should have high contrast between $global-color_bg -$global-body_bg: $global-color_bg !default; +$global-body_bg: $global-color_bg !default; -$global_borderRadius: 6px !default; +$global_borderRadius: 6px !default; /* -------------------------------------------------------------- *\ Theme Colors \* -------------------------------------------------------------- */ -$theme-border_color: mix($global-color_fg, $global-color_bg, 14%) !default; +$theme-border_color: mix($global-color_fg, $global-color_bg, 14%) !default; -$theme-link-hover_textDecoration: none !default; -$theme-photo_round: false !default; +$theme-link-hover_textDecoration: none !default; +$theme-photo_round: false !default; -$theme-heading_color: $global-color_secondary !default; -$theme-heading-hover_color: $global-color_primaryAlt !default; +$theme-heading_color: $global-color_secondary !default; +$theme-heading-hover_color: $global-color_primaryAlt !default; -$link-default_color: $global-color_fg !default; -$link-default-hover_color: $global-color_primary !default; +$link-default_color: $global-color_fg !default; +$link-default-hover_color: $global-color_primary !default; /* -------------------------------------------------------------- *\ Frame \* -------------------------------------------------------------- */ -$frame_backgroundColor: $global-color_black !default; +$frame_backgroundColor: $global-color_black !default; /* -------------------------------------------------------------- *\ Header \* -------------------------------------------------------------- */ -$header_bg: $global-color_void !default; -$header_color: $global-color_white !default; -$header-hover_color: $global-color_white !default; +$header_bg: $global-color_void !default; +$header_color: $global-color_white !default; +$header-hover_color: $global-color_white !default; /* -------------------------------------------------------------- *\ Panel \* -------------------------------------------------------------- */ -$panel-item_height: 2.5em !default; -$panel_item-borderRadius: $panel-item_height !default; +$panel-item_height: 2.5em !default; +$panel_item-borderRadius: $panel-item_height !default; /* -------------------------------------------------------------- *\ Footer \* -------------------------------------------------------------- */ -$footer_bg: mix($global-color_bg, $global-color_fg, 90%) !default; -$footer_color: $global-color_fg !default; -$footer-link_color: $global-color_primary !default; -$footer-link-hover_color: $global-color_primaryAlt !default; +$footer_bg: mix($global-color_bg, $global-color_fg, 90%) !default; +$footer_color: $global-color_fg !default; +$footer-link_color: $global-color_primary !default; +$footer-link-hover_color: $global-color_primaryAlt !default; /* -------------------------------------------------------------- *\ Navigation \* -------------------------------------------------------------- */ -$navigation_backgroundColor: mix($global-color_black, $header-bg, 12%) !default; - +$navigation_backgroundColor: mix($global-color_black, $header-bg, 12%) !default; /* -------------------------------------------------------------- *\ Buttons \* -------------------------------------------------------------- */ -$button-basic_fg: $global-color_primary !default; -$button-basic_bg: transparent !default; -$button-basic_border: $global-color_primary !default; +$button-basic_fg: $global-color_primary !default; +$button-basic_bg: transparent !default; +$button-basic_border: $global-color_primary !default; -$button-basic-hover_fg: $global-color_white !default; -$button-basic-hover_bg: transparent !default; -$button-basic-hover_border: $global-color_white !default; +$button-basic-hover_fg: $global-color_white !default; +$button-basic-hover_bg: transparent !default; +$button-basic-hover_border: $global-color_white !default; -$button-primary_fg: $global-color_white !default; -$button-primary_bg: $global-color_primary !default; -$button-primary_border: $global-color_primary !default; +$button-primary_fg: $global-color_white !default; +$button-primary_bg: $global-color_primary !default; +$button-primary_border: $global-color_primary !default; -$button-primary-hover_fg: $global-color_white !default; -$button-primary-hover_bg: $global-color_primaryAlt !default; -$button-primary-hover_border: $global-color_primaryAlt !default; +$button-primary-hover_fg: $global-color_white !default; +$button-primary-hover_bg: $global-color_primaryAlt !default; +$button-primary-hover_border: $global-color_primaryAlt !default; /* -------------------------------------------------------------- *\ Components \* -------------------------------------------------------------- */ -$component_bg: mix($global-color_bg, $global-color_fg, 97%) !default; -$component-title_color: $global-color_fg !default; -$component-meta-link-hover_color: $global-color_primaryAlt !default; +$component_bg: mix($global-color_bg, $global-color_fg, 97%) !default; +$component-title_color: $global-color_fg !default; +$component-meta-link-hover_color: $global-color_primaryAlt !default; -$component_lateralBorder: true !default; +$component_lateralBorder: true !default; /* -------------------------------------------------------------- *\ Tags \* -------------------------------------------------------------- */ -$tag_borderColor: $button-basic_border !default; -$tag_fg: $button-basic_fg !default; -$tag-hover_bg: $button-basic-hover_bg !default; -$tag-hover_fg: $global-color_primary !default; -$tag-hover_borderColor: $global-color_primary !default; +$tag_borderColor: $button-basic_border !default; +$tag_fg: $button-basic_fg !default; +$tag-hover_bg: $button-basic-hover_bg !default; +$tag-hover_fg: $global-color_primary !default; +$tag-hover_borderColor: $global-color_primary !default; /* -------------------------------------------------------------- *\ Form Elements \* -------------------------------------------------------------- */ -$formElement_height: 36px !default; -$formElement_borderRadius: $global_borderRadius !default; +$formElement_height: 36px !default; +$formElement_borderRadius: $global_borderRadius !default; /* -------------------------------------------------------------- *\ Buttons \* -------------------------------------------------------------- */ -$formButton_height: $formElement_height !default; -$formButton_borderRadius: $global_borderRadius !default; +$formButton_height: $formElement_height !default; +$formButton_borderRadius: $global_borderRadius !default; /* -------------------------------------------------------------- *\ Navigation \* -------------------------------------------------------------- */ -$navigation_bg: $header_bg !default; -$navigation_border: mix($header_bg, $global-color_black, 12%) !default; +$navigation_bg: $header_bg !default; +$navigation_border: mix($header_bg, $global-color_black, 12%) !default; /* -------------------------------------------------------------- *\ Mebox \* -------------------------------------------------------------- */ -$mebox_hover_bg: $frame_backgroundColor !default; +$mebox_hover_bg: $frame_backgroundColor !default; /* -------------------------------------------------------------- *\ Searchbox \* -------------------------------------------------------------- */ -$searchbox-button_color: $global-color_primary !default; - - +$searchbox-button_color: $global-color_primary !default; diff --git a/addons/themes/keystone/src/scss/base/_variables_dusk.scss b/addons/themes/keystone/src/scss/base/_variables_dusk.scss index 3afc532bcf4..97a4831efc6 100644 --- a/addons/themes/keystone/src/scss/base/_variables_dusk.scss +++ b/addons/themes/keystone/src/scss/base/_variables_dusk.scss @@ -8,161 +8,163 @@ Utility Variables \* -------------------------------------------------------------- */ -$utility-baseUnit: 6px; -$utility-baseUnitHalf: $utility-baseUnit / 2; // Derived -$utility-baseUnitDouble: $utility-baseUnit * 2; // Derived -$utility-baseUnitTriple: $utility-baseUnit * 3; // Derived -$utility-percentage_third: (100% / 3); -$utility-percentage_nineSixteenths: (9 / 16 * 100%); -$utility-SVGEncoding: "data:image/svg+xml,"; +@use "sass:math"; + +$utility-baseUnit: 6px; +$utility-baseUnitHalf: $utility-baseUnit * 0.5; // Derived +$utility-baseUnitDouble: $utility-baseUnit * 2; // Derived +$utility-baseUnitTriple: $utility-baseUnit * 3; // Derived +$utility-percentage_third: math.div(100%, 3); +$utility-percentage_nineSixteenths: (math.div(9, 16) * 100%); +$utility-SVGEncoding: "data:image/svg+xml,"; /* -------------------------------------------------------------- *\ Global Overwrites \* -------------------------------------------------------------- */ -$global-color_black: #000; -$global-color_white: #fff; -$global-color_transparent: transparent; +$global-color_black: #000; +$global-color_white: #fff; +$global-color_transparent: transparent; -$global-color_dusk: #111423; -$global-color_evening: #192231; -$global-color_grey: #a3a3a3; -$global-color_cloud: #49648b; -$global-color_sunset: #985E6D; +$global-color_dusk: #111423; +$global-color_evening: #192231; +$global-color_grey: #a3a3a3; +$global-color_cloud: #49648b; +$global-color_sunset: #985e6d; -$global-color_primary: $global-color_sunset !default; -$global-color_primaryAlt: darken($global-color_primary, 8%) !default; -$global-color_secondary: $global-color_cloud !default; +$global-color_primary: $global-color_sunset !default; +$global-color_primaryAlt: darken($global-color_primary, 8%) !default; +$global-color_secondary: $global-color_cloud !default; -$global-color_bg: $global-color_dusk !default; -$global-color_fg: $global-color_white !default; // text color | should have high contrast between $global-color_bg +$global-color_bg: $global-color_dusk !default; +$global-color_fg: $global-color_white !default; // text color | should have high contrast between $global-color_bg -$global_borderRadius: 6px !default; +$global_borderRadius: 6px !default; -$theme-border_color: mix($global-color_fg, $global-color_bg, 12%) !default; +$theme-border_color: mix($global-color_fg, $global-color_bg, 12%) !default; /* -------------------------------------------------------------- *\ Global Overwrites \* -------------------------------------------------------------- */ -$link-default_color: $global-color_grey !default; -$link-default-hover_color: $global-color_primary !default; -$link-default_visited_color: $global-color_primary !default; +$link-default_color: $global-color_grey !default; +$link-default-hover_color: $global-color_primary !default; +$link-default_visited_color: $global-color_primary !default; -$theme-link-hover_textDecoration: underline !default; +$theme-link-hover_textDecoration: underline !default; /* -------------------------------------------------------------- *\ Buttons Colors \* -------------------------------------------------------------- */ -$button-basic_fg: $global-color_white !default; -$button-basic_bg: mix($global-color_white, transparent, 8%) !default; -$button-basic_border: $global-color_white !default; +$button-basic_fg: $global-color_white !default; +$button-basic_bg: mix($global-color_white, transparent, 8%) !default; +$button-basic_border: $global-color_white !default; -$button-basic-hover_fg: $global-color_primary !default; -$button-basic-hover_bg: $button-basic_bg !default; -$button-basic-hover_border: $global-color_primary !default; +$button-basic-hover_fg: $global-color_primary !default; +$button-basic-hover_bg: $button-basic_bg !default; +$button-basic-hover_border: $global-color_primary !default; -$button-primary_fg: $global-color_white !default; -$button-primary_bg: $global-color_primary !default; -$button-primary_border: $global-color_primary !default; +$button-primary_fg: $global-color_white !default; +$button-primary_bg: $global-color_primary !default; +$button-primary_border: $global-color_primary !default; -$button-primary-hover_fg: $global-color_white !default; -$button-primary-hover_bg: $global-color_primaryAlt !default; -$button-primary-hover_border: $global-color_primaryAlt !default; +$button-primary-hover_fg: $global-color_white !default; +$button-primary-hover_bg: $global-color_primaryAlt !default; +$button-primary-hover_border: $global-color_primaryAlt !default; /* -------------------------------------------------------------- *\ Frame \* -------------------------------------------------------------- */ -$frame_bg: $global-color_evening !default; +$frame_bg: $global-color_evening !default; /* -------------------------------------------------------------- *\ Header \* -------------------------------------------------------------- */ -$header_bg: $global-color_bg !default; -$headerMebutton-hover_bg: $frame_bg !default; -$headerMebutton-active_bg: lighten($frame_bg, 8%) !default; +$header_bg: $global-color_bg !default; +$headerMebutton-hover_bg: $frame_bg !default; +$headerMebutton-active_bg: lighten($frame_bg, 8%) !default; /* -------------------------------------------------------------- *\ Footer \* -------------------------------------------------------------- */ -$footer_bg: darken($global-color_evening, 2%) !default; +$footer_bg: darken($global-color_evening, 2%) !default; /* -------------------------------------------------------------- *\ Navigation \* -------------------------------------------------------------- */ -$navigation_bg: mix($global-color_white, $header_bg, 12%) !default; -$navigation_fg: $global-color_fg !default; -$navigation-boxShadow: 0 5px 10px 0 rgba(255,255,255,255.30); -$navigation-hover_fg: $navigation_fg !default; -$navigation_border: darken($navigation_bg, 8%)!default; +$navigation_bg: mix($global-color_white, $header_bg, 12%) !default; +$navigation_fg: $global-color_fg !default; +$navigation-boxShadow: 0 5px 10px 0 rgba(255, 255, 255, 255.3); +$navigation-hover_fg: $navigation_fg !default; +$navigation_border: darken($navigation_bg, 8%) !default; -$navigationButton_bg: $global-color_secondary !default; -$navigationButton_fg: $button-primary_fg !default; -$navigationButton_border: $global-color_secondary !default; +$navigationButton_bg: $global-color_secondary !default; +$navigationButton_fg: $button-primary_fg !default; +$navigationButton_border: $global-color_secondary !default; -$navigationButton-hover_bg: lighten($global-color_secondary, 8%) !default; -$navigationButton-hover_fg: $button-primary-hover_fg !default; -$navigationButton-hover_border: $navigationButton-hover_bg !default; +$navigationButton-hover_bg: lighten($global-color_secondary, 8%) !default; +$navigationButton-hover_fg: $button-primary-hover_fg !default; +$navigationButton-hover_border: $navigationButton-hover_bg !default; /* -------------------------------------------------------------- *\ Mobile Mebox \* -------------------------------------------------------------- */ -$MobileMeBox_bg: mix($global-color_white, $header_bg, 12%) !default; -$MobileMeBox_fg: $global-color_fg !default; +$MobileMeBox_bg: mix($global-color_white, $header_bg, 12%) !default; +$MobileMeBox_fg: $global-color_fg !default; -$MobileMeBoxAlert_fg: $MobileMeBox_fg !default; -$MobileMeBoxAlert_bg: $global-color_secondary !default; -$MobileMeBoxAlert_borderColor: $global-color_secondary !default; +$MobileMeBoxAlert_fg: $MobileMeBox_fg !default; +$MobileMeBoxAlert_bg: $global-color_secondary !default; +$MobileMeBoxAlert_borderColor: $global-color_secondary !default; /* -------------------------------------------------------------- *\ Components \* -------------------------------------------------------------- */ -$component-item_spacing: 0 !default; -$component_bg: $global-color_bg !default; -$component_lateralBorder: true !default; -$component_borderRadius: $global_borderRadius !default; -$component_borderWidth: 1px !default; -$component_borderColor: $theme-border_color !default; +$component-item_spacing: 0 !default; +$component_bg: $global-color_bg !default; +$component_lateralBorder: true !default; +$component_borderRadius: $global_borderRadius !default; +$component_borderWidth: 1px !default; +$component_borderColor: $theme-border_color !default; /* -------------------------------------------------------------- *\ Tags \* -------------------------------------------------------------- */ -$tag_borderRadius: 20px !default; -$tag_bg: transparent !default; -$tag_fg: $global-color_grey !default; -$tag_borderColor: $global-color_grey !default; -$tag-hover_bg: $global-color_primary !default; -$tag-hover_fg: $global-color_white !default; -$tag-hover_borderColor: $global-color_primary !default; +$tag_borderRadius: 20px !default; +$tag_bg: transparent !default; +$tag_fg: $global-color_grey !default; +$tag_borderColor: $global-color_grey !default; +$tag-hover_bg: $global-color_primary !default; +$tag-hover_fg: $global-color_white !default; +$tag-hover_borderColor: $global-color_primary !default; /* -------------------------------------------------------------- *\ Count \* -------------------------------------------------------------- */ -$count_bg: $frame_bg !default; -$count_border: 1px solid transparent !default; -$count_color: $global-color_grey !default; +$count_bg: $frame_bg !default; +$count_border: 1px solid transparent !default; +$count_color: $global-color_grey !default; -$count-hover_bg: $global-color_primary !default; -$count-hover_borderColor: $global-color_primary !default; -$count-hover_color: $global-color_white !default; +$count-hover_bg: $global-color_primary !default; +$count-hover_borderColor: $global-color_primary !default; +$count-hover_color: $global-color_white !default; /* -------------------------------------------------------------- *\ Form Elements \* -------------------------------------------------------------- */ -$formElement_borderRadius: 20px !default; +$formElement_borderRadius: 20px !default; /* -------------------------------------------------------------- *\ Form Buttons \* -------------------------------------------------------------- */ -$formButton_borderRadius: 20px !default; +$formButton_borderRadius: 20px !default; diff --git a/addons/themes/keystone/src/scss/components/_kbicons.scss b/addons/themes/keystone/src/scss/components/_kbicons.scss index 63444ff9fd1..24a222d6278 100644 --- a/addons/themes/keystone/src/scss/components/_kbicons.scss +++ b/addons/themes/keystone/src/scss/components/_kbicons.scss @@ -6,12 +6,12 @@ //kb Icons @font-face { - font-family: 'kbicons'; - src: url('./fonts/kbicons/kbicons.eot?cwtzhl'); - src: url('./fonts/kbicons/kbicons.eot?cwtzhl#iefix') format('embedded-opentype'), - url('./fonts/kbicons/kbicons.ttf?cwtzhl') format('truetype'), - url('./fonts/kbicons/kbicons.woff?cwtzhl') format('woff'), - url('./fonts/kbicons/kbicons.svg?cwtzhl#icomoon') format('svg'); + font-family: "kbicons"; + src: url("./fonts/kbicons/kbicons.eot?cwtzhl"); + src: url("./fonts/kbicons/kbicons.eot?cwtzhl#iefix") format("embedded-opentype"), + url("./fonts/kbicons/kbicons.ttf?cwtzhl") format("truetype"), + url("./fonts/kbicons/kbicons.woff?cwtzhl") format("woff"), + url("./fonts/kbicons/kbicons.svg?cwtzhl#icomoon") format("svg"); font-weight: normal; font-style: normal; } @@ -37,14 +37,14 @@ Variables \* -------------------------------------------------------------- */ -$kbicon-compose: "\e900"; -$kbicon-gear: "\e901"; -$kbicon-message-empty: "\e902"; -$kbicon-message: "\e903"; -$kbicon-notifications-empty: "\e904"; -$kbicon-notifications: "\e905"; -$kbicon-settings: "\e906"; -$kbicon-star-empty: "\e907"; -$kbicon-star: "\e908"; -$kbicon-user-empty: "\e909"; -$kbicon-user: "\e90a"; +$kbicon-compose: "\e900"; +$kbicon-gear: "\e901"; +$kbicon-message-empty: "\e902"; +$kbicon-message: "\e903"; +$kbicon-notifications-empty: "\e904"; +$kbicon-notifications: "\e905"; +$kbicon-settings: "\e906"; +$kbicon-star-empty: "\e907"; +$kbicon-star: "\e908"; +$kbicon-user-empty: "\e909"; +$kbicon-user: "\e90a"; diff --git a/addons/themes/keystone/src/scss/components/_lists_cerulean.scss b/addons/themes/keystone/src/scss/components/_lists_cerulean.scss index c780d2db8c6..1b9f5a65de7 100644 --- a/addons/themes/keystone/src/scss/components/_lists_cerulean.scss +++ b/addons/themes/keystone/src/scss/components/_lists_cerulean.scss @@ -26,8 +26,8 @@ } &::after { - border-right: $arrow-size solid $global-color_white; - left: -#{$arrow-size * 2 - 1px}; + border-right: $arrow-size solid $global-color_white; + left: -#{$arrow-size * 2 - 1px}; } .Item-Header { @@ -62,7 +62,6 @@ } .Item-Header { - .PhotoWrap { top: $component-vertical_padding; left: $component-horizontal_padding; diff --git a/addons/themes/keystone/src/scss/components/_modmessage_coral.scss b/addons/themes/keystone/src/scss/components/_modmessage_coral.scss index 6a0ac134c44..fd7e0f9941f 100644 --- a/addons/themes/keystone/src/scss/components/_modmessage_coral.scss +++ b/addons/themes/keystone/src/scss/components/_modmessage_coral.scss @@ -6,7 +6,6 @@ .CasualMessage, .AlertMessage, .WarningMessage { - a { color: $global-color_fg; } diff --git a/addons/themes/keystone/src/scss/components/_modmessage_dark.scss b/addons/themes/keystone/src/scss/components/_modmessage_dark.scss index e36bf1bd502..27588c3dbd9 100644 --- a/addons/themes/keystone/src/scss/components/_modmessage_dark.scss +++ b/addons/themes/keystone/src/scss/components/_modmessage_dark.scss @@ -1,7 +1,6 @@ .CasualMessage, .AlertMessage, .WarningMessage { - a { color: $global-color_fg; } diff --git a/addons/themes/keystone/src/scss/components/_modmessage_dusk.scss b/addons/themes/keystone/src/scss/components/_modmessage_dusk.scss index e36bf1bd502..27588c3dbd9 100644 --- a/addons/themes/keystone/src/scss/components/_modmessage_dusk.scss +++ b/addons/themes/keystone/src/scss/components/_modmessage_dusk.scss @@ -1,7 +1,6 @@ .CasualMessage, .AlertMessage, .WarningMessage { - a { color: $global-color_fg; } diff --git a/addons/themes/keystone/src/scss/components/_popup_dark.scss b/addons/themes/keystone/src/scss/components/_popup_dark.scss index 159d19a918c..3aace529d9b 100644 --- a/addons/themes/keystone/src/scss/components/_popup_dark.scss +++ b/addons/themes/keystone/src/scss/components/_popup_dark.scss @@ -3,12 +3,12 @@ div.Popup { .Buttons .btn-primary.Close, #Form_Cancel { @include Button( - $global-color_white, - $global-color_primary, - $global-color_primary, - $global-color_primary, - $global-color_white, - $global-color_primary + $global-color_white, + $global-color_primary, + $global-color_primary, + $global-color_primary, + $global-color_white, + $global-color_primary ); } @@ -21,12 +21,12 @@ div.Popup { .groupToolbar .Button.Primary, .BoxButtons .Button.Primary { @include Button( - $global-color_primary, - $global-color_white, - $global-color_primary, - $global-color_primaryAlt, - $global-color_white, - $global-color_primaryAlt + $global-color_primary, + $global-color_white, + $global-color_primary, + $global-color_primaryAlt, + $global-color_white, + $global-color_primaryAlt ); } } diff --git a/addons/themes/keystone/src/scss/components/_popup_dusk.scss b/addons/themes/keystone/src/scss/components/_popup_dusk.scss index 159d19a918c..3aace529d9b 100644 --- a/addons/themes/keystone/src/scss/components/_popup_dusk.scss +++ b/addons/themes/keystone/src/scss/components/_popup_dusk.scss @@ -3,12 +3,12 @@ div.Popup { .Buttons .btn-primary.Close, #Form_Cancel { @include Button( - $global-color_white, - $global-color_primary, - $global-color_primary, - $global-color_primary, - $global-color_white, - $global-color_primary + $global-color_white, + $global-color_primary, + $global-color_primary, + $global-color_primary, + $global-color_white, + $global-color_primary ); } @@ -21,12 +21,12 @@ div.Popup { .groupToolbar .Button.Primary, .BoxButtons .Button.Primary { @include Button( - $global-color_primary, - $global-color_white, - $global-color_primary, - $global-color_primaryAlt, - $global-color_white, - $global-color_primaryAlt + $global-color_primary, + $global-color_white, + $global-color_primary, + $global-color_primaryAlt, + $global-color_white, + $global-color_primaryAlt ); } } diff --git a/addons/themes/keystone/src/scss/components/_searchbox_dark.scss b/addons/themes/keystone/src/scss/components/_searchbox_dark.scss index af7d8fa6c2b..a21f660ed68 100644 --- a/addons/themes/keystone/src/scss/components/_searchbox_dark.scss +++ b/addons/themes/keystone/src/scss/components/_searchbox_dark.scss @@ -24,7 +24,6 @@ .Herobanner .SearchBox { .InputBox.BigInput, #Form_Search { - @include maxWidth { background-color: $global-color_bg; color: $global-color_white; diff --git a/addons/themes/keystone/src/scss/components/_searchbox_dusk.scss b/addons/themes/keystone/src/scss/components/_searchbox_dusk.scss index a6751a2c7b5..35fd5c3580b 100644 --- a/addons/themes/keystone/src/scss/components/_searchbox_dusk.scss +++ b/addons/themes/keystone/src/scss/components/_searchbox_dusk.scss @@ -24,7 +24,6 @@ .Herobanner .SearchBox { .InputBox.BigInput, #Form_Search { - @include maxWidth { background-color: $global-color_bg; color: $global-color_white; diff --git a/addons/themes/keystone/src/scss/sections/_footer_cerulean.scss b/addons/themes/keystone/src/scss/sections/_footer_cerulean.scss index 4b1b4827175..c9b81b72220 100644 --- a/addons/themes/keystone/src/scss/sections/_footer_cerulean.scss +++ b/addons/themes/keystone/src/scss/sections/_footer_cerulean.scss @@ -5,7 +5,6 @@ */ .Footer { - .row:first-child { padding-top: $utility-baseUnitTriple; border-top: 1px solid #{$theme-border_color}; diff --git a/addons/themes/keystone/src/scss/sections/_header_cerulean.scss b/addons/themes/keystone/src/scss/sections/_header_cerulean.scss index 66c4d37fcc3..4140828fe14 100644 --- a/addons/themes/keystone/src/scss/sections/_header_cerulean.scss +++ b/addons/themes/keystone/src/scss/sections/_header_cerulean.scss @@ -5,7 +5,6 @@ */ .MeBox--header .SignInLinks { - .SignInPopup { background-color: $global-color_secondary; border-color: $global-color_secondary; diff --git a/addons/themes/keystone/src/scss/sections/_header_coral.scss b/addons/themes/keystone/src/scss/sections/_header_coral.scss index da8e3714779..e40d91ed99e 100644 --- a/addons/themes/keystone/src/scss/sections/_header_coral.scss +++ b/addons/themes/keystone/src/scss/sections/_header_coral.scss @@ -5,7 +5,6 @@ */ .MeBox--header .SignInLinks { - .SignInPopup { background-color: $global-color_butter; border-color: $global-color_butter; diff --git a/addons/themes/keystone/src/scss/sections/_header_default.scss b/addons/themes/keystone/src/scss/sections/_header_default.scss index 872bdd20d7d..581687a3ae6 100644 --- a/addons/themes/keystone/src/scss/sections/_header_default.scss +++ b/addons/themes/keystone/src/scss/sections/_header_default.scss @@ -32,4 +32,3 @@ // } // } //} - diff --git a/addons/themes/keystone/src/scss/sections/_navigation_dark.scss b/addons/themes/keystone/src/scss/sections/_navigation_dark.scss index ad56966d45b..863e62ee130 100644 --- a/addons/themes/keystone/src/scss/sections/_navigation_dark.scss +++ b/addons/themes/keystone/src/scss/sections/_navigation_dark.scss @@ -5,10 +5,8 @@ */ .Navigation-linkContainer { - &::after { width: calc(100% - (#{$utility-baseUnitTriple} * 2)); margin: 0 auto; } } - diff --git a/addons/themes/keystone/src/scss/sections/_panel_cerulean.scss b/addons/themes/keystone/src/scss/sections/_panel_cerulean.scss index 3a3f19758ba..d8a35dcaefb 100644 --- a/addons/themes/keystone/src/scss/sections/_panel_cerulean.scss +++ b/addons/themes/keystone/src/scss/sections/_panel_cerulean.scss @@ -7,9 +7,7 @@ body.Section-EditProfile .Box, .BoxFilter, .BoxCategories { - .Active { - a { border: $component_border; box-shadow: $component_boxShadow; diff --git a/addons/themes/keystone/src/scss/sections/_panel_classic.scss b/addons/themes/keystone/src/scss/sections/_panel_classic.scss index 61f8da7ddec..032c4b7ac70 100644 --- a/addons/themes/keystone/src/scss/sections/_panel_classic.scss +++ b/addons/themes/keystone/src/scss/sections/_panel_classic.scss @@ -5,10 +5,8 @@ */ .Panel-main { - .BoxFilter.BoxFilter, .Box.Box { - a::before { content: none; } diff --git a/addons/themes/keystone/src/scss/sections/_themeoptions.scss b/addons/themes/keystone/src/scss/sections/_themeoptions.scss index e4c9b716b80..9fd7f42c252 100644 --- a/addons/themes/keystone/src/scss/sections/_themeoptions.scss +++ b/addons/themes/keystone/src/scss/sections/_themeoptions.scss @@ -5,7 +5,6 @@ */ .ThemeOptions-panelToLeft { - .Panel-main { margin-left: 0; } @@ -25,11 +24,11 @@ margin-left: auto; width: calc(100% - #{$panel_width + 50px}); - @include maxWidth($theme-breakpoint_tablet) { - order: initial; - margin-left: 0; - width: auto; - } + @include maxWidth($theme-breakpoint_tablet) { + order: initial; + margin-left: 0; + width: auto; + } } .SearchBox { @@ -42,9 +41,7 @@ } .hideHomepageTitle { - .MainContent { - .HomepageTitle, .PageDescription { display: none; @@ -53,9 +50,7 @@ } .hideContentDescription { - .MainContent { - .PageDescription { display: none; } @@ -70,7 +65,6 @@ } .ThemeOptions-hasHeroBanner.ThemeOptions-hasFeatureSearchbox .Panel { - .SearchBox { display: none; } diff --git a/addons/themes/lavendermoon/README.md b/addons/themes/lavendermoon/README.md index 6ea7528ec54..99103193c7c 100644 --- a/addons/themes/lavendermoon/README.md +++ b/addons/themes/lavendermoon/README.md @@ -73,9 +73,10 @@ yarn build ``` ### Config + Requires the following config: `$Configuration['Garden']['CurrentTheme'] = 'theme-foundation';` `$Configuration['themeFeatures']['DataDrivenTheme'] = true;` -Note that the `DataDrivenTheme` config will use the React based header. +Note that the `DataDrivenTheme` config will use the React based header. diff --git a/addons/themes/lavendermoon/assets/styles.css b/addons/themes/lavendermoon/assets/styles.css index be17d96ab3d..2571b1baee2 100644 --- a/addons/themes/lavendermoon/assets/styles.css +++ b/addons/themes/lavendermoon/assets/styles.css @@ -1,90 +1,90 @@ * { - padding: 0; - margin: 0; - box-sizing: border-box; + padding: 0; + margin: 0; + box-sizing: border-box; } .footer { - background: #f5f5f6; - color: #555A62; - font-size: 14px; - line-height: 1.5; - padding: 18px 0; + background: #f5f5f6; + color: #555a62; + font-size: 14px; + line-height: 1.5; + padding: 18px 0; } .footer-wrap { - padding-left: 18px; - padding-right: 18px; - max-width: 1236px; - margin: 0 auto; + padding-left: 18px; + padding-right: 18px; + max-width: 1236px; + margin: 0 auto; } .footer a { - color: #0291DB; + color: #0291db; } .footer a:hover { - color: #0276b3; + color: #0276b3; } .footer-row { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: center; - margin: -3px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + margin: -3px; } .footer-col { - padding: 0 3px; + padding: 0 3px; } .footer-col-copyRight { - justify-content: flex-start; + justify-content: flex-start; } .footer-col-logo { - justify-content: flex-end; + justify-content: flex-end; } .footer-col-copyRight, .footer-col-logo { - flex: 1; - display: flex; + flex: 1; + display: flex; } .logo { - width: 120px; - height: 28px; - opacity: 0.6; + width: 120px; + height: 28px; + opacity: 0.6; } @media screen and (max-width: 768px) { - .footer-row { - display: block; - } - - .footer-col { - width: 100%; - text-align: center; - margin: 6px 0; - } - - .footer-col:first-child { - margin-top: 0; - } - - .footer-col:last-child { - margin-bottom: 0; - } - - .footer-col-copyRight, -.footer-col-logo { - justify-content: center; - } - - .logo { - margin: 0 auto; - } + .footer-row { + display: block; + } + + .footer-col { + width: 100%; + text-align: center; + margin: 6px 0; + } + + .footer-col:first-child { + margin-top: 0; + } + + .footer-col:last-child { + margin-bottom: 0; + } + + .footer-col-copyRight, + .footer-col-logo { + justify-content: center; + } + + .logo { + margin: 0 auto; + } } /*# sourceMappingURL=styles.css.map */ diff --git a/addons/themes/lavendermoon/assets/styles.scss b/addons/themes/lavendermoon/assets/styles.scss index 55ff3604f2a..6c31893aff2 100644 --- a/addons/themes/lavendermoon/assets/styles.scss +++ b/addons/themes/lavendermoon/assets/styles.scss @@ -1,6 +1,6 @@ $color_bg: #f5f5f6; -$color_fg: #555A62; -$color_link: #0291DB; +$color_fg: #555a62; +$color_link: #0291db; $color_link-hover: #0276b3; * { @@ -61,11 +61,10 @@ $color_link-hover: #0276b3; .logo { width: 120px; height: 28px; - opacity: .6; + opacity: 0.6; } @media screen and (max-width: 768px) { - .footer-row { display: block; } diff --git a/addons/themes/lavendermoon/src/scss/custom.scss b/addons/themes/lavendermoon/src/scss/custom.scss index 82152302b55..af16a6aecb4 100644 --- a/addons/themes/lavendermoon/src/scss/custom.scss +++ b/addons/themes/lavendermoon/src/scss/custom.scss @@ -7,4 +7,3 @@ /* --------------- Boilerplate --------------- */ @import "~@vanilla/theme-core/scss/dynamic"; - diff --git a/addons/themes/lavendersun/README.md b/addons/themes/lavendersun/README.md index 6ea7528ec54..99103193c7c 100644 --- a/addons/themes/lavendersun/README.md +++ b/addons/themes/lavendersun/README.md @@ -73,9 +73,10 @@ yarn build ``` ### Config + Requires the following config: `$Configuration['Garden']['CurrentTheme'] = 'theme-foundation';` `$Configuration['themeFeatures']['DataDrivenTheme'] = true;` -Note that the `DataDrivenTheme` config will use the React based header. +Note that the `DataDrivenTheme` config will use the React based header. diff --git a/addons/themes/lavendersun/assets/styles.css b/addons/themes/lavendersun/assets/styles.css index be17d96ab3d..2571b1baee2 100644 --- a/addons/themes/lavendersun/assets/styles.css +++ b/addons/themes/lavendersun/assets/styles.css @@ -1,90 +1,90 @@ * { - padding: 0; - margin: 0; - box-sizing: border-box; + padding: 0; + margin: 0; + box-sizing: border-box; } .footer { - background: #f5f5f6; - color: #555A62; - font-size: 14px; - line-height: 1.5; - padding: 18px 0; + background: #f5f5f6; + color: #555a62; + font-size: 14px; + line-height: 1.5; + padding: 18px 0; } .footer-wrap { - padding-left: 18px; - padding-right: 18px; - max-width: 1236px; - margin: 0 auto; + padding-left: 18px; + padding-right: 18px; + max-width: 1236px; + margin: 0 auto; } .footer a { - color: #0291DB; + color: #0291db; } .footer a:hover { - color: #0276b3; + color: #0276b3; } .footer-row { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: center; - margin: -3px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + margin: -3px; } .footer-col { - padding: 0 3px; + padding: 0 3px; } .footer-col-copyRight { - justify-content: flex-start; + justify-content: flex-start; } .footer-col-logo { - justify-content: flex-end; + justify-content: flex-end; } .footer-col-copyRight, .footer-col-logo { - flex: 1; - display: flex; + flex: 1; + display: flex; } .logo { - width: 120px; - height: 28px; - opacity: 0.6; + width: 120px; + height: 28px; + opacity: 0.6; } @media screen and (max-width: 768px) { - .footer-row { - display: block; - } - - .footer-col { - width: 100%; - text-align: center; - margin: 6px 0; - } - - .footer-col:first-child { - margin-top: 0; - } - - .footer-col:last-child { - margin-bottom: 0; - } - - .footer-col-copyRight, -.footer-col-logo { - justify-content: center; - } - - .logo { - margin: 0 auto; - } + .footer-row { + display: block; + } + + .footer-col { + width: 100%; + text-align: center; + margin: 6px 0; + } + + .footer-col:first-child { + margin-top: 0; + } + + .footer-col:last-child { + margin-bottom: 0; + } + + .footer-col-copyRight, + .footer-col-logo { + justify-content: center; + } + + .logo { + margin: 0 auto; + } } /*# sourceMappingURL=styles.css.map */ diff --git a/addons/themes/lavendersun/assets/styles.scss b/addons/themes/lavendersun/assets/styles.scss index 55ff3604f2a..6c31893aff2 100644 --- a/addons/themes/lavendersun/assets/styles.scss +++ b/addons/themes/lavendersun/assets/styles.scss @@ -1,6 +1,6 @@ $color_bg: #f5f5f6; -$color_fg: #555A62; -$color_link: #0291DB; +$color_fg: #555a62; +$color_link: #0291db; $color_link-hover: #0276b3; * { @@ -61,11 +61,10 @@ $color_link-hover: #0276b3; .logo { width: 120px; height: 28px; - opacity: .6; + opacity: 0.6; } @media screen and (max-width: 768px) { - .footer-row { display: block; } diff --git a/addons/themes/theme-boilerplate/README.md b/addons/themes/theme-boilerplate/README.md index 2bae34e4224..c30506320b2 100644 --- a/addons/themes/theme-boilerplate/README.md +++ b/addons/themes/theme-boilerplate/README.md @@ -1,9 +1,8 @@ # Theme Boilerplate - ## Description -It's a starter's kit to build Vanilla Forums custom themes. It contains all files necessary for a theme with customizable styles. +It's a starter's kit to build Vanilla Forums custom themes. It contains all files necessary for a theme with customizable styles. ## Getting Started @@ -11,29 +10,27 @@ Node and Yarn are prerequisites to use this tool. Please download and install th > **Notice**: It is important that you install Node in a way that does not require you to `sudo`. - - 1. Navigate to your theme folder and add the boilerplate package: - ``` - yarn add @vanillaforums/theme-boilerplate - ``` +``` +yarn add @vanillaforums/theme-boilerplate +``` 2. Run the installation command: - ``` - yarn run boilerplate-install my-pretty-theme "My Pretty Theme" - ``` +``` +yarn run boilerplate-install my-pretty-theme "My Pretty Theme" +``` - - Replace `my-pretty-theme` with your theme key. This should be unique and **must exactly match** the folder name, including capitalization. It should also follow the `dashed-lower-case` naming convention. - - Replace `My Pretty Theme` with your theme name (keep the double quotes). This is the name that appears on the dashboard. +- Replace `my-pretty-theme` with your theme key. This should be unique and **must exactly match** the folder name, including capitalization. It should also follow the `dashed-lower-case` naming convention. +- Replace `My Pretty Theme` with your theme name (keep the double quotes). This is the name that appears on the dashboard. 3. This tool also has a build step, provided by the [Vanilla CLI](https://docs.vanillaforums.com/developer/vanilla-cli/). This step is necessary to generate scripts and stylesheets that run in the browser. [Make sure the Vanilla CLI is installed](https://docs.vanillaforums.com/developer/vanilla-cli/installation), then run the following command on the theme folder to build: - ``` - vanilla build - ``` +``` +vanilla build +``` 4. Your theme is ready to be enabled. On your localhost navigate to **Dashboard > Appearance > Themes** and enable your theme. @@ -41,7 +38,7 @@ Node and Yarn are prerequisites to use this tool. Please download and install th You might want to start taking a look at `src/scss/_variables.scss`. There you can find most of the variables you need to customize your theme. -A good starting point is to create variables containing your brand values on the top of the `_variables.scss`, like colors, font family, sizes, etc. Make sure to use the `$theme-` namespace to keep things organized. +A good starting point is to create variables containing your brand values on the top of the `_variables.scss`, like colors, font family, sizes, etc. Make sure to use the `$theme-` namespace to keep things organized. Once your variables are set, you may start customizing! diff --git a/addons/themes/theme-boilerplate/package.json b/addons/themes/theme-boilerplate/package.json index 0f5db9996b7..9a38b5da939 100644 --- a/addons/themes/theme-boilerplate/package.json +++ b/addons/themes/theme-boilerplate/package.json @@ -16,7 +16,7 @@ "boilerplate" ], "author": "Isis Graziatto (https://vanilaforums.com)", - "license": "GPL-2.0-only", + "license": "MIT", "repository": { "type": "git", "url": "git+ssh://git@github.com/vanilla/vanilla-cloud.git" diff --git a/addons/themes/theme-boilerplate/settings/configuration.php b/addons/themes/theme-boilerplate/settings/configuration.php index d7cd01a15f9..cadad8f5bac 100644 --- a/addons/themes/theme-boilerplate/settings/configuration.php +++ b/addons/themes/theme-boilerplate/settings/configuration.php @@ -5,7 +5,7 @@ * @license GPL-2.0-only */ -$Configuration['Garden']['MobileTheme'] = 'keystone'; -$Configuration['Badges']['BadgesModule']['Target'] = 'AfterUserInfo'; -$Configuration['Feature']['NewFlyouts']['Enabled'] = true; -$Configuration['Feature']['DataDrivenTitleBar']['Enabled'] = false; +$Configuration["Garden"]["MobileTheme"] = "keystone"; +$Configuration["Badges"]["BadgesModule"]["Target"] = "AfterUserInfo"; +$Configuration["Feature"]["NewFlyouts"]["Enabled"] = true; +$Configuration["Feature"]["DataDrivenTitleBar"]["Enabled"] = false; diff --git a/addons/themes/theme-boilerplate/setup/boilerplateInstall.js b/addons/themes/theme-boilerplate/setup/boilerplateInstall.js index 56ff8804002..058f45108d2 100755 --- a/addons/themes/theme-boilerplate/setup/boilerplateInstall.js +++ b/addons/themes/theme-boilerplate/setup/boilerplateInstall.js @@ -24,8 +24,7 @@ if (!utils.validateArgs(themeKey, themeName)) { try { //copy addon.json fse.copyFileSync(path.resolve(TOOL_ROOT, "addon.json"), path.resolve(DEST, "addon.json")); - fse.readFile(path.resolve(DEST, "addon.json"), 'utf8', function (err,data) { - + fse.readFile(path.resolve(DEST, "addon.json"), "utf8", function (err, data) { data = data.replace(/theme-boilerplate/g, themeKey); data = data.replace(/Theme Boilerplate/g, themeName); @@ -34,8 +33,7 @@ try { //copy README.md and swap theme name fse.copyFileSync(path.resolve(TOOL_ROOT, "setup/src/README.md"), path.resolve(DEST, "README.md")); - fse.readFile(path.resolve(DEST, "README.md"), 'utf8', function (err,data) { - + fse.readFile(path.resolve(DEST, "README.md"), "utf8", function (err, data) { data = data.replace(/Vanilla Theme Boilerplate/g, themeName); fse.writeFileSync(path.resolve(DEST, "README.md"), data); @@ -52,7 +50,6 @@ try { //create src/ dir fse.mkdir(path.resolve(DEST, "src"), function (err) { - //create scss folder sctructure fse.mkdirSync(path.resolve(DEST, "src/scss")); fse.mkdirSync(path.resolve(DEST, "src/scss/base")); @@ -64,7 +61,10 @@ try { fse.copyFileSync(path.resolve(TOOL_ROOT, "setup/src/custom.scss"), path.resolve(DEST, "src/scss/custom.scss")); //copy _variables.scss - fse.copyFileSync(path.resolve(TOOL_ROOT, "src/scss/base/_variables.scss"), path.resolve(DEST, "src/scss/base/_variables.scss")); + fse.copyFileSync( + path.resolve(TOOL_ROOT, "src/scss/base/_variables.scss"), + path.resolve(DEST, "src/scss/base/_variables.scss"), + ); //create js folder fse.mkdirSync(path.resolve(DEST, "src/js")); @@ -80,7 +80,6 @@ try { fse.copySync(path.resolve(TOOL_ROOT, "settings"), path.resolve(DEST, "settings")); console.log("Boilerplate successfully installed!"); - } catch (err) { console.error(err.message); } diff --git a/addons/themes/theme-boilerplate/setup/src/README.md b/addons/themes/theme-boilerplate/setup/src/README.md index 0f5ce4b0b29..aab43f864ad 100644 --- a/addons/themes/theme-boilerplate/setup/src/README.md +++ b/addons/themes/theme-boilerplate/setup/src/README.md @@ -1,14 +1,12 @@ # Vanilla Theme Boilerplate - ## Description Custom theme for Vanilla Theme Boilerplate. - ## Notes -- This theme needs the `Feature.NewFlyouts.Enabled` config set as `true` for the flyouts to work properly. +- This theme needs the `Feature.NewFlyouts.Enabled` config set as `true` for the flyouts to work properly. ## Building Styles / Javascript / Images @@ -26,6 +24,4 @@ vanilla build --watch to build your styles/js/images. - - Documentation for the CLI can be found [here](https://docs.vanillaforums.com/developer/vanilla-cli/#build-tools). diff --git a/addons/themes/theme-boilerplate/setup/utils.js b/addons/themes/theme-boilerplate/setup/utils.js index 420d54ff132..6040455919a 100644 --- a/addons/themes/theme-boilerplate/setup/utils.js +++ b/addons/themes/theme-boilerplate/setup/utils.js @@ -6,33 +6,32 @@ module.exports = { convertToDashedCase: function (str) { - if(str === undefined){ + if (str === undefined) { console.error('Execute installation command followed by the theme-key and "Theme Name"'); return; } - return str.toLowerCase().replace(/-/g, ''); + return str.toLowerCase().replace(/-/g, ""); }, convertToPascalCase: function (str) { - if(str === undefined){ + if (str === undefined) { console.error('Execute installation command followed by the theme-key and "Theme Name"'); return; } - var splitStr = str.toLowerCase().split('-'); + var splitStr = str.toLowerCase().split("-"); for (var i = 0; i < splitStr.length; i++) { // assign it back to the array splitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].substring(1); } //remove special characters and return the joined string - splitStr = splitStr.join(''); - return splitStr.replace(/[^\w\s]/gi, ''); + splitStr = splitStr.join(""); + return splitStr.replace(/[^\w\s]/gi, ""); }, validateArgs: function (themeKey, themeName) { var valid = true; - if(themeKey === undefined || themeName === undefined){ - valid = false; + if (themeKey === undefined || themeName === undefined) { + valid = false; } return valid; - } + }, }; - diff --git a/addons/themes/theme-boilerplate/structure-variables.md b/addons/themes/theme-boilerplate/structure-variables.md index f0a627cdec4..4ec45851f89 100644 --- a/addons/themes/theme-boilerplate/structure-variables.md +++ b/addons/themes/theme-boilerplate/structure-variables.md @@ -53,7 +53,7 @@ What about more abstract styles that are applied to multiple blocks? Use the blo $global-button_paddingTop ``` -What about states? Append "_hover" after the sub element. +What about states? Append "\_hover" after the sub element. ``` $vanillaBox-icon_hover_paddingTop @@ -63,75 +63,73 @@ $vanillaBox-icon_hover_paddingTop ### Global -- **$global-body_fontFamily**: Main font family. Used pretty much for every text on the theme. -- **$global-body_fontWeight**: Same as above but for font weight. -- **$global-medium_fontSize**: Same as above but for font size. -- **$global-color_primary**: Your brand's primary color. (Recommended to have good contrast with `$global-color_bg`) -- **$global-color_primaryAlt**: A variation of the primary color, usually used on hover state (it might be a darker version of the same color like for example). -- **$global-color_secondary**: Your brand's secondary color. generally used for important call to actions, or hover/focus color. Recommended to have good contrast with `$global-color_bg`) -- **$global-color_bg**: Main color used for background. Adding a dark color to this variable will transform your theme into a dark theme, so make sure the `$global-color_fg` has high contrast with the color declared here. -- **$global-color_fg**: Main color used for foreground elements like text, icons, etc. Should have high contrast between `$global-color_bg`. +- **$global-body_fontFamily**: Main font family. Used pretty much for every text on the theme. +- **$global-body_fontWeight**: Same as above but for font weight. +- **$global-medium_fontSize**: Same as above but for font size. +- **$global-color_primary**: Your brand's primary color. (Recommended to have good contrast with `$global-color_bg`) +- **$global-color_primaryAlt**: A variation of the primary color, usually used on hover state (it might be a darker version of the same color like for example). +- **$global-color_secondary**: Your brand's secondary color. generally used for important call to actions, or hover/focus color. Recommended to have good contrast with `$global-color_bg`) +- **$global-color_bg**: Main color used for background. Adding a dark color to this variable will transform your theme into a dark theme, so make sure the `$global-color_fg` has high contrast with the color declared here. +- **$global-color_fg**: Main color used for foreground elements like text, icons, etc. Should have high contrast between `$global-color_bg`. ### Utility -- **$utility-baseUnitDouble**: Utility variables are heavily inherited through the theme. Editing those variables may break your layout, please do not edit them. -- **$utility-baseUnitHalf**: Utility variables are heavily inherited through the theme. Editing those variables may break your layout, please do not edit them. -- **$utility-baseUnitHalf**: Utility variables are heavily inherited through the theme. Editing those variables may break your layout, please do not edit them. -- **$utility-baseUnitTriple**: Utility variables are heavily inherited through the theme. Editing those variables may break your layout, please do not edit them. -- **$utility-xLarge_padding**: Utility variables are heavily inherited through the theme. Editing those variables may break your layout, please do not edit them. +- **$utility-baseUnitDouble**: Utility variables are heavily inherited through the theme. Editing those variables may break your layout, please do not edit them. +- **$utility-baseUnitHalf**: Utility variables are heavily inherited through the theme. Editing those variables may break your layout, please do not edit them. +- **$utility-baseUnitHalf**: Utility variables are heavily inherited through the theme. Editing those variables may break your layout, please do not edit them. +- **$utility-baseUnitTriple**: Utility variables are heavily inherited through the theme. Editing those variables may break your layout, please do not edit them. +- **$utility-xLarge_padding**: Utility variables are heavily inherited through the theme. Editing those variables may break your layout, please do not edit them. ### Theme -- **$theme-link_color**: Color used on links. -- **$theme-link-hover_color**: Color used on links, but on hover state. -- **$theme-link-hover_textDecoration**: Value to be used to decorate links on hover state. Usually it's set to `none` or `underline`. +- **$theme-link_color**: Color used on links. +- **$theme-link-hover_color**: Color used on links, but on hover state. +- **$theme-link-hover_textDecoration**: Value to be used to decorate links on hover state. Usually it's set to `none` or `underline`. ### Frame -- **$frame_backgroundColor**: Color used for background inside the theme frame. -- **$frame_backgroundImage**: Main background image. You can use this value to blend with `$frame_backgroundColor`. +- **$frame_backgroundColor**: Color used for background inside the theme frame. +- **$frame_backgroundImage**: Main background image. You can use this value to blend with `$frame_backgroundColor`. ### Header -- **$header_bg**: Background color for the header section. -- **$header_border**: Bottom border for the header section. To remove the border set this value to `none`. +- **$header_bg**: Background color for the header section. +- **$header_border**: Bottom border for the header section. To remove the border set this value to `none`. ### Panel -- **$panel_toLeft**: Set `true` on this variable if you want the panel to be on the left. -- **$panel_width**: Width for the panel section. -- **$panel_bg**: Background color for the panel section. -- **$panel_item-border**: Border for each item on the panel. -- **$panel_item-spacing**: Spacing between items on the panel. If the value of this field is `0`, item's borders will colapse. -- **$panel_item-borderRadius**: Border radius for each item on the panel. +- **$panel_toLeft**: Set `true` on this variable if you want the panel to be on the left. +- **$panel_width**: Width for the panel section. +- **$panel_bg**: Background color for the panel section. +- **$panel_item-border**: Border for each item on the panel. +- **$panel_item-spacing**: Spacing between items on the panel. If the value of this field is `0`, item's borders will colapse. +- **$panel_item-borderRadius**: Border radius for each item on the panel. ### Footer -- **$footer_bg**: Background color for the footer section. -- **$footer_color**: Text color for the footer section. -- **footer-link_color**: Color used in links on the footer section. -- **$footer-link-hover_color**: Color used in links on the footer section, but on hover state. +- **$footer_bg**: Background color for the footer section. +- **$footer_color**: Text color for the footer section. +- **footer-link_color**: Color used in links on the footer section. +- **$footer-link-hover_color**: Color used in links on the footer section, but on hover state. ### Component -- **$component-item_spacing**: Space between items. Generally used on categories and discussions lists. If the value of this variable is `0`, the items will collapse. -- **$component_bg**: Background color used on items. -- **$component_borderWidth**: Border width used on items. Border's will always be solid. Seti this value to `0` to remove the border. -- **$component_borderColor**: Color used on items borders. -- **$component_boxShadow**: Box shadow used on items. If `$component-item_spacing` value is `0`, this variable will be used on the list, not on the items. -- **$component_borderRadius**: Box radius used on items. If `$component-item_spacing` value is `0`, this variable will be used on the list, not on the items. +- **$component-item_spacing**: Space between items. Generally used on categories and discussions lists. If the value of this variable is `0`, the items will collapse. +- **$component_bg**: Background color used on items. +- **$component_borderWidth**: Border width used on items. Border's will always be solid. Seti this value to `0` to remove the border. +- **$component_borderColor**: Color used on items borders. +- **$component_boxShadow**: Box shadow used on items. If `$component-item_spacing` value is `0`, this variable will be used on the list, not on the items. +- **$component_borderRadius**: Box radius used on items. If `$component-item_spacing` value is `0`, this variable will be used on the list, not on the items. ### Form Element -- **$formElement_borderColor**: Border color for form inputs and textarea. -- **$formElement_borderRadius**: Border radius for form inputs and textarea. +- **$formElement_borderColor**: Border color for form inputs and textarea. +- **$formElement_borderRadius**: Border radius for form inputs and textarea. ### Form Button -- **$formButton_bg**: Background color used on buttons. -- **$formButton_color**: Text color used on buttons. -- **$formButton_borderRadius**: Border radius used on buttons. If you set this value to the `$formButton_height` , buttons will be round. +- **$formButton_bg**: Background color used on buttons. +- **$formButton_color**: Text color used on buttons. +- **$formButton_borderRadius**: Border radius used on buttons. If you set this value to the `$formButton_height` , buttons will be round. - - -> **Notice:** Some variables relative to specific components are not inside the `_variables.scss` file, those you can find inside the component `.scss` itself. Fell free to dig inside `src/scss/components` to find out more. +> **Notice:** Some variables relative to specific components are not inside the `_variables.scss` file, those you can find inside the component `.scss` itself. Fell free to dig inside `src/scss/components` to find out more. diff --git a/addons/themes/theme-dashboard/views/admin.master.twig b/addons/themes/theme-dashboard/views/admin.master.twig index 91b27e5232e..6fd3f1b71ff 100644 --- a/addons/themes/theme-dashboard/views/admin.master.twig +++ b/addons/themes/theme-dashboard/views/admin.master.twig @@ -7,7 +7,9 @@ {{ renderControllerAsset("Head") }}