function dragHandleZone(node, options) {
    let currentOptions = options;
    const zone = dndzone(node, {
        ...currentOptions,
        ...getAddedOptions()
    });
    function isItemDisabledCB(isItemsDragDisabled) {
        zone.update({
            ...currentOptions,
            ...getAddedOptions(isItemsDragDisabled)
        });
    }
    isItemsDragDisabled.subscribe(isItemDisabledCB);
    function consider(e) {
        const {
            info: {source, trigger}
        } = e.detail;
        // Ensure dragging is stopped on drag finish via keyboard
        if (source === SOURCES.KEYBOARD && trigger === TRIGGERS.DRAG_STOPPED) {
            isItemsDragDisabled.set(true);
        }
    }

    function finalize(e) {
        const {
            info: {source}
        } = e.detail;
        // Ensure dragging is stopped on drag finish via pointer (mouse, touch)
        if (source === SOURCES.POINTER) {
            isItemsDragDisabled.set(true);
        }
    }

    node.addEventListener("consider", consider);
    node.addEventListener("finalize", finalize);

    return {
        update: newOptions => {
            currentOptions = newOptions;
            zone.update({
                ...currentOptions,
                ...getAddedOptions(isItemsDragDisabled.get())
            });
        },
        destroy: () => {
            node.removeEventListener("consider", consider);
            node.removeEventListener("finalize", finalize);
            isItemsDragDisabled.unsubscribe(isItemDisabledCB);
        }
    };
}
This is an action that wraps around the dndzone action to make it easy to work with drag handles
When using this you must also use the 'dragHandle' action (see below) on an element inside each item within the zone
Credit for the idea and initial implementation goes to @gleuch (Greg Leuch) and @geovie (Georg Vienna)

@param {HTMLElement} node
@param options - will be passed down to the dndzone
@return {{update: (newOptions: Object) => {}, destroy: () => {}}}