From 66800441761a18e5907ccfbec6b41bcd9f3a6db6 Mon Sep 17 00:00:00 2001 From: Timo Date: Wed, 30 Apr 2025 08:48:29 +0200 Subject: [PATCH] form components: adds general fieldset component and accordion component --- .../app/src/Form/fieldset/index.tsx | 32 ++++++ .../app/src/components/accordion/index.tsx | 51 +++++++++ .../app/src/components/button/css/index.css | 4 +- .../app/src/components/button/index.tsx | 4 +- pkgs/webview-ui/app/src/layout/header.tsx | 2 +- .../app/src/routes/machines/create.tsx | 100 ++++++++++++------ 6 files changed, 157 insertions(+), 36 deletions(-) create mode 100644 pkgs/webview-ui/app/src/Form/fieldset/index.tsx create mode 100644 pkgs/webview-ui/app/src/components/accordion/index.tsx diff --git a/pkgs/webview-ui/app/src/Form/fieldset/index.tsx b/pkgs/webview-ui/app/src/Form/fieldset/index.tsx new file mode 100644 index 000000000..2fc21cf4b --- /dev/null +++ b/pkgs/webview-ui/app/src/Form/fieldset/index.tsx @@ -0,0 +1,32 @@ +import { JSX } from "solid-js"; + +import { Typography } from "@/src/components/Typography"; + +type FieldsetProps = { + legend?: string; + children: JSX.Element; + class?: string; +}; + +export default function Fieldset(props: FieldsetProps) { + return ( +
+ {props.legend && ( +
+ + {props.legend} + +
+ )} +
+ {props.children} +
+
+ ); +} diff --git a/pkgs/webview-ui/app/src/components/accordion/index.tsx b/pkgs/webview-ui/app/src/components/accordion/index.tsx new file mode 100644 index 000000000..c253ec8f1 --- /dev/null +++ b/pkgs/webview-ui/app/src/components/accordion/index.tsx @@ -0,0 +1,51 @@ +import { createSignal, JSX, Show } from "solid-js"; + +import Icon from "../icon"; +import { Typography } from "../Typography"; +import { Button } from "../button"; + +type AccordionProps = { + title: string; + children: JSX.Element; + class?: string; + initiallyOpen?: boolean; +}; + +export default function Accordion(props: AccordionProps) { + const [isOpen, setIsOpen] = createSignal(props.initiallyOpen ?? false); + return ( +
+
setIsOpen(!isOpen())} + class="accordion__title h-5 flex gap-x-0.5 items-center justify-end font-medium cursor-pointer px-1" + > + } + variant="light" + size="s" + > + {props.title} + + } + > + + +
+ +
{props.children}
+
+
+ ); +} diff --git a/pkgs/webview-ui/app/src/components/button/css/index.css b/pkgs/webview-ui/app/src/components/button/css/index.css index 536ea0af7..1ac3a5700 100644 --- a/pkgs/webview-ui/app/src/components/button/css/index.css +++ b/pkgs/webview-ui/app/src/components/button/css/index.css @@ -31,8 +31,8 @@ padding-left: theme(padding.2); } - &:has(> .button__icon--end):has(> .button__label) { - padding-left: theme(padding.2); + &:has(> .button__label):has(> .button__icon--end) { + padding-right: theme(padding.2); } } diff --git a/pkgs/webview-ui/app/src/components/button/index.tsx b/pkgs/webview-ui/app/src/components/button/index.tsx index db0dd305a..31ab19222 100644 --- a/pkgs/webview-ui/app/src/components/button/index.tsx +++ b/pkgs/webview-ui/app/src/components/button/index.tsx @@ -94,9 +94,7 @@ export const Button = (props: ButtonProps) => { {local.children} )} - {local.endIcon && ( - {local.endIcon} - )} + {local.endIcon && {local.endIcon}} ); }; diff --git a/pkgs/webview-ui/app/src/layout/header.tsx b/pkgs/webview-ui/app/src/layout/header.tsx index a69b0a9cb..113bba0c6 100644 --- a/pkgs/webview-ui/app/src/layout/header.tsx +++ b/pkgs/webview-ui/app/src/layout/header.tsx @@ -9,7 +9,7 @@ interface HeaderProps { } export const Header = (props: HeaderProps) => { return ( -
+