reka-ui
Version:
Vue port for Radix UI Primitives.
86 lines (82 loc) • 3.38 kB
JavaScript
'use strict';
const vue = require('vue');
const shared_createContext = require('../shared/createContext.cjs');
const Accordion_AccordionRoot = require('./AccordionRoot.cjs');
const shared_useForwardExpose = require('../shared/useForwardExpose.cjs');
const Collapsible_CollapsibleRoot = require('../Collapsible/CollapsibleRoot.cjs');
const shared_useArrowNavigation = require('../shared/useArrowNavigation.cjs');
const [injectAccordionItemContext, provideAccordionItemContext] = shared_createContext.createContext("AccordionItem");
const _sfc_main = /* @__PURE__ */ vue.defineComponent({
__name: "AccordionItem",
props: {
disabled: { type: Boolean },
value: {},
unmountOnHide: { type: Boolean },
asChild: { type: Boolean },
as: {}
},
setup(__props, { expose: __expose }) {
const props = __props;
const rootContext = Accordion_AccordionRoot.injectAccordionRootContext();
const open = vue.computed(
() => rootContext.isSingle.value ? props.value === rootContext.modelValue.value : Array.isArray(rootContext.modelValue.value) && rootContext.modelValue.value.includes(props.value)
);
const disabled = vue.computed(() => {
return rootContext.disabled.value || props.disabled;
});
const dataDisabled = vue.computed(() => disabled.value ? "" : void 0);
const dataState = vue.computed(
() => open.value ? "open" /* Open */ : "closed" /* Closed */
);
__expose({ open, dataDisabled });
const { currentRef, currentElement } = shared_useForwardExpose.useForwardExpose();
provideAccordionItemContext({
open,
dataState,
disabled,
dataDisabled,
triggerId: "",
currentRef,
currentElement,
value: vue.computed(() => props.value)
});
function handleArrowKey(e) {
const target = e.target;
const allCollectionItems = Array.from(rootContext.parentElement.value?.querySelectorAll("[data-reka-collection-item]") ?? []);
const collectionItemIndex = allCollectionItems.findIndex((item) => item === target);
if (collectionItemIndex === -1)
return null;
shared_useArrowNavigation.useArrowNavigation(
e,
currentElement.value,
rootContext.parentElement.value,
{
arrowKeyOptions: rootContext.orientation,
dir: rootContext.direction.value,
focus: true
}
);
}
return (_ctx, _cache) => {
return vue.openBlock(), vue.createBlock(vue.unref(Collapsible_CollapsibleRoot._sfc_main), {
"data-orientation": vue.unref(rootContext).orientation,
"data-disabled": dataDisabled.value,
"data-state": dataState.value,
disabled: disabled.value,
open: open.value,
as: props.as,
"as-child": props.asChild,
"unmount-on-hide": vue.unref(rootContext).unmountOnHide.value,
onKeydown: vue.withKeys(handleArrowKey, ["up", "down", "left", "right", "home", "end"])
}, {
default: vue.withCtx(() => [
vue.renderSlot(_ctx.$slots, "default", { open: open.value })
]),
_: 3
}, 8, ["data-orientation", "data-disabled", "data-state", "disabled", "open", "as", "as-child", "unmount-on-hide"]);
};
}
});
exports._sfc_main = _sfc_main;
exports.injectAccordionItemContext = injectAccordionItemContext;
//# sourceMappingURL=AccordionItem.cjs.map