UNPKG

@dvcol/neo-svelte

Version:

Neomorphic ui library for svelte 5

29 lines (28 loc) 896 B
import { getContext, setContext } from 'svelte'; import { SvelteMap } from 'svelte/reactivity'; export class NeoMenuContext { #parent = $state(); #children = new SvelteMap(); #hasChildrenOpen = $derived(this.#children.values().some(Boolean)); get ref() { return this.#parent?.ref; } get children() { return this.#hasChildrenOpen; } get parent() { return this.#parent?.open || this.children; } constructor(parent) { this.#parent = parent; } toggle(index, open) { this.#children.set(index, open); } async dismiss() { await this.#parent?.dismiss(); } } export const NeoMenuContextSymbol = Symbol('NeoMenuContext'); export const setMenuContext = (context) => setContext(NeoMenuContextSymbol, new NeoMenuContext(context)); export const getMenuContext = () => getContext(NeoMenuContextSymbol);