browsertrix/frontend/src/theme.ts

183 lines
5.5 KiB
TypeScript

/**
* Shoelace CSS theming variables and component overrides
* https://github.com/shoelace-style/shoelace/blob/next/src/themes/light.css
*
* To make new variables available to Tailwind, update
* `theme` in tailwind.cofnig.js
*/
import { css, unsafeCSS } from "lit";
import Color from "color";
// TODO generate at build time
const PRIMARY_COLOR = "#4876ff";
const primaryColor = Color(PRIMARY_COLOR);
const theme = css`
:root {
/* Custom contextual variables */
--primary: ${unsafeCSS(PRIMARY_COLOR)};
--success: var(--sl-color-success-600);
--warning: var(--sl-color-warning-600);
--danger: var(--sl-color-danger-600);
/* Custom font variables */
--font-monostyle-family: var(--sl-font-mono);
--font-monostyle-variation: "MONO" 0.51, "CASL" 0, "slnt" 0, "CRSV" 0;
/*
* Shoelace Theme Tokens
*/
/* Primary */
--sl-color-primary-50: ${unsafeCSS(primaryColor.lighten(0.54))};
--sl-color-primary-100: ${unsafeCSS(primaryColor.lighten(0.5))};
--sl-color-primary-200: ${unsafeCSS(primaryColor.lighten(0.4))};
--sl-color-primary-300: ${unsafeCSS(primaryColor.lighten(0.3))};
--sl-color-primary-400: ${unsafeCSS(primaryColor.lighten(0.2))};
--sl-color-primary-500: ${unsafeCSS(primaryColor.lighten(0.1))};
--sl-color-primary-600: var(--primary);
--sl-color-primary-700: ${unsafeCSS(primaryColor.darken(0.1))};
--sl-color-primary-800: ${unsafeCSS(primaryColor.darken(0.2))};
--sl-color-primary-900: ${unsafeCSS(primaryColor.darken(0.3))};
--sl-color-primary-950: ${unsafeCSS(primaryColor.darken(0.4))};
/*
* Typography
*/
/* Fonts */
--sl-font-mono: "Recursive var", SFMono-Regular, Consolas, "Liberation Mono",
Menlo, monospace;
--sl-font-sans: "Inter var", -apple-system, BlinkMacSystemFont, "Segoe UI",
Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji",
"Segoe UI Emoji", "Segoe UI Symbol";
/* Font sizes */
--sl-font-size-medium: 0.875rem; /* 14px */
--sl-font-size-2x-large: 2rem; /* 32px */
/* Font weights */
--sl-font-weight-medium: 500; // doesn't exist in shoelace
--sl-font-weight-semibold: 600;
/*
* Forms
*/
/* Buttons */
--sl-button-font-size-small: var(--sl-font-size-small);
--sl-button-font-size-medium: var(--sl-font-size-small);
--sl-button-font-size-large: var(--sl-font-size-medium);
/* Inputs */
--sl-input-height-small: 2rem; /* 32px */
--sl-input-font-size-small: var(--sl-font-size-small);
--sl-input-font-size-medium: var(--sl-font-size-small);
--sl-input-font-size-large: var(--sl-font-size-medium);
/* From GitHub Primer https://github.com/primer/primitives/blob/8b767947e35a79db17b9d7970836f03c904c8afe/data/colors/vars/global_light.ts#L47 */
/* TODO replace hardcoded color */
--sl-input-required-content-color: #9a6700;
/* Labels */
--sl-input-label-font-size-small: var(--sl-font-size-x-small);
--sl-input-label-font-size-medium: var(--sl-font-size-small);
--sl-input-label-font-size-large: var(--sl-font-size-medium);
--sl-input-label-color: var(--sl-color-neutral-800);
/* Help text */
--sl-input-help-text-font-size-medium: var(--sl-font-size-x-small);
}
body {
font-size: var(--sl-font-size-medium);
}
.sl-toast-stack {
bottom: 0;
top: auto;
}
/* Add more spacing between label, input and help text */
sl-input::part(form-control-label),
sl-textarea::part(form-control-label),
sl-select::part(form-control-label) {
line-height: 1.4;
margin-bottom: 0.375rem;
}
sl-input::part(form-control-help-text),
sl-textarea::part(form-control-help-text),
sl-select::part(form-control-help-text) {
margin-top: var(--sl-spacing-x-small);
font-weight: 400;
}
/* Elevate select and buttons */
sl-select::part(control),
sl-button:not([variant="text"])::part(base) {
box-shadow: var(--sl-shadow-small);
}
/* Prevent horizontal scrollbar */
sl-select::part(menu) {
overflow-x: hidden;
}
/* Decrease control spacing on small select */
sl-select[size="small"]::part(control) {
--sl-input-spacing-small: var(--sl-spacing-x-small);
line-height: 1.5;
}
/* Align left edge with menu item */
sl-select sl-menu-label::part(base) {
padding-left: calc(var(--sl-spacing-2x-small) + 1.5em);
}
/* Validation styles */
[data-user-invalid]:not([disabled])::part(base) {
border-color: var(--sl-color-danger-400);
}
[data-user-invalid]:focus-within::part(base) {
box-shadow: 0 0 0 var(--sl-focus-ring-width) var(--sl-color-danger-100);
}
[data-user-invalid]:not([disabled])::part(form-control-label):after {
/* Required asterisk color */
color: var(--sl-color-danger-500);
}
[data-user-invalid]:not([disabled])::part(form-control-help-text) {
color: var(--sl-color-danger-500);
}
/* TODO tailwind sets border-width: 0, see if this can be fixed in tw */
sl-divider {
border-top-width: var(--sl-panel-border-width);
}
/* Add more spacing between radio options */
sl-radio-group sl-radio:first-of-type {
margin-top: var(--sl-spacing-x-small);
}
sl-radio-group sl-radio:not(:first-of-type) {
margin-top: var(--sl-spacing-small);
}
/* Have button group take up whole width */
sl-radio-group::part(button-group),
sl-radio-group sl-radio-button {
width: 100%;
min-width: min-content;
}
/* Aesthetically closer to monospaced font: */
.font-monostyle {
font-family: var(--font-monostyle-family);
font-variation-settings: var(--font-monostyle-variation);
}
`;
export default theme;