Give setting components a facelift

This commit is contained in:
Zerebos 2024-12-08 20:40:57 -05:00
parent 25d3dcfac6
commit db908b71e4
No known key found for this signature in database
11 changed files with 102 additions and 67 deletions

View File

@ -155,10 +155,10 @@ const UI = {
* @param {ReactElement} [setting.children] Only used for "custom" type
* @param {CallableFunction} [setting.onChange] Callback when the value changes (only argument is new value)
* @param {boolean} [setting.disabled=false] Whether this setting is disabled
* @param {boolean} [setting.inline=true] Whether the input should render inline with the name (this is false by default for slider, color, and radio types)
* @param {boolean} [setting.inline=true] Whether the input should render inline with the name (this is false by default for radio type)
* @returns A SettingItem with a an input as the child
*/
buildSetting(setting) {
buildSettingItem(setting) {
return buildSetting(setting);
},

View File

@ -119,8 +119,8 @@ export class Filters {
* @returns {module:WebpackModules.Filters~filter} - Combinatory filter of all arguments
*/
static combine(...filters) {
return module => {
return filters.every(filter => filter(module));
return (exports, module, id) => {
return filters.every(filter => filter(exports, module, id));
};
}
}
@ -515,7 +515,7 @@ export default class WebpackModules {
const listeners = [...this.listeners];
for (let i = 0; i < listeners.length; i++) {
try {listeners[i](exports);}
try {listeners[i](exports, module, module.id);}
catch (error) {
Logger.stacktrace("WebpackModules", "Could not fire callback listener:", error);
}
@ -525,7 +525,7 @@ export default class WebpackModules {
Logger.stacktrace("WebpackModules", "Could not patch pushed module", error);
}
finally {
require.m[moduleId] = originalModule;
require.m[moduleId] = originalModule;
}
};

View File

@ -1,5 +1,6 @@
.bd-color-picker-container {
display: flex;
justify-content: center;
}
.bd-color-picker-container.bd-color-picker-disabled {
@ -20,8 +21,8 @@
.bd-color-picker-default {
cursor: pointer;
width: 72px;
height: 54px;
width: 75px;
height: 60px;
border-radius: 4px;
margin-right: 9px;
display: flex;
@ -39,13 +40,14 @@
position: absolute;
top: 5px;
right: 5px;
pointer-events: none;
}
.bd-color-picker {
outline: none;
width: 70px;
width: 75px;
border: none;
height: 54px;
height: 60px;
margin-top: 1px;
border-radius: 4px;
cursor: pointer;
@ -60,16 +62,35 @@
flex-wrap: wrap;
align-content: flex-start;
margin-left: 5px !important;
max-width: 340px;
max-width: 330px;
}
.bd-color-picker-swatch-item {
cursor: pointer;
border-radius: 4px;
width: 23px;
height: 23px;
width: 15px;
height: 15px;
margin: 4px;
display: flex;
align-items: center;
justify-content: center;
}
.bd-setting-item.inline .bd-color-picker-swatch {
max-width: 220px;
margin-top: 1px;
}
.bd-setting-item.inline .bd-color-picker-default,
.bd-setting-item.inline .bd-color-picker {
width: 50px;
height: 40px
}
.bd-setting-item.inline .bd-color-picker-swatch-item {
height: 18px;
width: 18px;
margin: 2px 2px;
}

View File

@ -1,48 +1,54 @@
.bd-setting-item.inline .bd-file-input-wrap {
max-width: 300px;
}
.bd-file-input-wrap {
display: flex;
align-items: center;
gap: 5px;
position: relative;
min-width: 250px;
box-sizing: border-box;
border-radius: 3px;
background-color: hsla(0, calc(var(--saturation-factor, 1)*0%), 0%, .1);
border: 1px solid hsla(0, calc(var(--saturation-factor, 1)*0%), 0%, .3);
padding: 0 4px;
height: 40px;
}
.bd-file-input {
flex: 1;
outline: none;
color: var(--text-normal);
background-color: var(--input-background);
min-width: 250px;
width: 100%;
font-size: 16px;
border-radius: 3px;
padding: 10px;
height: 40px;
box-sizing: border-box;
overflow: hidden;
border: none;
font-weight: 600;
width: 100%;
cursor: pointer;
}
.bd-file-input::-webkit-file-upload-button {
color: white;
background: #3E82E5;
outline: 0;
border: 0;
padding: 12px 16px!important;
margin-top: -10px;
margin-left: -10px;
margin-right: 10px;
bottom: 0;
border-radius: 3px 0 0 3px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
height: 0;
width: 0;
padding: 0 !important;
margin: 0;
visibility: hidden;
user-select: none;
pointer-events: none;
}
.bd-file-input-wrap .bd-file-input-browse {
padding: 7px 16px;
}
.bd-file-input-wrap .bd-file-input-clear {
position: absolute;
top: 50%;
right: 5px;
transform: translateY(-50%);
margin-left: 5px;
/* background: none!important; */
opacity: 0.5;
padding-right: 4px!important;
}
.bd-file-input-wrap .bd-file-input-clear:hover {
background: none;
/* background: none; */
opacity: 1;
}
@ -56,6 +62,7 @@
opacity: 0.5;
}
.bd-file-input-wrap.bd-file-input-disabled .bd-file-input-browse,
.bd-file-input-wrap.bd-file-input-disabled .bd-file-input,
.bd-file-input-wrap.bd-file-input-disabled .bd-file-input-clear {
pointer-events: none;

View File

@ -1,11 +1,14 @@
.bd-keybind-wrap {
display: flex;
align-items: center;
gap: 5px;
position: relative;
min-width: 250px;
box-sizing: border-box;
border-radius: 3px;
background-color: hsla(0, calc(var(--saturation-factor, 1)*0%), 0%, .1);
border: 1px solid hsla(0, calc(var(--saturation-factor, 1)*0%), 0%, .3);
padding: 10px;
padding: 0 4px;
height: 40px;
cursor: pointer;
}
@ -20,6 +23,7 @@
}
.bd-keybind-wrap input {
flex: 1;
outline: none;
border: none;
pointer-events: none;
@ -27,7 +31,11 @@
background: none;
font-size: 16px;
text-transform: uppercase;
font-weight: 700;
font-weight: 600;
}
.bd-keybind-wrap input::placeholder {
text-transform: capitalize;
}
.bd-keybind-wrap.recording {
@ -38,28 +46,23 @@
box-shadow: 0 0 6px hsla(359, calc(var(--saturation-factor, 1)*82.6%), 59.4%, .3);
}
.bd-keybind-controls {
position: absolute;
right: 5px;
top: 3px;
display: flex;
align-items: center;
gap: 5px;
.bd-keybind-wrap.recording input {
color: hsl(359, calc(var(--saturation-factor, 1)*82.6%), 59.4%)
}
.bd-keybind-controls .bd-keybind-record {
padding: 4px 8px;
.bd-keybind-wrap .bd-keybind-record {
padding: 3px 8px;
}
.bd-keybind-clear {
margin-left: 5px;
background: none!important;
/* background: none!important; */
opacity: 0.5;
padding-right: 4px!important;
}
.bd-keybind-clear:hover {
background: none;
/* background: none; */
opacity: 1;
}

View File

@ -5,7 +5,8 @@
.bd-radio-option {
display: flex;
align-items: center;
padding: 10px;
border-left: 3px solid transparent;
padding: 10px 10px 10px 7px;
margin-bottom: 8px;
cursor: pointer;
user-select: none;

View File

@ -68,7 +68,7 @@ export default function Color({value: initialValue, onChange, colors = defaultCo
const intValue = resolveColor(value, false);
return <div className={`bd-color-picker-container ${disabled ? "bd-color-picker-disabled" : ""}`}>
<div className="bd-color-picker-controls">
<DiscordModules.Tooltip text="Default" position="bottom">
{defaultValue && <DiscordModules.Tooltip text="Default" position="bottom">
{props => (
<div {...props} className="bd-color-picker-default" style={{backgroundColor: resolveColor(defaultValue)}} onClick={() => change({target: {value: defaultValue}})}>
{intValue === resolveColor(defaultValue, false)
@ -77,7 +77,7 @@ export default function Color({value: initialValue, onChange, colors = defaultCo
}
</div>
)}
</DiscordModules.Tooltip>
</DiscordModules.Tooltip>}
<DiscordModules.Tooltip text={Strings.Settings.customColor} position="bottom">
{props => (
<div className="bd-color-picker-custom">
@ -87,7 +87,7 @@ export default function Color({value: initialValue, onChange, colors = defaultCo
)}
</DiscordModules.Tooltip>
</div>
<div className="bd-color-picker-swatch">
{colors?.length > 0 && <div className="bd-color-picker-swatch">
{
colors.map((int, index) => (
<div key={index} className="bd-color-picker-swatch-item" style={{backgroundColor: resolveColor(int)}} onClick={() => change({target: {value: int}})}>
@ -98,6 +98,6 @@ export default function Color({value: initialValue, onChange, colors = defaultCo
</div>
))
}
</div>
</div>}
</div>;
}

View File

@ -28,7 +28,12 @@ export default function Filepicker({multiple, accept, clearable, onChange, disab
actions.clear = clear;
}, [clear, actions]);
const onClick = useCallback(() => {
inputRef.current?.click();
}, []);
return <div className={`bd-file-input-wrap ${disabled ? "bd-file-input-disabled" : ""}`}>
<Button size={Button.Sizes.ICON} look={Button.Looks.FILLED} color={Button.Colors.PRIMARY} className="bd-file-input-browse" onClick={onClick}>Browse</Button>
<input onChange={change} type="file" className="bd-file-input" multiple={multiple} accept={accept} disabled={disabled} ref={inputRef} />
{clearable && <Button size={Button.Sizes.ICON} look={Button.Looks.BLANK} onClick={clear} className="bd-file-input-clear"><Close size="24px" /></Button>}
</div>;

View File

@ -7,7 +7,7 @@ import Close from "@ui/icons/close";
const {useState, useCallback, useEffect} = React;
export default function Keybind({value: initialValue, onChange, max = 4, clearable = true, disabled}) {
export default function Keybind({value: initialValue, onChange, max = 4, clearable = false, disabled}) {
const [state, setState] = useState({value: initialValue, isRecording: false, accum: []});
useEffect(() => {
@ -60,12 +60,10 @@ export default function Keybind({value: initialValue, onChange, max = 4, clearab
}, [state, clearKeybind, disabled]);
const displayValue = state.isRecording ? "Recording..." : !state.value.length ? "N/A" : state.value.join(" + ");
const displayValue = !state.value.length ? "" : state.value.map(k => k === "Control" ? "Ctrl" : k).join(" + ");
return <div className={"bd-keybind-wrap" + (state.isRecording ? " recording" : "") + (disabled ? " bd-keybind-disabled" : "")} onClick={onClick}>
<input readOnly={true} type="text" className="bd-keybind-input" value={displayValue} disabled={disabled} />
<div className="bd-keybind-controls">
<Button size={Button.Sizes.ICON} look={Button.Looks.FILLED} color={state.isRecording ? Button.Colors.RED : Button.Colors.BRAND} className="bd-keybind-record" onClick={onClick}><Keyboard size="24px" /></Button>
{clearable && <Button size={Button.Sizes.ICON} look={Button.Looks.BLANK} onClick={clearKeybind} className="bd-keybind-clear"><Close size="24px" /></Button>}
</div>
<Button size={Button.Sizes.ICON} look={Button.Looks.FILLED} color={state.isRecording ? Button.Colors.RED : Button.Colors.PRIMARY} className="bd-keybind-record" onClick={onClick}><Keyboard size="24px" /></Button>
<input readOnly={true} type="text" className="bd-keybind-input" value={displayValue} placeholder="No keybind set" disabled={disabled} />
{clearable && <Button size={Button.Sizes.ICON} look={Button.Looks.BLANK} onClick={clearKeybind} className="bd-keybind-clear"><Close size="24px" /></Button>}
</div>;
}

View File

@ -17,7 +17,7 @@ export default function Radio({name, value, options, onChange, disabled}) {
function renderOption(opt, i) {
const isSelected = index === i;
return <label className={"bd-radio-option" + (isSelected ? " bd-radio-selected" : "")}>
return <label className={"bd-radio-option" + (isSelected ? " bd-radio-selected" : "")} style={{borderColor: opt.color ?? "transparent"}}>
<input onChange={change} type="radio" name={name} checked={isSelected} value={i} disabled={disabled} />
{/* <span className="bd-radio-button"></span> */}
<RadioIcon className="bd-radio-icon" size="24" checked={isSelected} />

View File

@ -47,5 +47,5 @@ export function buildSetting(setting) {
if (setting.type == "color") children = <Color {...setting} />;
if (setting.type == "custom") children = setting.children;
if (!children) return null;
return <Item id={setting.id} inline={setting.hasOwnProperty("inline") ? setting.inline : setting.type !== "radio" && setting.type !== "color" && setting.type !== "slider"} key={setting.id} name={setting.name} note={setting.note}>{children}</Item>;
return <Item id={setting.id} inline={setting.hasOwnProperty("inline") ? setting.inline : setting.type !== "radio"} key={setting.id} name={setting.name} note={setting.note}>{children}</Item>;
}