import { useForwardExpose } from "../shared/useForwardExpose.js"; import { Primitive } from "../Primitive/Primitive.js"; import { injectFieldRootContext } from "./FieldRoot.js"; import { computed, createBlock, defineComponent, mergeProps, onBeforeUnmount, onMounted, openBlock, renderSlot, unref, useAttrs, watch, withCtx } from "vue"; //#region src/Field/FieldControl.vue?vue&type=script&setup=true&lang.ts var FieldControl_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({ inheritAttrs: false, __name: "FieldControl", props: { id: { type: String, required: false }, modelValue: { type: [String, Number], required: false, default: void 0 }, defaultValue: { type: [String, Number], required: false, default: void 0 }, asChild: { type: Boolean, required: false }, as: { type: null, required: false, default: "input" } }, emits: ["update:modelValue"], setup(__props, { emit: __emit }) { const props = __props; const emits = __emit; const fieldContext = injectFieldRootContext(); const attrs = useAttrs(); const { forwardRef, currentElement } = useForwardExpose(); const controlId = computed(() => props.id ?? fieldContext.fieldId.value); function isAttrSet(value) { return value !== void 0 && value !== false && value !== "false"; } function mergeIds(consumerValue, fieldValue) { return [consumerValue, fieldValue].filter(Boolean).join(" ") || void 0; } function getBindings() { const { "aria-describedby": describedBy, "aria-labelledby": labelledBy, "aria-invalid": ariaInvalid, name, disabled, required,...rest } = attrs; const isDisabled = fieldContext.disabled.value || isAttrSet(disabled); return { ...fieldContext.dataAttributes.value, ...rest, ...valueBinding.value, "name": fieldContext.name.value ?? name, "disabled": isDisabled || void 0, "required": fieldContext.required.value || isAttrSet(required) || void 0, "aria-labelledby": mergeIds(labelledBy, fieldContext.labelId.value), "aria-describedby": mergeIds(describedBy, fieldContext.describedBy.value), "aria-invalid": ariaInvalid ?? (fieldContext.invalid.value && !isDisabled || void 0) }; } const isControlled = computed(() => props.modelValue !== void 0); const valueBinding = computed(() => { if (isControlled.value) return { value: props.modelValue }; if (props.defaultValue !== void 0) return { value: props.defaultValue }; return {}; }); function getElement() { const element = currentElement.value; return element && [ "INPUT", "TEXTAREA", "SELECT" ].includes(element.tagName) ? element : void 0; } function handleInput() { const element = getElement(); if (element) emits("update:modelValue", element.value); if (!isControlled.value) fieldContext.handleControlInput(); } watch(() => props.modelValue, (value, previous) => { if (value !== void 0 && value !== previous) fieldContext.handleControlInput({ value: String(value) }); }, { flush: "post" }); let unregister; onMounted(() => { unregister = fieldContext.registerControl({ id: () => controlId.value, element: () => currentElement.value, getValue: () => getElement()?.value, validityElement: getElement }); }); onBeforeUnmount(() => unregister?.()); return (_ctx, _cache) => { return openBlock(), createBlock(unref(Primitive), mergeProps({ id: controlId.value, ref: unref(forwardRef) }, getBindings(), { as: __props.as, "as-child": __props.asChild, onFocus: _cache[0] || (_cache[0] = ($event) => unref(fieldContext).handleControlFocus()), onBlur: _cache[1] || (_cache[1] = ($event) => unref(fieldContext).handleControlBlur()), onInput: handleInput }), { default: withCtx(() => [renderSlot(_ctx.$slots, "default")]), _: 3 }, 16, [ "id", "as", "as-child" ]); }; } }); //#endregion //#region src/Field/FieldControl.vue var FieldControl_default = FieldControl_vue_vue_type_script_setup_true_lang_default; //#endregion export { FieldControl_default }; //# sourceMappingURL=FieldControl.js.map