carbon-components-svelte/src/UIShell/SideNavMenu.svelte
Eric Liu 6bf72d4602
fix(types): loosen icon prop type to any (#2095)
Fixes https://github.com/carbon-design-system/carbon-icons-svelte/issues/207

`carbon-icons-svelte@13` and `carbon-pictograms-svelte@13` now  
only support TypeScript for Svelte 4/5.

The new `Component` type is incompatible with the `icon` prop in  
`carbon-components-svelte`, causing a type error with Svelte 5, as  
`typeof SvelteComponent` doesn't match the new `Component` type.

Since `Component` isn't available in Svelte 3/4, this PR changes  
the `icon` prop type to `any` for compatibility across Svelte 3, 4, and 5.
2025-02-02 19:49:53 -08:00

59 lines
1.3 KiB
Svelte

<script>
/** Set to `true` to toggle the expanded state */
export let expanded = false;
/**
* Specify the text
* @type {string}
*/
export let text = undefined;
/**
* Specify the icon to render
* @type {any}
*/
export let icon = undefined;
/** Obtain a reference to the HTML button element */
export let ref = null;
import ChevronDown from "../icons/ChevronDown.svelte";
</script>
<li class:bx--side-nav__item={true} class:bx--side-nav__item--icon={icon}>
<button
type="button"
bind:this={ref}
aria-expanded={expanded}
class:bx--side-nav__submenu={true}
{...$$restProps}
on:click
on:click={() => {
expanded = !expanded;
}}
>
{#if $$slots.icon || icon}
<div class:bx--side-nav__icon={true}>
<slot name="icon">
<svelte:component this={icon} />
</slot>
</div>
{/if}
<span class:bx--side-nav__submenu-title={true}>{text}</span>
<div
class:bx--side-nav__icon={true}
class:bx--side-nav__icon--small={true}
class:bx--side-nav__submenu-chevron={true}
>
<ChevronDown />
</div>
</button>
<!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->
<ul
role="menu"
class:bx--side-nav__menu={true}
style:max-height={expanded ? "none" : undefined}
>
<slot />
</ul>
</li>