/* Copyright 2026 Marimo. All rights reserved. */ import { EditIcon } from "lucide-react"; import React, { useState } from "react"; import { cn } from "@/utils/cn"; import { Combobox, ComboboxItem } from "../ui/combobox"; import { Textarea } from "../ui/textarea"; import { Toggle } from "../ui/toggle"; import { Tooltip } from "../ui/tooltip"; interface Props { options: string[]; value: string[]; className?: string; placeholder?: string; comboBoxClassName?: string; textAreaClassName?: string; onChange: (value: string[] | null) => void; } // new-line separated const DELIMINATOR = "\n"; /** * Switch between multi-select options or using a textarea. */ export const SwitchableMultiSelect: React.FC = ({ value, options, onChange, className, placeholder, textAreaClassName, comboBoxClassName, }) => { const [showTextArea, setShowTextArea] = useState(false); const valueAsArray = ensureStringArray(value); const renderInput = () => { if (showTextArea) { return ( ); } return ( option} className={cn("w-full max-w-[400px]", comboBoxClassName)} multiple={true} value={valueAsArray} onValueChange={onChange} keepPopoverOpenOnSelect={true} chips={true} chipsClassName="flex-row flex-wrap min-w-[210px]" > {options.map((option) => ( {option} ))} ); }; return (
{renderInput()}
); }; /** * Treat a textarea as a multi-select, * where each line is a value. */ export const TextAreaMultiSelect: React.FC<{ value: string[]; onChange: (value: string[]) => void; className?: string; placeholder?: string; }> = (props) => { const { className, value, onChange, placeholder } = props; const valueAsArray = ensureStringArray(value); return (