+
+ {children !== undefined &&
+ children.map((node) => (
+
+ ))}
+ {hasLoadMore && (
+
+ )}
+ {inputNode.isLoadingSiblings === true &&
}
+
+ );
+
+ function onSelectNode(node: TreeNodeType): void {
+ if (props.onSelectNode === undefined) {
+ return;
+ }
+ props.onSelectNode(node);
+ }
+
+ function onToggleNode(node: TreeNodeType): void {
+ if (node.isCheckboxEnabled !== true || node.checkboxState === undefined) {
+ return;
+ }
+ if (props.onToggleNode === undefined) {
+ return;
+ }
+ props.onToggleNode(node);
+ }
+
+ function onExpandNode(node: TreeNodeType): void {
+ if (!node.isParent) {
+ return;
+ }
+ node.isExpanded = !node.isExpanded;
+ }
+
+ function onLoadMore(node: TreeNodeType): void {
+ if (props.loader === undefined) {
+ return;
+ }
+ if (node.loadSiblings === undefined) {
+ return;
+ }
+ void node.loadSiblings(props.loader);
+ }
+
+ function onHover(node: TreeNodeType, value: boolean): void {
+ if (!hasHover) {
+ return;
+ }
+ setHover(value);
+ }
+};
+
+function getBackgroundColor(node: TreeNodeType, hover: boolean): string | undefined {
+ if (node.isSelected) {
+ return Colors['surface--interactive--toggled-pressed'];
+ }
+ if (hover) {
+ return Colors['surface--interactive--hover'];
+ }
+ return undefined;
+}
+
+function getTextColor(_node: TreeNodeType): string | undefined {
+ return Colors['text-icon--strong'];
+}
diff --git a/react-components/src/advanced-tree-view/view/advanced-tree-view-props.ts b/react-components/src/advanced-tree-view/view/advanced-tree-view-props.ts
new file mode 100644
index 0000000000..0741115f76
--- /dev/null
+++ b/react-components/src/advanced-tree-view/view/advanced-tree-view-props.ts
@@ -0,0 +1,42 @@
+/*!
+ * Copyright 2025 Cognite AS
+ */
+import { type IconProps } from '@cognite/cogs-icons';
+
+import { type ILazyLoader } from '../model/i-lazy-loader';
+import { type TreeNodeType } from '../model/tree-node-type';
+import { type IconName, type TreeNodeAction } from '../model/types';
+import { type FC } from 'react';
+
+export type AdvancedTreeViewProps = {
+ // Appearance
+ showRoot?: boolean; // Show root, default is true
+ hasHover?: boolean; // Default true, If this is set, it uses the hover color for the mouse over effect
+ hasCheckboxes?: boolean; // Default is true, but if the node has checkboxState == undefined, it will not be shown anyway
+
+ // Labels are not translated. Should be done on the app side?
+ loadingLabel?: string; // Default is 'Loading...'
+ loadMoreLabel?: string; // Default is 'Load more...'
+ maxLabelLength?: number; // Max length of label before it is truncated and a tooltip will appear
+
+ // Event handlers
+ onSelectNode?: TreeNodeAction; // Called when user select a node
+ onToggleNode?: TreeNodeAction; // Called when user toggle a node
+ onClickInfo?: TreeNodeAction; // Called when user click the info icon, if undefined, no info icon will appear
+ getIconFromIconName?: GetIconFromIconNameFn; // Function to get the icon for a node, if not set no icon will appear
+
+ // The root node of the tree (used only if loader is not set)
+ root?: TreeNodeType;
+
+ // Lazy loading manager (if this is set, the root above will be ignore,
+ // because the root is taken from the lazy loader)
+ loader?: ILazyLoader;
+};
+
+/*
+ * Convert between a string to the actual Cogs icon component.
+ * This is made to avoid references to Cogs in the data model
+ * so the data model can be independent on JXS.
+ */
+
+export type GetIconFromIconNameFn = (icon: IconName) => FC