Compare commits

..

7 Commits

Author SHA1 Message Date
Nathan Steel b0b4dda4a1 Change all colours to variables (gross colours atm) 11 months ago
Nathan Steel ffe88022a0 Change colour-scheme mixin to require variable 11 months ago
Nathan Steel 69f416010c Jank grid to allow xs-xl. Needs changes 11 months ago
Nathan Steel 9f7c739230 Add a few minor helpers 11 months ago
Nathan Steel 44eeac1b70 Add gitignore 11 months ago
Nathan Steel 9cf4528118 Add 'error' page module using new mixins 11 months ago
Nathan Steel deb85f5633 Add color-scheme and min-width media mixins
Also update media vars to respectable numbers rather than 0s
11 months ago

2
.gitignore vendored

@ -0,0 +1,2 @@
css/

@ -6,6 +6,10 @@ a{
display: inline-block; display: inline-block;
font-weight: bold; font-weight: bold;
text-decoration: underline; text-decoration: underline;
@include color-scheme(dark) {
color: $color-link--dark;
}
} }
a:hover { a:hover {

@ -17,4 +17,9 @@ body {
line-height: $line-height; line-height: $line-height;
overflow-x: hidden; overflow-x: hidden;
@include reset; /* Margin 0, padding 0. Testing new @use/@forward as globals aren't allowed... */ @include reset; /* Margin 0, padding 0. Testing new @use/@forward as globals aren't allowed... */
@include color-scheme(dark) {
background: $color-bg--dark;
color: $color-text--dark;
}
} }

@ -80,9 +80,13 @@ html{
overflow-x: scroll; /* Used instead of auto, as auto changed the height of elements if a tabgroup toggled */ overflow-x: scroll; /* Used instead of auto, as auto changed the height of elements if a tabgroup toggled */
justify-content: left; justify-content: left;
/* Scrollbar stuff */ /* Scrollbar stuff */
scrollbar-color: #444 transparent; scrollbar-color: $color-scrollbar transparent;
scrollbar-width: thin; scrollbar-width: thin;
padding-bottom: .5rem; padding-bottom: .5rem;
@include color-scheme(dark) {
scrollbar-color: $color-scrollbar--dark transparent;
}
} }
.row--scroll [class^="col"]{ .row--scroll [class^="col"]{
@ -92,48 +96,58 @@ html{
flex: 0 0 auto; flex: 0 0 auto;
} }
.col-1, // Default cols to 100% width when below $media-xs (base 360px)
.col-2, .col-1,.col-2,.col-3,.col-4,.col-5,.col-6,
.col-3, .col-7,.col-8,.col-9,.col-10,.col-11,.col-12{
.col-4,
.col-5,
.col-6,
.col-7,
.col-8,
.col-9,
.col-10,
.col-11,
.col-12 {
flex: 0 0 100%; flex: 0 0 100%;
} }
/* (100/12) * x = the flex % */ @include media($media-xs) {
.col-sm-1 { flex: 0 0 8.33%; }
.col-sm-2 { flex: 0 0 16.66%; }
.col-sm-3 { flex: 0 0 25%; }
.col-sm-3p5 { flex: 0 0 29.166%; } /* 3 point 5, example for scroll-off page */
.col-sm-4 { flex: 0 0 33.33%; }
.col-sm-5 { flex: 0 0 41.66%; }
.col-sm-6 { flex: 0 0 50%; }
.col-sm-7 { flex: 0 0 58.33%; }
.col-sm-8 { flex: 0 0 66.66%; }
.col-sm-9 { flex: 0 0 75%; }
.col-sm-10 { flex: 0 0 83.33%; }
.col-sm-11 { flex: 0 0 91.66%; }
.col-sm-12 { flex: 0 0 100%; }
.hidden-sm { // Once a breakpoint has been hit, cols will behave regularly,
display: none; // but will be overwritten/cascaded by their xs,md,lg, etc. counterparts
} // This is duplicated at md, as the 'default' col will be medium, needed here in-case people just
// use .col-4, etc. as an end-all be-all
.col-1 { flex: 0 0 8.33%; }
.col-2 { flex: 0 0 16.66%; }
.col-3 { flex: 0 0 25%; }
.col-3p5 { flex: 0 0 29.166%; } /* 3 point 5, example for scroll-off page, example. Should be set independantly */
.col-4 { flex: 0 0 33.33%; }
.col-5 { flex: 0 0 41.66%; }
.col-6 { flex: 0 0 50%; }
.col-7 { flex: 0 0 58.33%; }
.col-8 { flex: 0 0 66.66%; }
.col-9 { flex: 0 0 75%; }
.col-10 { flex: 0 0 83.33%; }
.col-11 { flex: 0 0 91.66%; }
.col-12 { flex: 0 0 100%; }
// Now the actual xs styling
.col-xs-1 { flex: 0 0 8.33% }
.col-xs-2 { flex: 0 0 16.66% }
.col-xs-3 { flex: 0 0 25% }
.col-xs-4 { flex: 0 0 33.33% }
.col-xs-5 { flex: 0 0 41.66% }
.col-xs-6 { flex: 0 0 50% }
.col-xs-7 { flex: 0 0 58.33% }
.col-xs-8 { flex: 0 0 66.66% }
.col-xs-9 { flex: 0 0 75% }
.col-xs-10 { flex: 0 0 83.33% }
.col-xs-11 { flex: 0 0 91.66% }
.col-xs-12 { flex: 0 0 100% }
.hidden-xs { display: none }
@media only screen and (min-width: 33.75rem) { /* ~540px */
} }
@media only screen and (min-width: 45rem) { /* ~720px */ @include media($media-sm) {
// THINK .col-3 will need to be re-cascaded each time, otherwise the sm/md will overwrite for ever
// if it's recascaded here for instance, any .col-xs that have .col- will be replaced by the (default) col size
.col-1 { flex: 0 0 8.33%; } .col-1 { flex: 0 0 8.33%; }
.col-2 { flex: 0 0 16.66%; } .col-2 { flex: 0 0 16.66%; }
.col-3 { flex: 0 0 25%; } .col-3 { flex: 0 0 25%; }
.col-3p5 { flex: 0 0 29.166%; } /* 3 point 5, example for scroll-off page */ .col-3p5 { flex: 0 0 29.166%; } /* 3 point 5, example for scroll-off page, example. Should be set independantly */
.col-4 { flex: 0 0 33.33%; } .col-4 { flex: 0 0 33.33%; }
.col-5 { flex: 0 0 41.66%; } .col-5 { flex: 0 0 41.66%; }
.col-6 { flex: 0 0 50%; } .col-6 { flex: 0 0 50%; }
@ -144,18 +158,115 @@ html{
.col-11 { flex: 0 0 91.66%; } .col-11 { flex: 0 0 91.66%; }
.col-12 { flex: 0 0 100%; } .col-12 { flex: 0 0 100%; }
.hidden-sm { display: block; } /* (100/12) * x = the flex % */
.col-sm-1 { flex: 0 0 8.33% }
.col-sm-2 { flex: 0 0 16.66% }
.col-sm-3 { flex: 0 0 25% }
.col-sm-4 { flex: 0 0 33.33% }
.col-sm-5 { flex: 0 0 41.66% }
.col-sm-6 { flex: 0 0 50% }
.col-sm-7 { flex: 0 0 58.33% }
.col-sm-8 { flex: 0 0 66.66% }
.col-sm-9 { flex: 0 0 75% }
.col-sm-10 { flex: 0 0 83.33% }
.col-sm-11 { flex: 0 0 91.66% }
.col-sm-12 { flex: 0 0 100% }
.hidden-sm { display: none }
// Any overwrites for previous sizes (as using min-width by preference)
// Not sure how hidden display altering will work with flex/block/inline-block differences though...
// IN FACT. This may not be needed? Could just be that if it's hidden sm, it's hidden above that too?
// but then I guess I'd need a 'show-md' etc, which has the same problem...
.hidden-xs { display: unset }
} }
@media only screen and (min-width: 60em) { /* ~960px */ @include media($media-md){
/* (100/12) * x = the flex % */
// Medium AND .col-4 over-ridden for the 2nd time, as medium is to be the default 'col' size
.col-md-1, .col-1 { flex: 0 0 8.33% }
.col-md-2, .col-2 { flex: 0 0 16.66% }
.col-md-3, .col-3 { flex: 0 0 25% }
.col-md-4, .col-4 { flex: 0 0 33.33% }
.col-md-5, .col-5 { flex: 0 0 41.66% }
.col-md-6, .col-6 { flex: 0 0 50% }
.col-md-7, .col-7 { flex: 0 0 58.33% }
.col-md-8, .col-8 { flex: 0 0 66.66% }
.col-md-9, .col-9 { flex: 0 0 75% }
.col-md-10, .col-10 { flex: 0 0 83.33% }
.col-md-11, .col-11 { flex: 0 0 91.66% }
.col-md-12, .col-12 { flex: 0 0 100% }
.hidden-md { display: none }
// Any overwrites for previous sizes (as using min-width by preference)
// Not sure how hidden display altering will work with flex/block/inline-block differences though...
.hidden-xs, .hidden-sm { display: unset }
} }
@include media($media-lg) {
// Col DOESN'T Need to be redone here as it's medium default. If a lg/xl are set, that SHOULD overwrite
// each time. So should be good. Reckon I need mixins/functions to replicate this grid though, as it's a
// little uhhhh, jank and repetative atm
/* (100/12) * x = the flex % */
.col-lg-1 { flex: 0 0 8.33% }
.col-lg-2 { flex: 0 0 16.66% }
.col-lg-3 { flex: 0 0 25% }
.col-lg-4 { flex: 0 0 33.33% }
.col-lg-5 { flex: 0 0 41.66% }
.col-lg-6 { flex: 0 0 50% }
.col-lg-7 { flex: 0 0 58.33% }
.col-lg-8 { flex: 0 0 66.66% }
.col-lg-9 { flex: 0 0 75% }
.col-lg-10 { flex: 0 0 83.33% }
.col-lg-11 { flex: 0 0 91.66% }
.col-lg-12 { flex: 0 0 100% }
.hidden-lg { display: none }
// Any overwrites for previous sizes (as using min-width by preference)
// Not sure how hidden display altering will work with flex/block/inline-block differences though...
.hidden-xs, .hidden-sm, .hidden-md { display: unset }
}
@include media($media-xl) {
/* (100/12) * x = the flex % */
.col-xl-1 { flex: 0 0 8.33% }
.col-xl-2 { flex: 0 0 16.66% }
.col-xl-3 { flex: 0 0 25% }
.col-xl-4 { flex: 0 0 33.33% }
.col-xl-5 { flex: 0 0 41.66% }
.col-xl-6 { flex: 0 0 50% }
.col-xl-7 { flex: 0 0 58.33% }
.col-xl-8 { flex: 0 0 66.66% }
.col-xl-9 { flex: 0 0 75% }
.col-xl-10 { flex: 0 0 83.33% }
.col-xl-11 { flex: 0 0 91.66% }
.col-xl-12 { flex: 0 0 100% }
.hidden-xl { display: none }
// Any overwrites for previous sizes (as using min-width by preference)
// Not sure how hidden display altering will work with flex/block/inline-block differences though...
.hidden-xs, .hidden-sm, .hidden-md, .hidden-lg { display: unset }
}
// These things may want to have an indivual xs,md,lg, etc. as well, but for now, leaving...
/* Try to avoid !important, have each rule set to keep track of */ /* Try to avoid !important, have each rule set to keep track of */
.no-padd, .row.no-padd [class^="col"], .row [class^="col"].no-padd{ .no-padd, .row.no-padd [class^="col"], .row [class^="col"].no-padd{
padding: 0; /* In-case elements want to be full-width, touching, etc */ padding: 0; /* In-case elements want to be full-width, touching, etc */
} }
.row--align-center{ align-items: center;} .row--align-center{ align-items: center;}
.row--justify-center{ justify-content: center; }
.col--align-center{ align-self: center; align-self: anchor-center} .col--align-center{ align-self: center; align-self: anchor-center}
/* Sort into col/sm areas with media queries */ /* Sort into col/sm areas with media queries */

@ -12,6 +12,10 @@ figure img {
figure figcaption { figure figcaption {
color: $color-text-secondary; color: $color-text-secondary;
@include color-scheme(dark) {
color: $color-text-secondary--dark;
}
} }
section img, section img,

@ -10,11 +10,18 @@ p+p, h1+p{ /* Para after para should space out */
mark, .highlight{ /* Useful for search result highlighting, and general hightlights that aren't strong */ mark, .highlight{ /* Useful for search result highlighting, and general hightlights that aren't strong */
padding: 0.1rem; padding: 0.1rem;
background: #ff8c00; background: $color-highlight;
@include color-scheme(dark) {
background: $color-highlight--dark;
}
} }
small { small {
color: $color-text-secondary; color: $color-text-secondary;
@include color-scheme(dark) {
color: $color-text-secondary--dark;
}
} }
hr{ hr{
@ -24,4 +31,7 @@ hr{
width: 100%; width: 100%;
max-width: $width-content; max-width: $width-content;
margin: .5rem auto; margin: .5rem auto;
@include color-scheme(dark) {
color: $color-bg-secondary--dark;
}
} }

@ -1,4 +1,5 @@
@use '../utilities/main_utilities' as *; @use '../utilities/main_utilities' as *;
@use "sass:color";
// Alerts // Alerts
.alert{ .alert{
@ -7,16 +8,33 @@
border-right: 4px solid $color-secondary; border-right: 4px solid $color-secondary;
padding: .1rem .8rem; padding: .1rem .8rem;
margin-bottom:.5rem; margin-bottom:.5rem;
@include color-scheme(dark) {
color: $color-secondary-accent--dark;
border-color: $color-secondary--dark;
}
} }
.alert--error{ .alert--error{
background: #f05870; background: desaturate($alert-color--error, 40);
border-color: #e90d30; border-color: $alert-color--error;
@include color-scheme(dark) {
color: $color-secondary-accent;
}
} }
.alert--warning{ .alert--warning{
background: #e8e85b; background: desaturate($alert-color--warning, 40);
border-color: #ddde11; border-color: $alert-color--warning;
@include color-scheme(dark) {
color: $color-secondary-accent;
}
} }
.alert--success{ .alert--success{
background: #60c572; background: desaturate($alert-color--success, 40);
border-color: #18ab34; border-color: $alert-color--success;
@include color-scheme(dark) {
color: $color-secondary-accent;
}
} }

@ -2,5 +2,9 @@
.banner{ .banner{
width: 100%; width: 100%;
background: #eee; background: $color-banner;
@include color-scheme(dark) {
background: $color-banner--dark;
}
} }

@ -5,8 +5,9 @@
button, button,
input[type="submit"] input[type="submit"]
{ {
background: #FEFEFE; color: $color-bg;
border: 2px solid $color-link; background: $color-link;
border: 2px solid $color-accent;
border-radius: $border-radius; border-radius: $border-radius;
display: inline-block; display: inline-block;
font-size: .9rem; font-size: .9rem;
@ -15,6 +16,11 @@ input[type="submit"]
margin-top: 0.5rem; margin-top: 0.5rem;
padding: .6rem 1.2rem; padding: .6rem 1.2rem;
text-decoration: none; text-decoration: none;
@include color-scheme(dark) {
background-color: $color-link--dark;
border-color: $color-accent--dark;
}
} }
.button + .button, .button + .button,
@ -56,6 +62,10 @@ input[type="submit"].button--blue
{ {
background-color: $color-link; background-color: $color-link;
color: $color-bg; color: $color-bg;
@include color-scheme(dark) {
border-color: $color-link--dark;
}
} }
.button--disabled, .button--disabled,
@ -65,6 +75,12 @@ input:disabled {
border-color: $color-bg-secondary; border-color: $color-bg-secondary;
color: $color-text-secondary; color: $color-text-secondary;
cursor: not-allowed; cursor: not-allowed;
@include color-scheme(dark) {
background-color: $color-bg-secondary--dark;
border-color: $color-bg-secondary--dark;
color: $color-text-secondary--dark;
}
} }
.button--disabled:hover, .button--disabled:hover,
button[disabled]:hover, button[disabled]:hover,

@ -9,12 +9,22 @@
box-shadow: $box-shadow $color-shadow; box-shadow: $box-shadow $color-shadow;
padding: 1.25rem; padding: 1.25rem;
/* flex: 0 0 $width-card; */ /* flex: 0 0 $width-card; */
background: #FFF; background: $color-card;
display: block !important; /* Unset row/col default */ display: block !important; /* Unset row/col default */
@include color-scheme(dark) {
border-color: $color-bg-secondary--dark;
box-shadow: $box-shadow $color-shadow--dark;
background: $color-card--dark;
}
} }
.card:hover { .card:hover {
box-shadow: $box-shadow $color-bg-secondary; box-shadow: $box-shadow $color-bg-secondary;
@include color-scheme(dark) {
box-shadow: $box-shadow $color-bg-secondary--dark;
}
} }
.row--cards{ .row--cards{

@ -8,6 +8,11 @@ code,samp {
display: inline-block; display: inline-block;
margin: 0 0.1rem; margin: 0 0.1rem;
padding: 0 0.5rem; padding: 0 0.5rem;
@include color-scheme(dark) {
background-color: $color-accent--dark;
color: $color-text--dark;
}
} }
pre { pre {
margin: .5rem 0; margin: .5rem 0;
@ -22,7 +27,13 @@ pre {
overflow-x: auto; overflow-x: auto;
white-space: pre-wrap; white-space: pre-wrap;
border: 1px solid #c1cfda; border: 1px solid $color-text;
@include color-scheme(dark) {
background-color: $color-accent--dark;
color: $color-text--dark;
border-color: $color-text--dark;
}
} }
section pre { section pre {

@ -10,6 +10,11 @@ form {
padding: 1.5rem; padding: 1.5rem;
text-align: $justify-normal; text-align: $justify-normal;
margin: 0 auto; margin: 0 auto;
@include color-scheme(dark) {
border-color: $color-bg-secondary--dark;
box-shadow: $color-shadow--dark;
}
} }
form header { form header {
@ -54,6 +59,10 @@ textarea {
border-radius: $border-radius; border-radius: $border-radius;
margin-bottom: 1rem; margin-bottom: 1rem;
padding: 0.4rem 0.8rem; padding: 0.4rem 0.8rem;
@include color-scheme(dark) {
border-color: $color-bg-secondary--dark;
}
} }
input[type="text"], input[type="text"],
@ -65,4 +74,8 @@ textarea {
input[readonly], input[readonly],
textarea[readonly] { textarea[readonly] {
background-color: $color-bg-secondary; background-color: $color-bg-secondary;
@include color-scheme(dark) {
background-color: $color-bg-secondary--dark;
}
} }

@ -56,6 +56,11 @@ ul li {
left: 0; left: 0;
/* Right */ /* Right */
/* transform: translate(-50%, 0); */ /* transform: translate(-50%, 0); */
@include color-scheme(dark) {
background-color: $color-bg--dark;
border-color: $color-bg-secondary--dark;
}
} }
.inline-list li ul::before { .inline-list li ul::before {

@ -11,4 +11,9 @@
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
width: 50%; width: 50%;
z-index: 999; z-index: 999;
@include color-scheme(dark) {
border-color: $color-bg-secondary--dark;
box-shadow: $color-shadow--dark;
}
} }

@ -17,4 +17,8 @@ blockquote footer{
font-size: small; font-size: small;
line-height: $line-height; line-height: $line-height;
padding: 1.5rem 0; padding: 1.5rem 0;
@include color-scheme(dark) {
color: $color-text-secondary--dark;
}
} }

@ -14,6 +14,10 @@ table {
text-align: left; text-align: left;
border-collapse: collapse; border-collapse: collapse;
overflow-wrap: normal; overflow-wrap: normal;
@include color-scheme(dark) {
border-color: $color-bg-secondary--dark;
}
} }
table td, table td,
@ -29,6 +33,11 @@ table thead tr {
color: $color-bg; color: $color-bg;
margin: 0; margin: 0;
padding: 0; padding: 0;
@include color-scheme(dark) {
background-color: $color-table--dark;
color: $color-bg--dark;
}
} }
table thead tr { table thead tr {
@ -37,7 +46,15 @@ table thead tr {
tbody tr:nth-child(even) { tbody tr:nth-child(even) {
background-color: $color-accent; background-color: $color-accent;
@include color-scheme(dark) {
background-color: $color-bg-secondary--dark;
}
} }
tbody tr:nth-child(odd) { tbody tr:nth-child(odd) {
background-color: #FFF; background-color: $color-bg;
@include color-scheme(dark) {
background-color: $color-bg--dark;
}
} }

@ -12,4 +12,9 @@
top:-2px; top:-2px;
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
@include color-scheme(dark) {
background-color: $color-secondary--dark;
color: $color-bg--dark;
}
} }

@ -2,6 +2,8 @@
/* Misc helpers */ /* Misc helpers */
.tar{ text-align: right; } .tar{ text-align: right; }
.tac{ text-align: center; }
.tal{ text-align: left; }
.no-padd{ padding: 0; } .no-padd{ padding: 0; }

@ -5,5 +5,9 @@
text-decoration: none; text-decoration: none;
} }
.nav a{ .nav a{
color: #CCC; color: $color-nav;
@include color-scheme(dark) {
color: $color-nav--dark;
}
} }

@ -1,3 +1,4 @@
@use '../utilities/main_utilities' as *; @use '../utilities/main_utilities' as *;
// Page specific stuff // Page specific stuff
@use 'error/error';

@ -0,0 +1,25 @@
@use '../../utilities/main_utilities' as *;
.body--error{
display: flex !important;
align-items: center !important;
justify-content: center !important;
flex-direction: column !important;
height: 100% !important;
background: $color-bg;
color: $color-text;
@include color-scheme(dark) {
background: $color-bg--dark;
color: $color-text--dark;
}
}
.error-title{
font-size: 40px;
@include media($media-sm) { font-size: 80px; }
}
.error-text{
margin-top: 20px;
@include media($media-sm) { margin-top: 40px; }
}

@ -1,4 +1,22 @@
@use 'variables' as *;
@mixin reset { @mixin reset {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
// @include color-scheme() {}
@mixin color-scheme($value: dark) {
@if $color-schemes {
@media (prefers-color-scheme: $value) {
@content;
}
}
}
// @include media($media-lg) {}
@mixin media($value: $media-md) {
@media (min-width: $value) {
@content;
}
}

@ -1,9 +1,11 @@
// Variables // Variables
$media-xs: 0; $color-schemes: false; // true/false, to enable/disable light/dark colour themes. All default styling is for 'light'
$media-sm: 0;
$media-md: 0; $media-xs: 360px;
$media-lg: 0; $media-sm: 540px;
$media-xl: 0; $media-md: 768px;
$media-lg: 900px;
$media-xl: 1200px;
$active-brightness: .85; $active-brightness: .85;
$hover-brightness: 1.2; $hover-brightness: 1.2;
@ -19,9 +21,9 @@ $color-bg-secondary--dark: #555;
$color-link: #118bee; $color-link: #118bee;
$color-link--dark: #0097fc; $color-link--dark: #0097fc;
$color-secondary: #508ce2; $color-secondary: #508ce2;
$color-secondary--dark: #e20de9; $color-secondary--dark: #2c68bd;
$color-secondary-accent: #dee9fa; $color-secondary-accent: #dee9fa;
$color-secondary-accent--dark: #e20de9; $color-secondary-accent--dark: #496282;
$color-shadow: #f4f4f4; $color-shadow: #f4f4f4;
$color-shadow--dark: #bbbbbb20; $color-shadow--dark: #bbbbbb20;
$color-table: #118bee; $color-table: #118bee;
@ -32,6 +34,24 @@ $color-text-secondary: #999;
$color-text-secondary--dark: #aaa; $color-text-secondary--dark: #aaa;
$color-scrollbar: #cacae8; $color-scrollbar: #cacae8;
$color-scrollbar--dark: #EEE;
$color-card: #FFF;
$color-card--dark: #232323;
$color-banner: #EEE;
$color-banner--dark: #444;
$color-highlight: #ff8c00;
$color-highlight--dark: #a3600d;
$color-nav: #CCC;
$color-nav--dark: #CCC;
// $alert-color:
$alert-color--error: #e90d30;
$alert-color--warning: #ddde11;
$alert-color--success: #18ab34;
$font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; $font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
$justify-important: center; $justify-important: center;

Loading…
Cancel
Save