@gdwc/components
Version:
A library of generic web components that are accessible, framework agnostic, possible to style, and easy to use with data provided by Drupal
335 lines (332 loc) • 8.46 kB
JavaScript
import { css } from 'lit';
/**
* Duplicating these styles feels gross, but all other approaches to import from the
* package either don't pierce the shadow DOM, are ignored by css template literals,
* or result in a flash of partially styled content.
*/
export default css`
:host {
--link: var(--indigo-7);
--link-visited: var(--grape-7);
--text-1: var(--gray-9);
--text-2: var(--gray-7);
--surface-1: var(--gray-0);
--surface-2: var(--gray-2);
--surface-3: var(--gray-3);
--surface-4: var(--gray-4);
--scrollbar-color: var(--gray-7);
accent-color: var(--link);
-webkit-text-size-adjust: none;
background-color: var(--surface-1);
block-size: 100%;
caret-color: var(--link);
color: var(--text-2);
color-scheme: light;
font-family: var(--font-sans);
line-height: var(--font-lineheight-3);
scrollbar-color: var(--scrollbar-color) transparent;
}
@media (dynamic-range: high) {
@supports (color(display-p3 0 0.5 1)) {
:host {
--link: color(display-p3 0 0.5 1);
--link-visited: color(display-p3 0.6 0.2 1);
}
}
}
@media (prefers-color-scheme: dark) {
:host {
--link: var(--indigo-3);
--link-visited: var(--grape-3);
--text-1: var(--gray-1);
--text-2: var(--gray-4);
--surface-1: var(--gray-9);
--surface-2: var(--gray-8);
--surface-3: var(--gray-7);
--surface-4: var(--gray-6);
color-scheme: dark;
}
}
:where(h1, h2, h3, h4, h5, h6, dt) {
color: var(--text-1);
}
:where(a[href]) {
color: var(--link);
}
:where(a[href]):visited {
color: var(--link-visited);
}
:focus-visible {
outline-color: var(--link);
}
@media (prefers-color-scheme: light) {
:host {
--scrollbar-color: var(--gray-4);
}
}
*,
:after,
:before {
box-sizing: border-box;
}
:where(:not(dialog)) {
margin: 0;
}
:where(:not(fieldset, progress, meter)) {
background-origin: border-box;
background-repeat: no-repeat;
border-style: solid;
border-width: 0;
}
@media (prefers-reduced-motion: no-preference) {
:host {
scroll-behavior: smooth;
}
}
@media (prefers-reduced-motion: no-preference) {
:focus-visible {
transition: outline-offset 145ms var(--ease-2);
}
:where(:not(:active)):focus-visible {
transition-duration: 0.25s;
}
}
:where(:not(:active)):focus-visible {
outline-offset: 5px;
}
:where(body) {
scrollbar-gutter: stable both-edges;
min-block-size: 100%;
}
:where(h1, h2, h3, h4, h5, h6) {
font-weight: var(--font-weight-9);
line-height: var(--font-lineheight-1);
}
:where(h1) {
font-size: var(--font-size-8);
max-inline-size: var(--size-header-1);
}
:where(h2) {
font-size: var(--font-size-6);
max-inline-size: var(--size-header-2);
}
:where(h3) {
font-size: var(--font-size-5);
}
:where(h4) {
font-size: var(--font-size-4);
}
:where(h5) {
font-size: var(--font-size-3);
}
:where(h3, h4, h5, h6, dt) {
max-inline-size: var(--size-header-3);
}
:where(p, ul, ol, dl, h6) {
font-size: var(--font-size-2);
}
:where(a, u, ins, abbr) {
text-underline-offset: 1px;
}
:where(a[href], area, button, input, label[for], select, summary, textarea, [tabindex]:not([tabindex*='-'])) {
cursor: pointer;
touch-action: manipulation;
}
:where(a) {
margin-block: calc(var(--size-1) * -1);
margin-inline: calc(var(--size-1) * -1);
padding-block: var(--size-1);
padding-inline: var(--size-1);
}
:where(a):where([href]) {
text-decoration-color: var(--indigo-2);
}
:where(a):where([href]):where(:visited) {
text-decoration-color: var(--grape-2);
}
:where(a):where(:not(:hover)) {
text-decoration: inherit;
}
:where(img, svg, video, canvas, audio, iframe, embed, object) {
display: block;
}
:where(img, svg, video) {
block-size: auto;
max-inline-size: 100%;
}
:where(input, button, textarea, select),
:where(input[type='file'])::-webkit-file-upload-button {
color: inherit;
font: inherit;
font-size: inherit;
letter-spacing: inherit;
}
:where(input, textarea) {
padding-block: var(--size-1);
padding-inline: var(--size-2);
}
:where(select) {
padding-block: 0.75ch;
padding-inline: 1.25ch 0;
}
:where(textarea, select, input:not(button, button[type], input[type='button'], input[type='submit'], input[type='reset'])) {
background-color: var(--surface-2);
border-radius: var(--radius-2);
}
@media (prefers-color-scheme: dark) {
:where(textarea, select, input:not(button, button[type], input[type='button'], input[type='submit'], input[type='reset'])) {
background-color: #171a1c;
}
}
:where(textarea) {
resize: block;
}
:where(input[type='checkbox'], input[type='radio']) {
block-size: var(--size-3);
inline-size: var(--size-3);
}
:where(svg) {
stroke: none;
fill: currentColor;
}
:where(svg):where(:not([fill])) {
stroke: currentColor;
fill: none;
stroke-linecap: round;
stroke-linejoin: round;
}
:where(svg):where(:not([width])) {
inline-size: var(--size-10);
}
:where(code, kbd, samp, pre) {
font-family: var(--font-mono);
}
:where(:not(pre) > code, kbd) {
white-space: nowrap;
}
:where(pre) {
max-inline-size: max-content;
min-inline-size: 0;
white-space: pre;
}
:where(:not(pre) > code) {
background: var(--surface-2);
border-radius: var(--radius-2);
padding: var(--size-1) var(--size-2);
}
:where(kbd, var) {
border-color: var(--surface-4);
border-radius: var(--radius-2);
border-width: var(--border-size-1);
padding: var(--size-1) var(--size-2);
}
:where(mark) {
border-radius: var(--radius-2);
padding-inline: var(--size-1);
}
:where(ol, ul) {
padding-inline-start: var(--size-8);
}
:where(li) {
padding-inline-start: var(--size-2);
}
:where(li, dd, figcaption) {
max-inline-size: var(--size-content-2);
}
:where(p) {
max-inline-size: var(--size-content-3);
}
:where(dt, summary) {
font-weight: var(--font-weight-7);
}
:where(dt:not(:first-of-type)) {
margin-block-start: var(--size-5);
}
:where(small) {
font-size: max(0.5em, var(--font-size-0));
max-inline-size: var(--size-content-1);
}
:where(hr) {
background-color: var(--surface-3);
height: var(--border-size-2);
margin-block: var(--size-fluid-5);
}
:where(figure) {
display: grid;
gap: var(--size-2);
place-items: center;
}
:where(figure) > :where(figcaption) {
font-size: var(--font-size-1);
}
:where(blockquote, :not > cite) {
border-inline-start-width: var(--border-size-3);
}
:where(blockquote) {
display: grid;
gap: var(--size-3);
max-inline-size: var(--size-content-2);
padding-block: var(--size-3);
padding-inline: var(--size-4);
}
:where(:not(blockquote) > cite) {
padding-inline-start: var(--size-2);
}
:where(summary) {
background: var(--surface-3);
border-radius: var(--radius-2);
margin: calc(var(--size-2) * -1) calc(var(--size-3) * -1);
padding: var(--size-2) var(--size-3);
}
:where(details) {
background: var(--surface-2);
border-radius: var(--radius-2);
padding-block: var(--size-2);
padding-inline: var(--size-3);
}
:where(details[open] > summary) {
border-end-end-radius: 0;
border-end-start-radius: 0;
margin-bottom: var(--size-2);
}
:where(fieldset) {
border: var(--border-size-1) solid var(--surface-4);
border-radius: var(--radius-2);
}
:where(del) {
background: var(--red-9);
color: var(--red-2);
}
:where(ins) {
background: var(--green-9);
color: var(--green-1);
}
:where(abbr) {
text-decoration-color: var(--blue-5);
}
:where(dialog) {
background-color: var(--surface-1);
border-radius: var(--radius-3);
box-shadow: var(--shadow-6);
color: inherit;
}
@media (prefers-color-scheme: dark) {
:where(dialog) {
background-color: var(--surface-2);
}
}
:where(dialog)::backdrop {
backdrop-filter: blur(25px);
}
:host[
\:has
\(dialog
\[open
\]\)] {
overflow: hidden;
}
:host:has(dialog[open]) {
overflow: hidden;
}
:where(menu) {
display: flex;
gap: var(--size-3);
padding-inline-start: 0;
}
`;