+
+
+
+
+ {selectedIndex !== undefined && (
+
+ )}
+
+
+ {selectedIndex === undefined && (
+
+ )}
+
+
+
+ {list.map((v, idx) => {
+ const isFirst = idx === 0;
+ const isLast = idx === list.length - 1;
+ const isSelected = selectedIndex === idx;
+ const disabled = selectedIndex !== undefined && !isSelected;
+ let clazz =
+ "relative flex border p-4 focus:outline-none disabled:text-grey";
+ if (isFirst) {
+ clazz += " rounded-tl-md rounded-tr-md ";
+ }
+ if (isLast) {
+ clazz += " rounded-bl-md rounded-br-md ";
+ }
+ if (isSelected) {
+ clazz += " z-10 border-indigo-200 bg-indigo-50 ";
+ } else {
+ clazz += " border-gray-200";
+ }
+ if (disabled) {
+ clazz +=
+ " cursor-not-allowed bg-gray-50 text-gray-500 ring-gray-200 text-gray";
+ } else {
+ clazz += " cursor-pointer";
+ }
+ return (
+
+ );
+ })}
+
+ {selectedIndex !== undefined && (
+
+
+
+ )}
+ {selectedIndex !== undefined && (
+
+
+ {selected !== undefined && (
+
+ )}
+
+
+
+
+
+ )}
+
+ );
+}
diff --git a/packages/exchange-backoffice-ui/src/forms/InputChoice.tsx b/packages/exchange-backoffice-ui/src/forms/InputChoice.tsx
new file mode 100644
index 000000000..dae5ff34a
--- /dev/null
+++ b/packages/exchange-backoffice-ui/src/forms/InputChoice.tsx
@@ -0,0 +1,119 @@
+import { TranslatedString } from "@gnu-taler/taler-util";
+import { Fragment, VNode, h } from "preact";
+import { LabelWithTooltipMaybeRequired, UIFormProps } from "./InputLine.js";
+import { useField } from "./useField.js";
+
+function classNames(...classes: string[]): string {
+ return classes.filter(Boolean).join(" ");
+}
+const memoryOptions = [
+ { name: "4 GB", inStock: true },
+ { name: "8 GB", inStock: true },
+ { name: "16 GB", inStock: true },
+ { name: "32 GB", inStock: true },
+ { name: "64 GB", inStock: true },
+ { name: "128 GB", inStock: false },
+];
+
+export interface Choice {
+ label: TranslatedString;
+ description?: TranslatedString;
+ value: string;
+}
+
+export function InputChoiceStacked(
+ props: {
+ choices: Choice[];
+ } & UIFormProps