- Adds top-level "Archived Data" view, replacing "Finished Crawls" and moving it as "Crawls" into view - Adds list for viewing all artifacts/data - Adds list for viewing all uploaded crawls - Updates crawl detail view to show upload details - Edit upload metadata, including 'name' - Delete uploads --------- Co-authored-by: Ilya Kreymer <ikreymer@gmail.com> Co-authored-by: Henry Wilkinson <henry@wilkinson.graphics>
256 lines
7.2 KiB
TypeScript
256 lines
7.2 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;
|
|
--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);
|
|
|
|
--sl-shadow-x-small: 0px 1px 2px rgba(0, 0, 0, 0.15);
|
|
}
|
|
|
|
body {
|
|
font-size: var(--sl-font-size-medium);
|
|
}
|
|
|
|
.sl-toast-stack {
|
|
bottom: 0;
|
|
top: auto;
|
|
}
|
|
|
|
/* Add more spacing between label, input and help text */
|
|
.form-label,
|
|
btrix-tag-input::part(form-control-label),
|
|
sl-input::part(form-control-label),
|
|
sl-textarea::part(form-control-label),
|
|
sl-select::part(form-control-label) {
|
|
--sl-spacing-3x-small: 0.375rem;
|
|
line-height: 1.4;
|
|
}
|
|
.form-label {
|
|
display: inline-block;
|
|
margin-bottom: var(--sl-spacing-3x-small);
|
|
}
|
|
.form-help-text,
|
|
btrix-tag-input::part(form-control-help-text),
|
|
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;
|
|
/* Enable controlling help text text alignment from parent */
|
|
text-align: var(--help-text-align, left);
|
|
}
|
|
.form-help-text {
|
|
color: var(--sl-input-help-text-color);
|
|
font-size: var(--sl-input-help-text-font-size-medium);
|
|
}
|
|
|
|
/* Elevate select and buttons */
|
|
sl-select::part(combobox),
|
|
sl-button:not([variant="text"])::part(base) {
|
|
box-shadow: var(--sl-shadow-x-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);
|
|
}
|
|
|
|
/* Add border to menu */
|
|
sl-menu {
|
|
border: 1px solid var(--sl-panel-border-color);
|
|
}
|
|
|
|
/* 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),
|
|
[data-user-invalid]:not([disabled]) .form-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;
|
|
}
|
|
|
|
/* For single-input forms with submit button inline */
|
|
/* Requires form control and button to be direct children */
|
|
.inline-control-input,
|
|
.inline-control-input::part(form-control) {
|
|
display: contents;
|
|
}
|
|
|
|
.inline-control-form {
|
|
display: grid;
|
|
grid-template-areas:
|
|
"label ."
|
|
"input button"
|
|
"help-text .";
|
|
grid-template-columns: 1fr max-content;
|
|
column-gap: var(--sl-spacing-small);
|
|
}
|
|
|
|
.inline-control-input::part(form-control-label) {
|
|
grid-area: label;
|
|
}
|
|
|
|
.inline-control-input::part(form-control-input) {
|
|
grid-area: input;
|
|
}
|
|
|
|
.inline-control-input::part(form-control-help-text) {
|
|
grid-area: help-text;
|
|
}
|
|
|
|
.inline-control-button {
|
|
grid-area: button;
|
|
}
|
|
|
|
/* Inputs with "Max N characters" help text */
|
|
.with-max-help-text {
|
|
--help-text-align: right;
|
|
}
|
|
|
|
/* Aesthetically closer to monospaced font: */
|
|
.font-monostyle {
|
|
font-family: var(--font-monostyle-family);
|
|
font-variation-settings: var(--font-monostyle-variation);
|
|
}
|
|
|
|
.truncate {
|
|
/* Fix tailwind clipping vertical */
|
|
overflow: clip visible;
|
|
}
|
|
|
|
.offscreen {
|
|
position: absolute;
|
|
left: -9999px;
|
|
bottom: -9999px;
|
|
visibility: hidden;
|
|
clip: rect(0 0 0 0);
|
|
}
|
|
`;
|
|
|
|
export default theme;
|