Spaces:
Running
on
Zero
Running
on
Zero
| import { $el } from "../ui.js"; | |
| /** | |
| * @typedef { { text: string, value?: string, tooltip?: string } } ToggleSwitchItem | |
| */ | |
| /** | |
| * Creates a toggle switch element | |
| * @param { string } name | |
| * @param { Array<string | ToggleSwitchItem } items | |
| * @param { Object } [opts] | |
| * @param { (e: { item: ToggleSwitchItem, prev?: ToggleSwitchItem }) => void } [opts.onChange] | |
| */ | |
| export function toggleSwitch(name, items, { onChange } = {}) { | |
| let selectedIndex; | |
| let elements; | |
| function updateSelected(index) { | |
| if (selectedIndex != null) { | |
| elements[selectedIndex].classList.remove("comfy-toggle-selected"); | |
| } | |
| onChange?.({ item: items[index], prev: selectedIndex == null ? undefined : items[selectedIndex] }); | |
| selectedIndex = index; | |
| elements[selectedIndex].classList.add("comfy-toggle-selected"); | |
| } | |
| elements = items.map((item, i) => { | |
| if (typeof item === "string") item = { text: item }; | |
| if (!item.value) item.value = item.text; | |
| const toggle = $el( | |
| "label", | |
| { | |
| textContent: item.text, | |
| title: item.tooltip ?? "", | |
| }, | |
| $el("input", { | |
| name, | |
| type: "radio", | |
| value: item.value ?? item.text, | |
| checked: item.selected, | |
| onchange: () => { | |
| updateSelected(i); | |
| }, | |
| }) | |
| ); | |
| if (item.selected) { | |
| updateSelected(i); | |
| } | |
| return toggle; | |
| }); | |
| const container = $el("div.comfy-toggle-switch", elements); | |
| if (selectedIndex == null) { | |
| elements[0].children[0].checked = true; | |
| updateSelected(0); | |
| } | |
| return container; | |
| } | |