From e985fe9c6169fae874b68b2bd8558dfe9653f6d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Sch=C3=A4fer?= Date: Sat, 29 Feb 2020 19:03:47 +0100 Subject: [PATCH] Design foundations - Create a colour palette - Create a sizing schema for paddings and fonts - Implement basic form controls - Create a theme demo page - Apply the theme to the existing pages. Still TODO is the final font selection. --- .gitignore | 1 + Makefile | 16 + build-requirements.txt | 1 + docs/colours.svg | 434 +++++++++++++++ snikket_web/__init__.py | 9 + snikket_web/scss/_baseline.scss | 132 +++++ snikket_web/scss/_theme.scss | 172 ++++++ snikket_web/scss/app.scss | 666 ++++++++++++++++++++++++ snikket_web/scss/common.scss | 7 + snikket_web/scss/login.scss | 97 ++++ snikket_web/scss/theme-demo.scss | 132 +++++ snikket_web/static/img/line.png | Bin 0 -> 567 bytes snikket_web/static/img/noise.png | Bin 0 -> 80688 bytes snikket_web/static/img/snikket-logo.svg | 216 ++++++++ snikket_web/templates/about.html | 22 + snikket_web/templates/app.html | 19 + snikket_web/templates/base.html | 12 + snikket_web/templates/demo.html | 178 +++++++ snikket_web/templates/library.j2 | 3 + snikket_web/templates/login.html | 44 +- snikket_web/templates/user_home.html | 25 +- snikket_web/templates/user_logout.html | 24 +- snikket_web/templates/user_passwd.html | 58 ++- snikket_web/user/__init__.py | 17 +- 24 files changed, 2229 insertions(+), 56 deletions(-) create mode 100644 Makefile create mode 100644 build-requirements.txt create mode 100644 docs/colours.svg create mode 100644 snikket_web/scss/_baseline.scss create mode 100644 snikket_web/scss/_theme.scss create mode 100644 snikket_web/scss/app.scss create mode 100644 snikket_web/scss/common.scss create mode 100644 snikket_web/scss/login.scss create mode 100644 snikket_web/scss/theme-demo.scss create mode 100644 snikket_web/static/img/line.png create mode 100644 snikket_web/static/img/noise.png create mode 100644 snikket_web/static/img/snikket-logo.svg create mode 100644 snikket_web/templates/about.html create mode 100644 snikket_web/templates/app.html create mode 100644 snikket_web/templates/base.html create mode 100644 snikket_web/templates/demo.html create mode 100644 snikket_web/templates/library.j2 diff --git a/.gitignore b/.gitignore index 609f3b6..0bd1163 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /.direnv /.local __pycache__ +/snikket_web/static/css/*.css diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ca09a10 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +scss_files = $(filter-out snikket_web/scss/_%.scss,$(wildcard snikket_web/scss/*.scss)) +scss_includes = $(filter snikket_web/scss/_%.scss,$(wildcard snikket_web/scss/*.scss)) +generated_css_files = $(patsubst snikket_web/scss/%.scss,snikket_web/static/css/%.css,$(scss_files)) + +PYTHON3 ?= python3 +SCSSC ?= $(PYTHON3) -m scss --load-path snikket_web/scss/ + +build_css: $(generated_css_files) + +$(generated_css_files): snikket_web/static/css/%.css: snikket_web/scss/%.scss $(scss_includes) + $(SCSSC) -o "$@" "$<" + +clean: + rm -f $(generated_css_files) + +.PHONY: build_css clean diff --git a/build-requirements.txt b/build-requirements.txt new file mode 100644 index 0000000..2bb5bdc --- /dev/null +++ b/build-requirements.txt @@ -0,0 +1 @@ +pyscss~=1.3 diff --git a/docs/colours.svg b/docs/colours.svg new file mode 100644 index 0000000..ba8c75b --- /dev/null +++ b/docs/colours.svg @@ -0,0 +1,434 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Grayscale + Success + Accent + Alert + Primary + + diff --git a/snikket_web/__init__.py b/snikket_web/__init__.py index 116b175..f30ee89 100644 --- a/snikket_web/__init__.py +++ b/snikket_web/__init__.py @@ -34,5 +34,14 @@ async def home(): return redirect(url_for('login')) +@app.route("/meta/about.html") +async def about(): + return await render_template("about.html") + + +@app.route("/meta/demo.html") +async def demo(): + return await render_template("demo.html") + from .user import user_bp app.register_blueprint(user_bp) diff --git a/snikket_web/scss/_baseline.scss b/snikket_web/scss/_baseline.scss new file mode 100644 index 0000000..8f6a38b --- /dev/null +++ b/snikket_web/scss/_baseline.scss @@ -0,0 +1,132 @@ +/** + * On the scaling of the headers. I’m a nerd, so here we go. + * + * I tried to determine a good scale a priori. It was clear to me that the + * observed difference between a 48px and 64px font is much smaller than the + * perceived difference between a 8px and 16px font size. + * + * Thus, the perception is *not* linear in the font size. + * + * I set the edge points to 200% and 100% (the h6 would get a bold font face) + * to compensate. + * + * The first attempt to get a visually appealing header size scale was thus to + * generate a logarithmic scale: + * + * numpy.logspace(np.log10(200), 2, 6, base=10) + * + * This leads to the following sizes: + * + * $_h-sizes: [200%, 174.11011266%, 151.57165665%, 131.95079108%, 114.8698355%, 100%]; + * + * This scale has too large differences between the larger font sizes, and too + * small differences between the smaller font sizes. Thus, I tried to invert + * this: + * + * 200 - numpy.logspace(2, np.log10(200), 6, base=10) + 100 + * + * This leads to the following sizes: + * + * $_h-sizes: [200.0%, 185.13016450029647%, 168.0492089227105%, 148.42834334896025%, 125.88988734077518%, 100%]; + * + * While this was better, it still didn’t look quite right yet. The next + * attempt was to go about a square function instead of log. The idea behind + * this is that the font size is essentially one edge of a rectangle, where the + * second edge depends on the first. A square function should thus generate a + * nicely appealing sequence: + * + * Again, we want the large differences to be on the large scales, too: + * + * xs = numpy.linspace(5, 0, 6); 4*xs*xs + 100 + * + * This leads to the following sizes: + * + * $_h-sizes: [200.0%, 164.0%, 136.0%, 116.0%, 104.0%, 100.0%]; + * + * While the first three headings looked nice with that, the others did not. + * Further research has shown me that others use an exponential scale (instead + * of a log scale), but with a rather small base (<1.6). + * + * Instead of taking one of the well-known factors (like golden ratio or major + * second), I opted for choosing a factor which gives me a clean 200%-100% + * range: + * + * numpy.power(math.pow(2, 1/5), numpy.linspace(5, 0, 6)) * 100 + * + * The result (rounded to 8 digits) is: + * + * $_h-sizes: [200.0%, 174.11011266%, 151.57165665%, 131.95079108%, 114.8698355%, 100.0%]; + * + * And... This is the first logspace range. Derp. So why did I discard it in + * the first place? Now that I look at it, it looks amazing. Brains are weird. + */ +$h-sizes: [200.0%, 174.11011266%, 151.57165665%, 131.95079108%, 114.8698355%, 100.0%]; + +/** + * And for mobile devices, we want an even less aggressive scale. Let’s try + * 150%-100%. + */ +$h-small-sizes: [150.0%, 138.31618672%, 127.54245006%, 117.60790225%, 108.44717712%, 100.0%]; +$small-screen-threshold: 40rem; + +html { + font-size: 100%; +} + +body { + font-family: $font-sans; + color: $gray-100; +} + +p { + line-height: 1.5; + margin: 1.5em 0; + font-family: $font-bulk; + color: inherit; +} + +h1, h2, h3, h4, h5, h6 { + /* normalise */ + font-weight: 400; + text-decoration: none; + font-style: normal; + font-family: $font-heading; + color: black; +} + +input, button, label, select, textarea, pre, code { + font-size: 100%; + color: inherit; + line-height: 1.5; +} + +textarea { + font-family: $font-bulk; +} + +option { + padding: 0; + margin: 0; +} + +@for $n from 1 through 6 { + h#{$n} { + font-size: nth($h-sizes, $n); + line-height: 1.5 / (nth($h-sizes, $n) / 100%); + margin: 1.5em / (nth($h-sizes, $n) / 100%) 0; + } +} + +h6 { + font-weight: bold; +} + +@media screen and (max-width: $small-screen-threshold) { + @for $n from 1 through 6 { + h#{$n} { + font-size: nth($h-small-sizes, $n); + line-height: 1.5 / (nth($h-small-sizes, $n) / 100%); + margin: 1.5em / (nth($h-small-sizes, $n) / 100%) 0; + } + } +} diff --git a/snikket_web/scss/_theme.scss b/snikket_web/scss/_theme.scss new file mode 100644 index 0000000..56409ff --- /dev/null +++ b/snikket_web/scss/_theme.scss @@ -0,0 +1,172 @@ +$colours: ( + "gray": [ + #1f1b17, + #3d3833, + #4e4a46, + #706965, + #8f8983, + #b1aca6, + #cac3bd, + #e3e1df, + #f6f5f4 + ], + "primary": [ + #062943, + #0f3d62, + #0e4c76, + #226494, + #418fc7, + #72b2e3, + #9dccf0, + #b5d8f3, + #e4f3fd + ], + "alert": [ + #340e03, + #681f0b, + #883017, + #a33d21, + #c95e40, + #ed947c, + #f2ac99, + #fbc2b3, + #fef1ed + ], + "accent": [ + #302100, + #563600, + #795b00, + #a07501, + #c79b0e, + #f4ce3f, + #feed93, + #fef6c1, + #fffbe8 + ], + "success": [ + #052f03, + #0c4608, + #197713, + #218a1b, + #55c644, + #81e06e, + #abed9c, + #cef6c5, + #ecfbe6 + ] +); + +$gray-100: nth(map-get($colours, "gray"), 1); +$gray-200: nth(map-get($colours, "gray"), 2); +$gray-300: nth(map-get($colours, "gray"), 3); +$gray-400: nth(map-get($colours, "gray"), 4); +$gray-500: nth(map-get($colours, "gray"), 5); +$gray-600: nth(map-get($colours, "gray"), 6); +$gray-700: nth(map-get($colours, "gray"), 7); +$gray-800: nth(map-get($colours, "gray"), 8); +$gray-900: nth(map-get($colours, "gray"), 9); + +$primary-100: nth(map-get($colours, "primary"), 1); +$primary-200: nth(map-get($colours, "primary"), 2); +$primary-300: nth(map-get($colours, "primary"), 3); +$primary-400: nth(map-get($colours, "primary"), 4); +$primary-500: nth(map-get($colours, "primary"), 5); +$primary-600: nth(map-get($colours, "primary"), 6); +$primary-700: nth(map-get($colours, "primary"), 7); +$primary-800: nth(map-get($colours, "primary"), 8); +$primary-900: nth(map-get($colours, "primary"), 9); + +$alert-100: nth(map-get($colours, "alert"), 1); +$alert-200: nth(map-get($colours, "alert"), 2); +$alert-300: nth(map-get($colours, "alert"), 3); +$alert-400: nth(map-get($colours, "alert"), 4); +$alert-500: nth(map-get($colours, "alert"), 5); +$alert-600: nth(map-get($colours, "alert"), 6); +$alert-700: nth(map-get($colours, "alert"), 7); +$alert-800: nth(map-get($colours, "alert"), 8); +$alert-900: nth(map-get($colours, "alert"), 9); + +$accent-100: nth(map-get($colours, "accent"), 1); +$accent-200: nth(map-get($colours, "accent"), 2); +$accent-300: nth(map-get($colours, "accent"), 3); +$accent-400: nth(map-get($colours, "accent"), 4); +$accent-500: nth(map-get($colours, "accent"), 5); +$accent-600: nth(map-get($colours, "accent"), 6); +$accent-700: nth(map-get($colours, "accent"), 7); +$accent-800: nth(map-get($colours, "accent"), 8); +$accent-900: nth(map-get($colours, "accent"), 9); + +$success-100: nth(map-get($colours, "success"), 1); +$success-200: nth(map-get($colours, "success"), 2); +$success-300: nth(map-get($colours, "success"), 3); +$success-400: nth(map-get($colours, "success"), 4); +$success-500: nth(map-get($colours, "success"), 5); +$success-600: nth(map-get($colours, "success"), 6); +$success-700: nth(map-get($colours, "success"), 7); +$success-800: nth(map-get($colours, "success"), 8); +$success-900: nth(map-get($colours, "success"), 9); + +/* +$primary-100: $gray-100; +$primary-200: $gray-200; +$primary-300: $gray-300; +$primary-400: $gray-400; +$primary-500: $gray-500; +$primary-600: $gray-600; +$primary-700: $gray-700; +$primary-800: $gray-800; +$primary-900: $gray-900; + +$alert-100: $gray-100; +$alert-200: $gray-200; +$alert-300: $gray-300; +$alert-400: $gray-400; +$alert-500: $gray-500; +$alert-600: $gray-600; +$alert-700: $gray-700; +$alert-800: $gray-800; +$alert-900: $gray-900; + +$accent-100: $gray-100; +$accent-200: $gray-200; +$accent-300: $gray-300; +$accent-400: $gray-400; +$accent-500: $gray-500; +$accent-600: $gray-600; +$accent-700: $gray-700; +$accent-800: $gray-800; +$accent-900: $gray-900; + +$success-100: $gray-100; +$success-200: $gray-200; +$success-300: $gray-300; +$success-400: $gray-400; +$success-500: $gray-500; +$success-600: $gray-600; +$success-700: $gray-700; +$success-800: $gray-800; +$success-900: $gray-900; +*/ + + +$w-s5: 0.0625rem; +$w-s4: 0.125rem; +$w-s3: 0.25rem; +$w-s2: 0.5rem; +$w-s1: 0.75rem; +$w-0: 1rem; +$w-l1: 1.5rem; +$w-l2: 2rem; +$w-l3: 3rem; +$w-l4: 4rem; +$w-l5: 6rem; +$w-l6: 8rem; +$w-l7: 12rem; + +$font-sans: "Noto Sans", sans-serif; +$font-serif: serif; +$font-monospace: monospace; + +$font-heading: $font-sans; +$font-bulk: $font-sans; +$font-code: $font-monospace; diff --git a/snikket_web/scss/app.scss b/snikket_web/scss/app.scss new file mode 100644 index 0000000..508bb8b --- /dev/null +++ b/snikket_web/scss/app.scss @@ -0,0 +1,666 @@ +@import "_theme.scss"; +@import "_baseline.scss"; + +/* coarse layout */ + +body { + margin: 0; + padding: 0; + background-color: $gray-900; +} + +body > main { + padding: $w-l1; +} + +/* top bar */ + +@mixin snikket-logo { + background-image: url('/static/img/snikket-logo.svg'); + background-size: contain; + background-repeat: no-repeat; + background-position: $w-s2 0em; + padding-left: 2em; +} + +div#topbar { + background-color: white; + @extend .el-1; + color: $primary-200; + margin: 0; + padding: $w-s1; + display: flex; + align-items: center; + + & > header { + flex: 0 1 auto; + color: black; + font-size: nth($h-sizes, 1); + + @media screen and (max-width: $small-screen-threshold) { + font-size: nth($h-small-sizes, 1); + } + + & > a { + color: inherit; + text-decoration: none; + + span { + @include snikket-logo; + } + } + + & > a:visited, & > a:hover, & > a:focus, & > a:active { + color: inherit; + text-decoration: none; + } + } + + & > div.filler { + flex: 1 1 0px; + } + + & > nav.usermenu { + flex: 0 1 auto; + } +} + +/* main content */ + +main { + max-width: 60rem; + margin-left: auto; + margin-right: auto; +} + +/* standard elevations */ + +.el-1, .box.el-1, div.form.el-1 { + box-shadow: + 0 1px 3px rgba(0, 0, 0, 0.12), + 0 1px 2px rgba(0, 0, 0, 0.24); +} + +.el-2, .box.el-2, div.form.el-2 { + box-shadow: + 0 3px 6px rgba(0, 0, 0, 0.15), + 0 2px 4px rgba(0, 0, 0, 0.12); +} + +.el-3, .box.el-3, div.form.el-3 { + box-shadow: + 0 10px 20px rgba(0, 0, 0, 0.15), + 0 3px 6px rgba(0, 0, 0, 0.10); +} + +.el-4, .box.el-4, div.form.el-4 { + box-shadow: + 0 15px 25px rgba(0, 0, 0, 0.15), + 0 5px 10px rgba(0, 0, 0, 0.05); +} + +.el-5, .box.el-5, div.form.el-5 { + box-shadow: + 0 20px 40px rgba(0, 0, 0, 0.2); +} + + +/* footer */ + +body > footer { + display: block; + background-color: $gray-100; + color: $gray-800; + padding: 0 $w-l1; + + ul { + display: block; + padding: 0; + margin: 0; + list-style-type: none; + } + + li { + display: inline-block; + margin: $w-l1 0; + } + + li:before { + content: '•'; + padding-right: $w-s2; + } + + a, a:visited, a:hover, a:active, a:focus { + color: $gray-900; + font-weight: bold; + text-decoration-line: underline; + text-decoration-color: $gray-500; + text-decoration-width: $w-s4; + text-decoration-thickness: $w-s4; + text-underline-offset: 0; + } + + a:hover { + text-decoration-color: $gray-700; + } +} + +/* form support */ + +@for $n from 1 through 6 { + div.form h#{$n}.form-title { + font-size: 100%; + font-weight: bold; + line-height: 1.5; + margin-bottom: 1.5em; + } +} + +label.required:after { + content: '*'; + color: $alert-400; + padding: $w-s4; +} + +p.form-desc.weak { + color: $gray-300; +} + +$text-entry-inputs: "text" "password"; + +div.f-errbox { + background-color: $alert-800; + border: $w-s4 solid $alert-200; + color: $alert-100; + border-radius: $w-s4; + padding: 0 $w-0; + margin: 1em 0; + + p { + line-height: 1; + margin: 1em 0; + } + + ul { + margin: 1em 0; + padding: 0; + padding-left: $w-0; + } + + li { + } +} + +div.form { + @extend .el-2; + + margin: $w-l1; + padding: $w-l1; + background-color: white; +} + +div.form.layout-expanded { + label { + display: block; + color: $gray-200; + } + + div.f-ebox { + margin-bottom: $w-l1; + } + + div.f-bbox { + text-align: right; + padding: $w-s2 0; + } + + @each $type in $text-entry-inputs { + input[type=$type] { + width: 100%; + border: none; + border-bottom: $w-s4 solid $primary-500; + margin-bottom: -$w-s4; + padding: 0 $w-s3; + } + + input[type=$type].has-error { + border-right: $w-s4 solid $alert-500; + } + + input[type=$type]:hover { + border-bottom-color: $primary-700; + } + + input[type=$type]:focus { + border-bottom-color: $primary-800; + } + } + + input[type="checkbox"], input[type="radio"] { + position: absolute; + z-index: -1; + } + + input[type="checkbox"] + label:before { + background-color: transparent; + color: transparent; + content: "✔"; + display: inline-block; + width: $w-0; + height: $w-0; + border-radius: $w-s4; + border: $w-s4 solid $primary-500; + text-align: center; + font-size: $w-0; + margin-right: $w-s2; + line-height: 1; + } + + input[type="radio"] + label:before { + background-color: transparent; + color: transparent; + content: "✔"; + display: inline-block; + width: $w-0; + height: $w-0; + border-radius: $w-s1; + border: $w-s4 solid $primary-500; + text-align: center; + font-size: $w-0; + margin-right: $w-s2; + line-height: 1; + } + + input[type="checkbox"] + label:hover:before, + input[type="radio"] + label:hover:before { + border-color: $primary-700; + } + + input[type="checkbox"]:focus + label:before, + input[type="radio"]:focus + label:before { + border-color: $primary-800; + } + + input[type="checkbox"]:checked + label:before { + background-color: $primary-500; + color: white; + } + + input[type="radio"]:checked + label:before { + background-color: $primary-500; + box-shadow: inset 0 0 0 $w-s3 white; + } + + input[type="checkbox"] + label, input[type="radio"] + label { + display: block; + } + + div.select-wrap { + display: block; + border-bottom: $w-s4 solid $primary-500; + margin-bottom: -$w-s4; + position: relative; + + & > select { + width: 100%; + background-color: transparent; + border: none; + outline: none; + padding: 0 $w-s3; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + padding-right: $w-l1 + $w-s3; + margin-top: -1px; + margin-bottom: -1px; + } + + &:after { + content: "\25bc"; + position: absolute; + right: 0; + width: $w-l1; + text-align: center; + top: 0; + bottom: 0; + pointer-events: none; + color: $primary-500; + font-size: 80%; + // now we can build a padding which eats the remaining 20% + // em is now 0.8 parent-em + // we want to eat 20% of 1 parent-em -> 0.2 parent-em + // 1 parent-em = 1.25 em + // 0.2 parent-em = 0.25 em + padding-top: 0.25em; + padding-bottom: 0.25em; + } + + &:hover { + border-bottom-color: $primary-700; + + &:after { + color: $primary-700; + } + } + + &:focus-within { + border-bottom-color: $primary-800; + + &:after { + color: $primary-800; + } + } + } + + textarea { + width: 100%; + border: none; + border-bottom: $w-s4 solid $primary-500; + } + + textarea:hover { + border-bottom-color: $primary-700; + } + + textarea:focus { + border-bottom-color: $primary-800; + } +} + + +/* form buttons */ + +button, .button { + margin: 0 $w-s2; + padding: $w-s3 $w-s1; +} + +a.button { + text-decoration: none; + cursor: default; +} + +button.primary, .button.primary { + background: linear-gradient(0deg, $primary-500, $primary-600); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); + color: $primary-900; + border: none; + /* TODO: fix vertical rhyhtm ... */ + border-radius: $w-s4; + // border: $w-s4 solid transparent; + + &:hover, &:focus { + background: linear-gradient(0deg, $primary-600, $primary-700); + color: white; + } + + &:active { + background: $primary-500; + box-shadow: inset 0px 2px 4px rgba(0, 0, 0, 0.2); + color: white; + } + + &.accent { + background: linear-gradient(0deg, $accent-500, $accent-600); + color: $accent-900; + + &:hover, &:focus { + background: linear-gradient(0deg, $accent-600, $accent-700); + } + + &:active { + background: $accent-500; + } + } + + &.danger { + background: linear-gradient(0deg, $alert-500, $alert-600); + color: $alert-900; + + &:hover, &:focus { + background: linear-gradient(0deg, $alert-600, $alert-700); + } + + &:active { + background: $alert-500; + } + } +} + +button.secondary, .button.secondary { + background: linear-gradient(0deg, $gray-600, $gray-700); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); + color: $gray-200; + border: none; + /* TODO: fix vertical rhyhtm ... */ + border-radius: $w-s4; + // border: $w-s4 solid transparent; + + &:hover, &:focus { + background: linear-gradient(0deg, $gray-700, $gray-800); + color: black; + } + + &:active { + background: $gray-600; + box-shadow: inset 0px 2px 4px rgba(0, 0, 0, 0.2); + color: black; + } + + &.accent { + background: linear-gradient(0deg, $accent-600, $accent-700); + color: $accent-200; + + &:hover, &:focus { + background: linear-gradient(0deg, $accent-700, $accent-800); + } + + &:active { + background: $accent-600; + } + } + + &.danger { + background: linear-gradient(0deg, $alert-600, $alert-700); + color: $alert-200; + + &:hover, &:focus { + background: linear-gradient(0deg, $alert-700, $alert-800); + } + + &:active { + background: $alert-600; + } + } +} + +button.tertiary, .button.tertiary { + background-color: transparent; + color: $gray-100; + border: none; + /* TODO: fix vertical rhyhtm ... */ + border-radius: $w-s4; + + &:hover { + background-color: $gray-900; + border-color: $gray-800; + color: black; + } + + &.accent { + &:hover { + background-color: $accent-900; + border-color: $accent-800; + color: black; + } + } + + &.danger { + &:hover { + background-color: $alert-900; + border-color: $alert-800; + color: black; + } + } +} + +button.fullwidth, .button.fullwidth { + display: block; + width: 100%; + margin-left: 0; + margin-right: 0; +} + +/* button, .button { + margin: 0 $w-s2; +} + +button.lv-primary, .button.lv-primary { + background-color: $gray-500; + color: $gray-900; + border-radius: $w-s4; + border: $w-s4 solid $gray-400; + + @each $type, $values in $colours { + &.c-#{$type} { + border-color: nth($values, 4); + background-color: nth($values, 5); + color: nth($values, 9); + } + + &.c-#{$type}:hover { + background-color: nth($values, 4); + } + } +} + +button.lv-secondary, .button.lv-secondary { + background-color: $gray-700; + color: $gray-100; + border-radius: $w-s4; + + @each $type, $values in $colours { + &.c-#{$type} { + background-color: nth($values, 7); + color: nth($values, 1); + } + } +} + +button.lv-tertiary, .button.lv-tertiary { + background-color: inherit; + color: $gray-300; + border-radius: $w-s4; + text-decoration: underline; + + @each $type, $values in $colours { + &.c-#{$type} { + color: nth($values, 3); + } + } +} +*/ + +/* + button.lv-secondary.c-#{$type}, .button.lv-secondary.c-#{$type} { + background-color: nth($values, 7); + color: nth($values, 1); + } + + button.lv-tertiary.c-#{$type}, .button.lv-tertiary.c-#{$type} { + color: nth($values, 3); + text-decoration: underline; + background-color: transparent; + } +}*/ + +/* boxes */ + +.box { + display: block; + /* border-width: $w-s4 / 2; + border-style: solid; */ + padding: $w-l1 /* - $w-s4 / 2; */; + margin: $w-l1; + border-radius: $w-s4; + + border-color: $gray-200; + background-color: white; + color: $gray-100; + + @extend .el-1; + + @each $type, $values in $colours { + &.#{$type} { + border-color: nth($values, 2); + background-color: nth($values, 9); + color: nth($values, 1); + } + } +} + +.box > header { + font-weight: bold; + display: block; + margin-bottom: $w-l1; + line-height: 1.5; + color: black; +} + +.box > p:last-child { + margin-bottom: 0; +} + +.box.slim { + & > header { + display: inline; + margin: 0; + } + + & > header:after { + content: ':'; + } + + & > p { + display: inline; + margin: 0; + } +} + +/* login page specials */ + +body#login { + .form { + font-size: nth($h-sizes, 4); + } + + .form-title { + color: $primary-200; + } + + h1 { + @include snikket-logo; + padding-left: 2em; + background-position: 0 0em; + } +} + +/* linearisation / responsive stuff */ + +@media screen and (max-width: $small-screen-threshold) { + main > .form.layout-expanded { + margin-left: 0; + margin-right: 0; + } + + .form.layout-expanded .box { + margin-left: 0; + margin-right: 0; + } + + .box > ul { + padding-left: $w-0; + } + + +} diff --git a/snikket_web/scss/common.scss b/snikket_web/scss/common.scss new file mode 100644 index 0000000..7644b81 --- /dev/null +++ b/snikket_web/scss/common.scss @@ -0,0 +1,7 @@ +.a11y-only { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + top: -100px; +} diff --git a/snikket_web/scss/login.scss b/snikket_web/scss/login.scss new file mode 100644 index 0000000..3c6b400 --- /dev/null +++ b/snikket_web/scss/login.scss @@ -0,0 +1,97 @@ +@import "_theme.scss"; +@import "_baseline.scss"; + +body { + margin: 0; + padding: 0; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + display: flex; + background: + url('../img/noise.png') 0 0 / 180px 180px, + $gray-900; + flex-direction: column; + + & > div.login-wrap { + justify-content: center; + align-items: center; + display: flex; + flex: 1 0 auto; + } + + & > footer { + flex: 0 0 auto; + background: + url('../img/noise.png') 0 0 / 180px 180px, + $gray-800; + box-shadow: inset 0 0.1em 0.2em rgba(0, 0, 0, 0.2); + color: $gray-200; + + ul { + display: block; + margin: 1.5em; + padding: 0; + text-align: center; + } + + ul > li { + display: inline-block; + } + + /* ul > li:before { + content: '•'; + padding-right: 0.5em; + } */ + } + + & > div.login-wrap > main { + width: 40rem; + border: 0.2em solid $primary-900; + padding: 1.5em; + margin: 0; + border-radius: 0.2em; + box-shadow: 0 0.5em 1.5em rgba(0, 0, 0, 0.2); + background-color: white; + } + + div.fbox, div.abox { + font-size: 150%; + line-height: 1; + margin: 0 0 1em 0; + } + + div.abox { + margin-bottom: 0; + text-align: right; + } + + input[type="password"], + input[type="text"] { + border: 0; + width: 100%; + border-bottom: 0.1em solid $primary-900; + padding: 0.05em; + + &:focus { + border-bottom-color: $primary-700; + } + } + + button { + border: 0; + background-color: $primary-500; + color: $gray-900; + padding: 0.375em 0.75em; + } + + h1 { + background-image: url('/static/img/snikket-logo.svg'); + background-size: contain; + background-repeat: no-repeat; + background-position: 0.25em 0em; + padding-left: 1.5em; + } +} diff --git a/snikket_web/scss/theme-demo.scss b/snikket_web/scss/theme-demo.scss new file mode 100644 index 0000000..1a60d15 --- /dev/null +++ b/snikket_web/scss/theme-demo.scss @@ -0,0 +1,132 @@ +@import "./app.scss"; + +.accent-100 { background-color: $accent-100; } +.success-100 { background-color: $success-100; } +.gray-100 { background-color: $gray-100; } +.alert-100 { background-color: $alert-100; } +.primary-100 { background-color: $primary-100; } +.accent-200 { background-color: $accent-200; } +.success-200 { background-color: $success-200; } +.gray-200 { background-color: $gray-200; } +.alert-200 { background-color: $alert-200; } +.primary-200 { background-color: $primary-200; } +.accent-300 { background-color: $accent-300; } +.success-300 { background-color: $success-300; } +.gray-300 { background-color: $gray-300; } +.alert-300 { background-color: $alert-300; } +.primary-300 { background-color: $primary-300; } +.accent-400 { background-color: $accent-400; } +.success-400 { background-color: $success-400; } +.gray-400 { background-color: $gray-400; } +.alert-400 { background-color: $alert-400; } +.primary-400 { background-color: $primary-400; } +.accent-500 { background-color: $accent-500; } +.success-500 { background-color: $success-500; } +.gray-500 { background-color: $gray-500; } +.alert-500 { background-color: $alert-500; } +.primary-500 { background-color: $primary-500; } +.accent-600 { background-color: $accent-600; } +.success-600 { background-color: $success-600; } +.gray-600 { background-color: $gray-600; } +.alert-600 { background-color: $alert-600; } +.primary-600 { background-color: $primary-600; } +.accent-700 { background-color: $accent-700; } +.success-700 { background-color: $success-700; } +.gray-700 { background-color: $gray-700; } +.alert-700 { background-color: $alert-700; } +.primary-700 { background-color: $primary-700; } +.accent-800 { background-color: $accent-800; } +.success-800 { background-color: $success-800; } +.gray-800 { background-color: $gray-800; } +.alert-800 { background-color: $alert-800; } +.primary-800 { background-color: $primary-800; } +.accent-900 { background-color: $accent-900; } +.success-900 { background-color: $success-900; } +.gray-900 { background-color: $gray-900; } +.alert-900 { background-color: $alert-900; } +.primary-900 { background-color: $primary-900; } + +div.samplerow { + display: flex; + align-items: center; + background: white; + color: black; +} + +div.samplerow.dark { + background: black; + color: white; +} + +div.samplehead { + flex: 1 0 auto; + padding: 8px; +} + +div.samplebox { + flex: 0 0 auto; + width: 32px; + height: 32px; + // border: 1px solid $gray-900; + border-radius: 3px; + margin: 8px; + box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.5); +} + +div.samplerow.dark div.samplebox { + //border: 1px solid $gray-100; +} + +body { + max-width: 60em; + margin-left: auto; + margin-right: auto; +} + +div.demo-columns { + display: flex; +} + +div.demo-column { + flex: 1 1 1px; + margin: 0 $w-l1; +} + +div.demo-column:first-child { + margin-left: 0; +} + +div.demo-column:last-child { + margin-right: 0; +} + +body { + background: + url('../img/line.png'), + $gray-900; + background-size: 1.5em 1.5em; + background-position: 0em -0.3em; +} + +body:target { + background: $gray-900; +} + +body #enable-lines { + display: none; +} + +body:target #disable-lines { + display: none; +} + +body:target #enable-lines { + display: inline; +} + +@media screen and (max-width: 40rem) { + div.demo-columns, div.demo-column { + display: block; + margin: 0; + } +} diff --git a/snikket_web/static/img/line.png b/snikket_web/static/img/line.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d232d2e2b41c02672e205554b5814f6f2c2635 GIT binary patch literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)MBDvsUanevX#%Ak0dsXax-7Cpy8;xiaILkP5%Y`PS89@oxckAa4<4LP zx_aVzLH=!xoZ~Oxnsu3 zbzKj`TQayLjx9K&lk7KX(g)f2?;Icg>K)ts=k-4s+pKd*4h|~wQrj|x^9B6#Z?QeE zO==WPo%&-=#hE4CLiRG49+oTMV^lNqrP447plzia*UJ z%rd|5+NscMd(`U_RhF;UDV}>xKq%sfkV;2DfGcO}jgE`!CMPMnJ};F2-|%|+iKP=( zv$*xKhAeO_`}?5&!|v^2bw!7~yN)!T6F>e_g7MI9hsDnohT2rmF3Y-LI!Dd&4;0+Ts6X#o3#*TQgWcS3daLvrm)z%U!0s*>U%0J-4W3 zxO8Rp6W)RXjvg_M>buYH#=fony?xou{qhbsizfH|xjYXTEo@2N?k)`fL2$v|<&%LT zoCO|{#S9F5M?jcysy3fAP>{XE)7O>#2{Wspv@oNv)m5O7iKmNWNX4zUml$~&40sN2 ysJn1X{z~NMBelF{r5}E+y8tShA literal 0 HcmV?d00001 diff --git a/snikket_web/static/img/noise.png b/snikket_web/static/img/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..1e62b473664b9a0bebdbfeeca3c87c0f827299e2 GIT binary patch literal 80688 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 Ef+eBOssI20 literal 0 HcmV?d00001 diff --git a/snikket_web/static/img/snikket-logo.svg b/snikket_web/static/img/snikket-logo.svg new file mode 100644 index 0000000..d9cf2e8 --- /dev/null +++ b/snikket_web/static/img/snikket-logo.svg @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/snikket_web/templates/about.html b/snikket_web/templates/about.html new file mode 100644 index 0000000..fbaf626 --- /dev/null +++ b/snikket_web/templates/about.html @@ -0,0 +1,22 @@ + + + + About Snikket + + + +

About Snikket

+

What is Snikket?

+

Snikket is an easy-to-use and easy-to-setup Instant Messaging platform for you and your friends and family.

+

What is the Snikket Web Portal?

+

Behind the Scenes and Licenses

+

Quart Microframework

+
+

h1

+

h2

+

h3

+

h4

+
h5
+
h6
+ + diff --git a/snikket_web/templates/app.html b/snikket_web/templates/app.html new file mode 100644 index 0000000..23ce20f --- /dev/null +++ b/snikket_web/templates/app.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% block head_lead %} +Snikket Web Portal +{% endblock %} +{% block style %} + +{{ super() }} +{% endblock %} +{% block body %} +
+
{{ config["SNIKKET_DOMAIN"] }}
+
+ +
+
{% block content %}{% endblock %}
+ +{% endblock %} diff --git a/snikket_web/templates/base.html b/snikket_web/templates/base.html new file mode 100644 index 0000000..755a10b --- /dev/null +++ b/snikket_web/templates/base.html @@ -0,0 +1,12 @@ + + + + + {% block head_lead %}{% endblock %} + + {% block style %} + + {% endblock %} + + {% block body %}{% endblock %} + diff --git a/snikket_web/templates/demo.html b/snikket_web/templates/demo.html new file mode 100644 index 0000000..413628d --- /dev/null +++ b/snikket_web/templates/demo.html @@ -0,0 +1,178 @@ +{% extends "base.html" %} +{% from "library.j2" import box %} +{% set body_id = "no-lines" %} +{% block head_lead %} +Theme Demo – Snikket Web Portal +{% endblock %} +{% block style %} + +{% endblock %} +{% block body %} +

Theme Demo

+

This page is to demonstrate the Snikket Web Portal theme and allow development. You should not see this during normal use.

+

Disable rhythm linesEnable rhythm lines

+

Headings

+

This subsection is responsible for demonstrating the heading sizes, with the relation between the different headings and also the relation between headings and text.

+
+

Sub-heading

+

Repudiandae voluptatem ratione voluptatem facere. Rerum recusandae nemo commodi provident praesentium est dignissimos. Aut provident nisi omnis tempore veritatis voluptatem minus esse. Non nulla consequatur id est doloribus quos voluptates. Quae suscipit fugiat minima.

+

Nested Sub—heading

+

Omnis sit temporibus soluta et inventore. Doloribus velit unde placeat aut necessitatibus distinctio. Sapiente sunt corporis neque ducimus officiis qui. Maxime officia et architecto dolor quos autem expedita. Omnis architecto atque facilis iste dolorem voluptatem consectetur. Cupiditate et officiis accusantium inventore.

+
Deeper Sub-heading
+

Perferendis vitae doloribus praesentium natus non. Itaque hic numquam dolorum non vero et excepturi consequatur. Accusantium doloribus molestias impedit laudantium quis accusantium. Repellendus et assumenda voluptate aut ipsa quod. Dolores rerum accusantium cumque voluptatem rerum iure.

+
Paragraph heading
+

Suscipit quis tempora officiis voluptatem sint. Sed vel perferendis libero similique pariatur. Quo corporis perferendis omnis laboriosam nesciunt. Ut fuga quis deserunt maiores voluptas id fugiat odio. Omnis et facilis officia. Rerum quia quia exercitationem qui quibusdam quia et.

+

Another nested Sub-heading

+

Saepe distinctio illo et illum quia quo. Maxime eveniet voluptate non voluptatibus commodi et. Dicta consequuntur voluptatum sint ab voluptatem tenetur. Ad rem et eveniet ea animi voluptatum laborum.

+
+

The other column of this demo demonstrates the headings right beneath each other.

+

Main Title (h1)

+

Heading (h2)

+

Sub-Heading (h3)

+

Nested Sub-Heading (h4)

+
Deep Sub-Heading (h5)
+
Paragraph Heading (h6)
+
+ +

Palette

+
gray
+
success
+
alert
+
accent
+
primary
+ +
gray
+
success
+
alert
+
accent
+
primary
+ +

Boxes

+

Boxes can be used to draw the attention to the user to a specific thing. In general, they will be used to inform the user about the result of an action or about an action item.

+
+

Full-size boxes

+

Full-size boxes visually separate the header and the following content into separate lines. This allows the use of all and multiple block format elements inside full-size boxes.

+

The following box contains an error message:

+ {% call box("alert", "Password change failed") %} +

You need to provide a new password.

+ {% endcall %} +

The following box contains a success message:

+ {% call box("success", "Bookmark created") %} +

The channel was added to your list.

+ {% endcall %} +

The following box contains a notice:

+ {% call box("accent", "Quota warning") %} +

You have nearly reached your HTTP upload storage quota.

+ {% endcall %} +

The following box contains a hint:

+ {% call box("primary", "Update available") %} +

There is a new version of the Snikket Server available.

+ {% endcall %} +

Finally, the following box has unspecified content:

+ {% call box("", "Something happened") %} +

But we don’t know if it’s good or bad or anything.

+ {% endcall %} +
+

Slim boxes

+

Slim boxes use inline elements only. They only support the <header/> and a single <p/>. Since, on the semantic level, the header and p are still separated, CSS is used to insert a colon for visual reading.

+

The following box contains an error message:

+ {% call box("alert", "Password change failed", slim=True) %} +

You need to provide a new password.

+ {% endcall %} +

The following box contains a success message:

+ {% call box("success", "Bookmark created", slim=True) %} +

The channel was added to your list.

+ {% endcall %} +

The following box contains a notice:

+ {% call box("accent", "Quota warning", slim=True) %} +

You have nearly reached your HTTP upload storage quota.

+ {% endcall %} +

The following box contains a hint:

+ {% call box("primary", "Update available", slim=True) %} +

There is a new version of the Snikket Server available.

+ {% endcall %} +

Finally, the following box has unspecified content:

+ {% call box("", "Something happened", slim=True) %} +

But we don’t know if it’s good or bad or anything.

+ {% endcall %} +
+ +

Elevation levels

+

Demonstrated with boxes:

+ + + + + + +

Forms

+

Standard Forms (Expanded)

+

Forms support a single title (on any h-level to fit semantically), a description text and fields. Fields and their labels are on separate lines by default.

+
+

Random Preferences

+

This form illustrates the various controls supported by the theme, without being semantically useful.

+
+ + +
+
+ + + +
+
+ + + +
+
+ +
+
+
+ + +
+

The following demonstrate the different button styles. First normal buttons:

+
+ + + +
+

Then the accentuated versions:

+
+ + + +
+

And finally, the Danger Zone:

+
+ + + +
+{# +{% for style in ["primary", "secondary", "tertiary"] %} +

The following demonstrate the {{ style }} button styles:

+
+ +
+{% endfor %} +#} +
+ +{% endblock %} diff --git a/snikket_web/templates/library.j2 b/snikket_web/templates/library.j2 new file mode 100644 index 0000000..e2f9d20 --- /dev/null +++ b/snikket_web/templates/library.j2 @@ -0,0 +1,3 @@ +{% macro box(type, title, slim=False, caller=None) %} + +{% endmacro %} diff --git a/snikket_web/templates/login.html b/snikket_web/templates/login.html index e6faa1d..fdff05a 100644 --- a/snikket_web/templates/login.html +++ b/snikket_web/templates/login.html @@ -1,13 +1,31 @@ - - - - Snikket Web Portal - - -
- - - - - - +{% extends "base.html" %} +{% set body_id = "login" %} +{% block head_lead %} +Snikket Web Portal +{% endblock %} +{% block style %} + +{{ super() }} +{% endblock %} +{% block body %} +
+

{{ config["SNIKKET_DOMAIN"] }}

+

Enter your Snikket address and password to manage your account.

+ +
+ + +
+
+ + +
+
+ +
+ +
+ +{% endblock %} diff --git a/snikket_web/templates/user_home.html b/snikket_web/templates/user_home.html index f1bfbbb..13afb55 100644 --- a/snikket_web/templates/user_home.html +++ b/snikket_web/templates/user_home.html @@ -1,14 +1,11 @@ - - - - Snikket Web Portal - - -

Welcome!

-

Welcome home, {{ user_info.username }}.

- - - +{% extends "app.html" %} +{% block content %} +

Welcome!

+

Welcome home, {{ user_info.username }}.

+

Next?

+

What do you want to do today?

⎄ + +{% endblock %} diff --git a/snikket_web/templates/user_logout.html b/snikket_web/templates/user_logout.html index 6dbf915..34363ac 100644 --- a/snikket_web/templates/user_logout.html +++ b/snikket_web/templates/user_logout.html @@ -1,9 +1,15 @@ - - - - - {{ form.csrf_token }} - -
- - +{% extends "app.html" %} +{% block head_lead %} +Snikket Web Portal +{% endblock %} +{% block content %} +
+

Sign out of the Snikket Web Portal

+

Click below to log yourself out of the web portal. This does not affect any other connected devices.

+ {{ form.csrf_token }} +
+ Back + +
+
+{% endblock %} diff --git a/snikket_web/templates/user_passwd.html b/snikket_web/templates/user_passwd.html index e113828..d13e472 100644 --- a/snikket_web/templates/user_passwd.html +++ b/snikket_web/templates/user_passwd.html @@ -1,19 +1,39 @@ - - - -
- {{ form.csrf_token }} - {{ form.current_password }} - {{ form.new_password }} - {{ form.new_password_confirm }} -
    - {% for field, errors in form.errors.items() %} - {% for error in errors %} -
  • {{ field }}: {{ error }}
  • - {% endfor %} - {% endfor %} -
- -
- - +{% extends "app.html" %} +{% block head_lead %} +Snikket Web Portal +{% endblock %} +{% block content %} +
+

Change your password

+

To change your password, you need to provide the current password as well as the new one. To reduce the chance of typos, we ask for your new password twice.

+ {{ form.csrf_token }} + {% if form.errors %} +
+
Password change failed
+
    + {% for field, errors in form.errors.items() %} + {% for error in errors %} +
  • {{ error }}
  • + {% endfor %} + {% endfor %} +
+
+ {% endif %} +
+ {{ form.current_password.label(class="required") }} + {{ form.current_password(class=("has-error" if form.current_password.name in form.errors else "")) }} +
+
+ {{ form.new_password.label(class="required") }} + {{ form.new_password }} +
+
+ {{ form.new_password_confirm.label(class="required") }} + {{ form.new_password_confirm(class=("has-error" if form.new_password_confirm.name in form.errors else "")) }} +
+
+ Back + +
+
+{% endblock %} diff --git a/snikket_web/user/__init__.py b/snikket_web/user/__init__.py index 1b8922e..cd10b39 100644 --- a/snikket_web/user/__init__.py +++ b/snikket_web/user/__init__.py @@ -10,18 +10,33 @@ from snikket_web.prosodyclient import client user_bp = Blueprint('user', __name__, url_prefix="/user") +@user_bp.context_processor +async def proc(): + return {"user_info": await client.get_user_info()} + + class ChangePasswordForm(FlaskForm): current_password = wtforms.PasswordField( + # TODO(i18n) + "Current password", validators=[wtforms.validators.InputRequired()] ) new_password = wtforms.PasswordField( + # TODO(i18n) + "New password", validators=[wtforms.validators.InputRequired()] ) new_password_confirm = wtforms.PasswordField( + # TODO(i18n) + "Confirm new password", validators=[wtforms.validators.InputRequired(), - wtforms.validators.EqualTo("new_password")] + wtforms.validators.EqualTo( + "new_password", + # TODO(i18n) + "The new passwords must match." + )] )