diff --git a/src/renderer/components/shared/bsm-button.component.tsx b/src/renderer/components/shared/bsm-button.component.tsx
index 24327605..cdcc4090 100644
--- a/src/renderer/components/shared/bsm-button.component.tsx
+++ b/src/renderer/components/shared/bsm-button.component.tsx
@@ -4,6 +4,7 @@ import React from "react";
import { BsmImage } from "./bsm-image.component";
import { useTranslation } from "renderer/hooks/use-translation.hook";
import { useThemeColor } from "renderer/hooks/use-theme-color.hook";
+import { useBestTextColor } from "renderer/hooks/use-best-text-color.hook";
type BsmButtonType = "primary"|"success"|"cancel"|"error";
@@ -32,16 +33,7 @@ export function BsmButton({className, style, imgClassName, iconClassName, icon,
const primaryColor = typeColor === "primary" ? useThemeColor("first-color") : null;
- const textColor = !primaryColor ? null : (() => {
- const hex = primaryColor.replaceAll("#", "");
- const uicolors = [parseInt(hex.substring(0, 2), 16) / 255, parseInt(hex.substring(0, 2), 16) / 255, parseInt(hex.substring(0, 2), 16) / 255];
- const c = uicolors.map(col => {
- if (col <= 0.03928) { return col / 12.92; }
- return Math.pow((col + 0.055) / 1.055, 2.4);
- });
- const L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2]);
- return (L > 0.179) ? "#000" : "fff";
- })();
+ const textColor = !primaryColor ? null : useBestTextColor(primaryColor);
const renderTypeColor = (() => {
if(typeColor === "primary"){ return ""; }
@@ -57,7 +49,7 @@ export function BsmButton({className, style, imgClassName, iconClassName, icon,
onClick && onClick(e)} className={`${className} overflow-hidden cursor-pointer group ${(!withBar && (!!typeColor || !!color)) && "hover:brightness-[1.15]"} ${disabled && "brightness-75 cursor-not-allowed"} ${renderTypeColor}`} style={{...style, ...((!!primaryColor || !!color) && {backgroundColor: primaryColor ?? color})}}>
{ image &&
}
{ icon && }
- {text && (type === "submit" ? : {t(text)})}
+ {text && (type === "submit" ? : {t(text)})}
{ withBar && (
diff --git a/src/renderer/components/shared/bsm-checkbox.component.tsx b/src/renderer/components/shared/bsm-checkbox.component.tsx
new file mode 100644
index 00000000..204c0979
--- /dev/null
+++ b/src/renderer/components/shared/bsm-checkbox.component.tsx
@@ -0,0 +1,32 @@
+import { useState } from "react"
+import { BsmIcon } from "../svgs/bsm-icon.component"
+import { motion } from "framer-motion"
+import { useThemeColor } from "renderer/hooks/use-theme-color.hook";
+import { useBestTextColor } from "renderer/hooks/use-best-text-color.hook";
+
+type Props = {className?:string, checked?: boolean, onChange?: (val: boolean) => void, disabled?: boolean}
+
+export function BsmCheckbox({className, checked, onChange, disabled} : Props) {
+
+ const [isChecked, setIsChecked] = useState(true);
+ const checkedColor = useThemeColor("first-color");
+ const iconColor = useBestTextColor(checkedColor);
+
+ const handleClick = () => {
+ if(disabled){ return; }
+ onChange && onChange(!checked);
+ setIsChecked(val => !val);
+ }
+
+ return (
+
+ {!disabled &&
}
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/renderer/components/svgs/bsm-icon.component.tsx b/src/renderer/components/svgs/bsm-icon.component.tsx
index d7c9530f..81b3106a 100644
--- a/src/renderer/components/svgs/bsm-icon.component.tsx
+++ b/src/renderer/components/svgs/bsm-icon.component.tsx
@@ -20,9 +20,10 @@ import EditIcon from "./icons/edit-icon.component";
import { ExportIcon } from "./icons/export-icon.component";
import PatreonIcon from "./icons/patreon-icon.component";
import { SearchIcon } from "./icons/search-icon.component";
+import { CheckIcon } from "./icons/check-icon.component";
export type BsmIconType = (
- "settings"|"trash"|"favorite"|"folder"|"bsNote"|
+ "settings"|"trash"|"favorite"|"folder"|"bsNote"|"check"|
"terminal"|"desktop"|"oculus"|"add"|"cross"|"task"|
"copy"|"steam"|"edit"|"export"|"patreon"|"search"|
"fr-FR-flag"|"es-ES-flag"|"en-US-flag"|"en-EN-flag"
@@ -52,6 +53,7 @@ export const BsmIcon = memo(({className, icon, style}: {className?: string, icon
if(icon === "export"){ return
}
if(icon === "patreon"){ return }
if(icon === "search"){ return }
+ if(icon === "check"){ return }
return
}
diff --git a/src/renderer/components/svgs/icons/check-icon.component.tsx b/src/renderer/components/svgs/icons/check-icon.component.tsx
new file mode 100644
index 00000000..08143498
--- /dev/null
+++ b/src/renderer/components/svgs/icons/check-icon.component.tsx
@@ -0,0 +1,9 @@
+import { CSSProperties } from "react";
+
+export function CheckIcon(props: {className?: string, style?: CSSProperties}) {
+ return (
+
+ )
+}
diff --git a/src/renderer/components/title-bar/title-bar.component.tsx b/src/renderer/components/title-bar/title-bar.component.tsx
index f5d7670d..f46ee96d 100644
--- a/src/renderer/components/title-bar/title-bar.component.tsx
+++ b/src/renderer/components/title-bar/title-bar.component.tsx
@@ -31,7 +31,7 @@ export default function TitleBar({template = "main"} : {template?: "update"|"mai
}
return (
-