/*!
Theme Name: Jake Van Base Theme
Theme URI: https://jakevan.ca
Author: Jake Vanderwerf
Author URI: https://jakevan.ca
Description: A base theme for Jake Van clients
Requires at least: 6.4
Tested up to: 6.4
Requires PHP: 8.0
Version: 1.6.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: jv
*/
/*************************************************************
VARIABLES
*************************************************************/
:root {
/*****************************
Layout
*****************************/
--half: min(384px, 17.5vw);
--narrow: min(500px, 62.5vw);
--content: min(768px, 65vw);
--wider: min(900px, 75vw);
--wide: min(1024px, 90vw);
--full: 100vw;
--offScreen: -200vw;
/*****************************
Sizing
*****************************/
--chip: 1.5rem;
--chipchip: 3rem;
--chip_: 2rem;
--btn: 4rem;
--btn_: 5rem;
--btnbtn: 8rem;
--maxHeight: calc(100vh - var(--btnbtn));
/*****************************
Flex
*****************************/
--dir: row;
--justify: center;
--align: center;
--wrap: wrap;
--gap: .5rem;
/*****************************
Typography
*****************************/
--w: 1.2em; /** For icons **/
--font-base: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;
--heading: 'Aleo', var(--font-base);
--body: 'Josefin Slab', var(--font-base);
--fw-h-light: 400;
--fw-h: 900;
--fw-h-bold: 900;
--fw-b-light: 200;
--fw-b: 400;
--fw-b-bold: 700;
--txt-small: clamp(.75rem, 1.1337rem + -1.2278vw, .059375rem);
--txt-x-small: clamp(.95rem, .879rem + .19vw, 1.05rem);
--txt-medium: clamp(1.1rem, .993rem + .286vw, 1.25rem);
--txt-x-medium: clamp(1.4rem, .971rem + 1.143vw, 2rem);
--txt-large: clamp(1.3rem, .6rem + 1.867vw, 2rem);
--txt-x-large:clamp(1.6rem, .957rem + 1.714vw, 2.5rem);
--txt-xx-large: clamp(2rem, 1.286rem + 1.905vw, 3rem);
--txt-xxx-large: clamp(2.5rem, 1.429rem + 2.857vw, 4rem);
--txt-enormous: calc(26vh - 4rem);
/*****************************
Colours
*****************************/
--filter: grayscale(.3) sepia(.4);
--mix-blend-mode: darken;
--coverBlend: overlay;
--coverIndex: 2;
--light-0: #fafafa;
--light-50: #fcfbfb;
--light-100: #f1eded;
--light-200: #e6dfdf;
--light-rgb: 250,250,250;
--dark-0: #201313;
--dark-50: #261717;
--dark-100: #2d1b1b;
--dark-200: #331e1e;
--dark-rgb: 16,4,4;
--action-0: #B7332E;
--action-50: #a32d29;
--action-100: #8e2824;
--action-200: #7a221f;
--action-contrast: var(--light-0);
--action-rgb: 183,51,46;
--secondary-0: #E8A737;
--secondary-50: #e59d20;
--secondary-100: #d48f18;
--secondary-200: #bd7f16;
--secondary-contrast: var(--light-0);
--secondary-rgb: 232,167,55;
--success: #22C55E;
--successBack: #d4edda;
--successText:#155724;
--warning: #E8A737;
--error: #EF4444;
--errorBack: #f8d7da;
--errorText: #721c24;
--base: var(--light-0);
--base-50: var(--light-50);
--base-100: var(--light-100);
--base-200: var(--light-200);
--base-rgb: var(--light-rgb);
--contrast: var(--dark-0);
--contrast-50: var(--dark-50);
--contrast-100: var(--dark-100);
--contrast-200: var(--dark-200);
--contrast-rgb: var(--dark-rgb);
--shimmer: rgba(var(--dark-rgb),0) 0%,
rgba(var(--dark-rgb),.05) 50%,
rgba(var(--dark-rgb),0) 100%;
--op-1: .05;
--op-2: .15;
--op-3: .25;
--op-45: .45;
--op-4: .66;
--op-5: .75;
--op-6: .85;
/*****************************
Shadows
*****************************/
--shdw-inset: inset 0 0 4px 1px;
--shdw: 0 0 4px;
--shdw-down: 0 6px 5px -5px;
--shdw-right: 6px 0 5px -5px;
--shdw-left: -6px 0 5px -5px;
--shdw-up: 0 -6px 5px -5px;
--shdw-subtle: 0 25px 20px -20px;
--shdw-subtle-right: 10px 0 20px -20px;
--shdw-none: transparent 0 0 0;
/*****************************
Stacking
*****************************/
--z-1: 5;
--z-2: 10;
--z-3: 15;
--z-4: 20;
--z-5: 50;
--z-6: 100;
--z-7: 999;
--z-8: 1000;
--z-9: 999999;
--z-10: 9999999;
/*****************************
Rounding
*****************************/
--radius: 4px;
--p-outer: 1rem;
--radius-outer: calc(var(--radius) + var(--p-outer));
--p-y: var(--sp1);
--p-x: var(--sp1);
/*****************************
Transitions
*****************************/
--trans-fn: cubic-bezier(.47,.24,.07,.47);
--trans-t: .25s;
--trans-base: var(--trans-t) var(--trans-fn);
--trans-color: background-color var(--trans-base),
color var(--trans-base), border var(--trans-base);
--trans-transform: transform var(--trans-base);
--trans-size: width var(--trans-base),
height var(--trans-base),max-width var(--trans-base), max-height var(--trans-base);
--trans-vis: opacity var(--trans-base);
/*****************************
Spacing
*****************************/
--sp1: clamp(0.5rem, 0.714vw + 0.321rem, 1rem); /* 8px → 16px */
--sp2: clamp(0.75rem, 1.071vw + 0.482rem, 1.5rem); /* 12px → 24px */
--sp3: clamp(1rem, 1.429vw + 0.643rem, 2rem); /* 16px → 32px */
--sp4: clamp(1.5rem, 2.143vw + 0.964rem, 3rem); /* 24px → 48px */
--sp5: clamp(2rem, 2.857vw + 1.286rem, 4rem); /* 32px → 64px */
--sp6: clamp(3rem, 4.286vw + 1.929rem, 6rem); /* 48px → 96px */
--sp7: clamp(4rem, 5.714vw + 2.571rem, 8rem); /* 64px → 128px */
/*****************************
Scrollbar
*****************************/
--sb-width: 8px;
--sb-track: var(--base-100);
--sb-thumb: var(--action-0);
--sb-thumb-hover: var(--action-50);
--sb-thumb-border: 2px solid var(--base-50);
--sb-radius: 4px;
--details: url('data:image/svg+xml,');
--link: url('data:image/svg+xml,');
}
body:has(#theme-switcher:checked){
/*****************************
Colours
*****************************/
--mixBlendMode: lighten;
--coverBlend: multiply;
--coverIndex: 0;
--action-50: #cb3933;
--action-100: #d14c47;
--action-200: #d6605c;
--secondary-50: #ebb14e;
--secondary-100: #edbb65;
--secondary-200: #f0c57c;
--contrast: var(--light-0);
--contrast-50: var(--light-50);
--contrast-100: var(--light-100);
--contrast-200: var(--light-200);
--contrast-rgb: var(--light-rgb);
--base: var(--dark-0);
--base-50: var(--dark-50);
--base-100: var(--dark-100);
--base-200: var(--dark-200);
--base-rgb: var(--dark-rgb);
--successBack: #155724;
--successText:#d4edda;
--errorBack: #721c24;
--errorText: #f8d7da;
--shimmer: rgba(var(--c),0) 0%,
rgba(var(--c),.05) 50%,
rgba(var(--c),0) 100%;
}
/* https://frontendmasters.com/blog/the-coyier-css-starter/ */
@layer reset {
html {
color-scheme: light dark;
font:
clamp(1rem, 1rem + 0.5vw, 2rem) / 1.4 system-ui,
sans-serif;
tab-size: 2;
hanging-punctuation: first allow-end last;
word-break: break-word;
}
body {
margin: 0;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
h1,
h2 {
font-weight: 900;
letter-spacing: -0.02rem;
}
h1,
h2,
h3 {
line-height: 1.1;
}
h1,
h2,
h3,
h4,
h5,
h6 /* FUTURE :heading */ {
text-wrap: balance;
margin-block-start: 0;
}
p,
li,
dd {
text-wrap: pretty;
max-inline-size: 88ch;
}
a {
color: oklch(0.68 0.17 228);
text-underline-offset: 2px;
&:not(:is(:hover, :focus)) {
text-decoration-color: color-mix(in srgb, currentColor, transparent 50%);
}
}
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
inset-block-end: -0.25em;
}
sup {
inset-block-start: -0.5em;
}
ul,
ol,
dl {
margin: 0;
padding: 0;
list-style: outside;
ul,
ol,
dl {
padding-inline-start: 2ch;
}
}
li {
padding-bottom: .5rem;
}
img,
video,
iframe {
display: block;
max-inline-size: 100%;
block-size: auto;
border-style: none;
}
figure {
inline-size: fit-content;
margin-inline: auto;
}
figure img {
width: 100%;
height: 100%;
object-fit: cover;
}
figcaption {
contain: inline-size;
font-size: 90%;
}
input,
select,
textarea,
button {
font: inherit;
/* FUTURE: appearance: base; */
}
label {
display: block;
}
input:not(
:where(
[type="submit"],
[type="checkbox"],
[type="radio"],
[type="button"],
[type="reset"]
)
) {
inline-size: 100%;
}
button,
input:where(
[type="submit"],
[type="reset"],
[type="button"]
) {
background: CanvasText;
color: Canvas;
border: 1px solid transparent;
}
textarea {
field-sizing: content;
min-block-size: 5lh;
inline-size: 100%;
max-inline-size: 100%;
}
pre,
code,
kbd,
samp {
font-family: ui-monospace, SFMono-Regular, monospace;
}
svg {
fill: currentColor;
}
[aria-disabled="true" i],
[disabled] {
cursor: not-allowed;
}
[hidden] {
display: none !important;
}
[disabled],
label:has(input[disabled]) {
opacity: 0.5;
[disabled] {
opacity: 1;
}
}
pre {
white-space: pre-wrap;
background: CanvasText;
color: Canvas;
padding: 1.5rem;
}
hr {
border-style: solid;
border-width: 1px 0 0;
color: inherit;
height: 0;
overflow: visible;
margin-block: 2.5rem;
}
:target {
scroll-margin: 3rlh;
}
table {
caption-side: bottom;
border-collapse: collapse;
td {
font-size: 90%;
}
td,
th {
word-break: normal;
border: 1px solid gray;
padding: 0.5rem;
}
}
[role="region"][aria-labelledby][tabindex] {
overflow: auto;
}
caption {
font-size: 90%;
}
.screen-reader-text:not(:focus):not(:active) {
clip: rect(0 0 0 0);
clip-path: inset(50%);
height: 1px;
overflow: hidden;
position: absolute;
white-space: nowrap;
width: 1px;
}
:focus-visible {
outline-offset: 2px;
}
@media (prefers-reduced-motion: no-preference) {
@view-transition {
navigation: auto;
}
html {
interpolate-size: allow-keywords;
&:focus-within {
scroll-behavior: smooth;
}
}
}
}
/*************************************************************
SCROLLBAR
*************************************************************/
* {
scrollbar-width: thin;
scrollbar-color: var(--sb-thumb) var(--sb-track);
}
/* For WebKit browsers (Chrome, Safari, etc.) */
::-webkit-scrollbar {
width: var(--sb-width);
height: var(--sb-width);
}
::-webkit-scrollbar-track {
background: var(--sb-track);
}
::-webkit-scrollbar-thumb {
background-color: var(--sb-thumb);
border-radius: var(--sb-radius);
border: var(--sb-thumb-border);
}
::-webkit-scrollbar-thumb:hover {
background-color: var(--sb-thumb-hover);
}
/*************************************************************
BASE
*************************************************************/
body {
background-color: var(--base-50);
color: var(--contrast);
margin: 0;
font-family: var(--body);
font-weight: var(--fw-b);
font-size: var(--txt-medium);
line-height: 1.4;
position: relative;
max-width: 100vw;
}
body,
body * {
transition: var(--trans-color)
}
/*************************************************************
LAYOUT
*************************************************************/
html {
scroll-behavior: smooth;
overflow-x: hidden;
}
@media(prefers-reduced-motion){
html {
scroll-behavior: unset;
}
* {
transition: none!important;
animation: none!important;
}
}
/*body:has(aside.expanded),*/
/*body:has(nav.open:not(.drawer)),*/
/*body:has(dialog[open]),*/
/*body.loading {*/
/* overflow: hidden;*/
/* max-height: 100vh;*/
/*}*/
main {
display: grid;
grid-template-columns:
[full-start] minmax(1rem, 1fr)
[wide-start] minmax(0, calc((100% - var(--content)) / 2))
[wider-start] minmax(0, calc((var(--wide) - var(--wider)) / 2))
[content-start] minmax(0, calc((var(--wider) - var(--content)) / 2))
[narrow-start] min(100% - 2rem, var(--narrow)) [narrow-end]
minmax(0, calc((var(--content) - var(--narrow)) / 2)) [content-end]
minmax(0, calc((var(--wider) - var(--content)) / 2)) [wider-end]
minmax(0, calc((var(--wide) - var(--wider)) / 2)) [wide-end]
minmax(0, calc((100% - var(--content)) / 2))
minmax(1rem, 1fr) [full-end];
min-height: var(--maxHeight);
}
main > * {
grid-column: content;
}
main > section {
padding: 3rem 0;
grid-column: full;
}
main > section > * {
width: 100%;
max-width: var(--content);
margin: var(--sp1) auto;
}
main > section > ul {
max-width: var(--narrow);
}
/* Nested items can use any width */
main .align-narrow {
grid-column: narrow;
}
main .align-content {
grid-column: content;
}
main .align-wider {
grid-column: wider;
}
main .align-wide {
grid-column: wide;
}
main .align-full {
grid-column: full;
width: 100%;
max-width: none;
}
/* First child has no top spacing */
main > *:first-child {
margin-top: 0;
}
.wp-site-blocks > header {
position: sticky;
top: 0;
z-index: var(--z-8);
background-color: var(--base);
box-shadow: rgba(var(--base-rgb), var(--op-45)) var(--shdw-down);
transition: top var(--trans-base);
}
header a[rel="home"] {
display: flex;
align-items: center;
max-height:var(--btn);
overflow:hidden;
}
.scroll-progress {
position: absolute;
inset-inline: 0;
bottom: 0;
height: 3px;
display: flex;
align-items: center;
pointer-events: none;
z-index: var(--z-3);
background-color: var(--base-200);
overflow: hidden;
}
.scroll-progress .bar {
width: 100%;
height: 1px;
transform-origin: left center;
transform: scaleX(0);
background: var(--action-0);
}
footer {
padding: 1rem;
background-color: var(--base);
color: var(--contrast-200);
text-align: center;
margin: 4rem 0 0;
position: relative;
z-index: var(--z-7);
}
footer p {
margin: 0 auto;
}
body:has(nav.fixed.bottom,nav.on-this-page) footer {
padding-bottom: var(--btn_);
}
@media (min-width:768px) {
footer {
padding: 1rem 2rem var(--btn_);
}
}
*:target {
scroll-snap-margin-top: var(--btnbtn);
scroll-margin-top: var(--btnbtn);
outline: double var(--action-200);
background-color: var(--base);
}
/***********************
PRE/SUB HEADER
***********************/
aside.header,
aside.footer {
padding: 0 1rem;
font-size: var(--txt-x-small);
z-index: var(--z-7);
background-color: var(--base-50);
}
aside.header {
height: var(--chip_);
--wrap: nowrap;
}
aside.footer p,
aside.header p {
width: max-content;
}
aside.footer {
--dir: column;
background-color:var(--base-50);
padding: 1rem;
border-top: 1px solid var(--base-200);
}
aside.footer + footer {
margin-top: 0;
}
aside.header p ,aside.footer p {
margin: 0.125rem 0;
}
aside.pre {
position: sticky;
top: -2rem;
transition: top var(--trans-base);
}
.scroll-up aside.pre {
top: 0;
}
.scroll-up .pre ~ header {
top: calc(var(--chip_) - 2px);
}
/***********************************************************
TYPOGRAPHY
***********************************************************/
body :is(b, strong) {
font-weight: var(--fw-b-bold);
}
:is(h1, h2, h3, h4, h5, h6) {
font-family: var(--heading);
text-transform: uppercase;
font-weight: var(--fw-h);
line-height: 1.3;
margin: 1.5em auto .25em;
width: 100%;
}
:is(h1,h2,h3,h4,h5,h6), p {
width: 100%;
}
:is(h1, h2, h3, h4, h5, h6) :is(b, strong) {
font-weight: var(--fw-h-bold);
letter-spacing: 2px;
}
:is(h1, h2, h3, h4, h5, h6) small {
display: block;
line-height: .8;
font-family: var(--body);
font-size: .5em;
}
:is(h1, h2, h3, h4, h5, h6) small :is(b, strong) {
font-weight: var(--fw-b-bold);
}
:is(h1, h2, h3, h4, h5, h6).inline {
font-size: 1.2rem;
font-weight: var(--fw-h-bold);
display: inline-block;
margin: 0 2rem 0 0;
letter-spacing: .05em;
}
:is(h1, h2, h3, h4, h5, h6).inline + * {
display: inline-block;
margin: .5rem 0;
}
h1 {
font-size: var(--txt-xxx-large);
font-weight: var(--fw-h);
line-height: 1;
margin: 10vh auto .25em;
}
h1 small + small {
display: inline-block;
font-size: var(--txt-large);
margin-right: .5rem;
}
h2 { font-size: var(--txt-xx-large); }
h3 { font-size: var(--txt-x-large); }
h4 {
font-weight: 400;
font-size: var(--txt-large);
}
h5, h6 {
font-weight: 400;
font-size: var(--txt-medium);
}
p {
line-height: 1.6;
}
.hint {
line-height: 1.2;
font-style: italic;
font-size: var(--txt-small);
}
/******************************************************
LINKS
******************************************************/
a {
color: var(--action-0);
border-radius: 4px;
padding: .125rem;
}
a:visited {
color: var(--action-100);
}
a:hover,
a:visited:hover {
color: var(--contrast-50);
text-decoration: none;
}
:is(p, li, h1,h2,h3,h4,h5,h6, small) a:hover {
color: var(--action-contrast);
background-color: var(--action-0);
}
/*****************************************************
ICONS
*****************************************************/
i.icon {
width: var(--w);
height: var(--w);
display: inline-block;
background-color: currentColor;
mask-image: var(--icon);
-webkit-mask-image: var(--icon);
mask-size: contain;
-webkit-mask-size: contain;
mask-repeat: no-repeat;
-webkit-mask-repeat: no-repeat;
mask-position: center;
-webkit-mask-position: center;
vertical-align: middle;
}
/** SWITCHING ICONS **/
/**** If, say, a button has two icons, one gets hidden on one state, and one gets shown on another, add it here **/
.favourite:not(.favourited) .heart-fill,
.favourite.favourited .heart,
.notifications:not(.has) .bell-ringing,
.notifications.has .bell,
.vote button:not(.voted) .upvoted,
.vote button:not(.voted) .downvoted,
.vote .voted .upvote,
.vote .voted .downvote {
display: none;
}
.favourite:not(.favourited) .heart,
.favourite.favourited .heart-fill,
.notifications:not(.has) .bell,
.notifications.has .bell-ringing,
.vote button:not(.voted) .upvote,
.vote button:not(.voted) .downvote,
.vote .voted .upvoted,
.vote .voted .downvoted {
display: block;
}
/*******************************************************
LISTS
*******************************************************/
ol {
list-style-type: decimal;
}
ul.terms {
display: grid;
grid-template-columns: repeat(2, 1fr);
}
ul.terms li {
list-style: none;
}
.term-list li {
list-style: none;
}
.term-list a {
display: inline-flex;
width: max-content;
}
/******************************************************
UTILITY
******************************************************/
.font-small { font-size: var(--txt-x-small); }
.font-medium { font-size: var(--txt-medium); }
.font-large { font-size: var(--txt-large); }
.font-x-large { font-size: var(--txt-x-large); }
.align-center { text-align: center; }
.align-left { text-align: left; }
.align-right { text-align: right; }
*[hidden] { display: none!important; }
@media (max-width: 767px){
.hide-small { display: none; }
}
.width-50,
.width-25,
.width-75 {
width: 100%;
}
.w-full{
width: 100%;
}
@media (min-width: 768px){
.width-50 {
width: calc(50% - .3em);
}
.width-25 {
width: calc(25% - .3em);
}
.width-75 {
width: calc(75% - .3em);
}
}
/** SPACING TODO: maybe scan our files for which we actually use? **/
.p-1 {padding: var(--sp1);}
.p-2 {padding: var(--sp2);}
.p-3 {padding: var(--sp3);}
.p-4 {padding: var(--sp4);}
.p-5 {padding: var(--sp5);}
.p-6 {padding: var(--sp6);}
.p-7 {padding: var(--sp7);}
.px-1 {padding-left: var(--sp1);padding-right: var(--sp1);}
.px-2 {padding-left: var(--sp2);padding-right: var(--sp2);}
.px-3 {padding-left: var(--sp3);padding-right: var(--sp3);}
.px-4 {padding-left: var(--sp4);padding-right: var(--sp4);}
.px-5 {padding-left: var(--sp5);padding-right: var(--sp5);}
.px-6 {padding-left: var(--sp6);padding-right: var(--sp6);}
.px-7 {padding-left: var(--sp7);padding-right: var(--sp7);}
.py-1 {padding-top: var(--sp1);padding-bottom: var(--sp1);}
.py-2 {padding-top: var(--sp2);padding-bottom: var(--sp2);}
.py-3 {padding-top: var(--sp3);padding-bottom: var(--sp3);}
.py-4 {padding-top: var(--sp4);padding-bottom: var(--sp4);}
.py-5 {padding-top: var(--sp5);padding-bottom: var(--sp5);}
.py-6 {padding-top: var(--sp6);padding-bottom: var(--sp6);}
.py-7 {padding-top: var(--sp7);padding-bottom: var(--sp7);}
.pt-1 { padding-top: var(--sp1); }
.pr-1 { padding-right: var(--sp1); }
.pl-1 { padding-left: var(--sp1); }
.pb-1 { padding-bottom: var(--sp1); }
.pt-2 { padding-top: var(--sp2); }
.pr-2 { padding-right: var(--sp2); }
.pl-2 { padding-left: var(--sp2); }
.pb-2 { padding-bottom: var(--sp2); }
.pt-3 { padding-top: var(--sp3); }
.pr-3 { padding-right: var(--sp3); }
.pl-3 { padding-left: var(--sp3); }
.pb-3 { padding-bottom: var(--sp3); }
.pt-4 { padding-top: var(--sp4); }
.pr-4 { padding-right: var(--sp4); }
.pl-4 { padding-left: var(--sp4); }
.pb-4 { padding-bottom: var(--sp4); }
.pt-5 { padding-top: var(--sp5); }
.pr-5 { padding-right: var(--sp5); }
.pl-5 { padding-left: var(--sp5); }
.pb-5 { padding-bottom: var(--sp5); }
.pt-6 { padding-top: var(--sp6); }
.pr-6 { padding-right: var(--sp6); }
.pl-6 { padding-left: var(--sp6); }
.pb-6 { padding-bottom: var(--sp6); }
.pt-7 { padding-top: var(--sp7); }
.pr-7 { padding-right: var(--sp7); }
.pl-7 { padding-left: var(--sp7); }
.pb-7 { padding-bottom: var(--sp7); }
/** MARGIN **/
.m-0 {margin: 0;}
.m-1 {margin: var(--sp1);}
.m-2 {margin: var(--sp2);}
.m-3 {margin: var(--sp3);}
.m-4 {margin: var(--sp4);}
.m-5 {margin: var(--sp5);}
.m-6 {margin: var(--sp6);}
.m-7 {margin: var(--sp7);}
.mx-1 {margin-left: var(--sp1);margin-right: var(--sp1);}
.mx-2 {margin-left: var(--sp2);margin-right: var(--sp2);}
.mx-3 {margin-left: var(--sp3);margin-right: var(--sp3);}
.mx-4 {margin-left: var(--sp4);margin-right: var(--sp4);}
.mx-5 {margin-left: var(--sp5);margin-right: var(--sp5);}
.mx-6 {margin-left: var(--sp6);margin-right: var(--sp6);}
.mx-7 {margin-left: var(--sp7);margin-right: var(--sp7);}
.my-1 {margin-top: var(--sp1);margin-bottom: var(--sp1);}
.my-2 {margin-top: var(--sp2);margin-bottom: var(--sp2);}
.my-3 {margin-top: var(--sp3);margin-bottom: var(--sp3);}
.my-4 {margin-top: var(--sp4);margin-bottom: var(--sp4);}
.my-5 {margin-top: var(--sp5);margin-bottom: var(--sp5);}
.my-6 {margin-top: var(--sp6);margin-bottom: var(--sp6);}
.my-7 {margin-top: var(--sp7);margin-bottom: var(--sp7);}
.mt-1 { margin-top: var(--sp1); }
.mr-1 { margin-right: var(--sp1); }
.ml-1 { margin-left: var(--sp1); }
.mb-1 { margin-bottom: var(--sp1); }
.mt-2 { margin-top: var(--sp2); }
.mr-2 { margin-right: var(--sp2); }
.ml-2 { margin-left: var(--sp2); }
.mb-2 { margin-bottom: var(--sp2); }
.mt-3 { margin-top: var(--sp3); }
.mr-3 { margin-right: var(--sp3); }
.ml-3 { margin-left: var(--sp3); }
.mb-3 { margin-bottom: var(--sp3); }
.mt-4 { margin-top: var(--sp4); }
.mr-4 { margin-right: var(--sp4); }
.ml-4 { margin-left: var(--sp4); }
.mb-4 { margin-bottom: var(--sp4); }
.mt-5 { margin-top: var(--sp5); }
.mr-5 { margin-right: var(--sp5); }
.ml-5 { margin-left: var(--sp5); }
.mb-5 { margin-bottom: var(--sp5); }
.mt-6 { margin-top: var(--sp6); }
.mr-6 { margin-right: var(--sp6); }
.ml-6 { margin-left: var(--sp6); }
.mb-6 { margin-bottom: var(--sp6); }
.mt-7 { margin-top: var(--sp7); }
.mr-7 { margin-right: var(--sp7); }
.ml-7 { margin-left: var(--sp7); }
.mb-7 { margin-bottom: var(--sp7); }
/******************************************************************
LAYOUT UTILITIES
******************************************************************/
/** Buttons **/
button,
[type=submit],
a.btn,
.btn + label,
li.btn,
.buttons a,
.buttons li,
/** Item Grid **/
.item-grid .item,
/** popups **/
aside.main,
/** asides **/
aside.header,
aside.footer,
/** Defaults, of course **/
.row,
.col {
display: flex;
justify-content: var(--justify);
align-items: var(--align);
gap: var(--gap);
flex-wrap: var(--wrap);
flex-direction: var(--dir);
--align: center;
--justify: center;
--gap: .5rem;
--wrap: wrap;
}
.col { --dir: column; }
.row { --dir: row; }
.col.rev { --dir: column-reverse; }
.row.rev { --dir: row-reverse; }
.nowrap.nowrap { --wrap: nowrap; }
.nowrap.nowrap.stack-small { --wrap: wrap;}
@media (min-width: 768px) {
.nowrap.nowrap.stack-small { --wrap: nowrap;}
}
.col.start,
.row.a-start { --align: flex-start; }
.col.end,
.row.a-end { --align: flex-end; }
.col.a-start,
.row.start { --justify: flex-start; }
.col.a-end,
.row.end { --justify: flex-end; }
.col.btw,
.row.btw {
--justify: space-between;
width: 100%;
}
.col.even,
.row.even { --justify: space-evenly; }
/*************************************************
POSITION UTILITIES
*************************************************/
.abs { position: absolute; }
*:has(>.abs) { position: relative; }
.top { top: 0; right: 0; left: 0; }
.top-right { top: 0; right: 0; }
.top-left { top: 0; left: 0; }
.btm { bottom: 0; left: 0; right: 0; }
.btm-right { bottom: 0; right: 0; }
.btm-left { bottom: 0; left: 0; }
.edges { inset: 0; }
.hidden {
transform: scale(0);
max-width: 0;
max-height: 0;
overflow: hidden;
transition: var(--trans-transform), var(--trans-size);
}
.visible {
transform: scale(1);
max-width: 100%;
max-height: 100%;
transition: var(--trans-transform), var(--trans-size);
}
/******************************************************************
THEME SWITCHER
******************************************************************/
.field .switch {
display: inline-flex;
}
.switch .slider {
--trans-t: .0125s;
position: relative;
width: var(--chipchip);
height: var(--chip);
background-color: var(--base-200);
border-radius: .75rem;
overflow: hidden;
display: flex;
justify-content: space-between;
align-items: center;
border: 4px solid transparent;
box-shadow: 0 0 .25rem 0 rgba(var(--contrast-rgb), .125) inset;
cursor: pointer;
margin: 5px;
transition: var(--trans-color);
}
.switch .slider::before {
content: '';
display: block;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-color: var(--base);
transform: translateX(-1.5rem); /* NOTE: Tied to half of the width defined above */
border-radius: .75rem;
transition: var(--trans-transform);
box-shadow: 0 0 .25rem 3px rgba(var(--contrast-rgb), .125);
}
.switch :checked ~ .slider::before {
transform: translateX(1.5rem);
box-shadow: 0 0 .25rem 3px rgba(var(--base-rgb), .25);
}
.switch :checked ~ .slider {
background-color: var(--action-0);
}
.switch :active ~ .slider::before {
transform: translateX(0);
}
#theme-switch {
z-index: var(--z-6);
margin: 0;
--wrap: nowrap;
--gap: 1rem;
}
#theme-switch [type=checkbox] {
position: absolute;
left: var(--offScreen);
}
@media (max-width: 600px) {
#theme-switch {
left: 1rem;
}
}
:checked ~ .slider .icon-sun-dim {
--w: .75em;
margin-top: .25em;
}
.slider .icon-moon {
--w: .666em;
margin-top: .333em;
}
.slider .icon-sun-dim,
:checked ~ .slider .icon-moon {
--w: 1em;
margin-top: 0;
}
:not(:checked) ~ .slider .icon-sun-dim {
color: var(--action-0);
}
/************************************************
GRIDS/ROWS/TABLES
************************************************/
/** GRID VIEW (default) **/
.item-grid{
--columns: repeat(2, 1fr);
display: grid;
grid-template-columns: var(--columns);
gap: 10px;
}
.item-grid .empty {
height: 15vh;
background-color: var(--base-50);
border-radius: var(--radius);
border: 2px dashed var(--base-200);
font-style: italic;
}
.item-grid.stats {
--columns: repeat(2, 1fr);
}
@media (min-width: 768px) {
.item-grid {
--width: 250px;
--columns: repeat(auto-fill, minmax(var(--width), 1fr));
}
}
.item-grid .item {
border-radius: var(--radius-outer);
filter: none;
position: relative;
}
.item-grid .item .item-actions {
--gap: .125rem;
z-index: 1;
position: absolute;
top: 0;
right: 0;
width: calc(100% - var(--btn));
}
.item-actions button,
.item-actions .btn + label {
min-height: var(--chipchip);
width: var(--chipchip);
z-index: var(--z-1);
}
.item-grid .item .images,
.item-grid .item .images a {
aspect-ratio: 1;
width: 100%;
height: 100%;
display: flex;
}
.item-grid img {
border-radius: var(--radius);
}
.item-grid .item-actions button {
min-height: var(--chipchip);
width: var(--chipchip);
}
/** LIST VIEW **/
.item-grid.list-view {
display: flex;
flex-direction: column;
gap: 0;
}
.item-grid.list-view .item {
aspect-ratio: unset;
align-items: flex-start;
border-radius: var(--radius);
padding: 1rem 0;
}
.list-view .item:nth-of-type(even) {
background-color: var(--base);
}
.list-view img {
width: 20%;
}
.item.col {
--wrap: nowrap;
}
.empty-state {
--w: 1.2em;
grid-column: 1 / span 2;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
margin: 1rem auto;
max-width: 66%;
background-color: var(--base-100);
border: 2px dashed var(--base-50);
padding: 1rem;
}
/***********************************************
TABLES
***********************************************/
table {
white-space: nowrap;
width: 100%;
display: block;
margin: 0 0 2rem;
border-radius: 4px;
height: var(--maxHeight);
overflow: auto;
position: relative;
}
thead,tfoot {
position: sticky;
z-index: 10;
background-color: var(--base);
text-transform: uppercase;
padding: .5rem 0;
line-height: 2;
font-weight: normal;
}
tr:nth-of-type(even){
background-color: var(--base-200);
}
tfoot th {
vertical-align: middle;
}
tfoot th:first-of-type {
text-align: right;
}
thead tr, tfoot tr {
background-color: rgba(var(--base-rgb),var(--op-6));
box-shadow: rgba(var(--base-rgb),var(--op-45)) var(--shdw);
}
thead tr {
border-bottom: 1px solid var(--contrast-200);
}
tfoot tr {
border-top: 1px solid var(--contrast-200);
}
thead {
top: 0;
}
tfoot {
bottom: 0;
}
thead th {
width: max-content;
}
th p {
margin: 0!important;
}
td {
width: max-content;
padding: .5rem 1rem;
}
td .toggle input[type=checkbox] {
margin: 0;
}
td .field {
margin: .25rem 0;
}
td[data-id="actions"] label {
margin: 0;
padding: 0;
}
td .description {
display: none;
}
td input[type=text] {
width: fit-content;
max-width: 40vw;
padding: .25em!important;
font-size: var(--txt-x-small)!important;
}
tbody tr {
border: 2px solid transparent;
}
tbody tr:focus-within {
background-color: var(--base-100);
border-color: var(--action-50)
}
[data-stuck] {
background-color: rgba(var(--base-rgb),var(--op-4));
position: sticky;
left: -1rem;
z-index: 15;
box-shadow: rgba(var(--base-rgb),var(--op-45)) var(--shdw-subtle-right);
}
tbody [data-stuck] {
z-index: 5;
}
thead [data-stuck],
tfoot [data-stuck] {
background: var(--base);
}
/***********************************************
BUTTONS
***********************************************/
button,
[type=submit],
a.btn,
.btn + label,
li.btn,
.buttons a {
--justify:center;
--align: center;
--dir: row;
--wrap: nowrap;
width: fit-content;
text-transform: uppercase;
text-decoration: none;
background-color: var(--base-100);
color: var(--contrast-50);
border: 1px solid var(--base-200);
border-radius: var(--radius);
padding: .25rem 1rem;
font-family: var(--heading);
cursor: pointer;
outline: 0;
min-height: var(--btn);
display: inline-flex;
position: relative;
box-shadow: rgba(var(--base-rgb),var(--op-6)) var(--shdw-inset);
}
button.outline,
[type=submit].outline,
a.btn.outline,
.filters .btn + label,
.buttons .outline a {
--color: var(--contrast);
background-color: transparent;
color: var(--color);
border: 1px solid var(--color);
}
button:hover,
button:focus,
[type=submit]:hover,
[type=submit]:focus,
a.btn:hover,
a.btn:visited:hover,
a.btn:focus,
.btn + label:hover,
.btn:focus + label,
.btn:checked + label,
li.btn:hover,
li.btn:focus,
.buttons a:hover,
.buttons a:visited:hover,
.buttons a:focus {
background-color: var(--action-0);
color: var(--action-contrast);
box-shadow: var(--shdw-none);
}
button.outline:hover,
button.outline:focus,
[type=submit].outline:hover,
[type=submit].outline:focus,
a.btn.outline:hover,
a.btn.outline:visited:hover,
a.btn.outline:focus,
.filters .btn + label:hover,
.filters .btn:focus + label,
.buttons .outline a:hover,
.buttons .outline a:visited:hover,
.buttons .outline a:focus {
background-color: var(--action-0);
color: var(--action-contrast);
border-color: var(--action-0);
}
button:disabled,
button:disabled:focus,
button:disabled:hover,
[type=submit]:disabled,
[type=submit]:disabled:focus,
[type=submit]:disabled:hover,
.btn:disabled + label,
.btn:disabled:hover + label,
.btn:disabled:focus + label {
opacity: .5;
cursor: not-allowed;
background-color: var(--base-200);
color: var(--contrast-200);
}
[type=submit] {
margin: 1rem 0;
}
.filters .btn + label,
.filters button {
min-height:var(--chip);
}
.filters .btn + label {
background-color: var(--base-100);
border: 1px solid var(--base-200);
color: var(--contrast-200);
}
.filters .btn:checked + label {
border-color: var(--contrast);
color: var(--contrast);
}
/**** WP BLOCK BUTTONS ****/
.buttons {
--wrap: wrap;
--justify: flex-start;
margin: 1rem auto;
width: 100%;
padding: 0;
}
.buttons li {
--justify: stretch;
--align: stretch;
padding: 0;
list-style: none;
overflow: hidden;
}
.buttons a {
width: 100%;
}
.buttons.fit {
width: fit-content;
margin: 1rem 2rem;
}
@media (min-width: 768px) {
.buttons {
max-width: var(--content);
margin: 3rem auto;
}
}
a.sticky,
button.sticky,
.main-actions .buttons {
z-index: var(--z-6);
position: fixed;
bottom: var(--btn_);
}
body:has(.on-this-page) a.sticky,
body:has(.on-this-page) button.sticky,
body:has(.on-this-page) .main-actions .buttons {
bottom: calc(var(--btn_) + var(--chip_));
}
.main-actions .buttons button,
button.sticky {
width: var(--btn);
height: var(--btn);
background-color: rgba(var(--base-rgb),var(--op-4));
color: var(--contrast);
box-shadow: rgba(var(--base-rgb),var(--op-45)) var(--shdw);
transition: var(--trans-size), var(--trans-color);
}
.main-actions .buttons button:hover,
.main-actions .buttons button:focus,
a.sticky:hover,
a.sticky:focus,
button.sticky:hover,
button.sticky:focus {
background-color: rgba(var(--action-rgb),var(--op-6));
color: var(--action-contrast);
}
.main-actions .buttons button:disabled,
.main-actions .buttons button:disabled:hover,
.main-actions .buttons button:disabled:focus,
button.sticky:disabled,
button.sticky:disabled:hover,
button.sticky:disabled:focus {
opacity: .5;
background-color: rgba(var(--base-rgb),var(--op-3));
color: var(--contrast);
}
.qtoggle {
left: 0;
transition: left var(--trans-base), width var(--trans-base), border var(--trans-base), var(--trans-color);
}
.main .m-actions .refresh {
width: var(--btn);
border-radius: 0;
background-color: var(--base-50);
color: var(--contrast);
}
.main .m-actions .refresh:hover,
.main .m-actions .refresh:focus {
background-color: var(--action-0);
color: var(--action-contrast);
}
.main .refresh .indicator {
background-color: rgba(var(--base-rgb), var(--op-3));
top: 0;
right: 0;
height: 1.1em;
width: 1.1em;
}
.refresh .countdown:not(.counting) {
display: none;
}
.main h2 {
margin: .5em 0;
font-size: var(--txt-medium);
}
#back-to-top {
min-height: var(--chip);
bottom: -3rem;
right: 0;
transition: bottom var(--trans-base);
}
body:has(.main-actions) #back-to-top {
right: calc(var(--btn_) + .5rem);
}
.scroll-up #back-to-top {
bottom: 0;
}
body:has(.fixed.bottom).scroll-up #back-to-top {
bottom: var(--btn);
}
body:has(.on-this-page).scroll-up.scroll-up #back-to-top {
bottom: calc(var(--btn) + var(--chip_));
}
/******************************************************************
ACCESSIBILITY
******************************************************************/
.screen-reader-text {
border: 0;
clip: rect(1px, 1px, 1px, 1px);
clip-path: inset(50%);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute !important;
width: 1px;
word-wrap: normal !important;
}
input[type=checkbox]:focus + label,
input[type=checkbox]:focus-visible + label,
input[type=radio]:focus + label,
input[type=radio]:focus-visible + label,
input:focus,
input:focus-within {
outline: 2px solid var(--action-0) !important;
outline-offset: 2px !important;
box-shadow: 0 0 0 4px rgba(var(--action-rgb), var(--op-3))!important;
}
[aria-busy="true"] {
cursor: progress;
}
[aria-disabled="true"],
[disabled] {
cursor: not-allowed;
opacity: .7;
}
[type=checkbox][hidden] + label,
[type=radio][hidden] + label,
.btn[hidden] + label {
display: none!important;
}
/**************************************************************
FORM ELEMENTS
**************************************************************/
label {
display: inline-flex;
align-items: center;
gap: .5em;
}
[type=radio],
[type=checkbox] {
position: absolute;
opacity: 0;
left: var(--offScreen);
}
[type=radio] + label,
[type=checkbox] + label {
cursor: pointer;
}
.field:is(.radio,.checkbox) fieldset {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: .5rem;
}
@media(min-width: 768px) {
.field:is(.radio,.checkbox) fieldset {
grid-template-columns: repeat(3, 1fr);
}
}
.field:is(.radio,.checkbox,.true-false) label {
position: relative;
top: unset;
left: unset;
padding: 0 0 0 var(--chip);
display: inline-flex;
border: 1px solid transparent;
font-weight: var(--fw-b);
font-size: var(--txt-medium);
}
[type=radio] + label:hover,
[type=radio]:focus + label,
[type=checkbox] + label:hover,
[type=checkbox]:focus + label {
color: var(--action-0);
}
[type=radio] + label::before,
[type=radio] + label::after,
[type=checkbox] + label::before,
[type=checkbox] + label::after {
content: '';
position: absolute;
z-index: var(--z-2);
}
[type=checkbox] + label::before,
[type=radio] + label::before {
z-index: var(--z-1);
}
[type=checkbox] + label::after {
left: .666em;
top: .125em;
transform: rotate(45deg);
width: .25em;
height: .75em;
border: solid var(--action-contrast);
border-width: 0 2px 2px 0;
display: none;
}
[type=checkbox] + label::before,
[type=radio] + label::before {
display: block;
top: .3em;
left: .3em;
width: .75rem;
height: .75rem;
border: 2px solid var(--contrast-200);
background-color: transparent;
border-radius: var(--radius);
}
[type=radio] + label::before {
border-radius: 50%;
}
[type=checkbox]:checked + label::before {
background-color: var(--action-0);
border-color: var(--base-50);
}
[type=checkbox]:checked + label::after {
display: block;
}
[type=radio]:checked + label::before {
background-color: var(--action-0);
box-shadow: rgba(var(--base-rgb), var(--op-45)) var(--shdw-inset);
}
/** Button checkboxes and radios **/
input.btn + label::before,
input.btn + label::after {
display: none;
}
textarea,
input:is([type=date], [type=number], [type=text], [type=url],
[type=email], [type=tel], [type=password], [type=search],
[type=datetime-local], [type=time]) {
font-family: var(--body);
font-size: var(--txt-medium);
color: var(--contrast);
padding: var(--p-y) var(--p-x);
border-radius: var(--radius);
background-color: var(--base);
outline: 0;
border: 1px solid var(--base-100);
border-bottom: 2px solid var(--contrast-200);
width: 100%;
max-width: 100%;
margin: 0 4px;
}
textarea:focus,
input:is([type=date], [type=number], [type=text], [type=url],
[type=email], [type=tel], [type=password], [type=search],
[type=datetime-local], [type=time]):focus {
outline: var(--action-50);
background-color: var(--base-100);
color: var(--contrast);
}
textarea::placeholder,
input::placeholder {
font-family: var(--body);
color: var(--base-200);
}
.field > label {
position: relative;
z-index: var(--z-1);
display:inline-block;
top: .75em;
left: 1em;
padding: 0 .5em;
background-color:var(--base);
font-size:var(--txt-small);
font-weight: var(--fw-b-light);
text-transform:uppercase;
border: 1px solid transparent;
}
.field.selector > label {
top: 2.25em;
}
.field.selector .filter-toggle {
width: var(--chipchip);
min-height: var(--chipchip);
padding: 0;
}
.field:not(.radio):not(.checkbox):not(.true-false):not(.taglist):focus-within > label {
background-color:var(--action-0);
color: var(--action-contrast);
border-radius: 4px;
}
.field.taglist, .field.taglist .field {
border: none;
}
.field li.btn {
min-height: var(--chip);
}
/******************************************************************
SELECT
******************************************************************/
select {
background: var(--base);
border: 2px solid var(--base-100);
border-radius: var(--radius);
color: var(--contrast);
cursor: pointer;
font-family: var(--body);
font-size: var(--txt-small);
padding: var(--sp1);
width: 100%;
}
select:disabled {
background-color: var(--base-50);
border-color: var(--base-100);
color: var(--base-200);
cursor: not-allowed;
}
select option {
background: var(--base);
color: var(--contrast);
padding: var(--sp1);
}
select option:hover,
select option:focus,
select option:active,
select option:checked {
background: var(--action-0);
color: var(--base);
box-shadow: 0 0 0 100px var(--action-0) inset;
}
select option:checked {
background: var(--action-0) linear-gradient(0deg, var(--action-0) 0%, var(--action-0) 100%);
color: var(--base);
}
select:hover {
border-color: var(--action-0);
}
select:focus {
border-color: var(--action-0);
}
/******************************************************************
SEARCH & SPECIAL INPUTS
******************************************************************/
input[type=search]:focus + .clear-search {
opacity: 1;
cursor: pointer;
}
.search-container .clear-search {
opacity: 0;
cursor: default;
}
.search-container .icon.search {
padding: 4px 8px;
color: var(--contrast-200);
--w: 3rem;
}
input[type="search"]::-moz-search-clear-button,
input[type="search"]::-ms-clear,
input[type="search"]::-ms-reveal,
input[type="search"]::search-cancel-button {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
display: none;
visibility: hidden;
}
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-results-button,
input[type="search"]::-webkit-search-results-decoration {
-webkit-appearance:none;
}
input[type=url] {
background: var(--icon);
background-position: .5em;
background-size: 1em;
background-repeat: no-repeat;
padding-left: 2em;
}
/**************************************************
TABS
**************************************************/
.tab-content[hidden] {
display: block!important;
transform: scaleY(0);
max-height: 0;
overflow: hidden;
}
.tab-content[hidden]:focus-within {
transform: scaleY(1);
max-height: max-content;
}
/**************************************************
CARD
**************************************************/
.item-grid.stats {
margin: 1rem 0;
}
.card {
background-color: var(--base-100);
border-radius: var(--radius);
box-shadow: rgba(var(--base-rgb), var(--op-45)) var(--shdw);
aspect-ratio: 3/2;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
}
.card h4 {
margin: 0;
text-transform: uppercase;
}
.stat-number {
font-family: var(--heading);
font-weight: var(--fw-h-bold);
color: var(--action-0);
font-size: var(--txt-xx-large);
}
/**************************************************
PROGRESS
**************************************************/
.progress {
width: 100%;
}
.progress .bar {
height: 6px;
display: block;
border-radius: 6px;
overflow: hidden;
background: var(--base-200);
position: relative;
}
.progress .fill {
height: 100%;
background: var(--action-0);
border-radius: 6px;
width: 0;
transition: width .3s ease;
}
.completed .fill {
background: var(--action-200);
}
.progress .details {
margin-top: 5px;
font-size: var(--txt-x-small);
color: var(--contrast);
text-align: center;
padding: .25rem 0;
}
.progress .details:empty {
display: none;
}
.queued .fill::after,
.pending .fill::after,
.processing .fill::after,
.uploading .fill::after {
--delay: 0s;
content: '';
position: absolute;
top: 0;
left: -50%;
width: 30%;
height: 100%;
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, .225) 50%,
rgba(255, 255, 255, 0) 100%
);
animation: shimmer 2.5s infinite linear var(--delay);
}
/**************************************************************
DETAILS
**************************************************************/
details {
padding: .25rem 0;
border-top: 1px solid var(--base-200);
border-bottom: 1px solid var(--base-200);
}
details[open] {
background-color: var(--base-50);
}
details summary {
list-style: none;
text-transform: uppercase;
cursor: pointer;
border: 0;
position: relative;
padding: .5rem 2.5rem .5rem .5rem;
gap: .5rem;
}
details summary:hover {
background-color: var(--base-100);
border-color: var(--base-100);
color: var(--contrast);
}
details[open] > summary {
background-color: var(--base-50);
}
details summary::after {
content: '';
position: absolute;
right: .5rem;
top: .5rem;
background-color: var(--contrast-100);
-webkit-mask-repeat: no-repeat;
-webkit-mask-size: contain;
-webkit-mask-image: var(--icon);
mask-image: var(--icon);
mask-repeat: no-repeat;
mask-size: contain;
width: 1.25rem;
height: 1.25rem;
margin-left: auto;
transition: var(--trans-color), var(--trans-transform);
}
details summary:hover::after {
background-color: var(--action-0);
}
details[open]:not(.all-filters) > summary::after {
background-color: var(--contrast);
transform: rotate(-540deg);
transition: background-color var(--trans-base);
transition-property: background-color, transform;
}
details::details-content {
opacity: 0;
block-size: 0;
overflow-y: clip;
transition: content-visibility var(--trans-t) allow-discrete, opacity var(--trans-t), block-size var(--trans-t);
}
details[open]::details-content {
opacity: 1;
block-size: auto;
}
@media (prefers-reduced-motion: no-preference){
details {
interpolate-size: allow-keywords;
}
}
/********************************************************
CODE
********************************************************/
code {
width: 100%;
margin: .5rem;
padding: .5rem;
user-select: all;
text-align: center;
border-radius: 4px;
background-color: var(--base-200);
}
/********************************************************
OVERLAYS
********************************************************/
dialog[open],
aside.expanded {
background-color: var(--base);
box-shadow: rgba(var(--base-rgb),var(--op-45)) var(--shdw);
z-index: var(--z-5);
}
dialog::backdrop {
backdrop-filter: blur(5px);
background-color: rgba(var(--base-rgb),var(--op-4));
}
dialog[open],
aside.main {
border-radius: var(--radius-outer);
overflow: hidden;
}
/** DIALOG **/
dialog[open] {
z-index: var(--z-10);
--padding: 0;
top: 5vh;
width: min(500px, 95vw);
height: fit-content;
max-height: 90vh;
padding: var(--padding);
background-color: var(--base-50);
color: var(--contrast);
border: 1px solid var(--base-200);
}
dialog:is(.create,.edit,.bulkEdit)[open] {
width: 98vw;
max-height: 98vh;
top: 1vh;
}
dialog > .wrap {
max-height: var(--maxHeight);
overflow: hidden auto;
margin: 0 0 0 1.5rem;
padding-right: 1.5rem;
padding-bottom: var(--btn);
width: calc(100% - 1.5rem);
}
dialog label {
font-weight: normal;
}
dialog h2,
dialog h3 {
margin: 0 0 .5rem 0;
font-size: var(--txt-large);
}
dialog:has(.m-actions) {
padding-bottom: var(--btn);
}
.m-actions {
--w: 1.15em;
--justify: flex-end;
--wrap: nowrap;
--gap: 0;
position: absolute;
bottom: 0;
right: 0;
left: 0;
height: var(--btn);
width: 100%;
z-index: var(--z-6);
background-color: var(--action-100);
box-shadow: rgba(var(--base-rgb),var(--op-45)) var(--shdw-up);
}
.m-actions button {
--wrap: nowrap;
box-shadow: none;
width: 100%;
background-color: var(--action-0);
color: var(--action-contrast);
--gap: .75rem;
font-size: var(--txt-x-small);
border-radius: 0;
height: var(--chipchip);
}
.m-actions button:hover,
.m-actions button:focus {
background-color: var(--base);
color: var(--contrast);
}
.m-actions button:first-of-type {
border-bottom-left-radius: 1rem;
}
.m-actions button:last-of-type {
border-bottom-right-radius: 1rem;
}
dialog ul {
list-style: none;
}
dialog .search-container {
padding-top: 1rem;
width: 100%;
gap: .5rem;
}
/** GALLERY **/
img[data-gallery] {
cursor: pointer;
}
dialog.gallery[open] {
--max: calc(100% - 2rem);
inset: 1rem;
margin: 0;
border: none;
width: 100%;
height: 100%;
max-height: var(--max);
max-width: var(--max);
border-radius: 0;
background-color: rgba(var(--base-rgb), var(--op-6));
}
.gallery > .wrap {
--wrap: nowrap;
}
.gallery .controls {
position: absolute;
bottom: 0;
left: var(--btn_);
right: 0;
width: 100%;
--wrap: nowrap;
--gap: 0;
}
.gallery button.nav {
width: 100%;
}
dialog.gallery .cancel:focus,
dialog.gallery .cancel:hover {
background: rgba(var(--base-rgb),var(--op-4));
}
dialog.gallery .content {
position: relative;
flex: 1 1 auto;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
dialog.gallery .content .image {
max-width: 90vw;
max-height: 85vh;
object-fit: contain;
transition: transform 0.15s ease-out;
touch-action: none;
}
dialog.gallery .image-left,
dialog.gallery .image-right {
position: absolute;
opacity: 0;
pointer-events: none;
}
dialog.gallery details {
position: absolute;
width: 100%;
max-width: none;
bottom: 0;
left: 0;
right: 0;
background: rgba(var(--base-rgb),var(--op-45));
color: var(--contrast);
border-radius: 4px;
overflow: hidden;
z-index: 10;
}
dialog.gallery details:has(.item-info:empty) {
display: none;
}
dialog.gallery details summary {
padding: 0.75rem 1rem;
cursor: pointer;
user-select: none;
}
dialog.gallery details[open] .item-info {
padding: 1rem;
}
dialog.gallery .counter {
position: absolute;
bottom: 1rem;
left: 1rem;
background: rgba(var(--base-rgb),var(--op-4));
color: var(--contrast);
padding: 0.4rem 0.8rem;
border-radius: 3px;
font-size: 0.85rem;
z-index: 10;
}
dialog.gallery .favourite {
position: absolute;
top: 1rem;
left: 1rem;
z-index: 10;
}
dialog.gallery .image {
opacity: 0;
transition: opacity .2s ease, transform .15s ease-out;
}
dialog.gallery .image[src] {
opacity: 1;
}
/*** POPUPS: notifications, cart, queue ***/
aside.main.main {
--wrap: nowrap;
--align: stretch;
--dir: column;
position: fixed;
top: var(--btnbtn);
bottom: var(--btn_);
width: min(500px, calc(100vw - 2rem));
padding: 0 0 var(--btn);
}
aside.main.left {
border-radius: 0 var(--radius-outer) var(--radius-outer) 0;
left: var(--offScreen);
transition: left var(--trans-base);
}
aside.main.left.expanded {
left: 0;
}
aside.main.right {
border-radius: var(--radius-outer) 0 0 var(--radius-outer);
right: var(--offScreen);
transition: right var(--trans-base);
}
aside.main.right.expanded {
right: 0;
}
aside.main nav.tabs {
--gap: 0;
flex-shrink: 0;
}
aside.main > .wrap {
max-height: 100%;
overflow: hidden auto;
}
aside.main header {
--w: 2em;
background-color: var(--action-0);
color: var(--action-contrast);
padding: 1rem;
}
.tab-content header {
width: calc(100% + 2rem);
left: -1rem;
top: -1rem;
position: relative;
}
.main header .icon {
margin-right: 1em;
}
.main h3 {
font-size: var(--txt-large);
margin: .5rem 0;
}
aside.main nav.share {
--dir: row;
--align: center;
margin: 0;
border-bottom: 1px solid var(--base-200);
}
nav.share ul,
nav.share li,
nav.share a {
height: var(--chipchip);
}
nav.share a:hover {
background-color: var(--action-0);
color: var(--action-contrast);
}
aside.main h4,
aside.main .hint {
text-align: center;
}
aside.main .tab-content {
flex-shrink: 0;
}
aside.main .tab-content.active {
flex: 1;
overflow: hidden auto;
padding: 1rem;
}
.main section {
padding: 1rem;
}
.main section + section {
border-top: 1px solid var(--base-200);
}
.qtoggle .count,
.indicator {
position: absolute;
top: -.5em;
right: -.5em;
width: .75em;
height: .75em;
border-radius: 50%;
}
.qtoggle .indicator {
top: 0;
right: 0;
}
.qtoggle .count {
right:unset;
left: .25rem;
top: .25rem;
font-size: var(--txt-small);
}
#queue.synced + .qtoggle .indicator {
background-color: var(--success);
}
#queue.pending + .qtoggle .indicator {
background-color: var(--warning);
animation: pulse 2s infinite;
}
.refresh.fetching .icon,
#queue.pending:not(.expanded) + .qtoggle .icon {
background-color: var(--action-0);
animation: spin 1s var(--trans-fn) infinite;
}
.main.expanded + .qtoggle {
width: calc(min(500px, calc(100vw - 2rem)) - var(--btn));
}
.main-actions .buttons:has(.expanded) {
width: calc(min(500px, calc(100vw - 2rem)));
}
.main.expanded + .qtoggle {
left: var(--btn);
border-bottom-right-radius: var(--radius-outer);
}
.main-actions .buttons:has(.expanded) {
right: 0;
}
.main-actions button.expanded {
border-bottom-left-radius: var(--radius-outer);
width: 100%;
}
.buttons:has(.expanded) > button:not(.expanded) {
display: none;
}
.main nav.filters {
width: 100%;
height: var(--chipchip);
--justify: flex-start;
--align: flex-end;
}
.main nav.filters li {
overflow: visible;
}
.main .btn + label {
min-height: var(--chip);
min-width: var(--chip);
overflow: visible;
}
.btn + label .indicator:not(:empty) {
font-size: var(--txt-small);
background-color: var(--base);
border: 1px solid var(--contrast);
width: 1.75em;
height: 1.75em;
padding: .3em;
}
.main > .header {
border-bottom: 1px solid var(--base-200);
padding: 1rem 0;
flex-shrink: 0;
}
.main .item-grid {
flex: 1;
overflow: hidden auto;
overflow-anchor: none;
padding: .5rem 2rem;
--gap: .5rem;
}
.queue-actions {
flex-shrink: 0;
border-top: 1px solid var(--base-200);
}
.queue-actions button {
width: 100%;
}
.main .item {
background-color: var(--base-50);
padding: 15px;
border-radius: var(--radius);
box-shadow: var(--shdw-none);
font-size: var(--txt-x-small);
}
.main .item .header {
position: relative;
padding: .25rem 0;
}
.main .item .actions {
width: 100%;
}
.main .item button {
min-height: var(--chip);
font-size: var(--txt-x-small);
--w: var(--txt-x-small);
}
.main .item .time {
padding: .5rem 0;
font-size: var(--txt-small);
border: 1px solid var(--base-200);
border-width: 1px 0;
margin: .25rem 0;
}
.main .item .progress .details {
text-align: right;
font-size: var(--txt-small);
width: 100%;
}
/*** MAIN ACTIONS ***/
.main-actions .buttons {
transition: width var(--trans-base), right var(--trans-base);
right: .5rem;
width: var(--btn);
margin: 0;
}
.attn {
animation: pulse-color 5s infinite;
animation-delay: 1s;
}
.attn.expanded {
animation: none;
}
/********************************************************
CALLOUTS
********************************************************/
.callalt.callalt,
.callout.callout {
padding: 2rem;
margin: 0;
max-width: none;
grid-column: full;
}
@media (min-width: 768px){
.callout.callout {
padding: 2rem 20vw;
}
}
.callout.callout {
background-color: var(--action-0);
color: var(--action-contrast);
}
.callalt.callalt {
background-color: var(--secondary-0);
color: var(--secondary-contrast);
}
.callalt :is(h1, h2, h3, h4, h5, h6),
.callout :is(h1, h2, h3, h4, h5, h6) {
font-family: var(--body);
font-weight: var(--fw-b-bold);
margin: 1rem 0 0;
width: 100%;
}
.callout a {
background-color: var(--action-contrast);
padding: 0 .125rem;
border-radius: 4px;
}
/********************************************************
WP BLOCKS
********************************************************/
/** COVER **/
.cover {
position: relative;
overflow: hidden;
min-height: 60vh;
padding: var(--btn);
}
.cover::before {
content: '';
z-index: var(--coverIndex);
background-color: var(--action-0);
mix-blend-mode: var(--coverBlend);
background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
.cover::before,
.cover > video,
.cover > img {
position: absolute;
inset: 0;
width: 100%;
max-width: 100%;
height: 100%;
margin: 0;
}
.cover .content {
z-index: 5;
position: relative;
overflow: hidden auto;
width: max-content;
height: max-content;
max-width:100%;
max-height: 100%;
}
.cover > img {
z-index: 1;
opacity: .5;
mix-blend-mode: luminosity;
object-fit: cover;
}
@media (min-width: 768px) {
.cover > img {
opacity: .33;
}
}
/** BLOCKQUOTE **/
blockquote {
--background: var(--base-100);
--border: var(--action-0);
line-height: 1.2;
padding: var(--btn);
border-radius: 4rem;
background-color: var(--background);
}
blockquote .content {
margin: 12px auto;
max-width: min(680px, 80vw);
position: relative;
font-family: var(--heading);
font-weight: var(--fw-h-bold);
padding: 3rem 2.5rem;
border-radius: var(--radius-outer);
border: 2px solid var(--border);
}
blockquote .content::before,
blockquote .content::after {
position: absolute;
content: '';
left: 50px;
}
blockquote .content::before {
width: 80px;
border: 6px solid var(--background);
bottom: -3px;
z-index: 2;
}
blockquote .content::after {
border: 2px solid var(--border);
border-radius: 0 100% 0 0;
width: 60px;
height: 60px;
bottom: -60px;
border-bottom: 0;
border-left: 0;
z-index: 3;
}
blockquote cite {
padding: 15px 0 0 12px;
margin: 0 0 0 150px;
z-index: 1;
}
blockquote.pull {
background-color: unset;
border-radius: 0;
margin: 4rem auto;
padding: 3rem;
box-shadow: rgba(var(--base-rgb),var(--op-45)) var(--shdw-down), rgba(var(--base-rgb),var(--op-45)) var(--shdw-up);;
}
blockquote.pull cite {
margin: 0;
}
/** QUERY **/
.loop .item-grid {
grid-template-columns: repeat(1, 1fr);
}
@media (min-width: 768px) {
.loop .item-grid {
grid-template-columns: repeat(2, 1fr);
}
}
/** TODO: LIST OVERRIDES **/
/*********************************************************
DIRECTORY
*********************************************************/
.directory-list > ul {
max-width: none;
}
.directory-list .image {
display: flex;
flex-wrap: nowrap;
align-items: center;
}
.directory-list img {
width: 70px;
}
.directory-list h3 {
margin: 0;
text-align: center;
font-weight: var(--fw-h-bold);
position: sticky;
font-size: var(--txt-enormous);
width: 100%;
top: var(--btn);
left: 0;
color: var(--base);
text-shadow: var(--base-200) 1px 1px 0;
user-select: none;
}
.directory-list >ul > li {
padding: 2rem;
align-items: flex-start;
}
.directory-list >ul > li:nth-of-type(even) {
background-color: var(--base-100);
}
/** The letter's list **/
.directory-list ul ul {
width: 100%;
}
.directory-list ul ul li {
padding: .35rem .5rem;
}
.directory-list ul ul li:nth-of-type(even) {
background-color: var(--base-100);
}
.directory-list ul li:nth-of-type(even) ul li:nth-of-type(even) {
background-color: var(--base-50);
}
@media (min-width: 768px) {
.directory-list h3 {
width: 20vw;
}
.directory-list ul ul {
min-height: var(--txt-enormous);
}
.directory-list >ul > li {
padding: 2rem 10vw;
}
}
/******************************************************************
LOADING
******************************************************************/
dialog.loading {
opacity: 0;
}
dialog.loading[open] {
opacity: 1;
width: 100vw;
height: 100vh;
display: flex;
max-width: 100%;
max-height: 100%;
border-radius: 0;
border: none;
background-color: transparent;
box-shadow: none;
--w: 3em;
justify-content: center;
align-items: center;
inset: 0;
}
dialog.loading[open]@starting-style {
opacity: 0;
}
dialog.loading[open] > .col {
height: fit-content;
width: min(400px, 60vw);
border-radius: var(--radius-outer);
background-color: rgba(var(--base-rgb),var(--op-4));
padding: 2rem;
box-shadow: rgba(var(--base-rgb),var(--op-45)) var(--shdw);
position: relative;
}
dialog.loading[open] .spinner {
position: absolute;
top: 1rem;
width: 5rem;
height: 5rem;
border-width: 0;
border-top-width: 4px;
animation: spin 1s var(--trans-fn) infinite;
}
.loading[open] i.icon {
background-color: var(--action-0);
}
dialog.loading[open] i.icon {
animation: dance 2s ease-in-out infinite;
}
dialog.loading[open] h3 {
color: var(--contrast);
margin: 2rem 1rem auto !important;
font-size: var(--txt-large);
width: -moz-fit-content;
width: fit-content;
}
dialog.loading[open] p {
margin: .5rem auto;
}
dialog.loading[open]::after {
animation: shimmer 3s ease-in-out infinite;
background: linear-gradient(90deg, var(--shimmer));
content: "";
inset: 0;
position: absolute;
z-index: -1;
}
.spinner {
width: 12px;
height: 12px;
border: 2px solid transparent;
border-top: 2px solid var(--action-50);
border-radius: 50%;
animation: spin 1s var(--trans-fn) infinite;
}
/** ANIMATIONS **/
@keyframes shimmer {
0% {
left: -50%;
}
50% {
left: 150%;
}
100% {
left: -50%;
}
}
@keyframes pulse-color {
0% {
box-shadow: 0 0 0 0 rgba(var(--action-rgb), .4);
}
30% {
box-shadow: 0 0 0 .75rem rgba(var(--action-rgb), 0);
}
100% {
box-shadow: 0 0 0 0 rgba(var(--action-rgb), 0);
}
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeOut {
from {
opacity: 1;
transform: translateY(0);
}
to {
opacity: 0;
transform: translateY(20px);
}
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
@keyframes dance {
0%, 100% {
transform: rotate(-5deg) scale(1);
}
50% {
transform: rotate(5deg) scale(1.1);
}
}