Dark UI for react-select

This commit is contained in:
Jamie Curnow
2025-09-22 23:14:00 +10:00
parent 53507f88b3
commit f39efb3e63
8 changed files with 67 additions and 16 deletions

View File

@@ -1,3 +1,14 @@
:root {
color-scheme: light dark;
}
.light {
color-scheme: light;
}
.dark {
color-scheme: dark;
}
.modal-backdrop { .modal-backdrop {
--tblr-backdrop-opacity: 0.8 !important; --tblr-backdrop-opacity: 0.8 !important;
} }
@@ -12,3 +23,45 @@
.ml-1 { .ml-1 {
margin-left: 0.25rem; margin-left: 0.25rem;
} }
.react-select-container {
.react-select__control {
color: var(--tblr-body-color);
background-color: var(--tblr-bg-forms);
border: var(--tblr-border-width) solid var(--tblr-border-color);
.react-select__input {
color: var(--tblr-body-color) !important;
}
.react-select__single-value {
color: var(--tblr-body-color);
}
.react-select__multi-value {
border: 1px solid var(--tblr-border-color);
background-color: var(--tblr-bg-surface-tertiary);
color: var(--tblr-secondary) !important;
.react-select__multi-value__label {
color: var(--tblr-secondary) !important;
}
}
}
.react-select__menu {
background-color: var(--tblr-bg-forms);
.react-select__option {
background: rgba(var(--tblr-primary-rgb), .04);
color: inherit !important;
&.react-select__option--is-focused {
background: rgba(var(--tblr-primary-rgb), .1);
}
&.react-select__option--is-focused.react-select__option--is-selected {
background: rgba(var(--tblr-primary-rgb), .2);
}
}
}
}

View File

@@ -46,6 +46,8 @@ export function DNSProviderFields() {
DNS Provider DNS Provider
</label> </label>
<Select <Select
className="react-select-container"
classNamePrefix="react-select"
name={field.name} name={field.name}
id="dnsProvider" id="dnsProvider"
closeMenuOnSelect={true} closeMenuOnSelect={true}

View File

@@ -91,6 +91,8 @@ export function DomainNamesField({
{intl.formatMessage({ id: label })} {intl.formatMessage({ id: label })}
</label> </label>
<CreatableSelect <CreatableSelect
className="react-select-container"
classNamePrefix="react-select"
name={field.name} name={field.name}
id={id} id={id}
closeMenuOnSelect={true} closeMenuOnSelect={true}

View File

@@ -103,6 +103,8 @@ export function SSLCertificateField({
{isError ? <div className="invalid-feedback">{`${error}`}</div> : null} {isError ? <div className="invalid-feedback">{`${error}`}</div> : null}
{!isLoading && !isError ? ( {!isLoading && !isError ? (
<Select <Select
className="react-select-container"
classNamePrefix="react-select"
defaultValue={options[0]} defaultValue={options[0]}
options={options} options={options}
components={{ Option }} components={{ Option }}

View File

@@ -107,7 +107,7 @@ export function SSLOptionsFields() {
<Field name="letsencryptEmail"> <Field name="letsencryptEmail">
{({ field }: any) => ( {({ field }: any) => (
<div className="row mt-5"> <div className="mt-5">
<label htmlFor="letsencryptEmail" className="form-label"> <label htmlFor="letsencryptEmail" className="form-label">
Email Address for Let's Encrypt Email Address for Let's Encrypt
</label> </label>

View File

@@ -1,13 +1,6 @@
.darkBtn { .btn {
color: var(--tblr-light) !important; color: light-dark(var(--tblr-dark), var(--tblr-light)) !important;
&:hover {
border: var(--tblr-btn-border-width) solid transparent !important;
background: color-mix(in srgb, var(--tblr-btn-hover-bg) 10%, transparent) !important;
}
}
.lightBtn {
color: var(--tblr-dark) !important;
&:hover { &:hover {
border: var(--tblr-btn-border-width) solid transparent !important; border: var(--tblr-btn-border-width) solid transparent !important;
background: color-mix(in srgb, var(--tblr-btn-hover-bg) 10%, transparent) !important; background: color-mix(in srgb, var(--tblr-btn-hover-bg) 10%, transparent) !important;

View File

@@ -15,11 +15,8 @@ function LocalePicker() {
location.reload(); location.reload();
}; };
const classes = ["btn", "dropdown-toggle", "btn-sm"]; const classes = ["btn", "dropdown-toggle", "btn-sm", styles.btn];
let cns = cn(...classes, "btn-ghost-light", styles.lightBtn); const cns = cn(...classes, getTheme() === "dark" ? "btn-ghost-dark" : "btn-ghost-light");
if (getTheme() === "dark") {
cns = cn(...classes, "btn-ghost-dark", styles.darkBtn);
}
return ( return (
<div className="dropdown"> <div className="dropdown">

View File

@@ -40,6 +40,8 @@ export const ThemeProvider: React.FC<ThemeProviderProps> = ({ children }) => {
useEffect(() => { useEffect(() => {
document.body.dataset.theme = theme; document.body.dataset.theme = theme;
document.body.classList.remove(theme === Light ? Dark : Light);
document.body.classList.add(theme);
localStorage.setItem(StorageKey, theme); localStorage.setItem(StorageKey, theme);
}, [theme]); }, [theme]);
@@ -53,7 +55,7 @@ export const ThemeProvider: React.FC<ThemeProviderProps> = ({ children }) => {
const getTheme = () => { const getTheme = () => {
return theme; return theme;
} };
document.documentElement.setAttribute("data-bs-theme", theme); document.documentElement.setAttribute("data-bs-theme", theme);
return <ThemeContext.Provider value={{ theme, toggleTheme, setTheme, getTheme }}>{children}</ThemeContext.Provider>; return <ThemeContext.Provider value={{ theme, toggleTheme, setTheme, getTheme }}>{children}</ThemeContext.Provider>;