File tree
3 minutes read
A file tree turns a nested list into a folder structure with icons, indentation, and a muted note on each entry. It is a presentational view of a list, so it reads the same without JavaScript. With JavaScript it becomes one keyboard widget: a single tab stop, arrow keys through the visible rows, and folders that open and close.
Syntax
:::file-tree{label="Project layout"}
- content/ # the pages of the site
- **index.md** # the home page
- mizzen.yml
:::
Options
| Name | Type | Default | What it does |
|---|---|---|---|
label |
string | File tree |
The tree's accessible name. |
id |
string | file-tree |
Prefix for the tree's element ids. Without one, each tree on the page gets file-tree, then file-tree-2, and so on. |
Keyboard
With JavaScript, the tree is one tab stop: the row you last focused stays in the tab order, and Tab leaves the tree. The full behaviour follows the WAI-ARIA tree view pattern.
| Key | What it does |
|---|---|
ArrowDown |
Moves to the next visible row. |
ArrowUp |
Moves to the previous visible row. |
Home |
Moves to the first visible row. |
End |
Moves to the last visible row. |
ArrowRight |
Opens a closed folder, or moves to its first row when it is open. |
ArrowLeft |
Closes an open folder, or moves to the parent row. |
Enter, Space |
Opens or closes a folder. Files have no action. |
Arrow keys do not wrap: at the first or last row the focus stays put. On a right-to-left page ArrowRight and ArrowLeft swap, because the nesting runs the other way.
Example
- content/pages and posts
- index.mdthe home page
- guides/
- install.md
- mizzen.ymlsite settings
- assets/
- logo.svg
Notes
- The body is a nested bullet list. Each item is one row; nested items are its children.
- A name ending in
/is a folder. An entry with nested items is a folder even without the slash. - Text after
#(with a space on each side) is a note on that row. - A name in bold,
**name**, is highlighted as the file the page is about. - Screen readers hear each row's level, its position among its siblings, the name, and the note. A folder with nested rows also reports whether it is open; a folder with no rows cannot open.
- Without JavaScript the complete tree stays visible and every row stays in the tab order. Folders start open: closing one is an enhancement, and the markup the server writes never hides a row.
- Trees without an
idget page-scoped ids in document order, so two trees on one page never collide. Give anidwhen links or tests should keep the same prefix across edits. The ids only label rows; the paths indata-copy-valuenever change. - Keep the tree to the files a reader needs. A whole repository dump hides the three lines that matter.