diff --git a/.gitignore b/.gitignore index 46d7756..735a5a9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,7 @@ FoodsharingSiegen.Server/config/appsettings.json # Generated CSS files from SCSS FoodsharingSiegen.Server/Pages/AuditView.razor.css FoodsharingSiegen.Server/Shared/DefaultLayout.razor.css -FoodsharingSiegen.Server/Shared/NavMenu.razor.css \ No newline at end of file +FoodsharingSiegen.Server/Shared/NavMenu.razor.css +FoodsharingSiegen.Server/wwwroot/css/site.css +FoodsharingSiegen.Server/wwwroot/css/site.min.css +FoodsharingSiegen.Server/wwwroot/css/site.css.map \ No newline at end of file diff --git a/FoodsharingSiegen.Server/wwwroot/css/_utilities.scss b/FoodsharingSiegen.Server/wwwroot/css/_utilities.scss new file mode 100644 index 0000000..4be8f54 --- /dev/null +++ b/FoodsharingSiegen.Server/wwwroot/css/_utilities.scss @@ -0,0 +1,72 @@ +// Breakpoints matching typical Bootstrap breakpoints +$breakpoints: ( + "sm": 576px, + "md": 768px, + "lg": 992px, + "xl": 1200px +); + +// Spacer values (1 to 5) mapped to rem +$spacers: ( + 0: 0, + 1: 0.25rem, + 2: 0.5rem, + 3: 1rem, + 4: 1.5rem, + 5: 3rem +); + +@mixin generate-utilities($breakpoint: "") { + @each $size-key, $size-val in $spacers { + + // Padding and Margin (all sides) + .p#{$breakpoint}-#{$size-key} { padding: $size-val !important; } + .m#{$breakpoint}-#{$size-key} { margin: $size-val !important; } + + // Top + .pt#{$breakpoint}-#{$size-key} { padding-top: $size-val !important; } + .mt#{$breakpoint}-#{$size-key} { margin-top: $size-val !important; } + + // Right / End + .pr#{$breakpoint}-#{$size-key} { padding-right: $size-val !important; } + .mr#{$breakpoint}-#{$size-key} { margin-right: $size-val !important; } + + // Bottom + .pb#{$breakpoint}-#{$size-key} { padding-bottom: $size-val !important; } + .mb#{$breakpoint}-#{$size-key} { margin-bottom: $size-val !important; } + + // Left / Start + .pl#{$breakpoint}-#{$size-key} { padding-left: $size-val !important; } + .ml#{$breakpoint}-#{$size-key} { margin-left: $size-val !important; } + + // X-axis (left and right) + .px#{$breakpoint}-#{$size-key} { + padding-left: $size-val !important; + padding-right: $size-val !important; + } + .mx#{$breakpoint}-#{$size-key} { + margin-left: $size-val !important; + margin-right: $size-val !important; + } + + // Y-axis (top and bottom) + .py#{$breakpoint}-#{$size-key} { + padding-top: $size-val !important; + padding-bottom: $size-val !important; + } + .my#{$breakpoint}-#{$size-key} { + margin-top: $size-val !important; + margin-bottom: $size-val !important; + } + } +} + +// 1. Generate default utilities (without breakpoint modifier) +@include generate-utilities(""); + +// 2. Generate utilities for each breakpoint using an @each loop +@each $bp-name, $bp-min-width in $breakpoints { + @media (min-width: $bp-min-width) { + @include generate-utilities("-#{$bp-name}"); + } +} diff --git a/FoodsharingSiegen.Server/wwwroot/css/site.scss b/FoodsharingSiegen.Server/wwwroot/css/site.scss new file mode 100644 index 0000000..80a1853 --- /dev/null +++ b/FoodsharingSiegen.Server/wwwroot/css/site.scss @@ -0,0 +1,71 @@ +@import 'utilities'; + +@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); + +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +hr { + height: initial !important; +} + +a, .btn-link { + color: green; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } +