Browse Source

Add action bindings on ToC component elements

master
buttercat1791 9 months ago
parent
commit
052392d7f0
  1. 74
      src/lib/components/publications/TableOfContents.svelte

74
src/lib/components/publications/TableOfContents.svelte

@ -23,50 +23,49 @@
let publicationTree = getContext('publicationTree') as SveltePublicationTree; let publicationTree = getContext('publicationTree') as SveltePublicationTree;
let toc = new TableOfContents(rootAddress, publicationTree, page.url.pathname ?? ""); let toc = new TableOfContents(rootAddress, publicationTree, page.url.pathname ?? "");
let entries = $derived.by(() => { let entries = $derived(
console.debug("[ToC] Filtering entries for depth", depth); Array
const entries = Array
.from(toc.addressMap.values()) .from(toc.addressMap.values())
.filter((entry) => entry.depth === depth); .filter((entry) => entry.depth === depth)
console.debug("[ToC] Filtered entries", entries.map((e) => e.title)); );
return entries;
});
// Track the currently visible section for highlighting function getEntryExpanded(address: string) {
let currentSection = $state<string | null>(null); return toc.getEntry(address)?.expanded;
}
// Handle section visibility changes from the IntersectionObserver function setEntryExpanded(address: string, expanded: boolean = false) {
function handleSectionVisibility(address: string, isVisible: boolean) { const entry = toc.getEntry(address);
if (isVisible) { if (!entry) {
currentSection = address; return;
} }
}
// Toggle expansion of a ToC entry entry.expanded = expanded;
async function toggleExpansion(entry: TocEntry) { if (entry.childrenResolved) {
// Update the current section in the ToC return;
const tocEntry = toc.getEntry(entry.address);
if (tocEntry) {
// Ensure the parent sections are expanded
let parent = tocEntry.parent;
while (parent) {
parent.expanded = true;
parent = parent.parent;
}
} }
entry.expanded = !entry.expanded; if (expanded) {
if (entry.expanded && !entry.childrenResolved) { entry.resolveChildren();
onSectionFocused?.(entry.address);
await entry.resolveChildren();
} }
} }
function handleEntryClick(address: string, expanded: boolean = false) {
setEntryExpanded(address, expanded);
onSectionFocused?.(address);
}
</script> </script>
<!-- TODO: Href doesn't work with query params. -->
{#if displayMode === 'accordion'} {#if displayMode === 'accordion'}
<Accordion flush multiple> <Accordion flush multiple>
{#each entries as entry} {#each entries as entry}
<AccordionItem open={entry.expanded}> {@const address = entry.address}
<AccordionItem
bind:open={
() => getEntryExpanded(address),
(open) => setEntryExpanded(address, open)
}
>
{#snippet header()} {#snippet header()}
<span class="text-gray-800 dark:text-gray-300">{entry.title}</span> <span class="text-gray-800 dark:text-gray-300">{entry.title}</span>
{/snippet} {/snippet}
@ -79,8 +78,15 @@
{:else} {:else}
<SidebarGroup> <SidebarGroup>
{#each entries as entry} {#each entries as entry}
{@const address = entry.address}
{#if entry.children.length > 0} {#if entry.children.length > 0}
<SidebarDropdownWrapper label={entry.title}> <SidebarDropdownWrapper
label={entry.title}
bind:isOpen={
() => getEntryExpanded(address),
(open) => setEntryExpanded(address, open)
}
>
<Self <Self
displayMode={displayMode} displayMode={displayMode}
rootAddress={entry.address} rootAddress={entry.address}
@ -89,7 +95,11 @@
/> />
</SidebarDropdownWrapper> </SidebarDropdownWrapper>
{:else} {:else}
<SidebarItem label={entry.title} href={entry.href} /> <!-- TODO: Add href -->
<SidebarItem
label={entry.title}
onclick={() => handleEntryClick(address, !getEntryExpanded(address))}
/>
{/if} {/if}
{/each} {/each}
</SidebarGroup> </SidebarGroup>

Loading…
Cancel
Save