|
| 1 | +--- |
| 2 | +title: TreeView |
| 3 | +componentId: tree_view |
| 4 | +status: Draft |
| 5 | +description: A hierarchical list of items where nested items can be expanded and collapsed. |
| 6 | +--- |
| 7 | + |
| 8 | +## Examples |
| 9 | + |
| 10 | +### File tree navigation without directory links |
| 11 | + |
| 12 | +```jsx live drafts |
| 13 | +<nav aria-label="File navigation"> |
| 14 | + <TreeView aria-label="File navigation"> |
| 15 | + <TreeView.Item> |
| 16 | + src |
| 17 | + <TreeView.SubTree> |
| 18 | + <TreeView.LinkItem href="#">Avatar.tsx</TreeView.LinkItem> |
| 19 | + <TreeView.Item> |
| 20 | + Button |
| 21 | + <TreeView.SubTree> |
| 22 | + <TreeView.LinkItem href="#">Button.tsx</TreeView.LinkItem> |
| 23 | + <TreeView.LinkItem href="#">Button.test.tsx</TreeView.LinkItem> |
| 24 | + </TreeView.SubTree> |
| 25 | + </TreeView.Item> |
| 26 | + </TreeView.SubTree> |
| 27 | + </TreeView.Item> |
| 28 | + <TreeView.Item> |
| 29 | + public |
| 30 | + <TreeView.SubTree> |
| 31 | + <TreeView.LinkItem href="#">index.html</TreeView.LinkItem> |
| 32 | + <TreeView.LinkItem href="#">favicon.ico</TreeView.LinkItem> |
| 33 | + </TreeView.SubTree> |
| 34 | + </TreeView.Item> |
| 35 | + <TreeView.LinkItem href="#">package.json</TreeView.LinkItem> |
| 36 | + </TreeView> |
| 37 | +</nav> |
| 38 | +``` |
| 39 | + |
| 40 | +### File tree navigation with directory links |
| 41 | + |
| 42 | +```jsx live drafts |
| 43 | +<nav aria-label="File navigation"> |
| 44 | + <TreeView aria-label="File navigation"> |
| 45 | + <TreeView.LinkItem href="#"> |
| 46 | + src |
| 47 | + <TreeView.SubTree> |
| 48 | + <TreeView.LinkItem href="#">Avatar.tsx</TreeView.LinkItem> |
| 49 | + <TreeView.LinkItem href="#"> |
| 50 | + Button |
| 51 | + <TreeView.SubTree> |
| 52 | + <TreeView.LinkItem href="#">Button.tsx</TreeView.LinkItem> |
| 53 | + <TreeView.LinkItem href="#">Button.test.tsx</TreeView.LinkItem> |
| 54 | + </TreeView.SubTree> |
| 55 | + </TreeView.LinkItem> |
| 56 | + </TreeView.SubTree> |
| 57 | + </TreeView.LinkItem> |
| 58 | + <TreeView.LinkItem href="#"> |
| 59 | + public |
| 60 | + <TreeView.SubTree> |
| 61 | + <TreeView.LinkItem href="#">index.html</TreeView.LinkItem> |
| 62 | + <TreeView.LinkItem href="#">favicon.ico</TreeView.LinkItem> |
| 63 | + </TreeView.SubTree> |
| 64 | + </TreeView.LinkItem> |
| 65 | + <TreeView.LinkItem href="#">package.json</TreeView.LinkItem> |
| 66 | + </TreeView> |
| 67 | +</nav> |
| 68 | +``` |
| 69 | + |
| 70 | +## Props |
| 71 | + |
| 72 | +### TreeView |
| 73 | + |
| 74 | +<PropsTable> |
| 75 | + <PropsTableRow name="children" type="React.ReactNode" required /> |
| 76 | + {/* <PropsTableSxRow /> */} |
| 77 | +</PropsTable> |
| 78 | + |
| 79 | +### TreeView.Item |
| 80 | + |
| 81 | +<PropsTable> |
| 82 | + <PropsTableRow name="children" type="React.ReactNode" required /> |
| 83 | + <PropsTableRow |
| 84 | + name="onSelect" |
| 85 | + type="(event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) => void" |
| 86 | + /> |
| 87 | + <PropsTableRow name="onToggle" type="(isExpanded: boolean) => void" /> |
| 88 | + {/* <PropsTableSxRow /> */} |
| 89 | +</PropsTable> |
| 90 | + |
| 91 | +### TreeView.LinkItem |
| 92 | + |
| 93 | +<PropsTable> |
| 94 | + <PropsTableRow name="children" type="React.ReactNode" required /> |
| 95 | + <PropsTableRow |
| 96 | + name="href" |
| 97 | + type="string" |
| 98 | + description={ |
| 99 | + <> |
| 100 | + The URL that the item navigates to. <InlineCode>href</InlineCode> is passed to the underlying{' '} |
| 101 | + <InlineCode><a></InlineCode> element. If <InlineCode>as</InlineCode> is specified, the component may need |
| 102 | + different props. If the item contains a sub-nav, the item is rendered as a{' '} |
| 103 | + <InlineCode><button></InlineCode> and <InlineCode>href</InlineCode> is ignored. |
| 104 | + </> |
| 105 | + } |
| 106 | + /> |
| 107 | + <PropsTableRow |
| 108 | + name="onSelect" |
| 109 | + type="(event: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) => void" |
| 110 | + /> |
| 111 | + <PropsTableRow name="onToggle" type="(isExpanded: boolean) => void" /> |
| 112 | + {/* <PropsTableSxRow /> */} |
| 113 | +</PropsTable> |
| 114 | + |
| 115 | +### TreeView.SubTree |
| 116 | + |
| 117 | +<PropsTable> |
| 118 | + <PropsTableRow name="children" type="React.ReactNode" /> |
| 119 | + {/* <PropsTableSxRow /> */} |
| 120 | +</PropsTable> |
| 121 | + |
| 122 | +<!-- TODO: Add leading and trailing visuals --> |
| 123 | + |
| 124 | +<!-- ### TreeView.LeadingVisual |
| 125 | + |
| 126 | +<PropsTable> |
| 127 | + <PropsTableRow |
| 128 | + name="children" |
| 129 | + type={`| React.ReactNode |
| 130 | +| (props: {isExpanded: boolean}) => React.ReactNode`} |
| 131 | + /> |
| 132 | + <PropsTableSxRow /> |
| 133 | +</PropsTable> |
| 134 | + |
| 135 | +### TreeView.TrailingVisual |
| 136 | + |
| 137 | +<PropsTable> |
| 138 | + <PropsTableRow |
| 139 | + name="children" |
| 140 | + type={`| React.ReactNode |
| 141 | +| (props: {isExpanded: boolean}) => React.ReactNode`} |
| 142 | + /> |
| 143 | + <PropsTableSxRow /> |
| 144 | +</PropsTable> |
| 145 | + |
| 146 | +### TreeView.FolderIcon |
| 147 | + |
| 148 | +<PropsTable> |
| 149 | + <PropsTableSxRow /> |
| 150 | +</PropsTable> --> |
| 151 | + |
| 152 | +<!-- TODO: Add components to support async behavior (e.g. LoadingItem) --> |
| 153 | + |
| 154 | +## Status |
| 155 | + |
| 156 | +<ComponentChecklist |
| 157 | + items={{ |
| 158 | + propsDocumented: true, |
| 159 | + noUnnecessaryDeps: false, |
| 160 | + adaptsToThemes: false, |
| 161 | + adaptsToScreenSizes: false, |
| 162 | + fullTestCoverage: false, |
| 163 | + usedInProduction: false, |
| 164 | + usageExamplesDocumented: false, |
| 165 | + hasStorybookStories: false, |
| 166 | + designReviewed: false, |
| 167 | + a11yReviewed: false, |
| 168 | + stableApi: false, |
| 169 | + addressedApiFeedback: false, |
| 170 | + hasDesignGuidelines: false, |
| 171 | + hasFigmaComponent: false |
| 172 | + }} |
| 173 | +/> |
0 commit comments