@dvcol/neo-svelte
Version:
Neomorphic ui library for svelte 5
29 lines (28 loc) • 896 B
JavaScript
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);