reka-ui
Version:
Vue port for Radix UI Primitives.
175 lines (172 loc) • 5.26 kB
JavaScript
import { createContext } from "../shared/createContext.js";
import { isNullish } from "../shared/nullish.js";
import { useDirection } from "../shared/useDirection.js";
import { useFormControl } from "../shared/useFormControl.js";
import { useCollection } from "../Collection/Collection.js";
import { PopperRoot_default } from "../Popper/PopperRoot.js";
import { BubbleSelect_default } from "./BubbleSelect.js";
import { compare } from "./utils.js";
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, defineComponent, mergeProps, openBlock, ref, renderList, renderSlot, toRefs, unref, withCtx } from "vue";
import { useVModel } from "@vueuse/core";
//#region src/Select/SelectRoot.vue?vue&type=script&setup=true&lang.ts
const _hoisted_1 = {
key: 0,
value: ""
};
const [injectSelectRootContext, provideSelectRootContext] = createContext("SelectRoot");
var SelectRoot_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
inheritAttrs: false,
__name: "SelectRoot",
props: {
open: {
type: Boolean,
required: false,
default: void 0
},
defaultOpen: {
type: Boolean,
required: false
},
defaultValue: {
type: null,
required: false
},
modelValue: {
type: null,
required: false,
default: void 0
},
by: {
type: [String, Function],
required: false
},
dir: {
type: String,
required: false
},
multiple: {
type: Boolean,
required: false
},
autocomplete: {
type: String,
required: false
},
disabled: {
type: Boolean,
required: false
},
name: {
type: String,
required: false
},
required: {
type: Boolean,
required: false
}
},
emits: ["update:modelValue", "update:open"],
setup(__props, { emit: __emit }) {
const props = __props;
const emits = __emit;
const { required, disabled, multiple, dir: propDir } = toRefs(props);
const modelValue = useVModel(props, "modelValue", emits, {
defaultValue: props.defaultValue ?? (multiple.value ? [] : void 0),
passive: props.modelValue === void 0,
deep: true
});
const open = useVModel(props, "open", emits, {
defaultValue: props.defaultOpen,
passive: props.open === void 0
});
const triggerElement = ref();
const valueElement = ref();
const triggerPointerDownPosRef = ref({
x: 0,
y: 0
});
const isEmptyModelValue = computed(() => {
if (multiple.value && Array.isArray(modelValue.value)) return modelValue.value?.length === 0;
else return isNullish(modelValue.value);
});
useCollection({ isProvider: true });
const dir = useDirection(propDir);
const isFormControl = useFormControl(triggerElement);
const optionsSet = ref(/* @__PURE__ */ new Set());
const nativeSelectKey = computed(() => {
return Array.from(optionsSet.value).map((option) => option.value).join(";");
});
function handleValueChange(value) {
if (multiple.value) {
const array = Array.isArray(modelValue.value) ? [...modelValue.value] : [];
const index = array.findIndex((i) => compare(i, value, props.by));
index === -1 ? array.push(value) : array.splice(index, 1);
modelValue.value = [...array];
} else modelValue.value = value;
}
provideSelectRootContext({
triggerElement,
onTriggerChange: (node) => {
triggerElement.value = node;
},
valueElement,
onValueElementChange: (node) => {
valueElement.value = node;
},
contentId: "",
modelValue,
onValueChange: handleValueChange,
by: props.by,
open,
multiple,
required,
onOpenChange: (value) => {
open.value = value;
},
dir,
triggerPointerDownPosRef,
disabled,
isEmptyModelValue,
optionsSet,
onOptionAdd: (option) => optionsSet.value.add(option),
onOptionRemove: (option) => optionsSet.value.delete(option)
});
return (_ctx, _cache) => {
return openBlock(), createBlock(unref(PopperRoot_default), null, {
default: withCtx(() => [renderSlot(_ctx.$slots, "default", {
modelValue: unref(modelValue),
open: unref(open)
}), unref(isFormControl) ? (openBlock(), createBlock(BubbleSelect_default, {
key: nativeSelectKey.value,
"aria-hidden": "true",
tabindex: "-1",
multiple: unref(multiple),
required: unref(required),
name: _ctx.name,
autocomplete: _ctx.autocomplete,
disabled: unref(disabled),
value: unref(modelValue)
}, {
default: withCtx(() => [unref(isNullish)(unref(modelValue)) ? (openBlock(), createElementBlock("option", _hoisted_1)) : createCommentVNode("v-if", true), (openBlock(true), createElementBlock(Fragment, null, renderList(Array.from(optionsSet.value), (option) => {
return openBlock(), createElementBlock("option", mergeProps({ key: option.value ?? "" }, { ref_for: true }, option), null, 16);
}), 128))]),
_: 1
}, 8, [
"multiple",
"required",
"name",
"autocomplete",
"disabled",
"value"
])) : createCommentVNode("v-if", true)]),
_: 3
});
};
}
});
//#endregion
//#region src/Select/SelectRoot.vue
var SelectRoot_default = SelectRoot_vue_vue_type_script_setup_true_lang_default;
//#endregion
export { SelectRoot_default, injectSelectRootContext, provideSelectRootContext };
//# sourceMappingURL=SelectRoot.js.map