Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/fine-kids-watch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@stackoverflow/stacks-svelte": patch
---

Navigation: Add animate prop to NavigationItem
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<script lang="ts" module>
import { defineMeta } from "@storybook/addon-svelte-csf";
import { slide } from "svelte/transition";
import Navigation from "./Navigation.svelte";
import NavigationItem from "./NavigationItem.svelte";
import NavigationTitle from "./NavigationTitle.svelte";
Expand Down Expand Up @@ -374,27 +373,26 @@
{@const itemsAfter =
selectedIndex >= 0 ? groupItems.slice(selectedIndex + 1) : []}

{#if !isCollapsed}
<div transition:slide>
{#each itemsBefore as item (item.text)}
<NavigationItem
icon={item.icon}
iconSelected={item.iconSelected}
text={item.text}
onclick={() => (tSelected = item.text)}
>
{#snippet trailing()}
{#if item.activity}
<ActivityIndicator
content={item.activity.content}
label={item.activity.label}
/>
{/if}
{/snippet}
</NavigationItem>
{/each}
</div>
{/if}
{#each itemsBefore as item (item.text)}
{#if !isCollapsed}
<NavigationItem
icon={item.icon}
iconSelected={item.iconSelected}
text={item.text}
onclick={() => (tSelected = item.text)}
animate
>
{#snippet trailing()}
{#if item.activity}
<ActivityIndicator
content={item.activity.content}
label={item.activity.label}
/>
{/if}
{/snippet}
</NavigationItem>
{/if}
{/each}
{#if selectedItem}
<NavigationItem
icon={selectedItem.icon}
Expand All @@ -413,27 +411,26 @@
{/snippet}
</NavigationItem>
{/if}
{#if !isCollapsed}
<div transition:slide>
{#each itemsAfter as item (item.text)}
<NavigationItem
icon={item.icon}
iconSelected={item.iconSelected}
text={item.text}
onclick={() => (tSelected = item.text)}
>
{#snippet trailing()}
{#if item.activity}
<ActivityIndicator
content={item.activity.content}
label={item.activity.label}
/>
{/if}
{/snippet}
</NavigationItem>
{/each}
</div>
{/if}
{#each itemsAfter as item (item.text)}
{#if !isCollapsed}
<NavigationItem
icon={item.icon}
iconSelected={item.iconSelected}
text={item.text}
onclick={() => (tSelected = item.text)}
animate
>
{#snippet trailing()}
{#if item.activity}
<ActivityIndicator
content={item.activity.content}
label={item.activity.label}
/>
{/if}
{/snippet}
</NavigationItem>
{/if}
{/each}
{/each}
</Navigation>
</Story>
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
} from "svelte/elements";
import Icon from "../Icon/Icon.svelte";
import Avatar from "../Avatar/Avatar.svelte";
import { slide } from "svelte/transition";

interface Props
extends Omit<
HTMLAnchorAttributes & HTMLButtonAttributes,
Expand Down Expand Up @@ -43,6 +45,10 @@
* Additional CSS classes added to the element
*/
class?: string;
/**
* If true, applies a slide animation to the navigation item.
*/
animate?: boolean;
/**
* Optional content rendered at the end of the navigation item.
*/
Expand All @@ -57,6 +63,7 @@
iconSelected = undefined,
avatar = undefined,
class: className = "",
animate = false,
trailing,
...restProps
}: Props = $props();
Expand All @@ -79,9 +86,11 @@
return classes;
};
const classes = $derived(getClasses(className, selected, dropdown));

const maybeslide = (node: Element) => (animate ? slide(node) : {});
</script>

<li>
<li transition:maybeslide>
<svelte:element
this={href ? "a" : "button"}
{href}
Expand Down