Improve modals (#840)
* Adjust picker input to take up all remaining space * Improve modals and buttons * Remove confusing focus of scrollable result list in Firefox * Adjust css for dark themes, add background for text field in prompt Seperate accent color for text to increase contrast in dark theme Set css color-scheme to dark for dark theme * Fix buggy when entering very long text in picker * Prevent key events from propagating outside of modals * Always show focus on button * Add the keydown event listener directly to the mini editor * Do not refocus the mini editor when it loses focus and refactoring of the AlwaysShownModal. * Fix reference to button and mini editor focus in chrome * Fix selected option index capping in filter when using page downpull/854/head
parent
27ef256674
commit
cb6ee137f2
|
@ -1,6 +1,7 @@
|
||||||
import { CompletionContext, CompletionResult } from "@codemirror/autocomplete";
|
import { CompletionContext, CompletionResult } from "@codemirror/autocomplete";
|
||||||
import { useRef, useState } from "preact/hooks";
|
import { useEffect, useRef, useState } from "preact/hooks";
|
||||||
import { MiniEditor } from "./mini_editor.tsx";
|
import { MiniEditor } from "./mini_editor.tsx";
|
||||||
|
import { ComponentChildren, Ref } from "preact";
|
||||||
|
|
||||||
export function Prompt({
|
export function Prompt({
|
||||||
message,
|
message,
|
||||||
|
@ -19,7 +20,11 @@ export function Prompt({
|
||||||
}) {
|
}) {
|
||||||
const [text, setText] = useState(defaultValue || "");
|
const [text, setText] = useState(defaultValue || "");
|
||||||
const returnEl = (
|
const returnEl = (
|
||||||
<div className="sb-modal-box">
|
<AlwaysShownModal
|
||||||
|
onCancel={() => {
|
||||||
|
callback();
|
||||||
|
}}
|
||||||
|
>
|
||||||
<div className="sb-prompt">
|
<div className="sb-prompt">
|
||||||
<label>{message}</label>
|
<label>{message}</label>
|
||||||
<MiniEditor
|
<MiniEditor
|
||||||
|
@ -40,22 +45,25 @@ export function Prompt({
|
||||||
setText(text);
|
setText(text);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<button
|
<div className="sb-prompt-buttons">
|
||||||
onClick={() => {
|
<Button
|
||||||
callback(text);
|
primary={true}
|
||||||
}}
|
onActivate={() => {
|
||||||
>
|
callback(text);
|
||||||
Ok
|
}}
|
||||||
</button>
|
>
|
||||||
<button
|
Ok
|
||||||
onClick={() => {
|
</Button>
|
||||||
callback();
|
<Button
|
||||||
}}
|
onActivate={() => {
|
||||||
>
|
callback();
|
||||||
Cancel
|
}}
|
||||||
</button>
|
>
|
||||||
|
Cancel
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</AlwaysShownModal>
|
||||||
);
|
);
|
||||||
|
|
||||||
return returnEl;
|
return returnEl;
|
||||||
|
@ -73,49 +81,98 @@ export function Confirm({
|
||||||
okButtonRef.current?.focus();
|
okButtonRef.current?.focus();
|
||||||
});
|
});
|
||||||
const returnEl = (
|
const returnEl = (
|
||||||
<div className="sb-modal-wrapper">
|
<AlwaysShownModal
|
||||||
<div className="sb-modal-box">
|
onCancel={() => {
|
||||||
<div
|
callback(false);
|
||||||
className="sb-prompt"
|
}}
|
||||||
onKeyDown={(e) => {
|
>
|
||||||
e.stopPropagation();
|
<div className="sb-prompt">
|
||||||
e.preventDefault();
|
<label>{message}</label>
|
||||||
switch (e.key) {
|
<div className="sb-prompt-buttons">
|
||||||
case "Enter":
|
<Button
|
||||||
callback(true);
|
buttonRef={okButtonRef}
|
||||||
break;
|
primary={true}
|
||||||
case "Escape":
|
onActivate={() => {
|
||||||
callback(false);
|
callback(true);
|
||||||
break;
|
}}
|
||||||
}
|
>
|
||||||
}}
|
Ok
|
||||||
>
|
</Button>
|
||||||
<label>{message}</label>
|
<Button
|
||||||
<div>
|
onActivate={() => {
|
||||||
<button
|
callback(false);
|
||||||
ref={okButtonRef}
|
}}
|
||||||
onClick={(e) => {
|
>
|
||||||
e.stopPropagation();
|
Cancel
|
||||||
e.preventDefault();
|
</Button>
|
||||||
callback(true);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Ok
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
onClick={(e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
e.preventDefault();
|
|
||||||
callback(false);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Cancel
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</AlwaysShownModal>
|
||||||
);
|
);
|
||||||
|
|
||||||
return returnEl;
|
return returnEl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function Button({
|
||||||
|
children,
|
||||||
|
primary,
|
||||||
|
onActivate,
|
||||||
|
buttonRef,
|
||||||
|
}: {
|
||||||
|
children: ComponentChildren;
|
||||||
|
primary?: boolean;
|
||||||
|
onActivate: () => void;
|
||||||
|
buttonRef?: Ref<HTMLButtonElement>;
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
ref={buttonRef}
|
||||||
|
className={primary ? "sb-button-primary" : "sb-button"}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
onActivate();
|
||||||
|
}}
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
if (e.key === "Enter") {
|
||||||
|
e.stopPropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
onActivate();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function AlwaysShownModal({
|
||||||
|
children,
|
||||||
|
onCancel,
|
||||||
|
}: {
|
||||||
|
children: ComponentChildren;
|
||||||
|
onCancel?: () => void;
|
||||||
|
}) {
|
||||||
|
const dialogRef = useRef<HTMLDialogElement>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
dialogRef.current?.showModal();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<dialog
|
||||||
|
className="sb-modal-box"
|
||||||
|
// @ts-ignore
|
||||||
|
onCancel={(e: Event) => {
|
||||||
|
e.preventDefault();
|
||||||
|
onCancel?.();
|
||||||
|
}}
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
}}
|
||||||
|
ref={dialogRef}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</dialog>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { FilterOption } from "$lib/web.ts";
|
||||||
import { MiniEditor } from "./mini_editor.tsx";
|
import { MiniEditor } from "./mini_editor.tsx";
|
||||||
import { fuzzySearchAndSort } from "../fuse_search.ts";
|
import { fuzzySearchAndSort } from "../fuse_search.ts";
|
||||||
import { deepEqual } from "../../plug-api/lib/json.ts";
|
import { deepEqual } from "../../plug-api/lib/json.ts";
|
||||||
|
import { AlwaysShownModal } from "./basic_modals.tsx";
|
||||||
|
|
||||||
export function FilterList({
|
export function FilterList({
|
||||||
placeholder,
|
placeholder,
|
||||||
|
@ -93,7 +94,11 @@ export function FilterList({
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const returnEl = (
|
const returnEl = (
|
||||||
<div className="sb-modal-box">
|
<AlwaysShownModal
|
||||||
|
onCancel={() => {
|
||||||
|
onSelect(undefined);
|
||||||
|
}}
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
className="sb-header"
|
className="sb-header"
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
|
@ -143,7 +148,9 @@ export function FilterList({
|
||||||
setSelectionOption(Math.max(0, selectedOption - 5));
|
setSelectionOption(Math.max(0, selectedOption - 5));
|
||||||
return true;
|
return true;
|
||||||
case "PageDown":
|
case "PageDown":
|
||||||
setSelectionOption(Math.max(0, selectedOption + 5));
|
setSelectionOption(
|
||||||
|
Math.min(matchingOptions.length - 1, selectedOption + 5),
|
||||||
|
);
|
||||||
return true;
|
return true;
|
||||||
case "Home":
|
case "Home":
|
||||||
setSelectionOption(0);
|
setSelectionOption(0);
|
||||||
|
@ -170,7 +177,7 @@ export function FilterList({
|
||||||
dangerouslySetInnerHTML={{ __html: helpText }}
|
dangerouslySetInnerHTML={{ __html: helpText }}
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<div className="sb-result-list">
|
<div className="sb-result-list" tabIndex={-1}>
|
||||||
{matchingOptions && matchingOptions.length > 0
|
{matchingOptions && matchingOptions.length > 0
|
||||||
? matchingOptions.map((option, idx) => (
|
? matchingOptions.map((option, idx) => (
|
||||||
<div
|
<div
|
||||||
|
@ -203,7 +210,7 @@ export function FilterList({
|
||||||
))
|
))
|
||||||
: null}
|
: null}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</AlwaysShownModal>
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
@ -64,19 +64,24 @@ export function MiniEditor(
|
||||||
const callbacksRef = useRef<MiniEditorEvents>();
|
const callbacksRef = useRef<MiniEditorEvents>();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (editorDiv.current) {
|
const currentEditorDiv = editorDiv.current;
|
||||||
|
if (currentEditorDiv) {
|
||||||
// console.log("Creating editor view");
|
// console.log("Creating editor view");
|
||||||
const editorView = new EditorView({
|
const editorView = new EditorView({
|
||||||
state: buildEditorState(),
|
state: buildEditorState(),
|
||||||
parent: editorDiv.current!,
|
parent: currentEditorDiv,
|
||||||
});
|
});
|
||||||
editorViewRef.current = editorView;
|
editorViewRef.current = editorView;
|
||||||
|
|
||||||
|
const focusEditorView = editorView.focus.bind(editorView);
|
||||||
|
currentEditorDiv.addEventListener("focusin", focusEditorView);
|
||||||
|
|
||||||
if (focus) {
|
if (focus) {
|
||||||
editorView.focus();
|
editorView.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
|
currentEditorDiv.removeEventListener("focusin", focusEditorView);
|
||||||
if (editorViewRef.current) {
|
if (editorViewRef.current) {
|
||||||
editorViewRef.current.destroy();
|
editorViewRef.current.destroy();
|
||||||
}
|
}
|
||||||
|
@ -107,37 +112,27 @@ export function MiniEditor(
|
||||||
}
|
}
|
||||||
}, [text, vimMode]);
|
}, [text, vimMode]);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// So, for some reason, CM doesn't propagate the keydown event, therefore we'll capture it here
|
|
||||||
// And check if it's the same editor element
|
|
||||||
function onKeyDown(e: KeyboardEvent) {
|
|
||||||
const parent = (e.target as any).parentElement.parentElement;
|
|
||||||
if (parent !== editorViewRef.current?.dom) {
|
|
||||||
// Different editor element
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let stopPropagation = false;
|
|
||||||
if (callbacksRef.current!.onKeyDown) {
|
|
||||||
stopPropagation = callbacksRef.current!.onKeyDown(
|
|
||||||
editorViewRef.current!,
|
|
||||||
e,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (stopPropagation) {
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
document.addEventListener("keydown", onKeyDown);
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
document.removeEventListener("keydown", onKeyDown);
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
let onBlurred = false, onEntered = false;
|
let onBlurred = false, onEntered = false;
|
||||||
|
|
||||||
return <div class="sb-mini-editor" ref={editorDiv} />;
|
return (
|
||||||
|
<div
|
||||||
|
class="sb-mini-editor"
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
let stopPropagation = false;
|
||||||
|
if (callbacksRef.current!.onKeyDown) {
|
||||||
|
stopPropagation = callbacksRef.current!.onKeyDown(
|
||||||
|
editorViewRef.current!,
|
||||||
|
e,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (stopPropagation) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
ref={editorDiv}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
function buildEditorState() {
|
function buildEditorState() {
|
||||||
// When vim mode is active, we need for CM to have created the new state
|
// When vim mode is active, we need for CM to have created the new state
|
||||||
|
@ -262,12 +257,6 @@ export function MiniEditor(
|
||||||
// Reset the state
|
// Reset the state
|
||||||
view.setState(buildEditorState());
|
view.setState(buildEditorState());
|
||||||
});
|
});
|
||||||
} else if (focus) {
|
|
||||||
// console.log("BLURRING WHILE KEEPING FOCUSE");
|
|
||||||
// Automatically refocus blurred
|
|
||||||
if (editorViewRef.current) {
|
|
||||||
editorViewRef.current.focus();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Event may occur again in 500ms
|
// Event may occur again in 500ms
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
|
|
@ -80,6 +80,39 @@
|
||||||
color: var(--action-button-hover-color);
|
color: var(--action-button-hover-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sb-button, .sb-button-primary {
|
||||||
|
--color: var(--button-color);
|
||||||
|
--background-color: var(--button-background-color);
|
||||||
|
--hover-background-color: var(--button-hover-background-color);
|
||||||
|
--border-color: var(--button-border-color);
|
||||||
|
|
||||||
|
&.sb-button-primary {
|
||||||
|
--color: var(--primary-button-color);
|
||||||
|
--background-color: var(--primary-button-background-color);
|
||||||
|
--hover-background-color: var(--primary-button-hover-background-color);
|
||||||
|
--border-color: var(--primary-button-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
background-color: var(--background-color);
|
||||||
|
color: var(--color);
|
||||||
|
|
||||||
|
box-shadow: 0 0 0.2em rgba(0, 0, 0, 0.05);
|
||||||
|
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 0.5em;
|
||||||
|
padding: 0.2em 0.5em;
|
||||||
|
font-size: 0.9em;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--hover-background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: 2px solid var(--color);
|
||||||
|
outline-offset: -3px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Modal boxes */
|
/* Modal boxes */
|
||||||
.sb-modal-box {
|
.sb-modal-box {
|
||||||
color: var(--modal-color);
|
color: var(--modal-color);
|
||||||
|
|
|
@ -1,11 +1,6 @@
|
||||||
.sb-modal-box {
|
.sb-modal-box {
|
||||||
position: absolute;
|
margin-top: 60px;
|
||||||
// At the toppest of the toppest
|
padding: 0;
|
||||||
z-index: 1000;
|
|
||||||
|
|
||||||
top: 60px;
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
width: 700px;
|
width: 700px;
|
||||||
max-width: 90%;
|
max-width: 90%;
|
||||||
|
|
||||||
|
@ -27,6 +22,11 @@
|
||||||
label {
|
label {
|
||||||
margin: 3px;
|
margin: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sb-mini-editor {
|
||||||
|
flex-grow: 1;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.sb-prompt {
|
.sb-prompt {
|
||||||
|
@ -37,11 +37,20 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.sb-mini-editor {
|
.sb-mini-editor {
|
||||||
|
background-color: var(--text-field-background-color);
|
||||||
margin: 10px 0;
|
margin: 10px 0;
|
||||||
width: 100%;
|
padding: 0.2em 0.5em;
|
||||||
border: 0;
|
border: 0;
|
||||||
|
border-radius: 0.5em;
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sb-prompt-buttons {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
margin-top: 10px;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.sb-help-text {
|
.sb-help-text {
|
||||||
|
@ -81,4 +90,4 @@
|
||||||
padding-bottom: 3px;
|
padding-bottom: 3px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
html {
|
html {
|
||||||
--ui-accent-color: #464cfc;
|
--ui-accent-color: #464cfc;
|
||||||
|
--ui-accent-text-color: var(--ui-accent-color);
|
||||||
|
--ui-accent-contrast-color: #eee;
|
||||||
--highlight-color: rgba(255, 255, 0, 0.5);
|
--highlight-color: rgba(255, 255, 0, 0.5);
|
||||||
--link-color: #0330cb;
|
--link-color: #0330cb;
|
||||||
--link-missing-color: #9e4705;
|
--link-missing-color: #9e4705;
|
||||||
|
@ -29,11 +31,11 @@ html {
|
||||||
--modal-color: inherit;
|
--modal-color: inherit;
|
||||||
--modal-background-color: #fff;
|
--modal-background-color: #fff;
|
||||||
--modal-border-color: rgb(108, 108, 108);
|
--modal-border-color: rgb(108, 108, 108);
|
||||||
--modal-header-label-color: var(--ui-accent-color);
|
--modal-header-label-color: var(--ui-accent-text-color);
|
||||||
--modal-help-background-color: #eee;
|
--modal-help-background-color: #eee;
|
||||||
--modal-help-color: #555;
|
--modal-help-color: #555;
|
||||||
--modal-selected-option-background-color: var(--ui-accent-color);
|
--modal-selected-option-background-color: var(--ui-accent-color);
|
||||||
--modal-selected-option-color: #eee;
|
--modal-selected-option-color: var(--ui-accent-contrast-color);
|
||||||
--modal-hint-background-color: #212476;
|
--modal-hint-background-color: #212476;
|
||||||
--modal-hint-color: #eee;
|
--modal-hint-color: #eee;
|
||||||
--modal-description-color: #aaa;
|
--modal-description-color: #aaa;
|
||||||
|
@ -43,6 +45,17 @@ html {
|
||||||
--notification-info-background-color: rgb(187, 221, 247);
|
--notification-info-background-color: rgb(187, 221, 247);
|
||||||
--notification-error-background-color: rgb(255, 84, 84);
|
--notification-error-background-color: rgb(255, 84, 84);
|
||||||
|
|
||||||
|
--button-background-color: #eee;
|
||||||
|
--button-hover-background-color: inherit;
|
||||||
|
--button-color: black;
|
||||||
|
--button-border-color: #6c6c6c;
|
||||||
|
--primary-button-background-color: var(--ui-accent-color);
|
||||||
|
--primary-button-hover-background-color: color-mix(in srgb, var(--ui-accent-color), black 35%);
|
||||||
|
--primary-button-color: var(--ui-accent-contrast-color);
|
||||||
|
--primary-button-border-color: transparent;
|
||||||
|
|
||||||
|
--text-field-background-color: var(--button-background-color);
|
||||||
|
|
||||||
--action-button-background-color: transparent;
|
--action-button-background-color: transparent;
|
||||||
--action-button-color: #292929;
|
--action-button-color: #292929;
|
||||||
--action-button-hover-color: #0772be;
|
--action-button-hover-color: #0772be;
|
||||||
|
@ -116,7 +129,11 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
html[data-theme="dark"] {
|
html[data-theme="dark"] {
|
||||||
|
color-scheme: dark;
|
||||||
|
|
||||||
--ui-accent-color: #464cfc;
|
--ui-accent-color: #464cfc;
|
||||||
|
--ui-accent-text-color: var(--ui-accent-color);
|
||||||
|
--ui-accent-text-color: color-mix(in srgb, var(--ui-accent-color), white 50%);
|
||||||
--highlight-color: rgba(255, 255, 0, 0.5);
|
--highlight-color: rgba(255, 255, 0, 0.5);
|
||||||
--link-color: #7e99fc;
|
--link-color: #7e99fc;
|
||||||
--link-missing-color: #9e4705;
|
--link-missing-color: #9e4705;
|
||||||
|
@ -146,7 +163,7 @@ html[data-theme="dark"] {
|
||||||
--modal-color: #ccc;
|
--modal-color: #ccc;
|
||||||
--modal-background-color: #262626;
|
--modal-background-color: #262626;
|
||||||
--modal-border-color: #6c6c6c;
|
--modal-border-color: #6c6c6c;
|
||||||
--modal-header-label-color: var(--ui-accent-color);
|
--modal-header-label-color: var(--ui-accent-text-color);
|
||||||
--modal-help-background-color: #333;
|
--modal-help-background-color: #333;
|
||||||
--modal-help-color: #ccc;
|
--modal-help-color: #ccc;
|
||||||
--modal-selected-option-background-color: var(--ui-accent-color);
|
--modal-selected-option-background-color: var(--ui-accent-color);
|
||||||
|
@ -160,6 +177,17 @@ html[data-theme="dark"] {
|
||||||
--notification-info-background-color: #1b76bb;
|
--notification-info-background-color: #1b76bb;
|
||||||
--notification-error-background-color: #a32121;
|
--notification-error-background-color: #a32121;
|
||||||
|
|
||||||
|
--button-background-color: #555;
|
||||||
|
--button-hover-background-color: #777;
|
||||||
|
--button-color: white;
|
||||||
|
--button-border-color: #666;
|
||||||
|
--primary-button-background-color: var(--ui-accent-color);
|
||||||
|
--primary-button-hover-background-color: color-mix(in srgb, var(--ui-accent-color), black 35%);
|
||||||
|
--primary-button-color: var(--ui-accent-contrast-color);
|
||||||
|
--primary-button-border-color: transparent;
|
||||||
|
|
||||||
|
--text-field-background-color: var(--button-background-color);
|
||||||
|
|
||||||
--action-button-background-color: transparent;
|
--action-button-background-color: transparent;
|
||||||
--action-button-color: #adadad;
|
--action-button-color: #adadad;
|
||||||
--action-button-hover-color: #37a1ed;
|
--action-button-hover-color: #37a1ed;
|
||||||
|
|
Loading…
Reference in New Issue