@kamod-ch/ui 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/tree/tree-registry.ts","../src/components/tree/TreeProvider.tsx","../src/components/tree/tree-keyboard.ts","../src/components/tree/Tree.tsx","../src/components/tree/TreeLines.tsx","../src/components/tree/tree-icons.tsx","../src/components/tree/TreeNode.tsx","../src/components/tree/TreeItem.tsx","../src/components/tree/index.ts"],"names":["signal","useRef","jsx","jsxs","createContext","useContext","useLayoutEffect","toChildArray"],"mappings":"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","file":"chunk-YMKC3H55.js","sourcesContent":["import { type Signal, signal } from \"@preact/signals\";\n\nexport type TreeNodeRecord = {\n nodeId: string;\n parentId: string | null;\n disabled: boolean;\n hasChildren: boolean;\n data: unknown;\n element: HTMLElement | null;\n order: number;\n isLast: boolean;\n level: number;\n};\n\nexport class TreeRegistry {\n private nodes = new Map<string, TreeNodeRecord>();\n private childrenByParent = new Map<string | null, string[]>();\n private orderCounter = 0;\n readonly version: Signal<number> = signal(0);\n\n private bump() {\n this.version.value += 1;\n }\n\n register(node: Omit<TreeNodeRecord, \"order\" | \"isLast\" | \"level\"> & { level: number }) {\n const existing = this.nodes.get(node.nodeId);\n if (existing) {\n existing.parentId = node.parentId;\n existing.disabled = node.disabled;\n existing.hasChildren = node.hasChildren;\n existing.data = node.data;\n existing.element = node.element;\n existing.level = node.level;\n this.rebuildChildren(node.parentId);\n this.bump();\n return;\n }\n\n this.nodes.set(node.nodeId, {\n ...node,\n order: this.orderCounter++,\n isLast: false,\n });\n this.rebuildChildren(node.parentId);\n this.bump();\n }\n\n unregister(nodeId: string) {\n const node = this.nodes.get(nodeId);\n if (!node) return;\n const parentId = node.parentId;\n this.nodes.delete(nodeId);\n this.rebuildChildren(parentId);\n this.bump();\n }\n\n setElement(nodeId: string, element: HTMLElement | null) {\n const node = this.nodes.get(nodeId);\n if (!node || node.element === element) return;\n node.element = element;\n this.bump();\n }\n\n getNode(nodeId: string) {\n return this.nodes.get(nodeId);\n }\n\n getChildren(parentId: string | null) {\n return this.childrenByParent.get(parentId) ?? [];\n }\n\n getParent(nodeId: string) {\n const node = this.nodes.get(nodeId);\n if (!node?.parentId) return null;\n return this.nodes.get(node.parentId) ?? null;\n }\n\n isVisible(nodeId: string, expandedIds: ReadonlySet<string>) {\n let current = this.nodes.get(nodeId);\n if (!current) return false;\n while (current.parentId) {\n if (!expandedIds.has(current.parentId)) return false;\n current = this.nodes.get(current.parentId);\n if (!current) return false;\n }\n return true;\n }\n\n getVisibleActivatableIds(expandedIds: ReadonlySet<string>) {\n const rootIds = this.getChildren(null);\n const result: string[] = [];\n\n const walk = (ids: string[]) => {\n for (const id of ids) {\n const node = this.nodes.get(id);\n if (!node) continue;\n if (!this.isVisible(id, expandedIds)) continue;\n if (!node.disabled) result.push(id);\n if (node.hasChildren && expandedIds.has(id)) {\n walk(this.getChildren(id));\n }\n }\n };\n\n walk(rootIds);\n return result;\n }\n\n private rebuildChildren(parentId: string | null) {\n const childIds = [...this.nodes.values()]\n .filter((node) => node.parentId === parentId)\n .sort((a, b) => a.order - b.order)\n .map((node) => node.nodeId);\n\n this.childrenByParent.set(parentId, childIds);\n\n childIds.forEach((childId, index) => {\n const node = this.nodes.get(childId);\n if (node) node.isLast = index === childIds.length - 1;\n });\n }\n}\n","import { type Signal, signal } from \"@preact/signals\";\nimport type { ComponentChildren, JSX } from \"preact\";\nimport { createContext } from \"preact\";\nimport { useContext, useLayoutEffect, useMemo, useRef, useState } from \"preact/hooks\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\nimport { cn } from \"../../lib/utils\";\nimport { TreeRegistry } from \"./tree-registry\";\nimport type { TreeIcons } from \"./tree-types\";\n\nexport type TreeSelectionMode = \"none\" | \"single\" | \"multiple\";\n\nexport const treeVariants = tv({\n base: \"w-full rounded-lg border border-border bg-background\",\n variants: {\n variant: {\n default: \"\",\n outline: \"border-2\",\n ghost: \"border-transparent bg-transparent\",\n },\n size: {\n sm: \"text-sm\",\n default: \"\",\n lg: \"text-lg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n});\n\nexport const treeItemVariants = tv({\n base: [\n \"group/tree-item relative flex min-w-0 cursor-default select-none items-center rounded-md outline-none transition-colors\",\n \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n \"motion-reduce:transition-none\",\n ],\n variants: {\n variant: {\n default:\n \"hover:bg-accent/60 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground\",\n outline:\n \"hover:bg-accent/40 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground\",\n ghost:\n \"hover:bg-accent/50 data-[selected=true]:bg-accent/70 data-[selected=true]:text-accent-foreground\",\n },\n size: {\n sm: \"min-h-7 gap-1.5 px-2 py-1 text-sm\",\n default: \"min-h-8 gap-2 px-2.5 py-1.5 text-sm\",\n lg: \"min-h-10 gap-2.5 px-3 py-2 text-base\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n});\n\nexport type TreeProviderContextValue = {\n registry: TreeRegistry;\n expandedIds: Signal<Set<string>>;\n selectedIds: Signal<Set<string>>;\n selectionMode: TreeSelectionMode;\n showLines: boolean;\n showIcons: boolean;\n animateExpand: boolean;\n indent: number | string;\n icons?: TreeIcons;\n variant: NonNullable<VariantProps<typeof treeVariants>[\"variant\"]>;\n size: NonNullable<VariantProps<typeof treeVariants>[\"size\"]>;\n focusedId: Signal<string | null>;\n tabbableId: Signal<string | null>;\n isExpandedControlled: boolean;\n isSelectedControlled: boolean;\n setExpandedIds: (ids: string[]) => void;\n setSelectedIds: (ids: string[]) => void;\n toggleExpanded: (nodeId: string) => void;\n selectNode: (nodeId: string, options?: { additive?: boolean; toggle?: boolean }) => void;\n focusNode: (nodeId: string, options?: { moveDOMFocus?: boolean }) => void;\n getNodeData: (nodeId: string) => unknown;\n};\n\nconst TreeProviderContext = createContext<TreeProviderContextValue | null>(null);\n\nexport const useTreeProvider = () => {\n const context = useContext(TreeProviderContext);\n if (!context) throw new Error(\"Tree components must be used within TreeProvider\");\n return context;\n};\n\nexport type TreeItemContextValue = {\n nodeId: string;\n level: number;\n parentPath: boolean[];\n isLast: boolean;\n};\n\nexport const TreeItemContext = createContext<TreeItemContextValue | null>(null);\n\nexport const useTreeItemContext = () => useContext(TreeItemContext);\n\nexport type TreeProviderProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, \"class\"> &\n VariantProps<typeof treeVariants> & {\n class?: string;\n expandedIds?: readonly string[];\n defaultExpandedIds?: readonly string[];\n onExpandedChange?: (ids: string[]) => void;\n selectedIds?: readonly string[];\n defaultSelectedIds?: readonly string[];\n onSelectionChange?: (ids: string[]) => void;\n selectionMode?: TreeSelectionMode;\n showLines?: boolean;\n showIcons?: boolean;\n animateExpand?: boolean;\n indent?: number | string;\n icons?: TreeIcons;\n children?: ComponentChildren;\n };\n\nexport const TreeProvider = ({\n class: className,\n variant = \"default\",\n size = \"default\",\n expandedIds: expandedIdsProp,\n defaultExpandedIds = [],\n onExpandedChange,\n selectedIds: selectedIdsProp,\n defaultSelectedIds = [],\n onSelectionChange,\n selectionMode = \"none\",\n showLines = true,\n showIcons = true,\n animateExpand = true,\n indent = 20,\n icons,\n children,\n ...rest\n}: TreeProviderProps) => {\n const registryRef = useRef<TreeRegistry | null>(null);\n if (!registryRef.current) registryRef.current = new TreeRegistry();\n const registry = registryRef.current;\n\n const isExpandedControlled = expandedIdsProp !== undefined;\n const isSelectedControlled = selectedIdsProp !== undefined;\n\n const [internalExpanded, setInternalExpanded] = useState<string[]>(() => [...defaultExpandedIds]);\n const [internalSelected, setInternalSelected] = useState<string[]>(() => [...defaultSelectedIds]);\n\n const expandedArray = isExpandedControlled ? [...expandedIdsProp] : internalExpanded;\n const selectedArray = isSelectedControlled ? [...selectedIdsProp] : internalSelected;\n\n const expandedIds = useMemo(() => signal(new Set(expandedArray)), []);\n expandedIds.value = new Set(expandedArray);\n\n const selectedIds = useMemo(() => signal(new Set(selectedArray)), []);\n selectedIds.value = new Set(selectedArray);\n\n const focusedId = useMemo(() => signal<string | null>(null), []);\n const tabbableId = useMemo(() => signal<string | null>(null), []);\n\n const setExpandedIds = (ids: string[]) => {\n if (!isExpandedControlled) setInternalExpanded(ids);\n expandedIds.value = new Set(ids);\n onExpandedChange?.(ids);\n };\n\n const setSelectedIds = (ids: string[]) => {\n if (!isSelectedControlled) setInternalSelected(ids);\n selectedIds.value = new Set(ids);\n onSelectionChange?.(ids);\n };\n\n const focusNode = (nodeId: string, options?: { moveDOMFocus?: boolean }) => {\n const node = registry.getNode(nodeId);\n if (!node || node.disabled) return;\n focusedId.value = nodeId;\n tabbableId.value = nodeId;\n if (options?.moveDOMFocus !== false && node.element) {\n node.element.focus();\n }\n };\n\n const collapseFocusCorrection = (branchId: string) => {\n const focused = focusedId.value;\n if (!focused || focused === branchId) return;\n let current = registry.getNode(focused);\n while (current) {\n if (current.nodeId === branchId) {\n focusNode(branchId);\n return;\n }\n current = current.parentId ? registry.getNode(current.parentId) : undefined;\n }\n };\n\n const toggleExpanded = (nodeId: string) => {\n const next = new Set(expandedIds.value);\n if (next.has(nodeId)) {\n next.delete(nodeId);\n setExpandedIds([...next]);\n collapseFocusCorrection(nodeId);\n } else {\n next.add(nodeId);\n setExpandedIds([...next]);\n }\n };\n\n const selectNode = (nodeId: string, options?: { additive?: boolean; toggle?: boolean }) => {\n if (selectionMode === \"none\") return;\n const node = registry.getNode(nodeId);\n if (!node || node.disabled) return;\n\n const current = new Set(selectedIds.value);\n const isSelected = current.has(nodeId);\n\n if (selectionMode === \"single\") {\n if (options?.toggle && isSelected) {\n setSelectedIds([]);\n return;\n }\n setSelectedIds([nodeId]);\n return;\n }\n\n if (options?.additive) {\n const next = new Set(current);\n if (isSelected) next.delete(nodeId);\n else next.add(nodeId);\n setSelectedIds([...next]);\n return;\n }\n\n if (options?.toggle && isSelected) {\n current.delete(nodeId);\n setSelectedIds([...current]);\n return;\n }\n\n setSelectedIds([nodeId]);\n };\n\n const prevExpandedRef = useRef(expandedArray);\n useLayoutEffect(() => {\n const prev = new Set(prevExpandedRef.current);\n const next = new Set(expandedArray);\n for (const id of prev) {\n if (!next.has(id)) collapseFocusCorrection(id);\n }\n prevExpandedRef.current = expandedArray;\n });\n\n const contextValue: TreeProviderContextValue = {\n registry,\n expandedIds,\n selectedIds,\n selectionMode,\n showLines,\n showIcons,\n animateExpand,\n indent,\n icons,\n variant: variant ?? \"default\",\n size: size ?? \"default\",\n focusedId,\n tabbableId,\n isExpandedControlled,\n isSelectedControlled,\n setExpandedIds,\n setSelectedIds,\n toggleExpanded,\n selectNode,\n focusNode,\n getNodeData: (nodeId) => registry.getNode(nodeId)?.data,\n };\n\n return (\n <TreeProviderContext.Provider value={contextValue}>\n <div\n data-slot=\"tree-provider\"\n data-variant={variant ?? \"default\"}\n data-size={size ?? \"default\"}\n class={cn(\"w-full\", className)}\n {...rest}\n >\n {children}\n </div>\n </TreeProviderContext.Provider>\n );\n};\n\nexport type { VariantProps };\n","import type { JSX } from \"preact\";\nimport type { TreeProviderContextValue } from \"./TreeProvider\";\n\nconst isMetaLike = (event: KeyboardEvent) => event.ctrlKey || event.metaKey;\n\nexport const handleTreeKeyDown = (\n event: JSX.TargetedKeyboardEvent<HTMLDivElement>,\n tree: TreeProviderContextValue,\n) => {\n if (event.defaultPrevented) return;\n\n const target = event.target as HTMLElement | null;\n const itemEl = target?.closest('[role=\"treeitem\"]') as HTMLElement | null;\n if (!itemEl) return;\n\n const nodeId = itemEl.getAttribute(\"data-node-id\");\n if (!nodeId) return;\n\n const visible = tree.registry.getVisibleActivatableIds(tree.expandedIds.value);\n const index = visible.indexOf(nodeId);\n if (index === -1) return;\n\n const node = tree.registry.getNode(nodeId);\n if (!node) return;\n\n const moveFocus = (nextId: string) => {\n event.preventDefault();\n tree.focusNode(nextId);\n };\n\n switch (event.key) {\n case \"ArrowDown\": {\n if (index < visible.length - 1) moveFocus(visible[index + 1]);\n break;\n }\n case \"ArrowUp\": {\n if (index > 0) moveFocus(visible[index - 1]);\n break;\n }\n case \"Home\": {\n if (visible.length > 0) moveFocus(visible[0]);\n break;\n }\n case \"End\": {\n if (visible.length > 0) moveFocus(visible[visible.length - 1]);\n break;\n }\n case \"ArrowRight\": {\n event.preventDefault();\n if (node.hasChildren) {\n if (!tree.expandedIds.value.has(nodeId)) {\n tree.toggleExpanded(nodeId);\n } else {\n const children = tree.registry.getChildren(nodeId).filter((id) => {\n const child = tree.registry.getNode(id);\n return child && !child.disabled && tree.registry.isVisible(id, tree.expandedIds.value);\n });\n if (children[0]) tree.focusNode(children[0]);\n }\n }\n break;\n }\n case \"ArrowLeft\": {\n event.preventDefault();\n if (node.hasChildren && tree.expandedIds.value.has(nodeId)) {\n tree.toggleExpanded(nodeId);\n } else if (node.parentId) {\n tree.focusNode(node.parentId);\n }\n break;\n }\n case \"Enter\":\n case \" \": {\n if (event.key === \" \" && isMetaLike(event)) {\n event.preventDefault();\n tree.selectNode(nodeId, { additive: true, toggle: true });\n break;\n }\n event.preventDefault();\n if (node.hasChildren && !tree.expandedIds.value.has(nodeId)) {\n tree.toggleExpanded(nodeId);\n }\n if (tree.selectionMode !== \"none\") {\n tree.selectNode(nodeId, {\n toggle: tree.selectionMode === \"multiple\",\n });\n }\n break;\n }\n case \"a\":\n case \"A\": {\n if (!isMetaLike(event) || tree.selectionMode !== \"multiple\") break;\n event.preventDefault();\n tree.setSelectedIds(visible);\n break;\n }\n default:\n break;\n }\n};\n","import type { ComponentChildren, JSX } from \"preact\";\nimport { useRef } from \"preact/hooks\";\nimport { cn } from \"../../lib/utils\";\nimport { treeVariants, useTreeProvider } from \"./TreeProvider\";\nimport { handleTreeKeyDown } from \"./tree-keyboard\";\n\nexport type TreeProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, \"class\"> & {\n class?: string;\n children?: ComponentChildren;\n};\n\nexport const Tree = ({\n class: className,\n children,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ...rest\n}: TreeProps) => {\n const tree = useTreeProvider();\n const rootRef = useRef<HTMLDivElement>(null);\n\n if (!ariaLabel && !ariaLabelledBy) {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env\n ?.NODE_ENV;\n if (env !== \"production\") {\n console.warn(\n \"[kamod-ui] <Tree> requires an accessible name via aria-label or aria-labelledby.\",\n );\n }\n }\n\n const multiselectable = tree.selectionMode === \"multiple\";\n\n return (\n <div\n ref={rootRef}\n role=\"tree\"\n aria-multiselectable={multiselectable ? true : undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n data-slot=\"tree\"\n data-variant={tree.variant}\n data-size={tree.size}\n class={cn(treeVariants({ variant: tree.variant, size: tree.size }), className)}\n onKeyDown={(event) => {\n handleTreeKeyDown(event, tree);\n }}\n onFocus={(event) => {\n if (event.target !== event.currentTarget) return;\n const visible = tree.registry.getVisibleActivatableIds(tree.expandedIds.value);\n if (visible.length === 0) return;\n const current = tree.tabbableId.value;\n const target = current && visible.includes(current) ? current : visible[0];\n tree.focusNode(target);\n }}\n {...rest}\n >\n {children}\n </div>\n );\n};\n","import { cn } from \"../../lib/utils\";\n\nconst indentCSSValue = (indent: number | string) =>\n typeof indent === \"number\" ? `${indent}px` : indent;\n\nexport type TreeLinesProps = {\n level: number;\n parentPath: boolean[];\n isLast: boolean;\n indent: number | string;\n class?: string;\n};\n\nexport const TreeLines = ({\n level,\n parentPath,\n isLast,\n indent,\n class: className,\n}: TreeLinesProps) => {\n if (level <= 0) return null;\n const indentPx = indentCSSValue(indent);\n\n return (\n <div\n aria-hidden=\"true\"\n data-slot=\"tree-lines\"\n class={cn(\"pointer-events-none absolute inset-y-0 start-0\", className)}\n >\n {parentPath.map((pathIsLast, pathIndex) => {\n if (pathIsLast) return null;\n return (\n <span\n key={`line-${pathIndex}`}\n class=\"absolute top-0 bottom-0 w-px bg-border\"\n style={{ insetInlineStart: `calc(${pathIndex + 1} * ${indentPx})` }}\n />\n );\n })}\n <span\n class=\"absolute top-1/2 h-px bg-border\"\n style={{\n insetInlineStart: `calc(${level - 1} * ${indentPx} + ${indentPx} / 2)`,\n width: `calc(${indentPx} / 2)`,\n }}\n />\n {!isLast ? (\n <span\n class=\"absolute top-0 bottom-0 w-px bg-border\"\n style={{ insetInlineStart: `calc(${level} * ${indentPx})` }}\n />\n ) : null}\n </div>\n );\n};\n\nexport { indentCSSValue };\n","import type { ComponentChildren } from \"preact\";\nimport { cn } from \"../../lib/utils\";\nimport type { TreeIconProp, TreeIconState, TreeIcons } from \"./tree-types\";\n\nconst DefaultChevron = ({ expanded }: { expanded: boolean }) => (\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n class={cn(\n \"size-4 shrink-0 origin-center text-muted-foreground transition-transform duration-200 motion-reduce:transition-none\",\n expanded && \"rotate-90 rtl:-rotate-90\",\n )}\n >\n <path\n d=\"M6 4l4 4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst DefaultBranchIcon = () => (\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M2 4.5h8a2 2 0 012 2V12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path d=\"M12 12h2\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst DefaultLeafIcon = () => (\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M4 8h8M8 4v8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst renderIconProp = (\n icon: TreeIconProp | undefined,\n state: TreeIconState,\n): ComponentChildren => {\n if (icon == null) return null;\n if (typeof icon === \"function\") return icon(state);\n return icon;\n};\n\nexport type ResolveTreeIconOptions = {\n state: TreeIconState;\n icon?: TreeIconProp;\n expandedIcon?: ComponentChildren;\n selectedIcon?: ComponentChildren;\n disabledIcon?: ComponentChildren;\n providerIcons?: TreeIcons;\n showFallback?: boolean;\n};\n\n/** Priority: disabledIcon → selectedIcon → expandedIcon → node icon → provider default → internal fallback */\nexport const resolveTreeIcon = ({\n state,\n icon,\n expandedIcon,\n selectedIcon,\n disabledIcon,\n providerIcons,\n showFallback = true,\n}: ResolveTreeIconOptions): ComponentChildren => {\n if (state.disabled && disabledIcon != null) return disabledIcon;\n if (state.selected && selectedIcon != null) return selectedIcon;\n if (state.branch && state.expanded && expandedIcon != null) return expandedIcon;\n\n const nodeIcon = renderIconProp(icon, state);\n if (nodeIcon != null) return nodeIcon;\n\n if (providerIcons) {\n if (state.branch) {\n if (state.expanded && providerIcons.branchExpanded != null)\n return providerIcons.branchExpanded;\n if (providerIcons.branch != null) return providerIcons.branch;\n } else if (providerIcons.leaf != null) {\n return providerIcons.leaf;\n }\n }\n\n if (!showFallback) return null;\n return state.branch ? <DefaultBranchIcon /> : <DefaultLeafIcon />;\n};\n\nexport const resolveTreeExpanderIcon = (\n expanded: boolean,\n providerIcons?: TreeIcons,\n): ComponentChildren => {\n if (expanded && providerIcons?.expanderExpanded != null) return providerIcons.expanderExpanded;\n if (!expanded && providerIcons?.expander != null) return providerIcons.expander;\n return <DefaultChevron expanded={expanded} />;\n};\n","import type { ComponentChildren, JSX, RefObject } from \"preact\";\nimport { createContext, toChildArray } from \"preact\";\nimport { useContext, useLayoutEffect, useRef } from \"preact/hooks\";\nimport { useHeightDisclosureContent } from \"../../lib/disclosure/use-height-disclosure-content\";\nimport { cn } from \"../../lib/utils\";\nimport { indentCSSValue, TreeLines } from \"./TreeLines\";\nimport {\n TreeItemContext,\n treeItemVariants,\n useTreeItemContext,\n useTreeProvider,\n} from \"./TreeProvider\";\nimport { resolveTreeExpanderIcon, resolveTreeIcon } from \"./tree-icons\";\nimport type { TreeIconProp } from \"./tree-types\";\n\nexport type TreeNodeContextValue = {\n nodeId: string;\n disabled: boolean;\n hasChildren: boolean;\n data?: unknown;\n icon?: TreeIconProp;\n expandedIcon?: ComponentChildren;\n selectedIcon?: ComponentChildren;\n disabledIcon?: ComponentChildren;\n level: number;\n parentPath: boolean[];\n isLast: boolean;\n itemRef: RefObject<HTMLDivElement>;\n};\n\nconst TreeNodeContext = createContext<TreeNodeContextValue | null>(null);\n\nexport const useTreeNodeContext = () => {\n const context = useContext(TreeNodeContext);\n if (!context) throw new Error(\"Tree node subcomponents must be used within TreeNode\");\n return context;\n};\n\nexport type TreeNodeProps = {\n nodeId: string;\n disabled?: boolean;\n data?: unknown;\n icon?: TreeIconProp;\n expandedIcon?: ComponentChildren;\n selectedIcon?: ComponentChildren;\n disabledIcon?: ComponentChildren;\n children?: ComponentChildren;\n};\n\nexport const TreeNode = ({\n nodeId,\n disabled = false,\n data,\n icon,\n expandedIcon,\n selectedIcon,\n disabledIcon,\n children,\n}: TreeNodeProps) => {\n const tree = useTreeProvider();\n const parentItem = useTreeItemContext();\n const itemRef = useRef<HTMLDivElement>(null);\n\n const childArray = toChildArray(children);\n const hasChildren = childArray.some(\n (child) =>\n child != null &&\n typeof child === \"object\" &&\n \"type\" in child &&\n typeof child.type === \"function\" &&\n (child.type as { __kamodTreeContent?: boolean }).__kamodTreeContent === true,\n );\n\n const level = parentItem ? parentItem.level + 1 : 1;\n const parentPath = parentItem ? [...parentItem.parentPath, parentItem.isLast] : [];\n\n const registryVersion = tree.registry.version.value;\n const nodeRecord = tree.registry.getNode(nodeId);\n const isLast = nodeRecord?.isLast ?? false;\n void registryVersion;\n\n useLayoutEffect(() => {\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env\n ?.NODE_ENV;\n const existing = tree.registry.getNode(nodeId);\n if (\n env !== \"production\" &&\n existing &&\n existing.element &&\n existing.element !== itemRef.current\n ) {\n console.warn(`[kamod-ui] Duplicate Tree nodeId \"${nodeId}\" detected.`);\n }\n\n tree.registry.register({\n nodeId,\n parentId: parentItem?.nodeId ?? null,\n disabled,\n hasChildren,\n data,\n element: itemRef.current,\n level,\n });\n\n return () => {\n tree.registry.unregister(nodeId);\n };\n }, [nodeId, parentItem?.nodeId, disabled, hasChildren, data, level, tree.registry]);\n\n useLayoutEffect(() => {\n const visible = tree.registry.getVisibleActivatableIds(tree.expandedIds.value);\n if (visible.length === 0) {\n tree.tabbableId.value = null;\n return;\n }\n if (!tree.tabbableId.value || !visible.includes(tree.tabbableId.value)) {\n tree.tabbableId.value = visible[0];\n }\n }, [tree.registry.version.value, tree.expandedIds.value, tree]);\n\n const contextValue: TreeNodeContextValue = {\n nodeId,\n disabled,\n hasChildren,\n data,\n icon,\n expandedIcon,\n selectedIcon,\n disabledIcon,\n level,\n parentPath,\n isLast,\n itemRef,\n };\n\n return (\n <TreeNodeContext.Provider value={contextValue}>\n <div data-slot=\"tree-node\" data-node-id={nodeId} class=\"relative min-w-0\">\n {children}\n </div>\n </TreeNodeContext.Provider>\n );\n};\n\nexport type TreeNodeTriggerProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, \"class\"> & {\n class?: string;\n children?: ComponentChildren;\n};\n\nexport const TreeNodeTrigger = ({\n class: className,\n children,\n onClick,\n onFocus,\n ...rest\n}: TreeNodeTriggerProps) => {\n const tree = useTreeProvider();\n const node = useTreeNodeContext();\n\n useLayoutEffect(() => {\n tree.registry.setElement(node.nodeId, node.itemRef.current);\n });\n\n const isExpanded = tree.expandedIds.value.has(node.nodeId);\n const isSelected = tree.selectedIds.value.has(node.nodeId);\n const isTabbable = tree.tabbableId.value === node.nodeId;\n\n const handleItemClick = (event: JSX.TargetedMouseEvent<HTMLDivElement>) => {\n if (node.disabled) return;\n tree.focusNode(node.nodeId);\n if (tree.selectionMode !== \"none\") {\n tree.selectNode(node.nodeId, {\n toggle: tree.selectionMode === \"multiple\" && (event.metaKey || event.ctrlKey),\n additive: tree.selectionMode === \"multiple\" && (event.metaKey || event.ctrlKey),\n });\n }\n onClick?.(event);\n };\n\n return (\n <div\n ref={node.itemRef}\n role=\"treeitem\"\n data-node-id={node.nodeId}\n data-slot=\"tree-node-trigger\"\n data-state={node.hasChildren ? (isExpanded ? \"open\" : \"closed\") : \"leaf\"}\n data-selected={isSelected ? \"true\" : undefined}\n data-disabled={node.disabled ? \"\" : undefined}\n data-level={node.level}\n aria-level={node.level}\n aria-expanded={node.hasChildren ? isExpanded : undefined}\n aria-selected={tree.selectionMode !== \"none\" ? isSelected : undefined}\n aria-disabled={node.disabled || undefined}\n tabIndex={node.disabled ? -1 : isTabbable ? 0 : -1}\n class={cn(\n treeItemVariants({ variant: tree.variant, size: tree.size }),\n \"relative\",\n node.disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n style={{ paddingInlineStart: `calc(${node.level} * ${indentCSSValue(tree.indent)})` }}\n onClick={handleItemClick}\n onFocus={(event) => {\n tree.focusedId.value = node.nodeId;\n tree.tabbableId.value = node.nodeId;\n onFocus?.(event);\n }}\n {...rest}\n >\n {tree.showLines ? (\n <TreeLines\n level={node.level}\n parentPath={node.parentPath}\n isLast={node.isLast}\n indent={tree.indent}\n />\n ) : null}\n {children}\n </div>\n );\n};\n\nexport type TreeExpanderProps = Omit<JSX.HTMLAttributes<HTMLSpanElement>, \"class\"> & {\n class?: string;\n};\n\nexport const TreeExpander = ({ class: className, ...rest }: TreeExpanderProps) => {\n const tree = useTreeProvider();\n const node = useTreeNodeContext();\n const isExpanded = tree.expandedIds.value.has(node.nodeId);\n\n const handleExpandToggle = (event: Event) => {\n event.stopPropagation();\n if (node.disabled || !node.hasChildren) return;\n tree.toggleExpanded(node.nodeId);\n };\n\n if (!node.hasChildren) {\n return <span class={cn(\"inline-flex size-4 shrink-0\", className)} aria-hidden=\"true\" />;\n }\n\n return (\n <span\n data-slot=\"tree-expander\"\n data-expanded={isExpanded ? \"true\" : \"false\"}\n data-disabled={node.disabled ? \"\" : undefined}\n class={cn(\n \"relative z-[1] inline-flex size-4 shrink-0 cursor-pointer items-center justify-center\",\n className,\n )}\n aria-hidden=\"true\"\n onClick={handleExpandToggle}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n event.stopPropagation();\n handleExpandToggle(event);\n }\n rest.onKeyDown?.(event);\n }}\n {...rest}\n >\n {resolveTreeExpanderIcon(isExpanded, tree.icons)}\n </span>\n );\n};\n\nexport type TreeIconProps = Omit<JSX.HTMLAttributes<HTMLSpanElement>, \"class\"> & {\n class?: string;\n icon?: TreeIconProp;\n expandedIcon?: ComponentChildren;\n selectedIcon?: ComponentChildren;\n disabledIcon?: ComponentChildren;\n};\n\nexport const TreeIcon = ({\n class: className,\n icon: iconProp,\n expandedIcon: expandedIconProp,\n selectedIcon: selectedIconProp,\n disabledIcon: disabledIconProp,\n ...rest\n}: TreeIconProps) => {\n const tree = useTreeProvider();\n const node = useTreeNodeContext();\n\n if (!tree.showIcons) return null;\n\n const isExpanded = tree.expandedIds.value.has(node.nodeId);\n const isSelected = tree.selectedIds.value.has(node.nodeId);\n\n const iconState = {\n nodeId: node.nodeId,\n branch: node.hasChildren,\n expanded: isExpanded,\n selected: isSelected,\n disabled: node.disabled,\n level: node.level,\n };\n\n const hasIconSlot =\n iconProp != null ||\n node.icon != null ||\n node.expandedIcon != null ||\n node.selectedIcon != null ||\n node.disabledIcon != null ||\n expandedIconProp != null ||\n selectedIconProp != null ||\n disabledIconProp != null ||\n tree.icons != null;\n\n if (!hasIconSlot) return null;\n\n const content = resolveTreeIcon({\n state: iconState,\n icon: iconProp ?? node.icon,\n expandedIcon: expandedIconProp ?? node.expandedIcon,\n selectedIcon: selectedIconProp ?? node.selectedIcon,\n disabledIcon: disabledIconProp ?? node.disabledIcon,\n providerIcons: tree.icons,\n showFallback: tree.icons != null,\n });\n\n return (\n <span\n data-slot=\"tree-icon\"\n data-expanded={isExpanded ? \"true\" : \"false\"}\n data-selected={isSelected ? \"true\" : undefined}\n data-disabled={node.disabled ? \"\" : undefined}\n class={cn(\n \"relative z-[1] inline-flex size-4 shrink-0 items-center justify-center [&_svg]:size-4\",\n className,\n )}\n aria-hidden=\"true\"\n {...rest}\n >\n {content}\n </span>\n );\n};\n\nexport type TreeLabelProps = Omit<JSX.HTMLAttributes<HTMLSpanElement>, \"class\"> & {\n class?: string;\n children?: ComponentChildren;\n};\n\nexport const TreeLabel = ({ class: className, children, ...rest }: TreeLabelProps) => (\n <span\n data-slot=\"tree-label\"\n class={cn(\"relative z-[1] min-w-0 flex-1 truncate text-start\", className)}\n {...rest}\n >\n {children}\n </span>\n);\n\nexport type TreeNodeActionsProps = Omit<JSX.HTMLAttributes<HTMLSpanElement>, \"class\"> & {\n class?: string;\n children?: ComponentChildren;\n};\n\nexport const TreeNodeActions = ({\n class: className,\n children,\n onClick,\n onKeyDown,\n ...rest\n}: TreeNodeActionsProps) => (\n <span\n data-slot=\"tree-node-actions\"\n class={cn(\"relative z-[1] ms-auto inline-flex shrink-0 items-center gap-1\", className)}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.(event);\n }}\n onKeyDown={(event) => {\n event.stopPropagation();\n onKeyDown?.(event);\n }}\n {...rest}\n >\n {children}\n </span>\n);\n\nexport type TreeNodeContentProps = {\n children?: ComponentChildren;\n class?: string;\n};\n\nexport const TreeNodeContent = ({ children, class: className }: TreeNodeContentProps) => {\n const tree = useTreeProvider();\n const node = useTreeNodeContext();\n const isExpanded = tree.expandedIds.value.has(node.nodeId);\n\n const {\n allowRender,\n isAnimatingClose,\n isAnimatingOpen,\n outerRef,\n innerRef,\n handleTransitionEnd,\n } = useHeightDisclosureContent({\n open: isExpanded,\n forceMount: !tree.animateExpand,\n });\n\n const showBranch = node.hasChildren && (tree.animateExpand ? allowRender : isExpanded);\n\n if (!node.hasChildren) return null;\n\n const itemContextValue = {\n nodeId: node.nodeId,\n level: node.level,\n parentPath: node.parentPath,\n isLast: node.isLast,\n };\n\n return (\n <div\n role=\"group\"\n data-slot=\"tree-node-content\"\n class={className}\n hidden={!showBranch && !isAnimatingClose}\n aria-hidden={!isExpanded && !isAnimatingClose}\n >\n {tree.animateExpand ? (\n <div\n ref={outerRef}\n data-slot=\"tree-node-content-outer\"\n data-state={isExpanded ? \"open\" : \"closed\"}\n onTransitionEnd={handleTransitionEnd}\n class={cn(\n \"min-h-0 overflow-hidden\",\n (isAnimatingOpen || isAnimatingClose) && \"will-change-[height]\",\n )}\n inert={!isExpanded || undefined}\n >\n <div ref={innerRef} data-slot=\"tree-node-content-inner\">\n <TreeItemContext.Provider value={itemContextValue}>{children}</TreeItemContext.Provider>\n </div>\n </div>\n ) : isExpanded ? (\n <TreeItemContext.Provider value={itemContextValue}>{children}</TreeItemContext.Provider>\n ) : null}\n </div>\n );\n};\n\nTreeNodeContent.__kamodTreeContent = true;\n","import type { ComponentChildren, JSX } from \"preact\";\nimport { toChildArray } from \"preact\";\nimport {\n TreeExpander,\n TreeIcon,\n TreeLabel,\n TreeNode,\n TreeNodeActions,\n TreeNodeContent,\n TreeNodeTrigger,\n} from \"./TreeNode\";\nimport type { TreeIconProp } from \"./tree-types\";\n\nexport type TreeItemProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, \"class\"> & {\n nodeId: string;\n label: ComponentChildren;\n icon?: TreeIconProp;\n expandedIcon?: ComponentChildren;\n selectedIcon?: ComponentChildren;\n disabledIcon?: ComponentChildren;\n endContent?: ComponentChildren;\n data?: unknown;\n disabled?: boolean;\n class?: string;\n children?: ComponentChildren;\n};\n\nexport const TreeItem = ({\n nodeId,\n label,\n icon,\n expandedIcon,\n selectedIcon,\n disabledIcon,\n endContent,\n data,\n disabled = false,\n class: className,\n children,\n ...rest\n}: TreeItemProps) => {\n const childArray = toChildArray(children);\n const hasChildren = childArray.length > 0;\n\n return (\n <TreeNode\n nodeId={nodeId}\n disabled={disabled}\n data={data}\n icon={icon}\n expandedIcon={expandedIcon}\n selectedIcon={selectedIcon}\n disabledIcon={disabledIcon}\n >\n <TreeNodeTrigger class={className} {...rest}>\n <TreeExpander />\n <TreeIcon />\n <TreeLabel>{label}</TreeLabel>\n {endContent ? <TreeNodeActions>{endContent}</TreeNodeActions> : null}\n </TreeNodeTrigger>\n {hasChildren ? <TreeNodeContent>{children}</TreeNodeContent> : null}\n </TreeNode>\n );\n};\n","import { Tree } from \"./Tree\";\nimport { TreeItem } from \"./TreeItem\";\nimport { TreeLines } from \"./TreeLines\";\nimport {\n TreeExpander,\n TreeIcon,\n TreeLabel,\n TreeNode,\n TreeNodeActions,\n TreeNodeContent,\n TreeNodeTrigger,\n useTreeNodeContext,\n} from \"./TreeNode\";\nimport {\n TreeProvider,\n treeItemVariants,\n treeVariants,\n useTreeItemContext,\n useTreeProvider,\n} from \"./TreeProvider\";\n\nexport type { TreeProps } from \"./Tree\";\nexport type { TreeItemProps } from \"./TreeItem\";\nexport type { TreeLinesProps } from \"./TreeLines\";\nexport type {\n TreeExpanderProps,\n TreeIconProps,\n TreeLabelProps,\n TreeNodeActionsProps,\n TreeNodeContentProps,\n TreeNodeContextValue,\n TreeNodeProps,\n TreeNodeTriggerProps,\n} from \"./TreeNode\";\nexport type {\n TreeItemContextValue,\n TreeProviderContextValue,\n TreeProviderProps,\n TreeSelectionMode,\n} from \"./TreeProvider\";\nexport type { TreeIconProp, TreeIconRender, TreeIconState, TreeIcons } from \"./tree-types\";\nexport {\n Tree,\n TreeExpander,\n TreeIcon,\n TreeItem,\n TreeLabel,\n TreeLines,\n TreeNode,\n TreeNodeActions,\n TreeNodeContent,\n TreeNodeTrigger,\n TreeProvider,\n treeItemVariants,\n treeVariants,\n useTreeItemContext,\n useTreeNodeContext,\n useTreeProvider,\n};\n\nexport default {\n Provider: TreeProvider,\n Root: Tree,\n Item: TreeItem,\n Node: TreeNode,\n NodeTrigger: TreeNodeTrigger,\n Expander: TreeExpander,\n Icon: TreeIcon,\n Label: TreeLabel,\n NodeActions: TreeNodeActions,\n NodeContent: TreeNodeContent,\n Lines: TreeLines,\n};\n"]}
@@ -0,0 +1,24 @@
1
+ import { v as TreeProviderProps, A as TreeProps, i as TreeItemProps, r as TreeNodeProps, t as TreeNodeTriggerProps, b as TreeExpanderProps, B as TreeIconProps, C as TreeLabelProps, o as TreeNodeActionsProps, q as TreeNodeContentProps, l as TreeLinesProps } from '../../TreeProvider-Cpu8yo3y.js';
2
+ export { T as Tree, a as TreeExpander, c as TreeIcon, d as TreeIconProp, e as TreeIconRender, f as TreeIconState, g as TreeIcons, h as TreeItem, D as TreeItemContextValue, j as TreeLabel, k as TreeLines, m as TreeNode, n as TreeNodeActions, p as TreeNodeContent, E as TreeNodeContextValue, s as TreeNodeTrigger, u as TreeProvider, F as TreeProviderContextValue, w as TreeSelectionMode, x as treeItemVariants, y as treeVariants, G as useTreeItemContext, z as useTreeNodeContext, H as useTreeProvider } from '../../TreeProvider-Cpu8yo3y.js';
3
+ import * as preact from 'preact';
4
+ import 'tailwind-variants';
5
+ import '@preact/signals';
6
+
7
+ declare const _default: {
8
+ Provider: ({ class: className, variant, size, expandedIds: expandedIdsProp, defaultExpandedIds, onExpandedChange, selectedIds: selectedIdsProp, defaultSelectedIds, onSelectionChange, selectionMode, showLines, showIcons, animateExpand, indent, icons, children, ...rest }: TreeProviderProps) => preact.JSX.Element;
9
+ Root: ({ class: className, children, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...rest }: TreeProps) => preact.JSX.Element;
10
+ Item: ({ nodeId, label, icon, expandedIcon, selectedIcon, disabledIcon, endContent, data, disabled, class: className, children, ...rest }: TreeItemProps) => preact.JSX.Element;
11
+ Node: ({ nodeId, disabled, data, icon, expandedIcon, selectedIcon, disabledIcon, children, }: TreeNodeProps) => preact.JSX.Element;
12
+ NodeTrigger: ({ class: className, children, onClick, onFocus, ...rest }: TreeNodeTriggerProps) => preact.JSX.Element;
13
+ Expander: ({ class: className, ...rest }: TreeExpanderProps) => preact.JSX.Element;
14
+ Icon: ({ class: className, icon: iconProp, expandedIcon: expandedIconProp, selectedIcon: selectedIconProp, disabledIcon: disabledIconProp, ...rest }: TreeIconProps) => preact.JSX.Element | null;
15
+ Label: ({ class: className, children, ...rest }: TreeLabelProps) => preact.JSX.Element;
16
+ NodeActions: ({ class: className, children, onClick, onKeyDown, ...rest }: TreeNodeActionsProps) => preact.JSX.Element;
17
+ NodeContent: {
18
+ ({ children, class: className }: TreeNodeContentProps): preact.JSX.Element | null;
19
+ __kamodTreeContent: boolean;
20
+ };
21
+ Lines: ({ level, parentPath, isLast, indent, class: className, }: TreeLinesProps) => preact.JSX.Element | null;
22
+ };
23
+
24
+ export { TreeExpanderProps, TreeIconProps, TreeItemProps, TreeLabelProps, TreeLinesProps, TreeNodeActionsProps, TreeNodeContentProps, TreeNodeProps, TreeNodeTriggerProps, TreeProps, TreeProviderProps, _default as default };
@@ -0,0 +1,5 @@
1
+ export { Tree, TreeExpander, TreeIcon, TreeItem, TreeLabel, TreeLines, TreeNode, TreeNodeActions, TreeNodeContent, TreeNodeTrigger, TreeProvider, tree_default as default, treeItemVariants, treeVariants, useTreeItemContext, useTreeNodeContext, useTreeProvider } from '../../chunk-YMKC3H55.js';
2
+ import '../../chunk-ISISDJ3Z.js';
3
+ import '../../chunk-XIANSPQO.js';
4
+ //# sourceMappingURL=index.js.map
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
package/dist/index.d.ts CHANGED
@@ -65,6 +65,7 @@ export { Toaster, useToast } from './components/toast/index.js';
65
65
  export { T as Toggle } from './Toggle-BgvkYUI8.js';
66
66
  export { T as ToggleGroup, a as ToggleGroupItem } from './ToggleGroup-CqYICGsS.js';
67
67
  export { T as Tooltip, a as TooltipContent, b as TooltipProvider, c as TooltipTrigger } from './Tooltip-Ba3GxE7u.js';
68
+ export { T as Tree, a as TreeExpander, b as TreeExpanderProps, c as TreeIcon, d as TreeIconProp, e as TreeIconRender, f as TreeIconState, g as TreeIcons, h as TreeItem, i as TreeItemProps, j as TreeLabel, k as TreeLines, l as TreeLinesProps, m as TreeNode, n as TreeNodeActions, o as TreeNodeActionsProps, p as TreeNodeContent, q as TreeNodeContentProps, r as TreeNodeProps, s as TreeNodeTrigger, t as TreeNodeTriggerProps, u as TreeProvider, v as TreeProviderProps, w as TreeSelectionMode, x as treeItemVariants, y as treeVariants, z as useTreeNodeContext } from './TreeProvider-Cpu8yo3y.js';
68
69
  export { T as Typography, a as TypographyVariants, t as typography } from './Typography-Df9IVmw2.js';
69
70
  export { Video } from './components/video/index.js';
70
71
  export { MODAL_DIALOG_PANEL_OUTSIDE_SLOP_PX, createDismissableLayer, createIdFactory, createRovingFocus, getFocusableElements, isPointerWithinModalDialogPanelSlop, trapFocus } from './lib/interactive/index.js';
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export { Toaster, useToast } from './chunk-7MITRFPE.js';
2
2
  export { Toggle } from './chunk-XGVQXRLA.js';
3
3
  export { ToggleGroup, ToggleGroupItem } from './chunk-5ATODZ6L.js';
4
+ export { Tree, TreeExpander, TreeIcon, TreeItem, TreeLabel, TreeLines, TreeNode, TreeNodeActions, TreeNodeContent, TreeNodeTrigger, TreeProvider, treeItemVariants, treeVariants, useTreeNodeContext } from './chunk-YMKC3H55.js';
4
5
  export { Typography, typography } from './chunk-4ZFKDNSK.js';
5
6
  export { Video } from './chunk-AYLEWD77.js';
6
7
  export { Slider } from './chunk-GPRE2VWB.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kamod-ch/ui",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Lightweight Preact + Tailwind UI components: composable primitives you can customize, extend, and ship without a heavy runtime.",
5
5
  "keywords": [
6
6
  "components",
@@ -304,6 +304,10 @@
304
304
  "types": "./dist/components/toggle-group/index.d.ts",
305
305
  "import": "./dist/components/toggle-group/index.js"
306
306
  },
307
+ "./tree": {
308
+ "types": "./dist/components/tree/index.d.ts",
309
+ "import": "./dist/components/tree/index.js"
310
+ },
307
311
  "./tooltip": {
308
312
  "types": "./dist/components/tooltip/index.d.ts",
309
313
  "import": "./dist/components/tooltip/index.js"
@@ -335,6 +339,7 @@
335
339
  "@testing-library/preact": "^3.2.4",
336
340
  "@vitest/coverage-v8": "^4.1.11",
337
341
  "jsdom": "^30.0.1",
342
+ "preact-render-to-string": "^6.7.0",
338
343
  "publint": "^0.3.24",
339
344
  "tailwindcss": "^4.3.3",
340
345
  "tsup": "^8.5.1",
@@ -354,11 +359,12 @@
354
359
  "node": ">=20"
355
360
  },
356
361
  "scripts": {
357
- "build": "tsup && cp src/theme.css dist/theme.css",
362
+ "build": "NODE_OPTIONS=--max-old-space-size=8192 tsup && cp src/theme.css dist/theme.css",
358
363
  "test": "vitest run",
359
364
  "test:coverage": "vitest run --coverage",
360
365
  "test:watch": "vitest",
361
366
  "typecheck": "tsc --noEmit",
367
+ "typecheck:emit": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc --emitDeclarationOnly --declaration --declarationMap false",
362
368
  "lint": "oxlint .",
363
369
  "publint": "publint",
364
370
  "attw": "attw --pack . --profile esm-only --exclude-entrypoints ./theme.css"