negodesign 0.0.66 → 0.0.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/core/nav/ui/ComplexMenu.svelte +15 -18
- package/dist/components/core/nav/ui/shared/MenuListItem.svelte +25 -34
- package/dist/components/core/nav/ui/shared/navigation/NavDropdown.svelte +78 -0
- package/dist/components/core/nav/ui/shared/navigation/NavDropdown.svelte.d.ts +9 -0
- package/dist/components/core/nav/ui/shared/navigation/NavigationMenuItem.svelte +8 -9
- package/dist/components/core/nav/ui/shared/navigation/NavigationMenuItemCard.svelte +30 -44
- package/dist/components/core/nav/ui/shared/navigation/NavigationMenuItemGrid.svelte +12 -14
- package/dist/components/core/nav/ui/shared/navigation/NavigationMenuItemList.svelte +15 -18
- package/dist/components/core/nav/ui/shared/navigation/NavigationMenuItems.svelte +15 -15
- package/dist/components/core/nav/ui/shared/navigation-old/NavigationMenuItem.svelte +15 -0
- package/dist/components/core/nav/ui/shared/navigation-old/NavigationMenuItem.svelte.d.ts +4 -0
- package/dist/components/core/nav/ui/shared/navigation-old/NavigationMenuItemCard.svelte +62 -0
- package/dist/components/core/nav/ui/shared/navigation-old/NavigationMenuItemCard.svelte.d.ts +4 -0
- package/dist/components/core/nav/ui/shared/navigation-old/NavigationMenuItemGrid.svelte +32 -0
- package/dist/components/core/nav/ui/shared/navigation-old/NavigationMenuItemGrid.svelte.d.ts +4 -0
- package/dist/components/core/nav/ui/shared/navigation-old/NavigationMenuItemList.svelte +24 -0
- package/dist/components/core/nav/ui/shared/navigation-old/NavigationMenuItemList.svelte.d.ts +4 -0
- package/dist/components/core/nav/ui/shared/navigation-old/NavigationMenuItems.svelte +21 -0
- package/dist/components/core/nav/ui/shared/navigation-old/NavigationMenuItems.svelte.d.ts +4 -0
- package/dist/globals.css +3 -0
- package/package.json +1 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import * as NavigationMenu from "../../../ui/navigation-menu/index.js";
|
|
3
2
|
import type { ComplexMenuProps } from "../data/types";
|
|
4
3
|
import {
|
|
5
4
|
isCard,
|
|
@@ -17,20 +16,18 @@
|
|
|
17
16
|
let { menus: links, textClass }: ComplexMenuProps = $props();
|
|
18
17
|
</script>
|
|
19
18
|
|
|
20
|
-
<
|
|
21
|
-
|
|
22
|
-
{#
|
|
23
|
-
{
|
|
24
|
-
|
|
25
|
-
{
|
|
26
|
-
|
|
27
|
-
{
|
|
28
|
-
|
|
29
|
-
{
|
|
30
|
-
|
|
31
|
-
{
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
</NavigationMenu.List>
|
|
36
|
-
</NavigationMenu.Root>
|
|
19
|
+
<ul class="flex list-none flex-1 flex-wrap items-center justify-center {textClass}">
|
|
20
|
+
{#each links as link, i (i)}
|
|
21
|
+
{#if isCard(link)}
|
|
22
|
+
<NavigationMenuItemCard {...link} />
|
|
23
|
+
{:else if isGrid(link)}
|
|
24
|
+
<NavigationMenuItemGrid {...link} />
|
|
25
|
+
{:else if isList(link)}
|
|
26
|
+
<NavigationMenuItemList {...link} />
|
|
27
|
+
{:else if isItems(link)}
|
|
28
|
+
<NavigationMenuItems {...link} />
|
|
29
|
+
{:else if isItem(link)}
|
|
30
|
+
<NavigationMenuItem {...link} />
|
|
31
|
+
{/if}
|
|
32
|
+
{/each}
|
|
33
|
+
</ul>
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import * as NavigationMenu from "../../../../ui/navigation-menu/index.js";
|
|
3
2
|
import { cn } from "../../../../../utils";
|
|
4
3
|
import type { ListItemProps } from "../../data/types";
|
|
5
4
|
let {
|
|
@@ -12,37 +11,29 @@
|
|
|
12
11
|
}: ListItemProps = $props();
|
|
13
12
|
</script>
|
|
14
13
|
|
|
15
|
-
{#snippet header()}
|
|
16
|
-
<div class="leading-none font-medium">{title}</div>
|
|
17
|
-
{/snippet}
|
|
18
|
-
|
|
19
14
|
<li>
|
|
20
|
-
<
|
|
21
|
-
{
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
>
|
|
30
|
-
|
|
31
|
-
<
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
</a>
|
|
46
|
-
{/snippet}
|
|
47
|
-
</NavigationMenu.Link>
|
|
48
|
-
</li>
|
|
15
|
+
<a
|
|
16
|
+
{href}
|
|
17
|
+
class={cn(
|
|
18
|
+
"block space-y-1 rounded-md p-3 leading-none no-underline transition-colors outline-none select-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground",
|
|
19
|
+
className,
|
|
20
|
+
)}
|
|
21
|
+
{...restProps}
|
|
22
|
+
>
|
|
23
|
+
{#if icon}
|
|
24
|
+
<div class="flex gap-1 items-center">
|
|
25
|
+
<div>
|
|
26
|
+
<i class={`${icon} size-8 md:size-10`}></i>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="-mt-1">
|
|
29
|
+
<div class="leading-none font-medium">{title}</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
{:else}
|
|
33
|
+
<div class="leading-none font-medium">{title}</div>
|
|
34
|
+
{/if}
|
|
35
|
+
<p class="line-clamp-2 text-sm leading-snug text-muted-foreground">
|
|
36
|
+
{content}
|
|
37
|
+
</p>
|
|
38
|
+
</a>
|
|
39
|
+
</li>
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { HugeiconsIcon } from "@hugeicons/svelte";
|
|
3
|
+
import { ArrowDown01Icon } from "@hugeicons/core-free-icons";
|
|
4
|
+
import type { Snippet } from "svelte";
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
label,
|
|
8
|
+
className = "",
|
|
9
|
+
children,
|
|
10
|
+
}: {
|
|
11
|
+
label: string;
|
|
12
|
+
className?: string;
|
|
13
|
+
children: Snippet;
|
|
14
|
+
} = $props();
|
|
15
|
+
|
|
16
|
+
let open = $state(false);
|
|
17
|
+
let closeTimer: ReturnType<typeof setTimeout> | undefined;
|
|
18
|
+
let itemRef = $state<HTMLLIElement | null>(null);
|
|
19
|
+
|
|
20
|
+
function openMenu() {
|
|
21
|
+
clearTimeout(closeTimer);
|
|
22
|
+
open = true;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function scheduleClose() {
|
|
26
|
+
clearTimeout(closeTimer);
|
|
27
|
+
closeTimer = setTimeout(() => {
|
|
28
|
+
open = false;
|
|
29
|
+
}, 150);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
$effect(() => {
|
|
33
|
+
function handleDocumentClick(event: MouseEvent) {
|
|
34
|
+
if (open && itemRef && !itemRef.contains(event.target as Node)) {
|
|
35
|
+
open = false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
document.addEventListener("click", handleDocumentClick);
|
|
39
|
+
return () => document.removeEventListener("click", handleDocumentClick);
|
|
40
|
+
});
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<li
|
|
44
|
+
bind:this={itemRef}
|
|
45
|
+
class="relative {className}"
|
|
46
|
+
onmouseenter={openMenu}
|
|
47
|
+
onmouseleave={scheduleClose}
|
|
48
|
+
>
|
|
49
|
+
<button
|
|
50
|
+
type="button"
|
|
51
|
+
aria-expanded={open}
|
|
52
|
+
onclick={() => {
|
|
53
|
+
clearTimeout(closeTimer);
|
|
54
|
+
open = !open;
|
|
55
|
+
}}
|
|
56
|
+
class="inline-flex h-9 w-max items-center justify-center rounded-2xl px-4.5 py-2.5 text-sm font-medium transition-all outline-none select-none hover:bg-muted focus:bg-muted focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 {open
|
|
57
|
+
? 'bg-muted'
|
|
58
|
+
: ''}"
|
|
59
|
+
>
|
|
60
|
+
{label}
|
|
61
|
+
<HugeiconsIcon
|
|
62
|
+
icon={ArrowDown01Icon}
|
|
63
|
+
strokeWidth={2}
|
|
64
|
+
class={`relative top-px ml-1 size-3 transition-transform duration-300 ${
|
|
65
|
+
open ? "rotate-180" : ""
|
|
66
|
+
}`}
|
|
67
|
+
aria-hidden="true"
|
|
68
|
+
/>
|
|
69
|
+
</button>
|
|
70
|
+
|
|
71
|
+
{#if open}
|
|
72
|
+
<div
|
|
73
|
+
class="absolute left-0 top-full z-50 mt-1.5 w-max rounded-2xl bg-popover p-2.5 pr-3 overflow-hidden text-popover-foreground shadow-2xl ring-1 ring-foreground/5"
|
|
74
|
+
>
|
|
75
|
+
{@render children()}
|
|
76
|
+
</div>
|
|
77
|
+
{/if}
|
|
78
|
+
</li>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
label: string;
|
|
4
|
+
className?: string;
|
|
5
|
+
children: Snippet;
|
|
6
|
+
};
|
|
7
|
+
declare const NavDropdown: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
8
|
+
type NavDropdown = ReturnType<typeof NavDropdown>;
|
|
9
|
+
export default NavDropdown;
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import * as NavigationMenu from "../../../../../ui/navigation-menu/index.js";
|
|
3
2
|
import type { NavigationMenuItemProps } from "../../../data/types";
|
|
4
|
-
import { navigationMenuTriggerStyle } from "../../../../../ui/navigation-menu/navigation-menu-trigger.svelte";
|
|
5
3
|
|
|
6
4
|
let { label, href }: NavigationMenuItemProps = $props();
|
|
7
5
|
</script>
|
|
8
6
|
|
|
9
|
-
<
|
|
10
|
-
<
|
|
11
|
-
{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
</
|
|
7
|
+
<li>
|
|
8
|
+
<a
|
|
9
|
+
{href}
|
|
10
|
+
class="inline-flex h-9 w-max items-center justify-center rounded-2xl px-4.5 py-2.5 text-sm font-medium transition-all outline-none select-none hover:bg-muted focus:bg-muted focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1"
|
|
11
|
+
>
|
|
12
|
+
{label}
|
|
13
|
+
</a>
|
|
14
|
+
</li>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import * as NavigationMenu from "../../../../../ui/navigation-menu/index.js";
|
|
3
2
|
import type { NavigationMenuItemCardProps } from "../../../data/types";
|
|
4
3
|
import MenuListItem from "../MenuListItem.svelte";
|
|
4
|
+
import NavDropdown from "./NavDropdown.svelte";
|
|
5
5
|
|
|
6
6
|
let { label, header, cards: items }: NavigationMenuItemCardProps = $props();
|
|
7
7
|
</script>
|
|
@@ -16,47 +16,33 @@
|
|
|
16
16
|
</p>
|
|
17
17
|
{/snippet}
|
|
18
18
|
|
|
19
|
-
<
|
|
20
|
-
<
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
19
|
+
<NavDropdown label={label ?? header?.label ?? ""}>
|
|
20
|
+
<ul
|
|
21
|
+
class="grid gap-2 p-2 w-100 lg:w-125 lg:grid-cols-[.75fr_1fr]"
|
|
22
|
+
>
|
|
23
|
+
{#if header}
|
|
24
|
+
<li
|
|
25
|
+
class="row-span-3 relative"
|
|
26
|
+
style={header.imgUrl
|
|
27
|
+
? `background-image: url(${header.imgUrl}); background-repeat: no-repeat; background-size: cover; background-position: center; border-radius: 12px;`
|
|
28
|
+
: ``}
|
|
29
|
+
>
|
|
30
|
+
<a
|
|
31
|
+
href={header.href ?? "#"}
|
|
32
|
+
class={`flex h-full w-full flex-col justify-end p-4 md:p-6 ${
|
|
33
|
+
header.imgUrl
|
|
34
|
+
? `no-underline outline-hidden select-none`
|
|
35
|
+
: `bg-linear-to-b from-muted/50 to-muted rounded-md focus:shadow-md`
|
|
36
|
+
}`}
|
|
29
37
|
>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
href={header.href ?? "#"}
|
|
42
|
-
class="bg-transparent absolute left-2 bottom-2"
|
|
43
|
-
>
|
|
44
|
-
{@render headerSnippet(header.label, header.description)}
|
|
45
|
-
</a>
|
|
46
|
-
{:else}
|
|
47
|
-
<a {...props} href={header.href ?? "#"}>
|
|
48
|
-
{@render headerSnippet(header.label, header.description)}
|
|
49
|
-
</a>
|
|
50
|
-
{/if}
|
|
51
|
-
{/snippet}
|
|
52
|
-
</NavigationMenu.Link>
|
|
53
|
-
</li>
|
|
54
|
-
{/if}
|
|
55
|
-
{#if items && items.length > 0}
|
|
56
|
-
{#each items as item, i (i)}
|
|
57
|
-
<MenuListItem {...item} />
|
|
58
|
-
{/each}
|
|
59
|
-
{/if}
|
|
60
|
-
</ul>
|
|
61
|
-
</NavigationMenu.Content>
|
|
62
|
-
</NavigationMenu.Item>
|
|
38
|
+
{@render headerSnippet(header.label, header.description)}
|
|
39
|
+
</a>
|
|
40
|
+
</li>
|
|
41
|
+
{/if}
|
|
42
|
+
{#if items && items.length > 0}
|
|
43
|
+
{#each items as item, i (i)}
|
|
44
|
+
<MenuListItem {...item} />
|
|
45
|
+
{/each}
|
|
46
|
+
{/if}
|
|
47
|
+
</ul>
|
|
48
|
+
</NavDropdown>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import * as NavigationMenu from "../../../../../ui/navigation-menu/index.js";
|
|
3
2
|
import type { NavigationMenuItemGridProps } from "../../../data/types";
|
|
4
3
|
import MenuListItem from "../MenuListItem.svelte";
|
|
4
|
+
import NavDropdown from "./NavDropdown.svelte";
|
|
5
5
|
|
|
6
6
|
let { label, grids: items }: NavigationMenuItemGridProps = $props();
|
|
7
7
|
|
|
@@ -13,20 +13,18 @@
|
|
|
13
13
|
if (len % 2 == 0) return "md:grid-cols-2";
|
|
14
14
|
return "grid-cols-1";
|
|
15
15
|
};
|
|
16
|
+
|
|
17
|
+
const gridCols = $derived(cols());
|
|
16
18
|
</script>
|
|
17
19
|
|
|
18
|
-
<
|
|
19
|
-
<NavigationMenu.Trigger>{label}</NavigationMenu.Trigger>
|
|
20
|
+
<NavDropdown {label}>
|
|
20
21
|
{#if items}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{/each}
|
|
29
|
-
</ul>
|
|
30
|
-
</NavigationMenu.Content>
|
|
22
|
+
<ul
|
|
23
|
+
class={`grid w-75 gap-2 p-2 sm:w-100 md:w-125 lg:min-w-150 ${gridCols}`}
|
|
24
|
+
>
|
|
25
|
+
{#each items as item, i (i)}
|
|
26
|
+
<MenuListItem {...item} />
|
|
27
|
+
{/each}
|
|
28
|
+
</ul>
|
|
31
29
|
{/if}
|
|
32
|
-
</
|
|
30
|
+
</NavDropdown>
|
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import * as NavigationMenu from "../../../../../ui/navigation-menu/index.js";
|
|
3
2
|
import type { NavigationMenuItemListProps } from "../../../data/types";
|
|
3
|
+
import NavDropdown from "./NavDropdown.svelte";
|
|
4
4
|
|
|
5
5
|
let { label, list }: NavigationMenuItemListProps = $props();
|
|
6
6
|
</script>
|
|
7
7
|
|
|
8
|
-
<
|
|
9
|
-
<
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
<
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
</ul>
|
|
23
|
-
</NavigationMenu.Content>
|
|
24
|
-
</NavigationMenu.Item>
|
|
8
|
+
<NavDropdown {label} className="hidden md:block">
|
|
9
|
+
<ul class="grid w-75 gap-4 p-2">
|
|
10
|
+
{#each list as item, i (i)}
|
|
11
|
+
<li>
|
|
12
|
+
<a href={item.href} class="block rounded-xl p-2 no-underline hover:bg-muted">
|
|
13
|
+
<div class="font-medium">{item.title ?? ""}</div>
|
|
14
|
+
<div class="text-muted-foreground">
|
|
15
|
+
{item.content}
|
|
16
|
+
</div>
|
|
17
|
+
</a>
|
|
18
|
+
</li>
|
|
19
|
+
{/each}
|
|
20
|
+
</ul>
|
|
21
|
+
</NavDropdown>
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import * as NavigationMenu from "../../../../../ui/navigation-menu/index.js";
|
|
3
2
|
import type { NavigationMenuItemsProps } from "../../../data/types";
|
|
3
|
+
import NavDropdown from "./NavDropdown.svelte";
|
|
4
4
|
|
|
5
5
|
let { label, items }: NavigationMenuItemsProps = $props();
|
|
6
6
|
</script>
|
|
7
7
|
|
|
8
|
-
<
|
|
9
|
-
<
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
</
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
</
|
|
21
|
-
</
|
|
8
|
+
<NavDropdown {label} className="hidden md:block">
|
|
9
|
+
<ul class="grid min-w-50 gap-4 p-1 md:p-2">
|
|
10
|
+
{#each items as item, i (i)}
|
|
11
|
+
<li>
|
|
12
|
+
<a
|
|
13
|
+
href={item.href}
|
|
14
|
+
class="block rounded-xl px-3 py-2 text-sm font-medium no-underline hover:bg-muted focus:bg-muted"
|
|
15
|
+
>
|
|
16
|
+
{item.title}
|
|
17
|
+
</a>
|
|
18
|
+
</li>
|
|
19
|
+
{/each}
|
|
20
|
+
</ul>
|
|
21
|
+
</NavDropdown>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as NavigationMenu from "../../../../../ui/navigation-menu/index.js";
|
|
3
|
+
import type { NavigationMenuItemProps } from "../../../data/types";
|
|
4
|
+
import { navigationMenuTriggerStyle } from "../../../../../ui/navigation-menu/navigation-menu-trigger.svelte";
|
|
5
|
+
|
|
6
|
+
let { label, href }: NavigationMenuItemProps = $props();
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<NavigationMenu.Item>
|
|
10
|
+
<NavigationMenu.Link>
|
|
11
|
+
{#snippet child()}
|
|
12
|
+
<a {href} class={navigationMenuTriggerStyle()}>{label}</a>
|
|
13
|
+
{/snippet}
|
|
14
|
+
</NavigationMenu.Link>
|
|
15
|
+
</NavigationMenu.Item>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as NavigationMenu from "../../../../../ui/navigation-menu/index.js";
|
|
3
|
+
import type { NavigationMenuItemCardProps } from "../../../data/types";
|
|
4
|
+
import MenuListItem from "../MenuListItem.svelte";
|
|
5
|
+
|
|
6
|
+
let { label, header, cards: items }: NavigationMenuItemCardProps = $props();
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
{#snippet headerSnippet(label: string, description: string)}
|
|
10
|
+
<div class="mt-4 mb-2 text-lg font-medium {header?.labelClass}">{label}</div>
|
|
11
|
+
<p
|
|
12
|
+
class="text-sm leading-tight {header?.descriptionClass ||
|
|
13
|
+
'text-muted-foreground'}"
|
|
14
|
+
>
|
|
15
|
+
{description}
|
|
16
|
+
</p>
|
|
17
|
+
{/snippet}
|
|
18
|
+
|
|
19
|
+
<NavigationMenu.Item>
|
|
20
|
+
<NavigationMenu.Trigger>{label}</NavigationMenu.Trigger>
|
|
21
|
+
<NavigationMenu.Content>
|
|
22
|
+
<ul class="grid gap-2 p-2 md:w-100 lg:w-125 lg:grid-cols-[.75fr_1fr]">
|
|
23
|
+
{#if header}
|
|
24
|
+
<li
|
|
25
|
+
class="row-span-3 relative"
|
|
26
|
+
style={header.imgUrl
|
|
27
|
+
? `background-image: url(${header.imgUrl}); background-repeat: no-repeat; background-size: cover; background-position: center; border-radius: 12px;`
|
|
28
|
+
: ``}
|
|
29
|
+
>
|
|
30
|
+
<NavigationMenu.Link
|
|
31
|
+
class={`flex h-full w-full flex-col justify-end p-4 md:p-6 ${
|
|
32
|
+
header.imgUrl
|
|
33
|
+
? `no-underline outline-hidden select-none`
|
|
34
|
+
: `bg-linear-to-b from-muted/50 to-muted rounded-md focus:shadow-md`
|
|
35
|
+
}`}
|
|
36
|
+
>
|
|
37
|
+
{#snippet child({ props })}
|
|
38
|
+
{#if header.imgUrl}
|
|
39
|
+
<a
|
|
40
|
+
{...props}
|
|
41
|
+
href={header.href ?? "#"}
|
|
42
|
+
class="bg-transparent absolute left-2 bottom-2"
|
|
43
|
+
>
|
|
44
|
+
{@render headerSnippet(header.label, header.description)}
|
|
45
|
+
</a>
|
|
46
|
+
{:else}
|
|
47
|
+
<a {...props} href={header.href ?? "#"}>
|
|
48
|
+
{@render headerSnippet(header.label, header.description)}
|
|
49
|
+
</a>
|
|
50
|
+
{/if}
|
|
51
|
+
{/snippet}
|
|
52
|
+
</NavigationMenu.Link>
|
|
53
|
+
</li>
|
|
54
|
+
{/if}
|
|
55
|
+
{#if items && items.length > 0}
|
|
56
|
+
{#each items as item, i (i)}
|
|
57
|
+
<MenuListItem {...item} />
|
|
58
|
+
{/each}
|
|
59
|
+
{/if}
|
|
60
|
+
</ul>
|
|
61
|
+
</NavigationMenu.Content>
|
|
62
|
+
</NavigationMenu.Item>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { NavigationMenuItemCardProps } from "../../../data/types";
|
|
2
|
+
declare const NavigationMenuItemCard: import("svelte").Component<NavigationMenuItemCardProps, {}, "">;
|
|
3
|
+
type NavigationMenuItemCard = ReturnType<typeof NavigationMenuItemCard>;
|
|
4
|
+
export default NavigationMenuItemCard;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as NavigationMenu from "../../../../../ui/navigation-menu/index.js";
|
|
3
|
+
import type { NavigationMenuItemGridProps } from "../../../data/types";
|
|
4
|
+
import MenuListItem from "../MenuListItem.svelte";
|
|
5
|
+
|
|
6
|
+
let { label, grids: items }: NavigationMenuItemGridProps = $props();
|
|
7
|
+
|
|
8
|
+
const cols = (): string => {
|
|
9
|
+
const len = items?.length ?? 0;
|
|
10
|
+
if (len > 10) return "md:grid-cols-3 lg:grid-cols-4";
|
|
11
|
+
if (len > 5) return "md:grid-cols-3";
|
|
12
|
+
if (len % 3 == 0) return "md:grid-cols-3";
|
|
13
|
+
if (len % 2 == 0) return "md:grid-cols-2";
|
|
14
|
+
return "grid-cols-1";
|
|
15
|
+
};
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<NavigationMenu.Item>
|
|
19
|
+
<NavigationMenu.Trigger>{label}</NavigationMenu.Trigger>
|
|
20
|
+
{#if items}
|
|
21
|
+
{@const gridCols = cols()}
|
|
22
|
+
<NavigationMenu.Content>
|
|
23
|
+
<ul
|
|
24
|
+
class={`grid w-75 gap-2 p-2 sm:w-100 md:w-125 ${gridCols} lg:min-w-150`}
|
|
25
|
+
>
|
|
26
|
+
{#each items as item, i (i)}
|
|
27
|
+
<MenuListItem {...item} />
|
|
28
|
+
{/each}
|
|
29
|
+
</ul>
|
|
30
|
+
</NavigationMenu.Content>
|
|
31
|
+
{/if}
|
|
32
|
+
</NavigationMenu.Item>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { NavigationMenuItemGridProps } from "../../../data/types";
|
|
2
|
+
declare const NavigationMenuItemGrid: import("svelte").Component<NavigationMenuItemGridProps, {}, "">;
|
|
3
|
+
type NavigationMenuItemGrid = ReturnType<typeof NavigationMenuItemGrid>;
|
|
4
|
+
export default NavigationMenuItemGrid;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as NavigationMenu from "../../../../../ui/navigation-menu/index.js";
|
|
3
|
+
import type { NavigationMenuItemListProps } from "../../../data/types";
|
|
4
|
+
|
|
5
|
+
let { label, list }: NavigationMenuItemListProps = $props();
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<NavigationMenu.Item class="hidden md:block relative">
|
|
9
|
+
<NavigationMenu.Trigger>{label}</NavigationMenu.Trigger>
|
|
10
|
+
<NavigationMenu.Content>
|
|
11
|
+
<ul class="grid w-75 gap-4 p-2">
|
|
12
|
+
{#each list as item, i (i)}
|
|
13
|
+
<li>
|
|
14
|
+
<NavigationMenu.Link href={item.href}>
|
|
15
|
+
<div class="font-medium">{item.title ?? ""}</div>
|
|
16
|
+
<div class="text-muted-foreground">
|
|
17
|
+
{item.content}
|
|
18
|
+
</div>
|
|
19
|
+
</NavigationMenu.Link>
|
|
20
|
+
</li>
|
|
21
|
+
{/each}
|
|
22
|
+
</ul>
|
|
23
|
+
</NavigationMenu.Content>
|
|
24
|
+
</NavigationMenu.Item>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { NavigationMenuItemListProps } from "../../../data/types";
|
|
2
|
+
declare const NavigationMenuItemList: import("svelte").Component<NavigationMenuItemListProps, {}, "">;
|
|
3
|
+
type NavigationMenuItemList = ReturnType<typeof NavigationMenuItemList>;
|
|
4
|
+
export default NavigationMenuItemList;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as NavigationMenu from "../../../../../ui/navigation-menu/index.js";
|
|
3
|
+
import type { NavigationMenuItemsProps } from "../../../data/types";
|
|
4
|
+
|
|
5
|
+
let { label, items }: NavigationMenuItemsProps = $props();
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<NavigationMenu.Item class="hidden md:block relative">
|
|
9
|
+
<NavigationMenu.Trigger>{label}</NavigationMenu.Trigger>
|
|
10
|
+
<NavigationMenu.Content>
|
|
11
|
+
<ul class="grid min-w-50 gap-4 p-1 md:p-2">
|
|
12
|
+
{#each items as item, i (i)}
|
|
13
|
+
<li>
|
|
14
|
+
<NavigationMenu.Link href={item.href} class="py-1">
|
|
15
|
+
{item.title}
|
|
16
|
+
</NavigationMenu.Link>
|
|
17
|
+
</li>
|
|
18
|
+
{/each}
|
|
19
|
+
</ul>
|
|
20
|
+
</NavigationMenu.Content>
|
|
21
|
+
</NavigationMenu.Item>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { NavigationMenuItemsProps } from "../../../data/types";
|
|
2
|
+
declare const NavigationMenuItems: import("svelte").Component<NavigationMenuItemsProps, {}, "">;
|
|
3
|
+
type NavigationMenuItems = ReturnType<typeof NavigationMenuItems>;
|
|
4
|
+
export default NavigationMenuItems;
|
package/dist/globals.css
CHANGED