You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
5.3 KiB
184 lines
5.3 KiB
<script lang="ts"> |
|
import { Button } from "flowbite-svelte"; |
|
import { CaretDownOutline, CaretUpOutline } from "flowbite-svelte-icons"; |
|
|
|
// TODO: Move this to settings panel for user control |
|
const TAG_LEGEND_COLUMNS = 4; // Number of columns for tag anchor table |
|
let { |
|
collapsedOnInteraction = false, |
|
className = "", |
|
starMode = false, |
|
showTags = false, |
|
tagAnchors = [], |
|
eventCounts = {}, |
|
} = $props<{ |
|
collapsedOnInteraction: boolean; |
|
className: string; |
|
starMode?: boolean; |
|
showTags?: boolean; |
|
tagAnchors?: any[]; |
|
eventCounts?: { [kind: number]: number }; |
|
}>(); |
|
|
|
let expanded = $state(true); |
|
|
|
$effect(() => { |
|
if (collapsedOnInteraction) { |
|
expanded = false; |
|
} |
|
}); |
|
|
|
function toggle() { |
|
expanded = !expanded; |
|
} |
|
</script> |
|
|
|
<div class={`leather-legend ${className}`}> |
|
<div class="flex items-center justify-between space-x-3"> |
|
<h3 class="h-leather">Legend</h3> |
|
<Button |
|
color="none" |
|
outline |
|
size="xs" |
|
onclick={toggle} |
|
class="rounded-full" |
|
> |
|
{#if expanded} |
|
<CaretUpOutline /> |
|
{:else} |
|
<CaretDownOutline /> |
|
{/if} |
|
</Button> |
|
</div> |
|
|
|
{#if expanded} |
|
<ul class="legend-list"> |
|
{#if starMode} |
|
<!-- Star center node --> |
|
<li class="legend-item"> |
|
<div class="legend-icon"> |
|
<span |
|
class="legend-circle" |
|
style="background-color: hsl(200, 70%, 75%)" |
|
> |
|
<span class="legend-letter">I</span> |
|
</span> |
|
</div> |
|
<span class="legend-text" |
|
>{eventCounts[30040] || 0} Index events (kind 30040) - Star centers with |
|
unique colors</span |
|
> |
|
</li> |
|
|
|
<!-- Content event node --> |
|
<li class="legend-item"> |
|
<div class="legend-icon"> |
|
<span class="legend-circle content"> |
|
<span class="legend-letter">C</span> |
|
</span> |
|
</div> |
|
<span class="legend-text" |
|
>{eventCounts[30041] || 0} Content nodes (kind 30041) - Arranged around |
|
star centers</span |
|
> |
|
</li> |
|
|
|
<!-- Star links --> |
|
<li class="legend-item"> |
|
<svg class="w-6 h-6 mr-2" viewBox="0 0 24 24"> |
|
<path |
|
d="M12 4l8 8-8 8M12 4l-8 8 8 8" |
|
class="network-link-leather" |
|
stroke-width="2" |
|
fill="none" |
|
/> |
|
</svg> |
|
<span class="legend-text" |
|
>Radial connections from star centers to content</span |
|
> |
|
</li> |
|
{:else} |
|
<!-- Index event node --> |
|
<li class="legend-item"> |
|
<div class="legend-icon"> |
|
<span |
|
class="legend-circle" |
|
style="background-color: hsl(200, 70%, 75%)" |
|
> |
|
<span class="legend-letter">I</span> |
|
</span> |
|
</div> |
|
<span class="legend-text" |
|
>{eventCounts[30040] || 0} Index events (kind 30040) - Each with a unique |
|
pastel color</span |
|
> |
|
</li> |
|
|
|
<!-- Content event node --> |
|
<li class="legend-item"> |
|
<div class="legend-icon"> |
|
<span class="legend-circle content"> |
|
<span class="legend-letter">C</span> |
|
</span> |
|
</div> |
|
<span class="legend-text" |
|
>{(eventCounts[30041] || 0) + (eventCounts[30818] || 0)} Content events |
|
(kinds 30041, 30818) - Publication sections</span |
|
> |
|
</li> |
|
|
|
<!-- Link arrow --> |
|
<li class="legend-item"> |
|
<svg class="w-6 h-6 mr-2" viewBox="0 0 24 24"> |
|
<path |
|
d="M4 12h16M16 6l6 6-6 6" |
|
class="network-link-leather" |
|
stroke-width="2" |
|
fill="none" |
|
/> |
|
</svg> |
|
<span class="legend-text">Arrows indicate reading/sequence order</span |
|
> |
|
</li> |
|
{/if} |
|
|
|
<!-- Tag Anchors section --> |
|
{#if showTags && tagAnchors.length > 0} |
|
<li class="legend-item mt-3 border-t pt-2 w-full"> |
|
<span class="legend-text font-semibold" |
|
>Active Tag Anchors: {tagAnchors[0].type}</span |
|
> |
|
</li> |
|
<li class="w-full"> |
|
<div |
|
class="tag-grid" |
|
style="grid-template-columns: repeat({TAG_LEGEND_COLUMNS}, 1fr);" |
|
> |
|
{#each tagAnchors as anchor} |
|
<div class="tag-grid-item"> |
|
<div class="legend-icon"> |
|
<span |
|
class="legend-circle" |
|
style="background-color: {anchor.color}; width: 18px; height: 18px; border: 2px solid white;" |
|
> |
|
<span class="legend-letter text-xs text-white font-bold"> |
|
{anchor.type === "t" |
|
? "#" |
|
: anchor.type === "author" |
|
? "A" |
|
: anchor.type.charAt(0).toUpperCase()} |
|
</span> |
|
</span> |
|
</div> |
|
<span class="legend-text text-xs"> |
|
{anchor.label} |
|
<span class="text-gray-500">({anchor.count})</span> |
|
</span> |
|
</div> |
|
{/each} |
|
</div> |
|
</li> |
|
{/if} |
|
</ul> |
|
{/if} |
|
</div>
|
|
|