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 (
+
+ );
+}
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}
+
+ }
+ >
+ }
+ variant="dark"
+ 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 (
-
+
{props.showBack &&
}
diff --git a/pkgs/webview-ui/app/src/routes/machines/create.tsx b/pkgs/webview-ui/app/src/routes/machines/create.tsx
index 1bda5b558..a515e3dd9 100644
--- a/pkgs/webview-ui/app/src/routes/machines/create.tsx
+++ b/pkgs/webview-ui/app/src/routes/machines/create.tsx
@@ -11,6 +11,9 @@ import { Match, Switch } from "solid-js";
import toast from "solid-toast";
import { MachineAvatar } from "./avatar";
import { DynForm } from "@/src/Form/form";
+import { Typography } from "@/src/components/Typography";
+import Fieldset from "@/src/Form/fieldset";
+import Accordion from "@/src/components/accordion";
type CreateMachineForm = OperationArgs<"create_machine">;
@@ -72,8 +75,11 @@ export function CreateMachine() {
<>