reka-ui
Version:
Vue port for Radix UI Primitives.
1 lines • 7.01 kB
Source Map (JSON)
{"version":3,"file":"CheckboxRoot.cjs","sources":["../../src/Checkbox/CheckboxRoot.vue"],"sourcesContent":["<script lang=\"ts\">\nimport type { PrimitiveProps } from '@/Primitive'\nimport type { Ref } from 'vue'\nimport { createContext, isNullish, isValueEqualOrExist, useFormControl, useForwardExpose } from '@/shared'\nimport type { CheckedState } from './utils'\nimport type { AcceptableValue, FormFieldProps } from '@/shared/types'\nimport { useVModel } from '@vueuse/core'\nimport { injectCheckboxGroupRootContext } from './CheckboxGroupRoot.vue'\n\nexport interface CheckboxRootProps extends PrimitiveProps, FormFieldProps {\n /** The value of the checkbox when it is initially rendered. Use when you do not need to control its value. */\n defaultValue?: boolean | 'indeterminate'\n /** The controlled value of the checkbox. Can be binded with v-model. */\n modelValue?: boolean | 'indeterminate' | null\n /** When `true`, prevents the user from interacting with the checkbox */\n disabled?: boolean\n /**\n * The value given as data when submitted with a `name`.\n * @defaultValue \"on\"\n */\n value?: AcceptableValue\n /** Id of the element */\n id?: string\n}\n\nexport type CheckboxRootEmits = {\n /** Event handler called when the value of the checkbox changes. */\n 'update:modelValue': [value: boolean | 'indeterminate']\n}\n\ninterface CheckboxRootContext {\n disabled: Ref<boolean>\n state: Ref<CheckedState>\n}\n\nexport const [injectCheckboxRootContext, provideCheckboxRootContext]\n = createContext<CheckboxRootContext>('CheckboxRoot')\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Primitive } from '@/Primitive'\nimport { RovingFocusItem } from '@/RovingFocus'\nimport { getState, isIndeterminate } from './utils'\nimport { VisuallyHiddenInput } from '@/VisuallyHidden'\nimport { isEqual } from 'ohash'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<CheckboxRootProps>(), {\n modelValue: undefined,\n value: 'on',\n as: 'button',\n})\nconst emits = defineEmits<CheckboxRootEmits>()\n\ndefineSlots<{\n default: (props: {\n /** Current value */\n modelValue: typeof modelValue.value\n /** Current state */\n state: typeof checkboxState.value\n }) => any\n}>()\n\nconst { forwardRef, currentElement } = useForwardExpose()\n\nconst checkboxGroupContext = injectCheckboxGroupRootContext(null)\n\nconst modelValue = useVModel(props, 'modelValue', emits, {\n defaultValue: props.defaultValue,\n passive: (props.modelValue === undefined) as false,\n}) as Ref<CheckedState>\n\nconst disabled = computed(() => checkboxGroupContext?.disabled.value || props.disabled)\n\nconst checkboxState = computed<CheckedState>(() => {\n if (!isNullish(checkboxGroupContext?.modelValue.value)) {\n return isValueEqualOrExist(checkboxGroupContext.modelValue.value, props.value)\n }\n else {\n return modelValue.value === 'indeterminate' ? 'indeterminate' : modelValue.value\n }\n})\n\nfunction handleClick() {\n if (!isNullish(checkboxGroupContext?.modelValue.value)) {\n const modelValueArray = [...(checkboxGroupContext.modelValue.value || [])]\n if (isValueEqualOrExist(modelValueArray, props.value)) {\n const index = modelValueArray.findIndex(i => isEqual(i, props.value))\n modelValueArray.splice(index, 1)\n }\n else {\n modelValueArray.push(props.value)\n }\n checkboxGroupContext.modelValue.value = modelValueArray\n }\n else {\n modelValue.value = isIndeterminate(modelValue.value) ? true : !modelValue.value\n }\n}\n\nconst isFormControl = useFormControl(currentElement)\nconst ariaLabel = computed(() => props.id && currentElement.value\n ? (document.querySelector(`[for=\"${props.id}\"]`) as HTMLLabelElement)?.innerText\n : undefined)\n\nprovideCheckboxRootContext({\n disabled,\n state: checkboxState,\n})\n</script>\n\n<template>\n <component\n v-bind=\"$attrs\"\n :is=\"checkboxGroupContext?.rovingFocus.value ? RovingFocusItem : Primitive\"\n :id=\"id\"\n :ref=\"forwardRef\"\n role=\"checkbox\"\n :as-child=\"asChild\"\n :as=\"as\"\n :type=\"as === 'button' ? 'button' : undefined\"\n :aria-checked=\"isIndeterminate(checkboxState) ? 'mixed' : checkboxState\"\n :aria-required=\"required\"\n :aria-label=\"$attrs['aria-label'] || ariaLabel\"\n :data-state=\"getState(checkboxState)\"\n :data-disabled=\"disabled ? '' : undefined\"\n :disabled=\"disabled\"\n :focusable=\"checkboxGroupContext?.rovingFocus.value ? !disabled : undefined\"\n @keydown.enter.prevent=\"() => {\n // According to WAI ARIA, Checkboxes don't activate on enter keypress\n }\"\n @click=\"handleClick\"\n >\n <slot\n :model-value=\"modelValue\"\n :state=\"checkboxState\"\n />\n\n <VisuallyHiddenInput\n v-if=\"isFormControl && name && !checkboxGroupContext\"\n type=\"checkbox\"\n :checked=\"!!checkboxState\"\n :name=\"name\"\n :value=\"value\"\n :disabled=\"disabled\"\n :required=\"required\"\n />\n </component>\n</template>\n"],"names":["createContext","useForwardExpose","injectCheckboxGroupRootContext","useVModel","computed","isNullish","isValueEqualOrExist","isEqual","isIndeterminate","useFormControl"],"mappings":";;;;;;;;;;;;;;;;AAmCO,MAAM,CAAC,yBAAA,EAA2B,0BAA0B,CAAA,GAC/DA,mCAAmC,cAAc;;;;;;;;;;;;;;;;;;;AAerD,IAAA,MAAM,KAAQ,GAAA,OAAA;AAKd,IAAA,MAAM,KAAQ,GAAA,MAAA;AAWd,IAAA,MAAM,EAAE,UAAA,EAAY,cAAe,EAAA,GAAIC,wCAAiB,EAAA;AAExD,IAAM,MAAA,oBAAA,GAAuBC,0DAA+B,IAAI,CAAA;AAEhE,IAAA,MAAM,UAAa,GAAAC,cAAA,CAAU,KAAO,EAAA,YAAA,EAAc,KAAO,EAAA;AAAA,MACvD,cAAc,KAAM,CAAA,YAAA;AAAA,MACpB,OAAA,EAAU,MAAM,UAAe,KAAA;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,WAAWC,YAAS,CAAA,MAAM,sBAAsB,QAAS,CAAA,KAAA,IAAS,MAAM,QAAQ,CAAA;AAEtF,IAAM,MAAA,aAAA,GAAgBA,aAAuB,MAAM;AACjD,MAAA,IAAI,CAACC,wBAAA,CAAU,oBAAsB,EAAA,UAAA,CAAW,KAAK,CAAG,EAAA;AACtD,QAAA,OAAOC,8CAAoB,CAAA,oBAAA,CAAqB,UAAW,CAAA,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,OAE1E,MAAA;AACH,QAAA,OAAO,UAAW,CAAA,KAAA,KAAU,eAAkB,GAAA,eAAA,GAAkB,UAAW,CAAA,KAAA;AAAA;AAC7E,KACD,CAAA;AAED,IAAA,SAAS,WAAc,GAAA;AACrB,MAAA,IAAI,CAACD,wBAAA,CAAU,oBAAsB,EAAA,UAAA,CAAW,KAAK,CAAG,EAAA;AACtD,QAAA,MAAM,kBAAkB,CAAC,GAAI,qBAAqB,UAAW,CAAA,KAAA,IAAS,EAAG,CAAA;AACzE,QAAA,IAAIC,8CAAoB,CAAA,eAAA,EAAiB,KAAM,CAAA,KAAK,CAAG,EAAA;AACrD,UAAM,MAAA,KAAA,GAAQ,gBAAgB,SAAU,CAAA,CAAA,CAAA,KAAKC,cAAQ,CAAG,EAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACpE,UAAgB,eAAA,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,SAE5B,MAAA;AACH,UAAgB,eAAA,CAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA;AAElC,QAAA,oBAAA,CAAqB,WAAW,KAAQ,GAAA,eAAA;AAAA,OAErC,MAAA;AACH,QAAA,UAAA,CAAW,QAAQC,8BAAgB,CAAA,UAAA,CAAW,KAAK,CAAI,GAAA,IAAA,GAAO,CAAC,UAAW,CAAA,KAAA;AAAA;AAC5E;AAGF,IAAM,MAAA,aAAA,GAAgBC,qCAAe,cAAc,CAAA;AACnD,IAAA,MAAM,SAAY,GAAAL,YAAA,CAAS,MAAM,KAAA,CAAM,MAAM,cAAe,CAAA,KAAA,GACvD,QAAS,CAAA,aAAA,CAAc,SAAS,KAAM,CAAA,EAAE,CAAI,EAAA,CAAA,CAAA,EAAwB,YACrE,MAAS,CAAA;AAEb,IAA2B,0BAAA,CAAA;AAAA,MACzB,QAAA;AAAA,MACA,KAAO,EAAA;AAAA,KACR,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}