183 lines
5.5 KiB
TypeScript
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;
|