/* credits: https://iamkate.com/code/tree-views/ */ .tree { --spacing: 1.5rem; --radius: 4px; } .tree li { display: block; position: relative; padding-left: calc(2 * var(--spacing) - var(--radius) - 2px); } .tree ul { margin-left: calc(var(--radius) - var(--spacing)); padding-left: 0; } .tree ul li { border-left: 2px solid #888; min-height: 2.5rem; } .tree ul li:last-child { border-color: transparent; } .tree ul li::before { content: ""; display: block; position: absolute; top: calc(var(--spacing) / -1); left: -2px; width: calc(var(--spacing) + 2px); height: calc(var(--spacing) + 13px); border: solid #888; border-radius: 0 0 0 8px; border-width: 0 0 2px 2px; transition: all 200ms linear; } .details[open] summary ~ * { animation: sweep 0.5s ease-in-out; } @keyframes sweep { 0% { opacity: 0; margin-left: -10px; } 100% { opacity: 1; margin-left: 0px; } } .tree summary { display: block; cursor: pointer; min-height: 2.5rem; } .tree summary::marker, .tree summary::-webkit-details-marker { display: none; } .tree summary:focus { outline: none; } .tree summary:focus-visible { outline: 1px dotted #000; } .tree li::after, .tree summary::before { content: ""; display: block; position: absolute; top: calc(var(--spacing) / 2 - var(--radius)); left: calc(var(--spacing) - var(--radius) - 1px); width: calc(2 * var(--radius)); height: calc(2 * var(--radius)); border-radius: 50%; background: #ddd; } .tree summary::before { z-index: 1; background: #ddd 0 0; } .tree details[open] > summary::before { background-position: calc(-2 * var(--radius)) 0; } .collapsibleContent { /*overflow-y: hidden;*/ } .collapsibleContent[data-state="open"] { animation: slideDown 300ms ease-out; } .collapsibleContent[data-state="closed"] { animation: slideUp 300ms ease-out; } @keyframes slideDown { 0% { height: 0; opacity: 0; } 50% { opacity: 0; } 100% { height: var(--radix-collapsible-content-height); opacity: 1; } } @keyframes slideUp { 0% { height: var(--radix-collapsible-content-height); opacity: 1; } 50% { opacity: 0; } 100% { height: 0; opacity: 0; } }