diff --git a/src/App.svelte b/src/App.svelte index b92f7d7..3e74034 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -17,6 +17,7 @@ import { fly } from "svelte/transition"; import LogMessage from "./lib/LogMessage.svelte"; import { LogMessageType } from "./lib/LogMessageType.ts"; + import MeltContextMenu from "./lib/MeltContextMenu.svelte"; import { tooltip } from "./lib/tooltip.ts"; @@ -246,6 +247,7 @@
ContextMenu and context-target: + + import { createContextMenu, melt } from "@melt-ui/svelte"; + import { get, writable } from "svelte/store"; + + ///////// USER CODE: Business logic of the actual context menu instance ///////////// + + const settingsSync = writable(true); + const hideMeltUI = writable(false); + + let settingsSyncState = $state($settingsSync); + settingsSync.subscribe((s) => { + console.log(s); + settingsSyncState = s; + }); + + const { + elements: { trigger, menu, item, separator }, + builders: { createSubmenu, createMenuRadioGroup, createCheckboxItem }, + } = createContextMenu(); + + const { + elements: { subMenu: subMenuA, subTrigger: subTriggerA }, + } = createSubmenu(); + + const { + elements: { radioGroup, radioItem }, + helpers: { isChecked }, + } = createMenuRadioGroup({ + defaultValue: "Hunter Johnston", + }); + + const { + elements: { checkboxItem }, + } = createCheckboxItem({ + checked: settingsSync, + }); + + const { + elements: { checkboxItem: checkboxItemA }, + } = createCheckboxItem({ + checked: hideMeltUI, + }); + + const personsArr = [ + "Hunter Johnston", + "Thomas G. Lopes", + "Adrian Gonz", + "Franck Poingt", + ]; + + let menuRender = [ + { + fn: menuItem, + descr: item, + fields: { + label: "About Melt UI", + diabled: false, + hotkey: "⇧⌘N", + }, + }, + { + fn: menuItem, + descr: item, + fields: { + label: "Check for Updates...", + diabled: true, + hotkey: "⇧U", + }, + }, + { + fn: menuSeparator, + descr: separator, + }, + { + fn: menuCheckbox, + descr: checkboxItem, + fields: { + label: "Settings Sync is On", + disabled: false, + hotkey: "ABC", + ischecked: () => settingsSyncState, + }, + }, + { + fn: menuItem, + descr: subTriggerA, + fields: { + label: "Select profile", + diabled: false, + hotkey: "⇧P", + }, + }, + { + fn: menuSeparator, + descr: separator, + }, + { + fn: menuSubmenu, + fields: { + subtree: [ + { + fn: menuCheckbox, + descr: checkboxItem, + fields: { + label: "Settings Sync is On", + disabled: false, + hotkey: "ABC", + ischecked: () => settingsSyncState, + }, + }, + ], + }, + descr: subMenuA, + }, + ]; + + let menuMain = { + fn: menuSubmenu, + descr: menu, + subtree: menuRender, + }; + + let menuRef1 = () => { + return $menu; + }; + let menuRef2 = () => menu; + + + + + + + + Right click me. + + +{@render menuMenu(()=> {return $menu}, () => menu, {subtree: menuRender})} + + + + + + +{#snippet content(arr)} + {#each arr as element, i} + {@render element.fn(element.descr, element.fields)} + {/each} +{/snippet} + +{#snippet menuSubmenu(descriptor, fields)} + +{/snippet} + +{#snippet menuMenu(descriptor1, descriptor2, fields)} + +{/snippet} + +{#snippet menuSeparator(descriptor)} +
+{/snippet} + +{#snippet menuRadio(descriptor, fields)} +
+
+ {#if get(fields.helper)(fields.label) === true} + [x] + {:else if get(fields.helper)(fields.label) === false} + [ ] + {/if} +
+ {label} +
{fields.hotkey}
+
+{/snippet} + +{#snippet menuCheckbox(descriptor, fields)} +
+
+ {#if fields.ischecked() == true} + [x] + {:else} + [ ] + {/if} +
+ {fields.label} +
{fields.hotkey}
+
+{/snippet} + +{#snippet menuItem(descriptor, fields)} +
+ {fields.label} +
{fields.hotkey}
+
+{/snippet} + +