From 69b50275cdb226f5ee572fcf03396d6ca6cf5573 Mon Sep 17 00:00:00 2001 From: Marcel Baumgartner Date: Fri, 13 Oct 2023 20:48:36 +0200 Subject: [PATCH] Added theme and basic ui defaults --- .dockerignore | 25 + .idea/.idea.Moonlight/.idea/encodings.xml | 4 + .idea/.idea.Moonlight/.idea/indexLayout.xml | 8 + .../.idea/projectSettingsUpdater.xml | 6 + .idea/.idea.Moonlight/.idea/vcs.xml | 6 + Moonlight.sln | 16 + .../ConfigurationBuilderExtensions.cs | 13 + Moonlight/BlazorApp.razor | 13 + Moonlight/Dockerfile | 20 + Moonlight/Moonlight.csproj | 31 + Moonlight/Pages/_Host.cshtml | 37 + Moonlight/Program.cs | 31 + Moonlight/Properties/launchSettings.json | 13 + .../Partials/ConnectionIndicator.razor | 24 + .../Components/Partials/PageHeader.razor | 219 +++ .../Shared/Components/Partials/Sidebar.razor | 31 + Moonlight/Shared/Layouts/DefaultLayout.razor | 36 + Moonlight/Shared/Layouts/MainLayout.razor | 5 + Moonlight/Shared/Views/Index.razor | 3 + Moonlight/Styles/_init.scss | 31 + Moonlight/Styles/base/_functions.scss | 10 + Moonlight/Styles/base/_mixins.scss | 11 + Moonlight/Styles/base/functions/_get.scss | 82 + Moonlight/Styles/base/functions/_math.scss | 15 + Moonlight/Styles/base/functions/_set.scss | 43 + .../Styles/base/functions/_theme-colors.scss | 15 + Moonlight/Styles/base/functions/_valueif.scss | 13 + .../Styles/base/mixins/_breakpoints.scss | 25 + Moonlight/Styles/base/mixins/_browsers.scss | 23 + Moonlight/Styles/base/mixins/_fixes.scss | 15 + .../Styles/base/mixins/_placeholder.scss | 16 + Moonlight/Styles/base/mixins/_property.scss | 9 + Moonlight/Styles/base/mixins/_reset.scss | 23 + .../Styles/bootstrap/scss/_accordion.scss | 158 ++ Moonlight/Styles/bootstrap/scss/_alert.scss | 68 + Moonlight/Styles/bootstrap/scss/_badge.scss | 38 + .../Styles/bootstrap/scss/_breadcrumb.scss | 40 + .../Styles/bootstrap/scss/_button-group.scss | 142 ++ Moonlight/Styles/bootstrap/scss/_buttons.scss | 207 ++ Moonlight/Styles/bootstrap/scss/_card.scss | 239 +++ .../Styles/bootstrap/scss/_carousel.scss | 244 +++ Moonlight/Styles/bootstrap/scss/_close.scss | 63 + .../Styles/bootstrap/scss/_containers.scss | 41 + .../Styles/bootstrap/scss/_dropdown.scss | 250 +++ Moonlight/Styles/bootstrap/scss/_forms.scss | 9 + .../Styles/bootstrap/scss/_functions.scss | 302 +++ Moonlight/Styles/bootstrap/scss/_grid.scss | 39 + Moonlight/Styles/bootstrap/scss/_helpers.scss | 12 + Moonlight/Styles/bootstrap/scss/_images.scss | 42 + .../Styles/bootstrap/scss/_list-group.scss | 197 ++ Moonlight/Styles/bootstrap/scss/_maps.scss | 174 ++ Moonlight/Styles/bootstrap/scss/_mixins.scss | 42 + Moonlight/Styles/bootstrap/scss/_modal.scss | 237 +++ Moonlight/Styles/bootstrap/scss/_nav.scss | 197 ++ Moonlight/Styles/bootstrap/scss/_navbar.scss | 289 +++ .../Styles/bootstrap/scss/_offcanvas.scss | 146 ++ .../Styles/bootstrap/scss/_pagination.scss | 109 + .../Styles/bootstrap/scss/_placeholders.scss | 51 + Moonlight/Styles/bootstrap/scss/_popover.scss | 196 ++ .../Styles/bootstrap/scss/_progress.scss | 68 + Moonlight/Styles/bootstrap/scss/_reboot.scss | 611 ++++++ Moonlight/Styles/bootstrap/scss/_root.scss | 187 ++ .../Styles/bootstrap/scss/_spinners.scss | 85 + Moonlight/Styles/bootstrap/scss/_tables.scss | 171 ++ Moonlight/Styles/bootstrap/scss/_toasts.scss | 73 + Moonlight/Styles/bootstrap/scss/_tooltip.scss | 119 ++ .../Styles/bootstrap/scss/_transitions.scss | 27 + Moonlight/Styles/bootstrap/scss/_type.scss | 106 + .../Styles/bootstrap/scss/_utilities.scss | 806 ++++++++ .../bootstrap/scss/_variables-dark.scss | 87 + .../Styles/bootstrap/scss/_variables.scss | 1747 +++++++++++++++++ .../Styles/bootstrap/scss/bootstrap-grid.scss | 62 + .../bootstrap/scss/bootstrap-reboot.scss | 10 + .../bootstrap/scss/bootstrap-utilities.scss | 19 + .../Styles/bootstrap/scss/bootstrap.scss | 52 + .../scss/forms/_floating-labels.scss | 95 + .../bootstrap/scss/forms/_form-check.scss | 189 ++ .../bootstrap/scss/forms/_form-control.scss | 214 ++ .../bootstrap/scss/forms/_form-range.scss | 91 + .../bootstrap/scss/forms/_form-select.scss | 80 + .../bootstrap/scss/forms/_form-text.scss | 11 + .../bootstrap/scss/forms/_input-group.scss | 132 ++ .../Styles/bootstrap/scss/forms/_labels.scss | 36 + .../bootstrap/scss/forms/_validation.scss | 12 + .../bootstrap/scss/helpers/_clearfix.scss | 3 + .../bootstrap/scss/helpers/_color-bg.scss | 7 + .../scss/helpers/_colored-links.scss | 30 + .../bootstrap/scss/helpers/_focus-ring.scss | 5 + .../bootstrap/scss/helpers/_icon-link.scss | 25 + .../bootstrap/scss/helpers/_position.scss | 36 + .../Styles/bootstrap/scss/helpers/_ratio.scss | 26 + .../bootstrap/scss/helpers/_stacks.scss | 15 + .../scss/helpers/_stretched-link.scss | 15 + .../scss/helpers/_text-truncation.scss | 7 + .../scss/helpers/_visually-hidden.scss | 8 + .../Styles/bootstrap/scss/helpers/_vr.scss | 8 + .../Styles/bootstrap/scss/mixins/_alert.scss | 18 + .../bootstrap/scss/mixins/_backdrop.scss | 14 + .../Styles/bootstrap/scss/mixins/_banner.scss | 7 + .../bootstrap/scss/mixins/_border-radius.scss | 78 + .../bootstrap/scss/mixins/_box-shadow.scss | 18 + .../bootstrap/scss/mixins/_breakpoints.scss | 127 ++ .../bootstrap/scss/mixins/_buttons.scss | 70 + .../Styles/bootstrap/scss/mixins/_caret.scss | 69 + .../bootstrap/scss/mixins/_clearfix.scss | 9 + .../bootstrap/scss/mixins/_color-mode.scss | 21 + .../bootstrap/scss/mixins/_color-scheme.scss | 7 + .../bootstrap/scss/mixins/_container.scss | 11 + .../bootstrap/scss/mixins/_deprecate.scss | 10 + .../Styles/bootstrap/scss/mixins/_forms.scss | 153 ++ .../bootstrap/scss/mixins/_gradients.scss | 47 + .../Styles/bootstrap/scss/mixins/_grid.scss | 151 ++ .../Styles/bootstrap/scss/mixins/_image.scss | 16 + .../bootstrap/scss/mixins/_list-group.scss | 26 + .../Styles/bootstrap/scss/mixins/_lists.scss | 7 + .../bootstrap/scss/mixins/_pagination.scss | 10 + .../bootstrap/scss/mixins/_reset-text.scss | 17 + .../Styles/bootstrap/scss/mixins/_resize.scss | 6 + .../scss/mixins/_table-variants.scss | 24 + .../bootstrap/scss/mixins/_text-truncate.scss | 8 + .../bootstrap/scss/mixins/_transition.scss | 26 + .../bootstrap/scss/mixins/_utilities.scss | 97 + .../scss/mixins/_visually-hidden.scss | 33 + .../Styles/bootstrap/scss/tests/jasmine.js | 16 + .../scss/tests/mixins/_color-modes.test.scss | 69 + .../_media-query-color-mode-full.test.scss | 8 + .../scss/tests/mixins/_utilities.test.scss | 393 ++++ .../scss/tests/sass-true/register.js | 14 + .../bootstrap/scss/tests/sass-true/runner.js | 17 + .../scss/tests/utilities/_api.test.scss | 75 + .../Styles/bootstrap/scss/utilities/_api.scss | 47 + .../Styles/bootstrap/scss/vendor/_rfs.scss | 348 ++++ Moonlight/Styles/build.bat | 2 + Moonlight/Styles/components/_accordion.scss | 107 + Moonlight/Styles/components/_alert.scss | 15 + Moonlight/Styles/components/_anchor.scss | 37 + Moonlight/Styles/components/_animation.scss | 81 + Moonlight/Styles/components/_badge.scss | 75 + Moonlight/Styles/components/_blockui.scss | 53 + Moonlight/Styles/components/_breadcrumb.scss | 69 + .../Styles/components/_btn-secondary.scss | 36 + Moonlight/Styles/components/_bullet.scss | 33 + Moonlight/Styles/components/_buttons.scss | 7 + Moonlight/Styles/components/_card.scss | 314 +++ Moonlight/Styles/components/_carousel.scss | 130 ++ Moonlight/Styles/components/_code.scss | 15 + Moonlight/Styles/components/_cookiealert.scss | 8 + Moonlight/Styles/components/_drawer.scss | 62 + Moonlight/Styles/components/_dropdown.scss | 12 + Moonlight/Styles/components/_engage.scss | 118 ++ Moonlight/Styles/components/_explore.scss | 104 + Moonlight/Styles/components/_fixed.scss | 18 + Moonlight/Styles/components/_forms.scss | 13 + Moonlight/Styles/components/_helpers.scss | 12 + Moonlight/Styles/components/_hover.scss | 53 + Moonlight/Styles/components/_image-input.scss | 111 ++ Moonlight/Styles/components/_indicator.scss | 17 + Moonlight/Styles/components/_landing.scss | 136 ++ Moonlight/Styles/components/_menu.scss | 7 + Moonlight/Styles/components/_mixins.scss | 13 + Moonlight/Styles/components/_modal.scss | 7 + .../Styles/components/_nav-line-tabs.scss | 68 + .../Styles/components/_nav-pills-custom.scss | 91 + Moonlight/Styles/components/_nav.scss | 71 + Moonlight/Styles/components/_offcanvas.scss | 6 + Moonlight/Styles/components/_overlay.scss | 35 + Moonlight/Styles/components/_page-loader.scss | 28 + Moonlight/Styles/components/_pagination.scss | 176 ++ Moonlight/Styles/components/_popover.scss | 58 + Moonlight/Styles/components/_print.scss | 34 + Moonlight/Styles/components/_progress.scss | 27 + Moonlight/Styles/components/_pulse.scss | 39 + Moonlight/Styles/components/_rating.scss | 62 + Moonlight/Styles/components/_reboot.scss | 7 + Moonlight/Styles/components/_ribbon.scss | 195 ++ Moonlight/Styles/components/_root.scss | 316 +++ Moonlight/Styles/components/_rotate.scss | 47 + Moonlight/Styles/components/_scroll.scss | 111 ++ Moonlight/Styles/components/_scrolltop.scss | 69 + Moonlight/Styles/components/_separator.scss | 66 + Moonlight/Styles/components/_shape.scss | 13 + Moonlight/Styles/components/_stepper.scss | 8 + Moonlight/Styles/components/_svg-icon.scss | 30 + Moonlight/Styles/components/_symbol.scss | 133 ++ Moonlight/Styles/components/_tables.scss | 232 +++ .../components/_testimonials-slider.scss | 65 + Moonlight/Styles/components/_theme-mode.scss | 38 + .../Styles/components/_timeline-label.scss | 59 + Moonlight/Styles/components/_timeline.scss | 75 + Moonlight/Styles/components/_toasts.scss | 17 + Moonlight/Styles/components/_toggle.scss | 19 + Moonlight/Styles/components/_tooltip.scss | 32 + Moonlight/Styles/components/_type.scss | 9 + Moonlight/Styles/components/_utilities.scss | 130 ++ .../Styles/components/_variables-dark.scss | 289 +++ .../Styles/components/_variables.custom.scss | 44 + Moonlight/Styles/components/_variables.scss | 1229 ++++++++++++ .../Styles/components/buttons/_base.scss | 129 ++ .../Styles/components/buttons/_theme.scss | 259 +++ Moonlight/Styles/components/components.scss | 68 + .../components/forms/_floating-labels.scss | 12 + .../Styles/components/forms/_form-check.scss | 193 ++ .../components/forms/_form-control.scss | 70 + .../Styles/components/forms/_form-select.scss | 68 + .../Styles/components/forms/_input-group.scss | 36 + .../Styles/components/forms/_labels.scss | 8 + .../Styles/components/forms/_required.scss | 14 + .../components/helpers/_background.scss | 241 +++ .../Styles/components/helpers/_borders.scss | 114 ++ .../Styles/components/helpers/_flex.scss | 57 + .../Styles/components/helpers/_opacity.scss | 18 + .../Styles/components/helpers/_shadow.scss | 19 + .../Styles/components/helpers/_text.scss | 146 ++ .../Styles/components/helpers/_transform.scss | 8 + Moonlight/Styles/components/menu/_base.scss | 307 +++ Moonlight/Styles/components/menu/_theme.scss | 510 +++++ .../Styles/components/mixins/_buttons.scss | 84 + Moonlight/Styles/components/mixins/_ki.scss | 18 + Moonlight/Styles/components/mixins/_menu.scss | 301 +++ .../Styles/components/mixins/_scroll.scss | 34 + .../Styles/components/mixins/_shape.scss | 29 + .../components/mixins/_svg-bg-icon.scss | 68 + .../Styles/components/mixins/_svg-icon.scss | 11 + .../Styles/components/mixins/_symbol.scss | 42 + .../Styles/components/stepper/_base.scss | 102 + .../Styles/components/stepper/_links.scss | 57 + .../Styles/components/stepper/_multistep.scss | 42 + .../Styles/components/stepper/_pills.scss | 201 ++ Moonlight/Styles/docs/_aside.scss | 54 + Moonlight/Styles/docs/_content.scss | 8 + Moonlight/Styles/docs/_header.scss | 26 + Moonlight/Styles/docs/_layout.scss | 12 + Moonlight/Styles/docs/_main.scss | 32 + Moonlight/Styles/docs/_menu.scss | 31 + Moonlight/Styles/docs/_print.scss | 30 + Moonlight/Styles/docs/_root.scss | 23 + Moonlight/Styles/docs/_variables.scss | 21 + Moonlight/Styles/layout/_base.scss | 50 + Moonlight/Styles/layout/_header.scss | 22 + Moonlight/Styles/layout/_layout.scss | 9 + Moonlight/Styles/layout/_page-title.scss | 22 + Moonlight/Styles/layout/_root.scss | 15 + .../Styles/layout/_sidebar-minimize.scss | 43 + Moonlight/Styles/layout/_sidebar.scss | 213 ++ .../Styles/layout/_variables.custom.scss | 68 + Moonlight/Styles/layout/base/_container.scss | 30 + Moonlight/Styles/layout/base/_content.scss | 24 + Moonlight/Styles/layout/base/_footer.scss | 99 + Moonlight/Styles/layout/base/_hero.scss | 13 + .../Styles/layout/base/_layout-builder.scss | 19 + Moonlight/Styles/layout/base/_layout.scss | 29 + Moonlight/Styles/layout/base/_main.scss | 75 + Moonlight/Styles/layout/base/_navbar.scss | 19 + .../Styles/layout/base/_page-loader.scss | 31 + Moonlight/Styles/layout/base/_page.scss | 7 + Moonlight/Styles/layout/base/_print.scss | 34 + Moonlight/Styles/layout/base/_reboot.scss | 65 + Moonlight/Styles/layout/base/_root.scss | 368 ++++ Moonlight/Styles/layout/base/_toolbar.scss | 171 ++ Moonlight/Styles/layout/base/_variables.scss | 615 ++++++ Moonlight/Styles/layout/base/_wrapper.scss | 100 + .../Styles/layout/base/aside/_aside.scss | 275 +++ .../layout/base/header/_header-primary.scss | 135 ++ .../layout/base/header/_header-secondary.scss | 139 ++ .../layout/base/header/_header-tertiary.scss | 138 ++ .../Styles/layout/base/header/_header.scss | 224 +++ .../layout/base/mixins/_layout-minimize.scss | 41 + .../base/mixins/_layout-transition.scss | 7 + .../layout/base/sidebar/_sidebar-panel.scss | 281 +++ .../layout/base/sidebar/_sidebar-primary.scss | 230 +++ .../base/sidebar/_sidebar-secondary.scss | 274 +++ .../Styles/layout/base/sidebar/_sidebar.scss | 284 +++ Moonlight/Styles/plugins.scss | 13 + Moonlight/Styles/style.scss | 14 + .../Styles/vendors/plugins/_apexcharts.scss | 129 ++ .../vendors/plugins/_bootstrap-maxlength.scss | 16 + .../Styles/vendors/plugins/_ckeditor.scss | 54 + .../Styles/vendors/plugins/_datatables.scss | 272 +++ .../vendors/plugins/_daterangepicker.scss | 272 +++ .../Styles/vendors/plugins/_draggable.scss | 28 + .../Styles/vendors/plugins/_dropzone.scss | 188 ++ .../Styles/vendors/plugins/_flatpickr.scss | 407 ++++ .../vendors/plugins/_formvalidation.scss | 20 + .../Styles/vendors/plugins/_fslightbox.scss | 11 + .../Styles/vendors/plugins/_fullcalendar.scss | 297 +++ Moonlight/Styles/vendors/plugins/_gmaps.scss | 18 + .../Styles/vendors/plugins/_jkanban.scss | 94 + Moonlight/Styles/vendors/plugins/_jstree.scss | 150 ++ .../Styles/vendors/plugins/_keenicons.scss | 12 + .../Styles/vendors/plugins/_leaflet.scss | 23 + Moonlight/Styles/vendors/plugins/_mixins.scss | 5 + .../Styles/vendors/plugins/_nouislider.scss | 103 + .../vendors/plugins/_plugins.angular.scss | 12 + .../vendors/plugins/_plugins.react.scss | 12 + .../Styles/vendors/plugins/_plugins.scss | 34 + .../Styles/vendors/plugins/_plugins.vue.scss | 12 + .../Styles/vendors/plugins/_prismjs.scss | 84 + Moonlight/Styles/vendors/plugins/_quill.scss | 196 ++ .../Styles/vendors/plugins/_recaptcha.scss | 32 + Moonlight/Styles/vendors/plugins/_root.scss | 36 + .../Styles/vendors/plugins/_select2.scss | 418 ++++ .../Styles/vendors/plugins/_sweetalert2.scss | 112 ++ Moonlight/Styles/vendors/plugins/_tagify.scss | 222 +++ .../vendors/plugins/_tempus-dominus.scss | 163 ++ .../Styles/vendors/plugins/_tiny-slider.scss | 141 ++ .../Styles/vendors/plugins/_tinymce.scss | 13 + Moonlight/Styles/vendors/plugins/_toastr.scss | 87 + .../vendors/plugins/_variables-dark.scss | 18 + .../Styles/vendors/plugins/_variables.scss | 27 + .../Styles/vendors/plugins/_vis-timeline.scss | 131 ++ .../vendors/plugins/mixins/_nouislider.scss | 13 + Moonlight/_Imports.razor | 5 + Moonlight/wwwroot/css/blazor.css | 51 + Moonlight/wwwroot/css/boxicons.min.css | 1 + Moonlight/wwwroot/fonts/boxicons.eot | Bin 0 -> 404773 bytes Moonlight/wwwroot/fonts/boxicons.svg | 1653 ++++++++++++++++ Moonlight/wwwroot/fonts/boxicons.ttf | Bin 0 -> 319936 bytes Moonlight/wwwroot/fonts/boxicons.woff | Bin 0 -> 320012 bytes Moonlight/wwwroot/fonts/boxicons.woff2 | Bin 0 -> 117788 bytes Moonlight/wwwroot/js/bootstrap.bundle.min.js | 7 + 320 files changed, 30617 insertions(+) create mode 100644 .dockerignore create mode 100644 .idea/.idea.Moonlight/.idea/encodings.xml create mode 100644 .idea/.idea.Moonlight/.idea/indexLayout.xml create mode 100644 .idea/.idea.Moonlight/.idea/projectSettingsUpdater.xml create mode 100644 .idea/.idea.Moonlight/.idea/vcs.xml create mode 100644 Moonlight.sln create mode 100644 Moonlight/App/Extensions/ConfigurationBuilderExtensions.cs create mode 100644 Moonlight/BlazorApp.razor create mode 100644 Moonlight/Dockerfile create mode 100644 Moonlight/Moonlight.csproj create mode 100644 Moonlight/Pages/_Host.cshtml create mode 100644 Moonlight/Program.cs create mode 100644 Moonlight/Properties/launchSettings.json create mode 100644 Moonlight/Shared/Components/Partials/ConnectionIndicator.razor create mode 100644 Moonlight/Shared/Components/Partials/PageHeader.razor create mode 100644 Moonlight/Shared/Components/Partials/Sidebar.razor create mode 100644 Moonlight/Shared/Layouts/DefaultLayout.razor create mode 100644 Moonlight/Shared/Layouts/MainLayout.razor create mode 100644 Moonlight/Shared/Views/Index.razor create mode 100644 Moonlight/Styles/_init.scss create mode 100644 Moonlight/Styles/base/_functions.scss create mode 100644 Moonlight/Styles/base/_mixins.scss create mode 100644 Moonlight/Styles/base/functions/_get.scss create mode 100644 Moonlight/Styles/base/functions/_math.scss create mode 100644 Moonlight/Styles/base/functions/_set.scss create mode 100644 Moonlight/Styles/base/functions/_theme-colors.scss create mode 100644 Moonlight/Styles/base/functions/_valueif.scss create mode 100644 Moonlight/Styles/base/mixins/_breakpoints.scss create mode 100644 Moonlight/Styles/base/mixins/_browsers.scss create mode 100644 Moonlight/Styles/base/mixins/_fixes.scss create mode 100644 Moonlight/Styles/base/mixins/_placeholder.scss create mode 100644 Moonlight/Styles/base/mixins/_property.scss create mode 100644 Moonlight/Styles/base/mixins/_reset.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_accordion.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_alert.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_badge.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_breadcrumb.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_button-group.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_buttons.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_card.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_carousel.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_close.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_containers.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_dropdown.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_forms.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_functions.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_grid.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_helpers.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_images.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_list-group.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_maps.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_mixins.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_modal.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_nav.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_navbar.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_offcanvas.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_pagination.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_placeholders.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_popover.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_progress.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_reboot.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_root.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_spinners.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_tables.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_toasts.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_tooltip.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_transitions.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_type.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_utilities.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_variables-dark.scss create mode 100644 Moonlight/Styles/bootstrap/scss/_variables.scss create mode 100644 Moonlight/Styles/bootstrap/scss/bootstrap-grid.scss create mode 100644 Moonlight/Styles/bootstrap/scss/bootstrap-reboot.scss create mode 100644 Moonlight/Styles/bootstrap/scss/bootstrap-utilities.scss create mode 100644 Moonlight/Styles/bootstrap/scss/bootstrap.scss create mode 100644 Moonlight/Styles/bootstrap/scss/forms/_floating-labels.scss create mode 100644 Moonlight/Styles/bootstrap/scss/forms/_form-check.scss create mode 100644 Moonlight/Styles/bootstrap/scss/forms/_form-control.scss create mode 100644 Moonlight/Styles/bootstrap/scss/forms/_form-range.scss create mode 100644 Moonlight/Styles/bootstrap/scss/forms/_form-select.scss create mode 100644 Moonlight/Styles/bootstrap/scss/forms/_form-text.scss create mode 100644 Moonlight/Styles/bootstrap/scss/forms/_input-group.scss create mode 100644 Moonlight/Styles/bootstrap/scss/forms/_labels.scss create mode 100644 Moonlight/Styles/bootstrap/scss/forms/_validation.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_clearfix.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_color-bg.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_colored-links.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_focus-ring.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_icon-link.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_position.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_ratio.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_stacks.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_stretched-link.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_text-truncation.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_visually-hidden.scss create mode 100644 Moonlight/Styles/bootstrap/scss/helpers/_vr.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_alert.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_backdrop.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_banner.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_border-radius.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_box-shadow.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_breakpoints.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_buttons.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_caret.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_clearfix.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_color-mode.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_color-scheme.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_container.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_deprecate.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_forms.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_gradients.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_grid.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_image.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_list-group.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_lists.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_pagination.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_reset-text.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_resize.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_table-variants.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_text-truncate.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_transition.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_utilities.scss create mode 100644 Moonlight/Styles/bootstrap/scss/mixins/_visually-hidden.scss create mode 100644 Moonlight/Styles/bootstrap/scss/tests/jasmine.js create mode 100644 Moonlight/Styles/bootstrap/scss/tests/mixins/_color-modes.test.scss create mode 100644 Moonlight/Styles/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss create mode 100644 Moonlight/Styles/bootstrap/scss/tests/mixins/_utilities.test.scss create mode 100644 Moonlight/Styles/bootstrap/scss/tests/sass-true/register.js create mode 100644 Moonlight/Styles/bootstrap/scss/tests/sass-true/runner.js create mode 100644 Moonlight/Styles/bootstrap/scss/tests/utilities/_api.test.scss create mode 100644 Moonlight/Styles/bootstrap/scss/utilities/_api.scss create mode 100644 Moonlight/Styles/bootstrap/scss/vendor/_rfs.scss create mode 100644 Moonlight/Styles/build.bat create mode 100644 Moonlight/Styles/components/_accordion.scss create mode 100644 Moonlight/Styles/components/_alert.scss create mode 100644 Moonlight/Styles/components/_anchor.scss create mode 100644 Moonlight/Styles/components/_animation.scss create mode 100644 Moonlight/Styles/components/_badge.scss create mode 100644 Moonlight/Styles/components/_blockui.scss create mode 100644 Moonlight/Styles/components/_breadcrumb.scss create mode 100644 Moonlight/Styles/components/_btn-secondary.scss create mode 100644 Moonlight/Styles/components/_bullet.scss create mode 100644 Moonlight/Styles/components/_buttons.scss create mode 100644 Moonlight/Styles/components/_card.scss create mode 100644 Moonlight/Styles/components/_carousel.scss create mode 100644 Moonlight/Styles/components/_code.scss create mode 100644 Moonlight/Styles/components/_cookiealert.scss create mode 100644 Moonlight/Styles/components/_drawer.scss create mode 100644 Moonlight/Styles/components/_dropdown.scss create mode 100644 Moonlight/Styles/components/_engage.scss create mode 100644 Moonlight/Styles/components/_explore.scss create mode 100644 Moonlight/Styles/components/_fixed.scss create mode 100644 Moonlight/Styles/components/_forms.scss create mode 100644 Moonlight/Styles/components/_helpers.scss create mode 100644 Moonlight/Styles/components/_hover.scss create mode 100644 Moonlight/Styles/components/_image-input.scss create mode 100644 Moonlight/Styles/components/_indicator.scss create mode 100644 Moonlight/Styles/components/_landing.scss create mode 100644 Moonlight/Styles/components/_menu.scss create mode 100644 Moonlight/Styles/components/_mixins.scss create mode 100644 Moonlight/Styles/components/_modal.scss create mode 100644 Moonlight/Styles/components/_nav-line-tabs.scss create mode 100644 Moonlight/Styles/components/_nav-pills-custom.scss create mode 100644 Moonlight/Styles/components/_nav.scss create mode 100644 Moonlight/Styles/components/_offcanvas.scss create mode 100644 Moonlight/Styles/components/_overlay.scss create mode 100644 Moonlight/Styles/components/_page-loader.scss create mode 100644 Moonlight/Styles/components/_pagination.scss create mode 100644 Moonlight/Styles/components/_popover.scss create mode 100644 Moonlight/Styles/components/_print.scss create mode 100644 Moonlight/Styles/components/_progress.scss create mode 100644 Moonlight/Styles/components/_pulse.scss create mode 100644 Moonlight/Styles/components/_rating.scss create mode 100644 Moonlight/Styles/components/_reboot.scss create mode 100644 Moonlight/Styles/components/_ribbon.scss create mode 100644 Moonlight/Styles/components/_root.scss create mode 100644 Moonlight/Styles/components/_rotate.scss create mode 100644 Moonlight/Styles/components/_scroll.scss create mode 100644 Moonlight/Styles/components/_scrolltop.scss create mode 100644 Moonlight/Styles/components/_separator.scss create mode 100644 Moonlight/Styles/components/_shape.scss create mode 100644 Moonlight/Styles/components/_stepper.scss create mode 100644 Moonlight/Styles/components/_svg-icon.scss create mode 100644 Moonlight/Styles/components/_symbol.scss create mode 100644 Moonlight/Styles/components/_tables.scss create mode 100644 Moonlight/Styles/components/_testimonials-slider.scss create mode 100644 Moonlight/Styles/components/_theme-mode.scss create mode 100644 Moonlight/Styles/components/_timeline-label.scss create mode 100644 Moonlight/Styles/components/_timeline.scss create mode 100644 Moonlight/Styles/components/_toasts.scss create mode 100644 Moonlight/Styles/components/_toggle.scss create mode 100644 Moonlight/Styles/components/_tooltip.scss create mode 100644 Moonlight/Styles/components/_type.scss create mode 100644 Moonlight/Styles/components/_utilities.scss create mode 100644 Moonlight/Styles/components/_variables-dark.scss create mode 100644 Moonlight/Styles/components/_variables.custom.scss create mode 100644 Moonlight/Styles/components/_variables.scss create mode 100644 Moonlight/Styles/components/buttons/_base.scss create mode 100644 Moonlight/Styles/components/buttons/_theme.scss create mode 100644 Moonlight/Styles/components/components.scss create mode 100644 Moonlight/Styles/components/forms/_floating-labels.scss create mode 100644 Moonlight/Styles/components/forms/_form-check.scss create mode 100644 Moonlight/Styles/components/forms/_form-control.scss create mode 100644 Moonlight/Styles/components/forms/_form-select.scss create mode 100644 Moonlight/Styles/components/forms/_input-group.scss create mode 100644 Moonlight/Styles/components/forms/_labels.scss create mode 100644 Moonlight/Styles/components/forms/_required.scss create mode 100644 Moonlight/Styles/components/helpers/_background.scss create mode 100644 Moonlight/Styles/components/helpers/_borders.scss create mode 100644 Moonlight/Styles/components/helpers/_flex.scss create mode 100644 Moonlight/Styles/components/helpers/_opacity.scss create mode 100644 Moonlight/Styles/components/helpers/_shadow.scss create mode 100644 Moonlight/Styles/components/helpers/_text.scss create mode 100644 Moonlight/Styles/components/helpers/_transform.scss create mode 100644 Moonlight/Styles/components/menu/_base.scss create mode 100644 Moonlight/Styles/components/menu/_theme.scss create mode 100644 Moonlight/Styles/components/mixins/_buttons.scss create mode 100644 Moonlight/Styles/components/mixins/_ki.scss create mode 100644 Moonlight/Styles/components/mixins/_menu.scss create mode 100644 Moonlight/Styles/components/mixins/_scroll.scss create mode 100644 Moonlight/Styles/components/mixins/_shape.scss create mode 100644 Moonlight/Styles/components/mixins/_svg-bg-icon.scss create mode 100644 Moonlight/Styles/components/mixins/_svg-icon.scss create mode 100644 Moonlight/Styles/components/mixins/_symbol.scss create mode 100644 Moonlight/Styles/components/stepper/_base.scss create mode 100644 Moonlight/Styles/components/stepper/_links.scss create mode 100644 Moonlight/Styles/components/stepper/_multistep.scss create mode 100644 Moonlight/Styles/components/stepper/_pills.scss create mode 100644 Moonlight/Styles/docs/_aside.scss create mode 100644 Moonlight/Styles/docs/_content.scss create mode 100644 Moonlight/Styles/docs/_header.scss create mode 100644 Moonlight/Styles/docs/_layout.scss create mode 100644 Moonlight/Styles/docs/_main.scss create mode 100644 Moonlight/Styles/docs/_menu.scss create mode 100644 Moonlight/Styles/docs/_print.scss create mode 100644 Moonlight/Styles/docs/_root.scss create mode 100644 Moonlight/Styles/docs/_variables.scss create mode 100644 Moonlight/Styles/layout/_base.scss create mode 100644 Moonlight/Styles/layout/_header.scss create mode 100644 Moonlight/Styles/layout/_layout.scss create mode 100644 Moonlight/Styles/layout/_page-title.scss create mode 100644 Moonlight/Styles/layout/_root.scss create mode 100644 Moonlight/Styles/layout/_sidebar-minimize.scss create mode 100644 Moonlight/Styles/layout/_sidebar.scss create mode 100644 Moonlight/Styles/layout/_variables.custom.scss create mode 100644 Moonlight/Styles/layout/base/_container.scss create mode 100644 Moonlight/Styles/layout/base/_content.scss create mode 100644 Moonlight/Styles/layout/base/_footer.scss create mode 100644 Moonlight/Styles/layout/base/_hero.scss create mode 100644 Moonlight/Styles/layout/base/_layout-builder.scss create mode 100644 Moonlight/Styles/layout/base/_layout.scss create mode 100644 Moonlight/Styles/layout/base/_main.scss create mode 100644 Moonlight/Styles/layout/base/_navbar.scss create mode 100644 Moonlight/Styles/layout/base/_page-loader.scss create mode 100644 Moonlight/Styles/layout/base/_page.scss create mode 100644 Moonlight/Styles/layout/base/_print.scss create mode 100644 Moonlight/Styles/layout/base/_reboot.scss create mode 100644 Moonlight/Styles/layout/base/_root.scss create mode 100644 Moonlight/Styles/layout/base/_toolbar.scss create mode 100644 Moonlight/Styles/layout/base/_variables.scss create mode 100644 Moonlight/Styles/layout/base/_wrapper.scss create mode 100644 Moonlight/Styles/layout/base/aside/_aside.scss create mode 100644 Moonlight/Styles/layout/base/header/_header-primary.scss create mode 100644 Moonlight/Styles/layout/base/header/_header-secondary.scss create mode 100644 Moonlight/Styles/layout/base/header/_header-tertiary.scss create mode 100644 Moonlight/Styles/layout/base/header/_header.scss create mode 100644 Moonlight/Styles/layout/base/mixins/_layout-minimize.scss create mode 100644 Moonlight/Styles/layout/base/mixins/_layout-transition.scss create mode 100644 Moonlight/Styles/layout/base/sidebar/_sidebar-panel.scss create mode 100644 Moonlight/Styles/layout/base/sidebar/_sidebar-primary.scss create mode 100644 Moonlight/Styles/layout/base/sidebar/_sidebar-secondary.scss create mode 100644 Moonlight/Styles/layout/base/sidebar/_sidebar.scss create mode 100644 Moonlight/Styles/plugins.scss create mode 100644 Moonlight/Styles/style.scss create mode 100644 Moonlight/Styles/vendors/plugins/_apexcharts.scss create mode 100644 Moonlight/Styles/vendors/plugins/_bootstrap-maxlength.scss create mode 100644 Moonlight/Styles/vendors/plugins/_ckeditor.scss create mode 100644 Moonlight/Styles/vendors/plugins/_datatables.scss create mode 100644 Moonlight/Styles/vendors/plugins/_daterangepicker.scss create mode 100644 Moonlight/Styles/vendors/plugins/_draggable.scss create mode 100644 Moonlight/Styles/vendors/plugins/_dropzone.scss create mode 100644 Moonlight/Styles/vendors/plugins/_flatpickr.scss create mode 100644 Moonlight/Styles/vendors/plugins/_formvalidation.scss create mode 100644 Moonlight/Styles/vendors/plugins/_fslightbox.scss create mode 100644 Moonlight/Styles/vendors/plugins/_fullcalendar.scss create mode 100644 Moonlight/Styles/vendors/plugins/_gmaps.scss create mode 100644 Moonlight/Styles/vendors/plugins/_jkanban.scss create mode 100644 Moonlight/Styles/vendors/plugins/_jstree.scss create mode 100644 Moonlight/Styles/vendors/plugins/_keenicons.scss create mode 100644 Moonlight/Styles/vendors/plugins/_leaflet.scss create mode 100644 Moonlight/Styles/vendors/plugins/_mixins.scss create mode 100644 Moonlight/Styles/vendors/plugins/_nouislider.scss create mode 100644 Moonlight/Styles/vendors/plugins/_plugins.angular.scss create mode 100644 Moonlight/Styles/vendors/plugins/_plugins.react.scss create mode 100644 Moonlight/Styles/vendors/plugins/_plugins.scss create mode 100644 Moonlight/Styles/vendors/plugins/_plugins.vue.scss create mode 100644 Moonlight/Styles/vendors/plugins/_prismjs.scss create mode 100644 Moonlight/Styles/vendors/plugins/_quill.scss create mode 100644 Moonlight/Styles/vendors/plugins/_recaptcha.scss create mode 100644 Moonlight/Styles/vendors/plugins/_root.scss create mode 100644 Moonlight/Styles/vendors/plugins/_select2.scss create mode 100644 Moonlight/Styles/vendors/plugins/_sweetalert2.scss create mode 100644 Moonlight/Styles/vendors/plugins/_tagify.scss create mode 100644 Moonlight/Styles/vendors/plugins/_tempus-dominus.scss create mode 100644 Moonlight/Styles/vendors/plugins/_tiny-slider.scss create mode 100644 Moonlight/Styles/vendors/plugins/_tinymce.scss create mode 100644 Moonlight/Styles/vendors/plugins/_toastr.scss create mode 100644 Moonlight/Styles/vendors/plugins/_variables-dark.scss create mode 100644 Moonlight/Styles/vendors/plugins/_variables.scss create mode 100644 Moonlight/Styles/vendors/plugins/_vis-timeline.scss create mode 100644 Moonlight/Styles/vendors/plugins/mixins/_nouislider.scss create mode 100644 Moonlight/_Imports.razor create mode 100644 Moonlight/wwwroot/css/blazor.css create mode 100644 Moonlight/wwwroot/css/boxicons.min.css create mode 100644 Moonlight/wwwroot/fonts/boxicons.eot create mode 100644 Moonlight/wwwroot/fonts/boxicons.svg create mode 100644 Moonlight/wwwroot/fonts/boxicons.ttf create mode 100644 Moonlight/wwwroot/fonts/boxicons.woff create mode 100644 Moonlight/wwwroot/fonts/boxicons.woff2 create mode 100644 Moonlight/wwwroot/js/bootstrap.bundle.min.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..cd967fc --- /dev/null +++ b/.dockerignore @@ -0,0 +1,25 @@ +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/.idea +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/.idea/.idea.Moonlight/.idea/encodings.xml b/.idea/.idea.Moonlight/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.Moonlight/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.Moonlight/.idea/indexLayout.xml b/.idea/.idea.Moonlight/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.Moonlight/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.Moonlight/.idea/projectSettingsUpdater.xml b/.idea/.idea.Moonlight/.idea/projectSettingsUpdater.xml new file mode 100644 index 0000000..4bb9f4d --- /dev/null +++ b/.idea/.idea.Moonlight/.idea/projectSettingsUpdater.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/.idea.Moonlight/.idea/vcs.xml b/.idea/.idea.Moonlight/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/.idea.Moonlight/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Moonlight.sln b/Moonlight.sln new file mode 100644 index 0000000..87f7f78 --- /dev/null +++ b/Moonlight.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Moonlight", "Moonlight\Moonlight.csproj", "{691E5EC2-4B4F-4BD1-9CBC-7D3C6EFC12DA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {691E5EC2-4B4F-4BD1-9CBC-7D3C6EFC12DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {691E5EC2-4B4F-4BD1-9CBC-7D3C6EFC12DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {691E5EC2-4B4F-4BD1-9CBC-7D3C6EFC12DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {691E5EC2-4B4F-4BD1-9CBC-7D3C6EFC12DA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Moonlight/App/Extensions/ConfigurationBuilderExtensions.cs b/Moonlight/App/Extensions/ConfigurationBuilderExtensions.cs new file mode 100644 index 0000000..2ade456 --- /dev/null +++ b/Moonlight/App/Extensions/ConfigurationBuilderExtensions.cs @@ -0,0 +1,13 @@ +using System.Text; + +namespace Moonlight.App.Extensions; + +public static class ConfigurationBuilderExtensions +{ + public static IConfigurationBuilder AddJsonString(this IConfigurationBuilder configurationBuilder, string json) + { + var bytes = Encoding.UTF8.GetBytes(json); + var stream = new MemoryStream(bytes); + return configurationBuilder.AddJsonStream(stream); + } +} \ No newline at end of file diff --git a/Moonlight/BlazorApp.razor b/Moonlight/BlazorApp.razor new file mode 100644 index 0000000..385264d --- /dev/null +++ b/Moonlight/BlazorApp.razor @@ -0,0 +1,13 @@ +@using Moonlight.Shared.Layouts + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
\ No newline at end of file diff --git a/Moonlight/Dockerfile b/Moonlight/Dockerfile new file mode 100644 index 0000000..e00ed64 --- /dev/null +++ b/Moonlight/Dockerfile @@ -0,0 +1,20 @@ +FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base +WORKDIR /app +EXPOSE 80 +EXPOSE 443 + +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +WORKDIR /src +COPY ["Moonlight/Moonlight.csproj", "Moonlight/"] +RUN dotnet restore "Moonlight/Moonlight.csproj" +COPY . . +WORKDIR "/src/Moonlight" +RUN dotnet build "Moonlight.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "Moonlight.csproj" -c Release -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Moonlight.dll"] diff --git a/Moonlight/Moonlight.csproj b/Moonlight/Moonlight.csproj new file mode 100644 index 0000000..622dce0 --- /dev/null +++ b/Moonlight/Moonlight.csproj @@ -0,0 +1,31 @@ + + + + net7.0 + enable + enable + Linux + + + + + .dockerignore + + + + + + + + + + + + + + + + + + + diff --git a/Moonlight/Pages/_Host.cshtml b/Moonlight/Pages/_Host.cshtml new file mode 100644 index 0000000..3ed5871 --- /dev/null +++ b/Moonlight/Pages/_Host.cshtml @@ -0,0 +1,37 @@ +@page "/" +@using Microsoft.AspNetCore.Components.Web +@namespace Moonlight.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers + + + + + + + + Moonlight + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Moonlight/Program.cs b/Moonlight/Program.cs new file mode 100644 index 0000000..a3e47a6 --- /dev/null +++ b/Moonlight/Program.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; +using Moonlight.App.Extensions; + +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddRazorPages(); +builder.Services.AddServerSideBlazor(); + +var config = + new ConfigurationBuilder().AddJsonString( + "{\"LogLevel\":{\"Default\":\"Information\",\"Microsoft.AspNetCore\":\"Warning\"}}"); +builder.Logging.AddConfiguration(config.Build()); + +var app = builder.Build(); + +if (!app.Environment.IsDevelopment()) +{ + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseHttpsRedirection(); + +app.UseStaticFiles(); + +app.UseRouting(); + +app.MapBlazorHub(); +app.MapFallbackToPage("/_Host"); + +app.Run(); \ No newline at end of file diff --git a/Moonlight/Properties/launchSettings.json b/Moonlight/Properties/launchSettings.json new file mode 100644 index 0000000..a03e9d9 --- /dev/null +++ b/Moonlight/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5132", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Moonlight/Shared/Components/Partials/ConnectionIndicator.razor b/Moonlight/Shared/Components/Partials/ConnectionIndicator.razor new file mode 100644 index 0000000..4c7298b --- /dev/null +++ b/Moonlight/Shared/Components/Partials/ConnectionIndicator.razor @@ -0,0 +1,24 @@ +
+
+ +
+
+ +
+ + +
\ No newline at end of file diff --git a/Moonlight/Shared/Components/Partials/PageHeader.razor b/Moonlight/Shared/Components/Partials/PageHeader.razor new file mode 100644 index 0000000..fe0e944 --- /dev/null +++ b/Moonlight/Shared/Components/Partials/PageHeader.razor @@ -0,0 +1,219 @@ +@using Moonlight.Shared.Layouts + + +@code +{ + [CascadingParameter] + public DefaultLayout Layout { get; set; } +} diff --git a/Moonlight/Shared/Components/Partials/Sidebar.razor b/Moonlight/Shared/Components/Partials/Sidebar.razor new file mode 100644 index 0000000..401bab6 --- /dev/null +++ b/Moonlight/Shared/Components/Partials/Sidebar.razor @@ -0,0 +1,31 @@ +@using Moonlight.Shared.Layouts +
+ + +
+ +@code +{ + [CascadingParameter] + public DefaultLayout Layout { get; set; } +} \ No newline at end of file diff --git a/Moonlight/Shared/Layouts/DefaultLayout.razor b/Moonlight/Shared/Layouts/DefaultLayout.razor new file mode 100644 index 0000000..c3db78e --- /dev/null +++ b/Moonlight/Shared/Layouts/DefaultLayout.razor @@ -0,0 +1,36 @@ +
+
+ + +
+ +
+
+
+ @ChildContent +
+
+
+
+
+
+
+ +@if (ShowMobileSidebar) +{ +
+} + +@code +{ + [Parameter] + public RenderFragment ChildContent { get; set; } + + public bool ShowMobileSidebar { get; set; } + + public async Task ToggleMobileSidebar() + { + ShowMobileSidebar = !ShowMobileSidebar; + await InvokeAsync(StateHasChanged); + } +} \ No newline at end of file diff --git a/Moonlight/Shared/Layouts/MainLayout.razor b/Moonlight/Shared/Layouts/MainLayout.razor new file mode 100644 index 0000000..2ab8e18 --- /dev/null +++ b/Moonlight/Shared/Layouts/MainLayout.razor @@ -0,0 +1,5 @@ +@inherits LayoutComponentBase + + + @Body + \ No newline at end of file diff --git a/Moonlight/Shared/Views/Index.razor b/Moonlight/Shared/Views/Index.razor new file mode 100644 index 0000000..add825e --- /dev/null +++ b/Moonlight/Shared/Views/Index.razor @@ -0,0 +1,3 @@ +@page "/" + +

Hello, world!

\ No newline at end of file diff --git a/Moonlight/Styles/_init.scss b/Moonlight/Styles/_init.scss new file mode 100644 index 0000000..04a714d --- /dev/null +++ b/Moonlight/Styles/_init.scss @@ -0,0 +1,31 @@ +// +// Main init file of global bootstrap and theme functions, mixins, variables and config +// + + +// Custom functions & mixins +@import "base/functions"; +@import "base/mixins"; +@import "components/mixins"; +@import "vendors/plugins/mixins"; + +// Custom variables +@import "components/variables.custom"; +@import "components/variables"; +@import "components/variables-dark"; + +// Bootstrap initializaton +@import "bootstrap/scss/functions"; +@import "bootstrap/scss/variables"; +@import "bootstrap/scss/variables-dark"; +@import "bootstrap/scss/maps"; +@import "bootstrap/scss/mixins"; +@import "bootstrap/scss/utilities"; + +// 3rd-Party plugins variables +@import "vendors/plugins/variables"; +@import "vendors/plugins/variables-dark"; + +// Custom layout variables +@import "layout/base/variables"; +@import "layout/variables.custom"; \ No newline at end of file diff --git a/Moonlight/Styles/base/_functions.scss b/Moonlight/Styles/base/_functions.scss new file mode 100644 index 0000000..0551f4b --- /dev/null +++ b/Moonlight/Styles/base/_functions.scss @@ -0,0 +1,10 @@ +// +// Functions +// + +// Import Dependencies +@import "functions/get"; +@import "functions/set"; +@import "functions/math"; +@import "functions/valueif"; +@import "functions/theme-colors"; diff --git a/Moonlight/Styles/base/_mixins.scss b/Moonlight/Styles/base/_mixins.scss new file mode 100644 index 0000000..93acae0 --- /dev/null +++ b/Moonlight/Styles/base/_mixins.scss @@ -0,0 +1,11 @@ +// +// Mixins +// + +// Import Dependencies +@import "mixins/property"; +@import "mixins/browsers"; +@import "mixins/fixes"; +@import "mixins/reset"; +@import "mixins/placeholder"; +@import "mixins/breakpoints"; diff --git a/Moonlight/Styles/base/functions/_get.scss b/Moonlight/Styles/base/functions/_get.scss new file mode 100644 index 0000000..775e4a1 --- /dev/null +++ b/Moonlight/Styles/base/functions/_get.scss @@ -0,0 +1,82 @@ +// +// Get +// + +@function get($map, $keys...) { + @if length($keys) == 1 { + $keys: nth($keys, 1); + } + + @if type-of($map) != 'map' or $map == null { + //@return false; + } + + $warn: "#{nth($keys, 1)}"; + $length: length($keys); + $get: map-get($map, nth($keys, 1)); + + @if $length > 1 { + @for $i from 2 through $length { + @if $get != null and type-of($get) == 'map' { + $warn: $warn + "->#{nth($keys, $i)}"; + $get: map-get($get, nth($keys, $i)); + + @if $get == null { + @return null; + } + } + @else { + @return get-warning($warn, $get, nth($keys, $i)); + } + } + } + + @return $get; +} + +@function has($map, $keys...) { + @if length($keys) == 1 { + $keys: nth($keys, 1); + } + + @if type-of($map) != 'map' or $map == null { + //@return false; + } + + $warn: "#{nth($keys, 1)}"; + $length: length($keys); + $get: map-get($map, nth($keys, 1)); + + @if $length > 1 { + @for $i from 2 through $length { + @if $get != null and type-of($get) == 'map' { + $warn: $warn + "->#{nth($keys, $i)}"; + $get: map-get($get, nth($keys, $i)); + + @if $get == null { + @return false; + } + } + @else { + @return false; + } + } + } + + @if $get != null { + @return true; + } + @else { + @return false; + } +} + +@function get-warning($warn, $get, $key) { + @if $get == null { + @warn "Map has no value for key search `#{$warn}`"; + } + @else if type-of($get) != 'map' { + @warn "Non-map value found for key search `#{$warn}`, cannot search for key `#{$key}`"; + } + @return null; +} \ No newline at end of file diff --git a/Moonlight/Styles/base/functions/_math.scss b/Moonlight/Styles/base/functions/_math.scss new file mode 100644 index 0000000..e5766ff --- /dev/null +++ b/Moonlight/Styles/base/functions/_math.scss @@ -0,0 +1,15 @@ +// +// Math +// + +@function sqrt($r) { + $x0: 1; + $x1: $x0; + + @for $i from 1 through 10 { + $x1: $x0 - ($x0 * $x0 - abs($r)) / (2 * $x0); + $x0: $x1; + } + + @return $x1; +} diff --git a/Moonlight/Styles/base/functions/_set.scss b/Moonlight/Styles/base/functions/_set.scss new file mode 100644 index 0000000..91690a8 --- /dev/null +++ b/Moonlight/Styles/base/functions/_set.scss @@ -0,0 +1,43 @@ +/// Deep set function to set a value in nested maps + +@function set($map, $keys, $value) { + $maps: ($map,); + $result: null; + + // If the last key is a map already + // Warn the user we will be overriding it with $value + @if type-of(nth($keys, -1)) == "map" { + @warn "The last key you specified is a map; it will be overrided with `#{$value}`."; + } + + // If $keys is a single key + // Just merge and return + @if length($keys) == 1 { + @return map-merge($map, ($keys: $value)); + } + + // Loop from the first to the second to last key from $keys + // Store the associated map to this key in the $maps list + // If the key doesn't exist, throw an error + @for $i from 1 through length($keys) - 1 { + $current-key: nth($keys, $i); + $current-map: nth($maps, -1); + $current-get: map-get($current-map, $current-key); + @if $current-get == null { + @error "Key `#{$key}` doesn't exist at current level in map."; + } + $maps: append($maps, $current-get); + } + + // Loop from the last map to the first one + // Merge it with the previous one + @for $i from length($maps) through 1 { + $current-map: nth($maps, $i); + $current-key: nth($keys, $i); + $current-val: if($i == length($maps), $value, $result); + $result: map-merge($current-map, ($current-key: $current-val)); + } + + // Return result + @return $result; +} diff --git a/Moonlight/Styles/base/functions/_theme-colors.scss b/Moonlight/Styles/base/functions/_theme-colors.scss new file mode 100644 index 0000000..6c9fd7f --- /dev/null +++ b/Moonlight/Styles/base/functions/_theme-colors.scss @@ -0,0 +1,15 @@ +// +// Bootstrap extended functions +// + +@function theme-inverse-color($key: "primary") { + @return get($theme-inverse-colors, $key); +} + +@function theme-active-color($key: "primary") { + @return get($theme-active-colors, $key); +} + +@function theme-light-color($key: "primary") { + @return get($theme-light-colors, $key); +} diff --git a/Moonlight/Styles/base/functions/_valueif.scss b/Moonlight/Styles/base/functions/_valueif.scss new file mode 100644 index 0000000..ac3de28 --- /dev/null +++ b/Moonlight/Styles/base/functions/_valueif.scss @@ -0,0 +1,13 @@ +// +// valueif +// + +@function valueif($check, $trueValue, $falseValue: null) { + @if $check { + @return $trueValue; + } @else if $falseValue != null { + @return $falseValue; + } @else { + @return null; + } +} diff --git a/Moonlight/Styles/base/mixins/_breakpoints.scss b/Moonlight/Styles/base/mixins/_breakpoints.scss new file mode 100644 index 0000000..d335b9a --- /dev/null +++ b/Moonlight/Styles/base/mixins/_breakpoints.scss @@ -0,0 +1,25 @@ +// Media of at most the maximum and minimum breakpoint widths. No query for the largest breakpoint. +// Makes the @content apply to the given breakpoint. + +@mixin media-breakpoint-direction($direction, $name, $breakpoints: $grid-breakpoints) { + @if $direction == up { + $min: breakpoint-min($name, $breakpoints); + + @if $min { + @media (min-width: $min) { + @content; + } + } @else { + @content; + } + + } @else if $direction == down { + $max: breakpoint-max($name, $breakpoints); + + @if $max { + @media (max-width: $max) { + @content; + } + } + } +} \ No newline at end of file diff --git a/Moonlight/Styles/base/mixins/_browsers.scss b/Moonlight/Styles/base/mixins/_browsers.scss new file mode 100644 index 0000000..5aaa31c --- /dev/null +++ b/Moonlight/Styles/base/mixins/_browsers.scss @@ -0,0 +1,23 @@ +// +// Browsers +// + +@mixin for-edge { + // Microsoft Edge + @supports (-ms-ime-align:auto) { + @content; + } +} + +@mixin for-safari { + .safari { + @content; + } +} + +@mixin for-firefox { + // Firefox + @-moz-document url-prefix() { + @content; + } +} \ No newline at end of file diff --git a/Moonlight/Styles/base/mixins/_fixes.scss b/Moonlight/Styles/base/mixins/_fixes.scss new file mode 100644 index 0000000..5f07525 --- /dev/null +++ b/Moonlight/Styles/base/mixins/_fixes.scss @@ -0,0 +1,15 @@ +// +// Fixes +// + + +@mixin fix-fixed-position-lags() { + // webkit hack for smooth font view on fixed positioned elements + -webkit-backface-visibility:hidden; + backface-visibility:hidden; +} + +@mixin fix-animation-lags() { + transform: translateZ(0); + -webkit-transform-style: preserve-3d; +} diff --git a/Moonlight/Styles/base/mixins/_placeholder.scss b/Moonlight/Styles/base/mixins/_placeholder.scss new file mode 100644 index 0000000..2119683 --- /dev/null +++ b/Moonlight/Styles/base/mixins/_placeholder.scss @@ -0,0 +1,16 @@ +// +// Input placeholder color +// + +@mixin placeholder($color) { + // Chrome, Firefox, Opera, Safari 10.1+ + &::placeholder { + color: $color; + } + + // Firefox + &::-moz-placeholder { + color: $color; + opacity: 1; + } +} diff --git a/Moonlight/Styles/base/mixins/_property.scss b/Moonlight/Styles/base/mixins/_property.scss new file mode 100644 index 0000000..d93c3ec --- /dev/null +++ b/Moonlight/Styles/base/mixins/_property.scss @@ -0,0 +1,9 @@ +// +// CSS Property +// + +@mixin property($attr, $value, $important: '') { + @if $value != null and $value != false { + #{$attr}: #{$value} #{$important}; + } +} \ No newline at end of file diff --git a/Moonlight/Styles/base/mixins/_reset.scss b/Moonlight/Styles/base/mixins/_reset.scss new file mode 100644 index 0000000..b796a6e --- /dev/null +++ b/Moonlight/Styles/base/mixins/_reset.scss @@ -0,0 +1,23 @@ +// +// Reset +// + +@mixin button-reset() { + appearance: none; + box-shadow: none; + border-radius: 0; + border: none; + cursor: pointer; + background-color: transparent; + outline: none !important; + margin: 0; + padding: 0; +} + +@mixin input-reset() { + border: 0; + background-color: transparent; + outline: none !important; + box-shadow: none; + border-radius: 0; +} diff --git a/Moonlight/Styles/bootstrap/scss/_accordion.scss b/Moonlight/Styles/bootstrap/scss/_accordion.scss new file mode 100644 index 0000000..75588a5 --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_accordion.scss @@ -0,0 +1,158 @@ +// +// Base styles +// + +.accordion { + // scss-docs-start accordion-css-vars + --#{$prefix}accordion-color: #{$accordion-color}; + --#{$prefix}accordion-bg: #{$accordion-bg}; + --#{$prefix}accordion-transition: #{$accordion-transition}; + --#{$prefix}accordion-border-color: #{$accordion-border-color}; + --#{$prefix}accordion-border-width: #{$accordion-border-width}; + --#{$prefix}accordion-border-radius: #{$accordion-border-radius}; + --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius}; + --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x}; + --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y}; + --#{$prefix}accordion-btn-color: #{$accordion-button-color}; + --#{$prefix}accordion-btn-bg: #{$accordion-button-bg}; + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)}; + --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width}; + --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform}; + --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)}; + --#{$prefix}accordion-btn-focus-border-color: #{$accordion-button-focus-border-color}; + --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow}; + --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x}; + --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y}; + --#{$prefix}accordion-active-color: #{$accordion-button-active-color}; + --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg}; + // scss-docs-end accordion-css-vars +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x); + @include font-size($font-size-base); + color: var(--#{$prefix}accordion-btn-color); + text-align: left; // Reset button style + background-color: var(--#{$prefix}accordion-btn-bg); + border: 0; + @include border-radius(0); + overflow-anchor: none; + @include transition(var(--#{$prefix}accordion-transition)); + + &:not(.collapsed) { + color: var(--#{$prefix}accordion-active-color); + background-color: var(--#{$prefix}accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list + + &::after { + background-image: var(--#{$prefix}accordion-btn-active-icon); + transform: var(--#{$prefix}accordion-btn-icon-transform); + } + } + + // Accordion icon + &::after { + flex-shrink: 0; + width: var(--#{$prefix}accordion-btn-icon-width); + height: var(--#{$prefix}accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--#{$prefix}accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--#{$prefix}accordion-btn-icon-width); + @include transition(var(--#{$prefix}accordion-btn-icon-transition)); + } + + &:hover { + z-index: 2; + } + + &:focus { + z-index: 3; + border-color: var(--#{$prefix}accordion-btn-focus-border-color); + outline: 0; + box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow); + } +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--#{$prefix}accordion-color); + background-color: var(--#{$prefix}accordion-bg); + border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color); + + &:first-of-type { + @include border-top-radius(var(--#{$prefix}accordion-border-radius)); + + .accordion-button { + @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + &:not(:first-of-type) { + border-top: 0; + } + + // Only set a border-radius on the last item if the accordion is collapsed + &:last-of-type { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + + .accordion-button { + &.collapsed { + @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius)); + } + } + + .accordion-collapse { + @include border-bottom-radius(var(--#{$prefix}accordion-border-radius)); + } + } +} + +.accordion-body { + padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x); +} + + +// Flush accordion items +// +// Remove borders and border-radius to keep accordion items edge-to-edge. + +.accordion-flush { + .accordion-collapse { + border-width: 0; + } + + .accordion-item { + border-right: 0; + border-left: 0; + @include border-radius(0); + + &:first-child { border-top: 0; } + &:last-child { border-bottom: 0; } + + .accordion-button { + &, + &.collapsed { + @include border-radius(0); + } + } + } +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .accordion-button::after { + --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)}; + --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)}; + } + } +} diff --git a/Moonlight/Styles/bootstrap/scss/_alert.scss b/Moonlight/Styles/bootstrap/scss/_alert.scss new file mode 100644 index 0000000..b8cff9b --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_alert.scss @@ -0,0 +1,68 @@ +// +// Base styles +// + +.alert { + // scss-docs-start alert-css-vars + --#{$prefix}alert-bg: transparent; + --#{$prefix}alert-padding-x: #{$alert-padding-x}; + --#{$prefix}alert-padding-y: #{$alert-padding-y}; + --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom}; + --#{$prefix}alert-color: inherit; + --#{$prefix}alert-border-color: transparent; + --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color); + --#{$prefix}alert-border-radius: #{$alert-border-radius}; + --#{$prefix}alert-link-color: inherit; + // scss-docs-end alert-css-vars + + position: relative; + padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x); + margin-bottom: var(--#{$prefix}alert-margin-bottom); + color: var(--#{$prefix}alert-color); + background-color: var(--#{$prefix}alert-bg); + border: var(--#{$prefix}alert-border); + @include border-radius(var(--#{$prefix}alert-border-radius)); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; + color: var(--#{$prefix}alert-link-color); +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $alert-dismissible-padding-r; + + // Adjust close link position + .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: $stretched-link-z-index + 1; + padding: $alert-padding-y * 1.25 $alert-padding-x; + } +} + + +// scss-docs-start alert-modifiers +// Generate contextual modifier classes for colorizing the alert +@each $state in map-keys($theme-colors) { + .alert-#{$state} { + --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis); + --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle); + --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle); + --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis); + } +} +// scss-docs-end alert-modifiers diff --git a/Moonlight/Styles/bootstrap/scss/_badge.scss b/Moonlight/Styles/bootstrap/scss/_badge.scss new file mode 100644 index 0000000..cc3d269 --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_badge.scss @@ -0,0 +1,38 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + // scss-docs-start badge-css-vars + --#{$prefix}badge-padding-x: #{$badge-padding-x}; + --#{$prefix}badge-padding-y: #{$badge-padding-y}; + @include rfs($badge-font-size, --#{$prefix}badge-font-size); + --#{$prefix}badge-font-weight: #{$badge-font-weight}; + --#{$prefix}badge-color: #{$badge-color}; + --#{$prefix}badge-border-radius: #{$badge-border-radius}; + // scss-docs-end badge-css-vars + + display: inline-block; + padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x); + @include font-size(var(--#{$prefix}badge-font-size)); + font-weight: var(--#{$prefix}badge-font-weight); + line-height: 1; + color: var(--#{$prefix}badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius(var(--#{$prefix}badge-border-radius)); + @include gradient-bg(); + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} diff --git a/Moonlight/Styles/bootstrap/scss/_breadcrumb.scss b/Moonlight/Styles/bootstrap/scss/_breadcrumb.scss new file mode 100644 index 0000000..b8252ff --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_breadcrumb.scss @@ -0,0 +1,40 @@ +.breadcrumb { + // scss-docs-start breadcrumb-css-vars + --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x}; + --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y}; + --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom}; + @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size); + --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg}; + --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius}; + --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color}; + --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x}; + --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color}; + // scss-docs-end breadcrumb-css-vars + + display: flex; + flex-wrap: wrap; + padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x); + margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom); + @include font-size(var(--#{$prefix}breadcrumb-font-size)); + list-style: none; + background-color: var(--#{$prefix}breadcrumb-bg); + @include border-radius(var(--#{$prefix}breadcrumb-border-radius)); +} + +.breadcrumb-item { + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item { + padding-left: var(--#{$prefix}breadcrumb-item-padding-x); + + &::before { + float: left; // Suppress inline spacings and underlining of the separator + padding-right: var(--#{$prefix}breadcrumb-item-padding-x); + color: var(--#{$prefix}breadcrumb-divider-color); + content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; + } + } + + &.active { + color: var(--#{$prefix}breadcrumb-item-active-color); + } +} diff --git a/Moonlight/Styles/bootstrap/scss/_button-group.scss b/Moonlight/Styles/bootstrap/scss/_button-group.scss new file mode 100644 index 0000000..55ae3f6 --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_button-group.scss @@ -0,0 +1,142 @@ +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; // match .btn alignment given font-size hack above + + > .btn { + position: relative; + flex: 1 1 auto; + } + + // Bring the hover, focused, and "active" buttons to the front to overlay + // the borders properly + > .btn-check:checked + .btn, + > .btn-check:focus + .btn, + > .btn:hover, + > .btn:focus, + > .btn:active, + > .btn.active { + z-index: 1; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + + .input-group { + width: auto; + } +} + +.btn-group { + @include border-radius($btn-border-radius); + + // Prevent double borders when buttons are next to each other + > :not(.btn-check:first-child) + .btn, + > .btn-group:not(:first-child) { + margin-left: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn.dropdown-toggle-split:first-child, + > .btn-group:not(:last-child) > .btn { + @include border-end-radius(0); + } + + // The left radius should be 0 if the button is: + // - the "third or more" child + // - the second child and the previous element isn't `.btn-check` (making it the first child visually) + // - part of a btn-group which isn't the first child + > .btn:nth-child(n + 3), + > :not(.btn-check) + .btn, + > .btn-group:not(:first-child) > .btn { + @include border-start-radius(0); + } +} + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// +// Split button dropdowns +// + +.dropdown-toggle-split { + padding-right: $btn-padding-x * .75; + padding-left: $btn-padding-x * .75; + + &::after, + .dropup &::after, + .dropend &::after { + margin-left: 0; + } + + .dropstart &::before { + margin-right: 0; + } +} + +.btn-sm + .dropdown-toggle-split { + padding-right: $btn-padding-x-sm * .75; + padding-left: $btn-padding-x-sm * .75; +} + +.btn-lg + .dropdown-toggle-split { + padding-right: $btn-padding-x-lg * .75; + padding-left: $btn-padding-x-lg * .75; +} + + +// The clickable button for toggling the menu +// Set the same inset shadow as the :active state +.btn-group.show .dropdown-toggle { + @include box-shadow($btn-active-box-shadow); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// +// Vertical button groups +// + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; + + > .btn, + > .btn-group { + width: 100%; + } + + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-top: calc(#{$btn-border-width} * -1); // stylelint-disable-line function-disallowed-list + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn-group:not(:last-child) > .btn { + @include border-bottom-radius(0); + } + + > .btn ~ .btn, + > .btn-group:not(:first-child) > .btn { + @include border-top-radius(0); + } +} diff --git a/Moonlight/Styles/bootstrap/scss/_buttons.scss b/Moonlight/Styles/bootstrap/scss/_buttons.scss new file mode 100644 index 0000000..e14a184 --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_buttons.scss @@ -0,0 +1,207 @@ +// +// Base styles +// + +.btn { + // scss-docs-start btn-css-vars + --#{$prefix}btn-padding-x: #{$btn-padding-x}; + --#{$prefix}btn-padding-y: #{$btn-padding-y}; + --#{$prefix}btn-font-family: #{$btn-font-family}; + @include rfs($btn-font-size, --#{$prefix}btn-font-size); + --#{$prefix}btn-font-weight: #{$btn-font-weight}; + --#{$prefix}btn-line-height: #{$btn-line-height}; + --#{$prefix}btn-color: #{$btn-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-width: #{$btn-border-width}; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-border-radius: #{$btn-border-radius}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-box-shadow: #{$btn-box-shadow}; + --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity}; + --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5); + // scss-docs-end btn-css-vars + + display: inline-block; + padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x); + font-family: var(--#{$prefix}btn-font-family); + @include font-size(var(--#{$prefix}btn-font-size)); + font-weight: var(--#{$prefix}btn-font-weight); + line-height: var(--#{$prefix}btn-line-height); + color: var(--#{$prefix}btn-color); + text-align: center; + text-decoration: if($link-decoration == none, null, none); + white-space: $btn-white-space; + vertical-align: middle; + cursor: if($enable-button-pointers, pointer, null); + user-select: none; + border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color); + @include border-radius(var(--#{$prefix}btn-border-radius)); + @include gradient-bg(var(--#{$prefix}btn-bg)); + @include box-shadow(var(--#{$prefix}btn-box-shadow)); + @include transition($btn-transition); + + &:hover { + color: var(--#{$prefix}btn-hover-color); + text-decoration: if($link-hover-decoration == underline, none, null); + background-color: var(--#{$prefix}btn-hover-bg); + border-color: var(--#{$prefix}btn-hover-border-color); + } + + .btn-check + &:hover { + // override for the checkbox/radio buttons + color: var(--#{$prefix}btn-color); + background-color: var(--#{$prefix}btn-bg); + border-color: var(--#{$prefix}btn-border-color); + } + + &:focus-visible { + color: var(--#{$prefix}btn-hover-color); + @include gradient-bg(var(--#{$prefix}btn-hover-bg)); + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:focus-visible + & { + border-color: var(--#{$prefix}btn-hover-border-color); + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + + .btn-check:checked + &, + :not(.btn-check) + &:active, + &:first-child:active, + &.active, + &.show { + color: var(--#{$prefix}btn-active-color); + background-color: var(--#{$prefix}btn-active-bg); + // Remove CSS gradients if they're enabled + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-active-border-color); + @include box-shadow(var(--#{$prefix}btn-active-shadow)); + + &:focus-visible { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow); + } @else { + box-shadow: var(--#{$prefix}btn-focus-box-shadow); + } + } + } + + &:disabled, + &.disabled, + fieldset:disabled & { + color: var(--#{$prefix}btn-disabled-color); + pointer-events: none; + background-color: var(--#{$prefix}btn-disabled-bg); + background-image: if($enable-gradients, none, null); + border-color: var(--#{$prefix}btn-disabled-border-color); + opacity: var(--#{$prefix}btn-disabled-opacity); + @include box-shadow(none); + } +} + + +// +// Alternate buttons +// + +// scss-docs-start btn-variant-loops +@each $color, $value in $theme-colors { + .btn-#{$color} { + @if $color == "light" { + @include button-variant( + $value, + $value, + $hover-background: shade-color($value, $btn-hover-bg-shade-amount), + $hover-border: shade-color($value, $btn-hover-border-shade-amount), + $active-background: shade-color($value, $btn-active-bg-shade-amount), + $active-border: shade-color($value, $btn-active-border-shade-amount) + ); + } @else if $color == "dark" { + @include button-variant( + $value, + $value, + $hover-background: tint-color($value, $btn-hover-bg-tint-amount), + $hover-border: tint-color($value, $btn-hover-border-tint-amount), + $active-background: tint-color($value, $btn-active-bg-tint-amount), + $active-border: tint-color($value, $btn-active-border-tint-amount) + ); + } @else { + @include button-variant($value, $value); + } + } +} + +@each $color, $value in $theme-colors { + .btn-outline-#{$color} { + @include button-outline-variant($value); + } +} +// scss-docs-end btn-variant-loops + + +// +// Link buttons +// + +// Make a button look and behave like a link +.btn-link { + --#{$prefix}btn-font-weight: #{$font-weight-normal}; + --#{$prefix}btn-color: #{$btn-link-color}; + --#{$prefix}btn-bg: transparent; + --#{$prefix}btn-border-color: transparent; + --#{$prefix}btn-hover-color: #{$btn-link-hover-color}; + --#{$prefix}btn-hover-border-color: transparent; + --#{$prefix}btn-active-color: #{$btn-link-hover-color}; + --#{$prefix}btn-active-border-color: transparent; + --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color}; + --#{$prefix}btn-disabled-border-color: transparent; + --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows + --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb}; + + text-decoration: $link-decoration; + @if $enable-gradients { + background-image: none; + } + + &:hover, + &:focus-visible { + text-decoration: $link-hover-decoration; + } + + &:focus-visible { + color: var(--#{$prefix}btn-color); + } + + &:hover { + color: var(--#{$prefix}btn-hover-color); + } + + // No need for an active state here +} + + +// +// Button Sizes +// + +.btn-lg { + @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg); +} + +.btn-sm { + @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm); +} diff --git a/Moonlight/Styles/bootstrap/scss/_card.scss b/Moonlight/Styles/bootstrap/scss/_card.scss new file mode 100644 index 0000000..d3535a9 --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_card.scss @@ -0,0 +1,239 @@ +// +// Base styles +// + +.card { + // scss-docs-start card-css-vars + --#{$prefix}card-spacer-y: #{$card-spacer-y}; + --#{$prefix}card-spacer-x: #{$card-spacer-x}; + --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y}; + --#{$prefix}card-title-color: #{$card-title-color}; + --#{$prefix}card-subtitle-color: #{$card-subtitle-color}; + --#{$prefix}card-border-width: #{$card-border-width}; + --#{$prefix}card-border-color: #{$card-border-color}; + --#{$prefix}card-border-radius: #{$card-border-radius}; + --#{$prefix}card-box-shadow: #{$card-box-shadow}; + --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius}; + --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y}; + --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x}; + --#{$prefix}card-cap-bg: #{$card-cap-bg}; + --#{$prefix}card-cap-color: #{$card-cap-color}; + --#{$prefix}card-height: #{$card-height}; + --#{$prefix}card-color: #{$card-color}; + --#{$prefix}card-bg: #{$card-bg}; + --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding}; + --#{$prefix}card-group-margin: #{$card-group-margin}; + // scss-docs-end card-css-vars + + position: relative; + display: flex; + flex-direction: column; + min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106 + height: var(--#{$prefix}card-height); + color: var(--#{$prefix}body-color); + word-wrap: break-word; + background-color: var(--#{$prefix}card-bg); + background-clip: border-box; + border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + @include border-radius(var(--#{$prefix}card-border-radius)); + @include box-shadow(var(--#{$prefix}card-box-shadow)); + + > hr { + margin-right: 0; + margin-left: 0; + } + + > .list-group { + border-top: inherit; + border-bottom: inherit; + + &:first-child { + border-top-width: 0; + @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); + } + + &:last-child { + border-bottom-width: 0; + @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); + } + } + + // Due to specificity of the above selector (`.card > .list-group`), we must + // use a child selector here to prevent double borders. + > .card-header + .list-group, + > .list-group + .card-footer { + border-top: 0; + } +} + +.card-body { + // Enable `flex-grow: 1` for decks and groups so that card blocks take up + // as much space as possible, ensuring footers are aligned to the bottom. + flex: 1 1 auto; + padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x); + color: var(--#{$prefix}card-color); +} + +.card-title { + margin-bottom: var(--#{$prefix}card-title-spacer-y); + color: var(--#{$prefix}card-title-color); +} + +.card-subtitle { + margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list + margin-bottom: 0; + color: var(--#{$prefix}card-subtitle-color); +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link { + &:hover { + text-decoration: if($link-hover-decoration == underline, none, null); + } + + + .card-link { + margin-left: var(--#{$prefix}card-spacer-x); + } +} + +// +// Optional textual caps +// + +.card-header { + padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); + margin-bottom: 0; // Removes the default margin-bottom of + color: var(--#{$prefix}card-cap-color); + background-color: var(--#{$prefix}card-cap-bg); + border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + + &:first-child { + @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0); + } +} + +.card-footer { + padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x); + color: var(--#{$prefix}card-cap-color); + background-color: var(--#{$prefix}card-cap-bg); + border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color); + + &:last-child { + @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius)); + } +} + + +// +// Header navs +// + +.card-header-tabs { + margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + border-bottom: 0; + + .nav-link.active { + background-color: var(--#{$prefix}card-bg); + border-bottom-color: var(--#{$prefix}card-bg); + } +} + +.card-header-pills { + margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list + margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list +} + +// Card image +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--#{$prefix}card-img-overlay-padding); + @include border-radius(var(--#{$prefix}card-inner-border-radius)); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch +} + +.card-img, +.card-img-top { + @include border-top-radius(var(--#{$prefix}card-inner-border-radius)); +} + +.card-img, +.card-img-bottom { + @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius)); +} + + +// +// Card groups +// + +.card-group { + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + margin-bottom: var(--#{$prefix}card-group-margin); + } + + @include media-breakpoint-up(sm) { + display: flex; + flex-flow: row wrap; + // The child selector allows nested `.card` within `.card-group` + // to display properly. + > .card { + // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4 + flex: 1 0 0%; + margin-bottom: 0; + + + .card { + margin-left: 0; + border-left: 0; + } + + // Handle rounded corners + @if $enable-rounded { + &:not(:last-child) { + @include border-end-radius(0); + + .card-img-top, + .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-right-radius: 0; + } + .card-img-bottom, + .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-right-radius: 0; + } + } + + &:not(:first-child) { + @include border-start-radius(0); + + .card-img-top, + .card-header { + // stylelint-disable-next-line property-disallowed-list + border-top-left-radius: 0; + } + .card-img-bottom, + .card-footer { + // stylelint-disable-next-line property-disallowed-list + border-bottom-left-radius: 0; + } + } + } + } + } +} diff --git a/Moonlight/Styles/bootstrap/scss/_carousel.scss b/Moonlight/Styles/bootstrap/scss/_carousel.scss new file mode 100644 index 0000000..0ac8f87 --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_carousel.scss @@ -0,0 +1,244 @@ +// Notes on the classes: +// +// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically) +// even when their scroll action started on a carousel, but for compatibility (with Firefox) +// we're preventing all actions instead +// 2. The .carousel-item-start and .carousel-item-end is used to indicate where +// the active slide is heading. +// 3. .active.carousel-item is the current slide. +// 4. .active.carousel-item-start and .active.carousel-item-end is the current +// slide in its in-transition state. Only one of these occurs at a time. +// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end +// is the upcoming slide in transition. + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; + @include clearfix(); +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + @include transition($carousel-transition); +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + + +// +// Alternate transitions +// + +.carousel-fade { + .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; + } + + .carousel-item.active, + .carousel-item-next.carousel-item-start, + .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; + } + + .active.carousel-item-start, + .active.carousel-item-end { + z-index: 0; + opacity: 0; + @include transition(opacity 0s $carousel-transition-duration); + } +} + + +// +// Left/right controls for nav +// + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + // Use flex for alignment (1-3) + display: flex; // 1. allow flex styles + align-items: center; // 2. vertically center contents + justify-content: center; // 3. horizontally center contents + width: $carousel-control-width; + padding: 0; + color: $carousel-control-color; + text-align: center; + background: none; + border: 0; + opacity: $carousel-control-opacity; + @include transition($carousel-control-transition); + + // Hover/focus state + &:hover, + &:focus { + color: $carousel-control-color; + text-decoration: none; + outline: 0; + opacity: $carousel-control-hover-opacity; + } +} +.carousel-control-prev { + left: 0; + background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null); +} +.carousel-control-next { + right: 0; + background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null); +} + +// Icons for within +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: $carousel-control-icon-width; + height: $carousel-control-icon-width; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +/* rtl:options: { + "autoRename": true, + "stringMap":[ { + "name" : "prev-next", + "search" : "prev", + "replace" : "next" + } ] +} */ +.carousel-control-prev-icon { + background-image: escape-svg($carousel-control-prev-icon-bg); +} +.carousel-control-next-icon { + background-image: escape-svg($carousel-control-next-icon-bg); +} + +// Optional indicator pips/controls +// +// Add a container (such as a list) with the following class and add an item (ideally a focusable control, +// like a button) with data-bs-target for each slide your carousel holds. + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + // Use the .carousel-control's width as margin so we don't overlay those + margin-right: $carousel-control-width; + margin-bottom: 1rem; + margin-left: $carousel-control-width; + + [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: $carousel-indicator-width; + height: $carousel-indicator-height; + padding: 0; + margin-right: $carousel-indicator-spacer; + margin-left: $carousel-indicator-spacer; + text-indent: -999px; + cursor: pointer; + background-color: $carousel-indicator-active-bg; + background-clip: padding-box; + border: 0; + // Use transparent borders to increase the hit area by 10px on top and bottom. + border-top: $carousel-indicator-hit-area-height solid transparent; + border-bottom: $carousel-indicator-hit-area-height solid transparent; + opacity: $carousel-indicator-opacity; + @include transition($carousel-indicator-transition); + } + + .active { + opacity: $carousel-indicator-active-opacity; + } +} + + +// Optional captions +// +// + +.carousel-caption { + position: absolute; + right: (100% - $carousel-caption-width) * .5; + bottom: $carousel-caption-spacer; + left: (100% - $carousel-caption-width) * .5; + padding-top: $carousel-caption-padding-y; + padding-bottom: $carousel-caption-padding-y; + color: $carousel-caption-color; + text-align: center; +} + +// Dark mode carousel + +@mixin carousel-dark() { + .carousel-control-prev-icon, + .carousel-control-next-icon { + filter: $carousel-dark-control-icon-filter; + } + + .carousel-indicators [data-bs-target] { + background-color: $carousel-dark-indicator-active-bg; + } + + .carousel-caption { + color: $carousel-dark-caption-color; + } +} + +.carousel-dark { + @include carousel-dark(); +} + +@if $enable-dark-mode { + @include color-mode(dark) { + @if $color-mode-type == "media-query" { + .carousel { + @include carousel-dark(); + } + } @else { + .carousel, + &.carousel { + @include carousel-dark(); + } + } + } +} diff --git a/Moonlight/Styles/bootstrap/scss/_close.scss b/Moonlight/Styles/bootstrap/scss/_close.scss new file mode 100644 index 0000000..4d6e73c --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_close.scss @@ -0,0 +1,63 @@ +// Transparent background and border properties included for button version. +// iOS requires the button element instead of an anchor tag. +// If you want the anchor version, it requires `href="#"`. +// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + +.btn-close { + // scss-docs-start close-css-vars + --#{$prefix}btn-close-color: #{$btn-close-color}; + --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) }; + --#{$prefix}btn-close-opacity: #{$btn-close-opacity}; + --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity}; + --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow}; + --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity}; + --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity}; + --#{$prefix}btn-close-white-filter: #{$btn-close-white-filter}; + // scss-docs-end close-css-vars + + box-sizing: content-box; + width: $btn-close-width; + height: $btn-close-height; + padding: $btn-close-padding-y $btn-close-padding-x; + color: var(--#{$prefix}btn-close-color); + background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements + border: 0; // for button elements + @include border-radius(); + opacity: var(--#{$prefix}btn-close-opacity); + + // Override 's hover style + &:hover { + color: var(--#{$prefix}btn-close-color); + text-decoration: none; + opacity: var(--#{$prefix}btn-close-hover-opacity); + } + + &:focus { + outline: 0; + box-shadow: var(--#{$prefix}btn-close-focus-shadow); + opacity: var(--#{$prefix}btn-close-focus-opacity); + } + + &:disabled, + &.disabled { + pointer-events: none; + user-select: none; + opacity: var(--#{$prefix}btn-close-disabled-opacity); + } +} + +@mixin btn-close-white() { + filter: var(--#{$prefix}btn-close-white-filter); +} + +.btn-close-white { + @include btn-close-white(); +} + +@if $enable-dark-mode { + @include color-mode(dark) { + .btn-close { + @include btn-close-white(); + } + } +} diff --git a/Moonlight/Styles/bootstrap/scss/_containers.scss b/Moonlight/Styles/bootstrap/scss/_containers.scss new file mode 100644 index 0000000..83b3138 --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_containers.scss @@ -0,0 +1,41 @@ +// Container widths +// +// Set the container width, and override it for fixed navbars in media queries. + +@if $enable-container-classes { + // Single container class with breakpoint max-widths + .container, + // 100% wide container at all breakpoints + .container-fluid { + @include make-container(); + } + + // Responsive containers that are 100% wide until a breakpoint + @each $breakpoint, $container-max-width in $container-max-widths { + .container-#{$breakpoint} { + @extend .container-fluid; + } + + @include media-breakpoint-up($breakpoint, $grid-breakpoints) { + %responsive-container-#{$breakpoint} { + max-width: $container-max-width; + } + + // Extend each breakpoint which is smaller or equal to the current breakpoint + $extend-breakpoint: true; + + @each $name, $width in $grid-breakpoints { + @if ($extend-breakpoint) { + .container#{breakpoint-infix($name, $grid-breakpoints)} { + @extend %responsive-container-#{$breakpoint}; + } + + // Once the current breakpoint is reached, stop extending + @if ($breakpoint == $name) { + $extend-breakpoint: false; + } + } + } + } + } +} diff --git a/Moonlight/Styles/bootstrap/scss/_dropdown.scss b/Moonlight/Styles/bootstrap/scss/_dropdown.scss new file mode 100644 index 0000000..587ebb4 --- /dev/null +++ b/Moonlight/Styles/bootstrap/scss/_dropdown.scss @@ -0,0 +1,250 @@ +// The dropdown wrapper (`
`) +.dropup, +.dropend, +.dropdown, +.dropstart, +.dropup-center, +.dropdown-center { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; + + // Generate the caret automatically + @include caret(); +} + +// The dropdown menu +.dropdown-menu { + // scss-docs-start dropdown-css-vars + --#{$prefix}dropdown-zindex: #{$zindex-dropdown}; + --#{$prefix}dropdown-min-width: #{$dropdown-min-width}; + --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x}; + --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y}; + --#{$prefix}dropdown-spacer: #{$dropdown-spacer}; + @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size); + --#{$prefix}dropdown-color: #{$dropdown-color}; + --#{$prefix}dropdown-bg: #{$dropdown-bg}; + --#{$prefix}dropdown-border-color: #{$dropdown-border-color}; + --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius}; + --#{$prefix}dropdown-border-width: #{$dropdown-border-width}; + --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius}; + --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg}; + --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y}; + --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow}; + --#{$prefix}dropdown-link-color: #{$dropdown-link-color}; + --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color}; + --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg}; + --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color}; + --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg}; + --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color}; + --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x}; + --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y}; + --#{$prefix}dropdown-header-color: #{$dropdown-header-color}; + --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x}; + --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y}; + // scss-docs-end dropdown-css-vars + + position: absolute; + z-index: var(--#{$prefix}dropdown-zindex); + display: none; // none by default, but block on "open" of the menu + min-width: var(--#{$prefix}dropdown-min-width); + padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x); + margin: 0; // Override default margin of ul + @include font-size(var(--#{$prefix}dropdown-font-size)); + color: var(--#{$prefix}dropdown-color); + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + list-style: none; + background-color: var(--#{$prefix}dropdown-bg); + background-clip: padding-box; + border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color); + @include border-radius(var(--#{$prefix}dropdown-border-radius)); + @include box-shadow(var(--#{$prefix}dropdown-box-shadow)); + + &[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--#{$prefix}dropdown-spacer); + } + + @if $dropdown-padding-y == 0 { + > .dropdown-item:first-child, + > li:first-child .dropdown-item { + @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius)); + } + > .dropdown-item:last-child, + > li:last-child .dropdown-item { + @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius)); + } + + } +} + +// scss-docs-start responsive-breakpoints +// We deliberately hardcode the `bs-` prefix because we check +// this custom property in JS to determine Popper's positioning + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .dropdown-menu#{$infix}-start { + --bs-position: start; + + &[data-bs-popper] { + right: auto; + left: 0; + } + } + + .dropdown-menu#{$infix}-end { + --bs-position: end; + + &[data-bs-popper] { + right: 0; + left: auto; + } + } + } +} +// scss-docs-end responsive-breakpoints + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// Just add .dropup after the standard .dropdown class and you're set. +.dropup { + .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(up); + } +} + +.dropend { + .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(end); + &::after { + vertical-align: 0; + } + } +} + +.dropstart { + .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--#{$prefix}dropdown-spacer); + } + + .dropdown-toggle { + @include caret(start); + &::before { + vertical-align: 0; + } + } +} + + +// Dividers (basically an `
`) within the dropdown +.dropdown-divider { + height: 0; + margin: var(--#{$prefix}dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--#{$prefix}dropdown-divider-bg); + opacity: 1; // Revisit in v6 to de-dupe styles that conflict with
element +} + +// Links, buttons, and more within the dropdown menu +// +// `