From 36f0371132169ccf87286f1717e5a502d1166f9c Mon Sep 17 00:00:00 2001 From: GauthierWebDev Date: Sat, 19 Apr 2025 14:23:41 +0200 Subject: [PATCH] feat: Add new components Button, Callout, Form, Icon, Iframe, and related Icons --- app/components/Button.tsx | 52 +++++++++++++++++++++ app/components/Callout.tsx | 74 ++++++++++++++++++++++++++++++ app/components/Form.tsx | 51 +++++++++++++++++++++ app/components/Icon.tsx | 83 ++++++++++++++++++++++++++++++++++ app/components/Iframe.tsx | 21 +++++++++ app/icons/InstallationIcon.tsx | 36 +++++++++++++++ app/icons/LightbulbIcon.tsx | 39 ++++++++++++++++ app/icons/PluginsIcon.tsx | 48 ++++++++++++++++++++ app/icons/PresetsIcon.tsx | 36 +++++++++++++++ app/icons/QuestionIcon.tsx | 48 ++++++++++++++++++++ app/icons/ThemingIcon.tsx | 52 +++++++++++++++++++++ app/icons/WarningIcon.tsx | 48 ++++++++++++++++++++ 12 files changed, 588 insertions(+) create mode 100644 app/components/Button.tsx create mode 100644 app/components/Callout.tsx create mode 100644 app/components/Form.tsx create mode 100644 app/components/Icon.tsx create mode 100644 app/components/Iframe.tsx create mode 100644 app/icons/InstallationIcon.tsx create mode 100644 app/icons/LightbulbIcon.tsx create mode 100644 app/icons/PluginsIcon.tsx create mode 100644 app/icons/PresetsIcon.tsx create mode 100644 app/icons/QuestionIcon.tsx create mode 100644 app/icons/ThemingIcon.tsx create mode 100644 app/icons/WarningIcon.tsx diff --git a/app/components/Button.tsx b/app/components/Button.tsx new file mode 100644 index 0000000..be8be90 --- /dev/null +++ b/app/components/Button.tsx @@ -0,0 +1,52 @@ +import type { JSX } from "solid-js"; + +import { Link } from "./Link"; +import clsx from "clsx"; + +const variantStyles = { + primary: + "bg-violet-300 font-semibold text-slate-900 hover:bg-violet-200 focus:outline-hidden focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-violet-300/50 active:bg-violet-500", + secondary: + "bg-slate-800 font-medium text-white hover:bg-slate-700 focus:outline-hidden focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white/50 active:text-slate-400", + ghost: + "bg-transparent font-medium text-slate-900 dark:text-slate-400 hover:bg-slate-100 focus:outline-hidden focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-slate-300/50 active:bg-slate-200", +}; + +const sizeStyles = { + sm: "rounded-md py-1 px-2 text-xs", + md: "rounded-full py-2 px-4 text-sm", + lg: "rounded-full py-3 px-6 text-base", +}; + +type ButtonProps = { + variant?: keyof typeof variantStyles; + size?: keyof typeof sizeStyles; + className?: string; +} & ( + | JSX.IntrinsicElements["button"] + | (JSX.IntrinsicElements["a"] & { href?: undefined }) +); + +export function Button({ + variant = "primary", + size = "md", + className, + ...props +}: ButtonProps) { + className = clsx( + variantStyles[variant], + sizeStyles[size], + "cursor-pointer", + className, + ); + + return "href" in props && props.href ? ( + + ) : ( +