Skip to content

Commit 44bc028

Browse files
committed
fix: Sidebar activeUrl. docs: Navbar examples
1 parent 00a12af commit 44bc028

File tree

13 files changed

+55
-17
lines changed

13 files changed

+55
-17
lines changed

src/lib/nav/NavUl.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script lang="ts">
22
import { getContext, setContext } from "svelte";
33
import type { navbarType } from "$lib/types";
4-
import { writable, type Writable } from 'svelte/store';
4+
import { writable } from 'svelte/store';
55
import { type NavUlProps as Props, navUl } from ".";
66
77
let { children, activeUrl = '', class: className, ...restProps }: Props = $props();

src/lib/sidebar/Sidebar.svelte

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
<script lang="ts">
22
import { setContext } from "svelte";
33
import { fly } from "svelte/transition";
4+
import { writable } from 'svelte/store';
45
import { sineIn } from "svelte/easing";
56
import { type SidebarProps as Props, sidebar, type SidebarCtxType } from ".";
67
7-
let { children, isOpen = false, closeSidebar, isSingle = true, breakpoint = "md", position = "fixed", activateClickOutside = true, backdrop = true, backdropClass, transition = fly, params, divClass, ariaLabel, nonActiveClass, activeClass, class: className, ...restProps }: Props = $props();
8+
let { children, isOpen = false, closeSidebar, isSingle = true, breakpoint = "md", position = "fixed", activateClickOutside = true, backdrop = true, backdropClass, transition = fly, params, divClass, ariaLabel, nonActiveClass, activeClass, activeUrl = '', class: className, ...restProps }: Props = $props();
89
910
const breakpointValues = {
1011
sm: 640,
@@ -16,6 +17,12 @@
1617
1718
let isLargeScreen = $state(false);
1819
20+
const activeUrlStore = writable('');
21+
setContext('activeUrl', activeUrlStore);
22+
$effect(() => {
23+
activeUrlStore.set(activeUrl);
24+
});
25+
1926
function checkScreenSize() {
2027
isLargeScreen = window.innerWidth >= breakpointValues[breakpoint];
2128
}

src/lib/sidebar/SidebarItem.svelte

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,26 @@
33
import { twMerge } from "tailwind-merge";
44
import { type SidebarCtxType, type SidebarItemProps as Props } from "./";
55
6-
let { iconSlot, subtext, href, label, spanClass = "ms-3", activeClass, nonActiveClass, aClass, active, class: className, ...restProps }: Props = $props();
6+
let { iconSlot, subtext, href, label, spanClass = "ms-3", activeClass, nonActiveClass, aClass, class: className, ...restProps }: Props = $props();
77
88
const context = getContext<SidebarCtxType>("sidebarContext") ?? {};
9-
let currentUrl = $state("");
9+
const activeUrlStore = getContext('activeUrl') as { subscribe: (callback: (value: string) => void) => void };
10+
11+
let sidebarUrl = $state("");
12+
activeUrlStore.subscribe((value) => {
13+
sidebarUrl = value;
14+
});
15+
let active = $state();
1016
1117
$effect(() => {
12-
currentUrl = window.location.pathname;
18+
active = sidebarUrl ? href === sidebarUrl : false;
1319
});
1420
15-
let aCls = $derived((active ?? currentUrl === href) ? (activeClass ?? context.activeClass) : (nonActiveClass ?? context.nonActiveClass));
21+
let aCls = $derived((active ?? sidebarUrl === href) ? (activeClass ?? context.activeClass) : (nonActiveClass ?? context.nonActiveClass));
1622
</script>
1723

1824
<li class={className}>
19-
<a onclick={context.closeSidebar} {...restProps} {href} aria-current={active ?? currentUrl === href} class={twMerge(aCls, aClass)}>
25+
<a onclick={context.closeSidebar} {...restProps} {href} aria-current={active ?? sidebarUrl === href} class={twMerge(aCls, aClass)}>
2026
{#if iconSlot}
2127
{@render iconSlot()}
2228
{/if}

src/lib/sidebar/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type SidebarCtxType = {
1717
nonActiveClass?: string;
1818
isSingle?: boolean;
1919
selected?: Writable<object>;
20+
activeUrl?: string;
2021
};
2122

2223
type BreakpointType = "sm" | "md" | "lg" | "xl" | "2xl" | undefined;
@@ -38,6 +39,7 @@ interface SidebarProps extends HTMLAttributes<HTMLElement> {
3839
transition?: TransitionFunc;
3940
backdrop?: boolean;
4041
backdropClass?: string;
42+
activeUrl?: string;
4143
}
4244

4345
interface SidebarButtonProps extends HTMLButtonAttributes {
@@ -95,7 +97,6 @@ interface SidebarItemProps extends HTMLAnchorAttributes {
9597
activeClass?: string;
9698
nonActiveClass?: string;
9799
aClass?: string;
98-
active?: boolean;
99100
}
100101

101102
export { Sidebar, sidebar, type SidebarProps, SidebarDropdownWrapper, sidebardropdownwrapper, type SidebarDropdownWrapperProps, SidebarGroup, type SidebarGroupProps, SidebarItem, type SidebarItemProps, type SidebarCtxType, SidebarButton, sidebarbutton, type SidebarButtonProps, SidebarCta, sidebarcta, type SidebarCtaProps, SidebarBrand, sitebarbrand, type SidebarBrandProps, type BreakpointType, type PosisionType };

src/routes/+layout.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
</Navbar>
7676
</header>
7777
<div class="lg:flex" id="sidebar">
78-
<Sidebar isSingle {isOpen} {closeSidebar} breakpoint="lg" activeClass="flex items-center p-1 text-base font-normal text-white dark:hover:text-white hover:text-gray-900 bg-primary-700 dark:bg-primary-700 rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" nonActiveClass="p-1 hover:bg-gray-200" divClass="dark:bg-gray-900 bg-gray-50" class="top-[62px] h-screen dark:bg-gray-900">
78+
<Sidebar {activeUrl} isSingle {isOpen} {closeSidebar} breakpoint="lg" activeClass="flex items-center p-1 text-base font-normal text-white dark:hover:text-white hover:text-gray-900 bg-primary-700 dark:bg-primary-700 rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" nonActiveClass="p-1 hover:bg-gray-200" divClass="dark:bg-gray-900 bg-gray-50" class="top-[62px] h-screen dark:bg-gray-900">
7979
<SidebarGroup>
8080
<SidebarDropdownWrapper label="GETTING STARTED" isOpen={pageStatus} svgClass="me-4" btnClass="p-1">
8181
<SidebarItem label="About" href="/pages/about" />

src/routes/components/navbar/examples/BackgroundColor.svelte

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
<script lang="ts">
22
import { Navbar, NavBrand, NavUl, NavLi, uiHelpers } from "$lib";
3+
import { page } from '$app/stores';
4+
let activeUrl = $state($page.url.pathname);
35
let nav = uiHelpers();
46
let navStatus = $state(false);
57
let toggleNav = nav.toggle;
68
let closeNav = nav.close;
79
$effect(() => {
810
navStatus = nav.isOpen;
11+
activeUrl = $page.url.pathname;
912
});
1013
</script>
1114

@@ -16,7 +19,7 @@
1619
</NavBrand>
1720
{/snippet}
1821

19-
<NavUl>
22+
<NavUl {activeUrl}>
2023
<NavLi href="/">Home</NavLi>
2124
<NavLi href="/components/navbar">Navbar</NavLi>
2225
<NavLi href="/components/footer">Footer</NavLi>

src/routes/components/navbar/examples/Breakpoint.svelte

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
<script lang="ts">
22
import { Navbar, NavBrand, NavUl, NavLi, uiHelpers } from "$lib";
3+
import { page } from '$app/stores';
4+
let activeUrl = $state($page.url.pathname);
35
let nav = uiHelpers();
46
let navStatus = $state(false);
57
let toggleNav = nav.toggle;
68
let closeNav = nav.close;
79
$effect(() => {
810
navStatus = nav.isOpen;
11+
activeUrl = $page.url.pathname;
912
});
1013
</script>
1114

@@ -16,7 +19,7 @@
1619
</NavBrand>
1720
{/snippet}
1821

19-
<NavUl>
22+
<NavUl {activeUrl}>
2023
<NavLi href="/">Home</NavLi>
2124
<NavLi href="/components/navbar">Navbar</NavLi>
2225
<NavLi href="/components/footer">Footer</NavLi>

src/routes/components/navbar/examples/CtaButton.svelte

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
<script lang="ts">
22
import { Navbar, NavBrand, NavUl, NavLi, uiHelpers, Button, NavHamburger } from "$lib";
3+
import { page } from '$app/stores';
4+
let activeUrl = $state($page.url.pathname);
35
let nav = uiHelpers();
46
let navStatus = $state(false);
57
let toggleNav = nav.toggle;
68
$effect(() => {
79
navStatus = nav.isOpen;
10+
activeUrl = $page.url.pathname;
811
});
912
</script>
1013

@@ -20,7 +23,7 @@
2023
<NavHamburger {toggleNav} />
2124
</div>
2225
{/snippet}
23-
<NavUl class="order-1">
26+
<NavUl class="order-1" {activeUrl}>
2427
<NavLi href="/">Home</NavLi>
2528
<NavLi href="/components/navbar">Navbar</NavLi>
2629
<NavLi href="/components/footer">Footer</NavLi>

src/routes/components/navbar/examples/Default.svelte

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
<script lang="ts">
22
import { Navbar, NavBrand, NavUl, NavLi, uiHelpers } from "$lib";
3+
import { page } from '$app/stores';
4+
let activeUrl = $state($page.url.pathname);
35
let nav = uiHelpers();
46
let navStatus = $state(false);
57
let toggleNav = nav.toggle;
68
let closeNav = nav.close;
79
$effect(() => {
810
navStatus = nav.isOpen;
11+
activeUrl = $page.url.pathname;
912
});
1013
</script>
1114

@@ -16,7 +19,7 @@
1619
</NavBrand>
1720
{/snippet}
1821

19-
<NavUl>
22+
<NavUl {activeUrl}>
2023
<NavLi href="/">Home</NavLi>
2124
<NavLi href="/components/navbar">Navbar</NavLi>
2225
<NavLi href="/components/footer">Footer</NavLi>

src/routes/components/navbar/examples/Dropdown.svelte

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script lang="ts">
22
import { Navbar, NavBrand, NavUl, NavLi, uiHelpers, Dropdown, DropdownUl, DropdownLi } from "$lib";
3+
import { page } from '$app/stores';
4+
let activeUrl = $state($page.url.pathname);
35
import { ChevronDownOutline } from "flowbite-svelte-icons";
46
// for navbar
57
let nav = uiHelpers();
@@ -13,6 +15,7 @@
1315
$effect(() => {
1416
navStatus = nav.isOpen;
1517
dropdownStatus = dropdown.isOpen;
18+
activeUrl = $page.url.pathname;
1619
});
1720
</script>
1821

@@ -24,7 +27,7 @@
2427
</NavBrand>
2528
{/snippet}
2629

27-
<NavUl>
30+
<NavUl {activeUrl}>
2831
<NavLi href="/">Home</NavLi>
2932
<NavLi href="/components/navbar">Navbar</NavLi>
3033
<NavLi onclick={dropdown.toggle} class="cursor-pointer">

0 commit comments

Comments
 (0)