import { createSignal, For, Show, splitProps } from "solid-js"; import type { Component, JSX } from "solid-js"; export type TreeNode = { id: string; label: string; icon?: JSX.Element; children?: TreeNode[] }; type TreeViewProps = { nodes: TreeNode[]; onSelect?: (node: TreeNode) => void; class?: string }; type TreeNodeItemProps = { node: TreeNode; level: number; onSelect?: (node: TreeNode) => void }; const ChevronIcon: Component<{ expanded: boolean }> = (props) => ( ); const TreeNodeItem: Component = (props) => { const [expanded, setExpanded] = createSignal(false); const hasChildren = () => props.node.children && props.node.children.length > 0; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); if (hasChildren()) { setExpanded(!expanded()); } props.onSelect?.(props.node); } else if (e.key === "ArrowRight" && hasChildren() && !expanded()) { setExpanded(true); } else if (e.key === "ArrowLeft" && expanded()) { setExpanded(false); } }; return (
  • { if (hasChildren()) setExpanded(!expanded()); props.onSelect?.(props.node); }} onKeyDown={handleKeyDown} tabIndex={0} role="button"> }> {props.node.icon} {props.node.label}
      {(child) => }
  • ); }; export const TreeView: Component = (props) => { const [local, others] = splitProps(props, ["nodes", "onSelect", "class"]); return ( ); };