ropav 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +32 -3
  2. package/dist/base.css +153 -77
  3. package/dist/button.css +276 -32
  4. package/dist/button.js +40 -19
  5. package/dist/button.js.map +1 -1
  6. package/dist/checkbox.css +127 -19
  7. package/dist/checkbox.js +57 -44
  8. package/dist/checkbox.js.map +1 -1
  9. package/dist/components/button/button.d.ts +2 -2
  10. package/dist/components/button/index.d.ts +1 -1
  11. package/dist/components/button/types.d.ts +8 -1
  12. package/dist/components/checkbox/index.d.ts +1 -1
  13. package/dist/components/checkbox/types.d.ts +8 -0
  14. package/dist/components/input/index.d.ts +1 -1
  15. package/dist/components/input/input.d.ts +5 -1
  16. package/dist/components/input/types.d.ts +5 -0
  17. package/dist/components/radio/index.d.ts +1 -1
  18. package/dist/components/radio/types.d.ts +12 -0
  19. package/dist/components/select/types.d.ts +3 -0
  20. package/dist/components/select/useSelect.d.ts +2 -0
  21. package/dist/components/switch/index.d.ts +1 -1
  22. package/dist/components/switch/types.d.ts +4 -0
  23. package/dist/components/textarea/index.d.ts +1 -1
  24. package/dist/components/textarea/types.d.ts +5 -0
  25. package/dist/components/textarea/useTextarea.d.ts +1 -0
  26. package/dist/index.d.ts +0 -2
  27. package/dist/index.js +2 -4
  28. package/dist/input.css +91 -15
  29. package/dist/input.js +66 -23
  30. package/dist/input.js.map +1 -1
  31. package/dist/radio.css +84 -16
  32. package/dist/radio.js +35 -8
  33. package/dist/radio.js.map +1 -1
  34. package/dist/select.css +97 -32
  35. package/dist/select.js +128 -88
  36. package/dist/select.js.map +1 -1
  37. package/dist/switch.css +75 -20
  38. package/dist/switch.js +8 -4
  39. package/dist/switch.js.map +1 -1
  40. package/dist/textarea.css +84 -14
  41. package/dist/textarea.js +33 -5
  42. package/dist/textarea.js.map +1 -1
  43. package/dist/useControlState.js +4 -0
  44. package/dist/useControlState.js.map +1 -1
  45. package/package.json +11 -10
  46. package/src/styles/_mixins.scss +21 -11
  47. package/src/styles/_tokens.scss +168 -96
  48. package/src/styles/_variables.scss +30 -28
  49. package/dist/components/_internal/icons/CheckIcon.d.ts +0 -18
  50. package/dist/components/_internal/icons/ChevronDownIcon.d.ts +0 -18
  51. package/dist/components/_internal/icons/MinusIcon.d.ts +0 -18
  52. package/dist/components/_internal/icons/index.d.ts +0 -3
  53. package/dist/components/_internal/optionList.d.ts +0 -9
  54. package/dist/components/tabs/index.d.ts +0 -5
  55. package/dist/components/tabs/index.js +0 -2
  56. package/dist/components/tabs/tab-panel.d.ts +0 -21
  57. package/dist/components/tabs/tabs-list.d.ts +0 -20
  58. package/dist/components/tabs/tabs-trigger.d.ts +0 -21
  59. package/dist/components/tabs/tabs.d.ts +0 -23
  60. package/dist/components/tabs/types.d.ts +0 -18
  61. package/dist/components/tabs/useTabs.d.ts +0 -19
  62. package/dist/components/tooltip/index.d.ts +0 -2
  63. package/dist/components/tooltip/index.js +0 -2
  64. package/dist/components/tooltip/tooltip.d.ts +0 -23
  65. package/dist/components/tooltip/types.d.ts +0 -5
  66. package/dist/components/tooltip/useTooltip.d.ts +0 -8
  67. package/dist/tabs.css +0 -45
  68. package/dist/tabs.js +0 -205
  69. package/dist/tabs.js.map +0 -1
  70. package/dist/tooltip.css +0 -78
  71. package/dist/tooltip.js +0 -112
  72. package/dist/tooltip.js.map +0 -1
  73. package/dist/useRequiredInject.js +0 -11
  74. package/dist/useRequiredInject.js.map +0 -1
package/dist/radio.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"radio.js","names":[],"sources":["../src/components/radio/types.ts","../src/components/radio/useRadio.ts","../src/components/radio/radio.vue","../src/components/radio/radio.vue","../src/components/radio/radio-group.vue","../src/components/radio/radio-group.vue"],"sourcesContent":["import type { InjectionKey } from 'vue';\n\nexport interface RadioProps {\n value: string | number;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n id?: string;\n name?: string;\n modelValue: string | number | null;\n disabled?: boolean;\n required?: boolean;\n invalid?: boolean;\n ariaLabel?: string;\n describedby?: string;\n labelledby?: string;\n}\n\nexport interface RadioGroupContext {\n modelValue: string | number | null;\n name: string;\n disabled: boolean;\n required: boolean;\n select: (value: string | number) => void;\n}\n\nexport const radioGroupKey = Symbol('radioGroup') as InjectionKey<RadioGroupContext>;\n","import { computed, provide, useId } from 'vue';\nimport { useControlState } from '@/composables/useControlState';\nimport { useRequiredInject } from '@/composables/useRequiredInject';\nimport { bem } from '@/utils/bem';\nimport { radioGroupKey } from './types';\nimport type { RadioGroupContext, RadioGroupProps, RadioProps } from './types';\n\nexport function useRadio(props: Readonly<RadioProps>) {\n const group = useRequiredInject(radioGroupKey, 'RpRadio');\n const isChecked = computed(() => group.modelValue === props.value);\n const isDisabled = computed(() => props.disabled || group.disabled);\n\n const rootClass = computed(() =>\n bem('rp-radio', {\n checked: isChecked.value,\n disabled: isDisabled.value,\n }),\n );\n\n function onSelect() {\n if (isDisabled.value) return;\n group.select(props.value);\n }\n\n return {\n group,\n isChecked,\n isDisabled,\n rootClass,\n onSelect,\n };\n}\n\nexport function useRadioGroup(\n props: Readonly<RadioGroupProps>,\n emitUpdate: (value: string | number | null) => void,\n) {\n const control = useControlState(props);\n\n const rootClass = computed(() =>\n bem('rp-radio-group', {\n disabled: control.disabled,\n invalid: control.invalid,\n }),\n );\n\n const generatedName = useId();\n const groupName = computed(() => props.name ?? `${control.id ?? generatedName}-radio`);\n\n provide<RadioGroupContext>(radioGroupKey, {\n get modelValue() { return props.modelValue; },\n get name() { return groupName.value; },\n get disabled() { return control.disabled; },\n get required() { return control.required; },\n select(value) {\n emitUpdate(value);\n },\n });\n\n return {\n control,\n rootClass,\n };\n}\n","<template>\n <label :class=\"rootClass\" :data-disabled=\"isDisabled || undefined\" :data-state=\"isChecked ? 'checked' : 'unchecked'\">\n <input\n type=\"radio\"\n class=\"rp-radio__native\"\n :name=\"group.name\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled || undefined\"\n :required=\"group.required || undefined\"\n @change=\"onSelect\"\n />\n <span class=\"rp-radio__dot\" />\n <span v-if=\"$slots.default\" class=\"rp-radio__label\">\n <slot />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadio } from './useRadio';\nimport type { RadioProps } from './types';\n\ndefineOptions({ name: 'RpRadio' });\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n disabled: false,\n});\n\nconst { group, isChecked, isDisabled, rootClass, onSelect } = useRadio(props);\n</script>\n\n<style src=\"./radio.scss\" lang=\"scss\" scoped></style>\n","<template>\n <label :class=\"rootClass\" :data-disabled=\"isDisabled || undefined\" :data-state=\"isChecked ? 'checked' : 'unchecked'\">\n <input\n type=\"radio\"\n class=\"rp-radio__native\"\n :name=\"group.name\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled || undefined\"\n :required=\"group.required || undefined\"\n @change=\"onSelect\"\n />\n <span class=\"rp-radio__dot\" />\n <span v-if=\"$slots.default\" class=\"rp-radio__label\">\n <slot />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadio } from './useRadio';\nimport type { RadioProps } from './types';\n\ndefineOptions({ name: 'RpRadio' });\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n disabled: false,\n});\n\nconst { group, isChecked, isDisabled, rootClass, onSelect } = useRadio(props);\n</script>\n\n<style src=\"./radio.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n :id=\"control.id\"\n :class=\"rootClass\"\n role=\"radiogroup\"\n :data-disabled=\"control.disabled || undefined\"\n :data-invalid=\"control.invalid || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadioGroup } from './useRadio';\nimport type { RadioGroupProps } from './types';\n\ndefineOptions({ name: 'RpRadioGroup' });\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n}>();\n\nconst { control, rootClass } = useRadioGroup(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./radio-group.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n :id=\"control.id\"\n :class=\"rootClass\"\n role=\"radiogroup\"\n :data-disabled=\"control.disabled || undefined\"\n :data-invalid=\"control.invalid || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadioGroup } from './useRadio';\nimport type { RadioGroupProps } from './types';\n\ndefineOptions({ name: 'RpRadioGroup' });\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n}>();\n\nconst { control, rootClass } = useRadioGroup(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./radio-group.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;AA2BA,IAAa,gBAAgB,OAAO,YAAY;;;ACpBhD,SAAgB,SAAS,OAA6B;CAClD,MAAM,QAAQ,kBAAkB,eAAe,SAAS;CACxD,MAAM,YAAY,eAAe,MAAM,eAAe,MAAM,KAAK;CACjE,MAAM,aAAa,eAAe,MAAM,YAAY,MAAM,QAAQ;CAElE,MAAM,YAAY,eACd,IAAI,YAAY;EACZ,SAAS,UAAU;EACnB,UAAU,WAAW;CACzB,CAAC,CACL;CAEA,SAAS,WAAW;EAChB,IAAI,WAAW,OAAO;EACtB,MAAM,OAAO,MAAM,KAAK;CAC5B;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;CACJ;AACJ;AAEA,SAAgB,cACZ,OACA,YACF;CACE,MAAM,UAAU,gBAAgB,KAAK;CAErC,MAAM,YAAY,eACd,IAAI,kBAAkB;EAClB,UAAU,QAAQ;EAClB,SAAS,QAAQ;CACrB,CAAC,CACL;CAEA,MAAM,gBAAgB,MAAM;CAC5B,MAAM,YAAY,eAAe,MAAM,QAAQ,GAAG,QAAQ,MAAM,cAAc,OAAO;CAErF,QAA2B,eAAe;EACtC,IAAI,aAAa;GAAE,OAAO,MAAM;EAAY;EAC5C,IAAI,OAAO;GAAE,OAAO,UAAU;EAAO;EACrC,IAAI,WAAW;GAAE,OAAO,QAAQ;EAAU;EAC1C,IAAI,WAAW;GAAE,OAAO,QAAQ;EAAU;EAC1C,OAAO,OAAO;GACV,WAAW,KAAK;EACpB;CACJ,CAAC;CAED,OAAO;EACH;EACA;CACJ;AACJ;;;;;;;;;;;;;;;;;;EClCA,MAAM,EAAE,OAAO,WAAW,YAAY,WAAW,aAAa,SAAS,OAAK;;;SAnB/D,WAAM,MAAE,MAAA,QAAA,CAAQ,CAAA,CAAA,CAAA;;;;gBATV,MAAA,SAAA,CAAS;eAAG,iBAAe,MAAA,UAAA,KAAc,KAAA,CAAS;eAAG,cAAY,aAAS,YAAA,WAAA;eAIhF,QAAM,OAAK,IAAA;gBACJ,QAAA,KAAK;eACZ,WAAS,UAAS;eAClB,YAAU,MAAA,UAAA,KAAc,KAAA,CAAS;eACjC,YAAU,OAAK,YAAa,KAAA,CAAS;;;iBAI9B,OAAM,eAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEU1B,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,cAAc,cAAc,QAAQ,UAAU;GAC3D,KAAK,qBAAqB,KAAK;EACnC,CAAC;;;;;eAjCQ,MAAI,SAAO,EAAA;gBACJ,MAAA,SAAA,CAAS;eAEhB,iBAAe,SAAO,YAAa,KAAA,CAAS;eAC5C,gBAAc,oBAAmB,KAAA,CAAS;eAC1C,cAAY,QAAA,aAAa,KAAA,CAAS;eAClC,mBAAiB,SAAO,cAAA;eACxB,oBAAkB,SAAO,eAAA;eACzB,gBAAc,oBAAmB,KAAA,CAAS;eAC1C,iBAAe,SAAO,YAAa,KAAA,CAAS"}
1
+ {"version":3,"file":"radio.js","names":[],"sources":["../src/composables/useRequiredInject.ts","../src/components/radio/types.ts","../src/components/radio/useRadio.ts","../src/components/radio/radio.vue","../src/components/radio/radio.vue","../src/components/radio/radio-group.vue","../src/components/radio/radio-group.vue"],"sourcesContent":["import { inject, type InjectionKey } from 'vue';\n\nexport function useRequiredInject<T>(key: InjectionKey<T>, componentName: string): T {\n const value = inject(key);\n if (value == null) {\n throw new Error(\n `[Ropav] <${componentName}> must be used inside its parent provider component.`,\n );\n }\n return value;\n}\n","import type { InjectionKey } from 'vue';\n\nexport type RadioColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'warning'\n | 'danger'\n | 'info'\n | 'neutral';\n\nexport type RadioSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport type RadioVariant = 'solid' | 'outline';\n\nexport interface RadioProps {\n value: string | number;\n variant?: RadioVariant;\n color?: RadioColor;\n size?: RadioSize;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n id?: string;\n name?: string;\n modelValue: string | number | null;\n variant?: RadioVariant;\n color?: RadioColor;\n size?: RadioSize;\n disabled?: boolean;\n required?: boolean;\n invalid?: boolean;\n ariaLabel?: string;\n describedby?: string;\n labelledby?: string;\n}\n\nexport interface RadioGroupContext {\n modelValue: string | number | null;\n name: string;\n disabled: boolean;\n required: boolean;\n variant?: RadioVariant;\n color?: RadioColor;\n size?: RadioSize;\n select: (value: string | number) => void;\n}\n\nexport const radioGroupKey = Symbol('radioGroup') as InjectionKey<RadioGroupContext>;\n","import { computed, provide, useId } from 'vue';\nimport { useControlState } from '@/composables/useControlState';\nimport { useRequiredInject } from '@/composables/useRequiredInject';\nimport { bem } from '@/utils/bem';\nimport { radioGroupKey } from './types';\nimport type { RadioGroupContext, RadioGroupProps, RadioProps } from './types';\n\nexport function useRadio(props: Readonly<RadioProps>) {\n const group = useRequiredInject(radioGroupKey, 'RpRadio');\n const isChecked = computed(() => group.modelValue === props.value);\n const isDisabled = computed(() => props.disabled || group.disabled);\n const variant = computed(() => props.variant ?? group.variant);\n const color = computed(() => props.color ?? group.color);\n const size = computed(() => props.size ?? group.size);\n\n const rootClass = computed(() =>\n bem('rp-radio', {\n checked: isChecked.value,\n disabled: isDisabled.value,\n [variant.value ?? '']: Boolean(variant.value),\n [`color-${color.value}`]: Boolean(color.value),\n [`size-${size.value}`]: Boolean(size.value),\n }),\n );\n\n function onSelect() {\n if (isDisabled.value) return;\n group.select(props.value);\n }\n\n return {\n group,\n isChecked,\n isDisabled,\n rootClass,\n onSelect,\n };\n}\n\nexport function useRadioGroup(\n props: Readonly<RadioGroupProps>,\n emitUpdate: (value: string | number | null) => void,\n) {\n const control = useControlState(props);\n\n const rootClass = computed(() =>\n bem('rp-radio-group', {\n disabled: control.disabled,\n invalid: control.invalid,\n }),\n );\n\n const generatedName = useId();\n const groupName = computed(() => props.name ?? `${control.id ?? generatedName}-radio`);\n\n provide<RadioGroupContext>(radioGroupKey, {\n get modelValue() {\n return props.modelValue;\n },\n get name() {\n return groupName.value;\n },\n get disabled() {\n return control.disabled;\n },\n get required() {\n return control.required;\n },\n get variant() {\n return props.variant;\n },\n get color() {\n return props.color;\n },\n get size() {\n return props.size;\n },\n select(value) {\n emitUpdate(value);\n },\n });\n\n return {\n control,\n rootClass,\n };\n}\n","<template>\n <label\n :class=\"rootClass\"\n :data-disabled=\"isDisabled || undefined\"\n :data-state=\"isChecked ? 'checked' : 'unchecked'\"\n >\n <input\n type=\"radio\"\n class=\"rp-radio__native\"\n :name=\"group.name\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled || undefined\"\n :required=\"group.required || undefined\"\n @change=\"onSelect\"\n />\n <span class=\"rp-radio__dot\" />\n <span v-if=\"$slots.default\" class=\"rp-radio__label\">\n <slot />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadio } from './useRadio';\nimport type { RadioProps } from './types';\n\ndefineOptions({ name: 'RpRadio' });\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n variant: undefined,\n color: undefined,\n size: undefined,\n disabled: false,\n});\n\nconst { group, isChecked, isDisabled, rootClass, onSelect } = useRadio(props);\n</script>\n\n<style src=\"./radio.scss\" lang=\"scss\" scoped></style>\n","<template>\n <label\n :class=\"rootClass\"\n :data-disabled=\"isDisabled || undefined\"\n :data-state=\"isChecked ? 'checked' : 'unchecked'\"\n >\n <input\n type=\"radio\"\n class=\"rp-radio__native\"\n :name=\"group.name\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled || undefined\"\n :required=\"group.required || undefined\"\n @change=\"onSelect\"\n />\n <span class=\"rp-radio__dot\" />\n <span v-if=\"$slots.default\" class=\"rp-radio__label\">\n <slot />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadio } from './useRadio';\nimport type { RadioProps } from './types';\n\ndefineOptions({ name: 'RpRadio' });\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n variant: undefined,\n color: undefined,\n size: undefined,\n disabled: false,\n});\n\nconst { group, isChecked, isDisabled, rootClass, onSelect } = useRadio(props);\n</script>\n\n<style src=\"./radio.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n :id=\"control.id\"\n :class=\"rootClass\"\n role=\"radiogroup\"\n :data-disabled=\"control.disabled || undefined\"\n :data-invalid=\"control.invalid || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadioGroup } from './useRadio';\nimport type { RadioGroupProps } from './types';\n\ndefineOptions({ name: 'RpRadioGroup' });\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n variant: undefined,\n color: undefined,\n size: undefined,\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n}>();\n\nconst { control, rootClass } = useRadioGroup(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./radio-group.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n :id=\"control.id\"\n :class=\"rootClass\"\n role=\"radiogroup\"\n :data-disabled=\"control.disabled || undefined\"\n :data-invalid=\"control.invalid || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadioGroup } from './useRadio';\nimport type { RadioGroupProps } from './types';\n\ndefineOptions({ name: 'RpRadioGroup' });\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n variant: undefined,\n color: undefined,\n size: undefined,\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n}>();\n\nconst { control, rootClass } = useRadioGroup(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./radio-group.scss\" lang=\"scss\" scoped></style>\n"],"mappings":"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"}
package/dist/select.css CHANGED
@@ -1,109 +1,174 @@
1
- .rp-select[data-v-692ef421] {
1
+ .rp-select[data-v-9838513c] {
2
+ --_rp-select-radius: var(--rp-radius-sm);
2
3
  position: relative;
3
4
  display: inline-flex;
4
5
  font-family: var(--rp-font-family);
5
6
  font-weight: var(--rp-font-weight-normal);
6
7
  line-height: var(--rp-line-height-none);
7
8
  }
8
- .rp-select--disabled[data-v-692ef421] {
9
+ .rp-select--disabled[data-v-9838513c] {
9
10
  opacity: var(--rp-opacity-disabled);
10
11
  cursor: not-allowed;
11
12
  }
12
- .rp-select__trigger[data-v-692ef421] {
13
+ .rp-select__trigger[data-v-9838513c] {
13
14
  display: inline-flex;
14
15
  align-items: center;
15
16
  justify-content: center;
16
17
  justify-content: space-between;
17
18
  width: 100%;
18
- min-width: var(--rp-component-menu-min-width);
19
+ min-width: 180px;
19
20
  height: var(--rp-size-control-md);
20
- padding: 0 var(--rp-spacing-4);
21
+ padding: 0 var(--rp-spacing-3);
21
22
  font-size: var(--rp-font-size-base);
22
23
  background-color: var(--rp-color-control-bg);
23
24
  border: var(--rp-border-width-thin) solid var(--rp-color-control-border);
24
- border-radius: var(--rp-radius-lg);
25
+ border-radius: var(--_rp-select-radius);
25
26
  cursor: pointer;
26
27
  transition: border-color var(--rp-transition-fast), box-shadow var(--rp-transition-fast);
27
28
  gap: var(--rp-spacing-2);
28
29
  }
29
- .rp-select__trigger[data-v-692ef421]:hover {
30
+ .rp-select__trigger[data-v-9838513c]:hover {
30
31
  border-color: var(--rp-color-control-border-hover);
31
32
  }
32
- .rp-select__trigger[data-v-692ef421]:focus-visible {
33
+ .rp-select__trigger[data-v-9838513c]:focus-visible {
33
34
  outline: none;
34
35
  border-color: var(--rp-color-control-border-focus);
35
36
  box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
36
37
  }
37
- .rp-select--open .rp-select__trigger[data-v-692ef421] {
38
+ .rp-select--radius-xs[data-v-9838513c] {
39
+ --_rp-select-radius: var(--rp-radius-sm);
40
+ }
41
+ .rp-select--radius-sm[data-v-9838513c] {
42
+ --_rp-select-radius: var(--rp-radius-sm);
43
+ }
44
+ .rp-select--radius-md[data-v-9838513c] {
45
+ --_rp-select-radius: var(--rp-radius-md);
46
+ }
47
+ .rp-select--radius-lg[data-v-9838513c] {
48
+ --_rp-select-radius: var(--rp-radius-lg);
49
+ }
50
+ .rp-select--radius-xl[data-v-9838513c] {
51
+ --_rp-select-radius: var(--rp-radius-xl);
52
+ }
53
+ .rp-select--open .rp-select__trigger[data-v-9838513c] {
38
54
  border-color: var(--rp-color-control-border-focus);
39
55
  box-shadow: 0 0 0 var(--rp-border-width-medium) var(--rp-color-focus-ring);
40
56
  }
41
- .rp-select--invalid .rp-select__trigger[data-v-692ef421] {
57
+ .rp-select--invalid .rp-select__trigger[data-v-9838513c] {
42
58
  border-color: var(--rp-color-danger-fg);
43
59
  }
44
- .rp-select__value[data-v-692ef421] {
60
+ .rp-select__value[data-v-9838513c] {
45
61
  flex: 1;
46
62
  overflow: hidden;
47
63
  text-overflow: ellipsis;
48
64
  white-space: nowrap;
49
65
  color: var(--rp-color-control-fg);
50
66
  }
51
- .rp-select__placeholder[data-v-692ef421] {
67
+ .rp-select__placeholder[data-v-9838513c] {
52
68
  color: var(--rp-color-control-placeholder);
53
69
  }
54
- .rp-select__arrow[data-v-692ef421] {
70
+ .rp-select__indicator[data-v-9838513c] {
55
71
  display: inline-flex;
56
72
  align-items: center;
57
73
  width: 1em;
58
74
  height: 1em;
59
75
  flex-shrink: 0;
60
76
  }
61
- .rp-select__arrow svg[data-v-692ef421] {
77
+ .rp-select__indicator svg[data-v-9838513c] {
62
78
  width: 100%;
63
79
  height: 100%;
64
80
  }
65
- .rp-select__arrow[data-v-692ef421] {
81
+ .rp-select__indicator[data-v-9838513c] {
82
+ position: relative;
66
83
  color: var(--rp-color-control-icon);
67
- transition: transform var(--rp-transition-fast);
84
+ transform: translateX(var(--rp-spacing-1));
85
+ }
86
+ .rp-select__arrow[data-v-9838513c] {
87
+ display: inline-flex;
88
+ align-items: center;
89
+ width: 1em;
90
+ height: 1em;
91
+ flex-shrink: 0;
68
92
  }
69
- .rp-select__arrow--open[data-v-692ef421] {
70
- transform: rotate(180deg);
93
+ .rp-select__arrow svg[data-v-9838513c] {
94
+ width: 100%;
95
+ height: 100%;
71
96
  }
72
- .rp-select__dropdown[data-v-692ef421] {
97
+ .rp-select__arrow[data-v-9838513c] {
98
+ transition: opacity var(--rp-transition-fast);
99
+ }
100
+ .rp-select__clear[data-v-9838513c] {
101
+ padding: 0;
102
+ font: inherit;
103
+ background: none;
104
+ border: none;
105
+ cursor: pointer;
106
+ display: inline-flex;
107
+ align-items: center;
108
+ width: 1em;
109
+ height: 1em;
110
+ flex-shrink: 0;
111
+ }
112
+ .rp-select__clear svg[data-v-9838513c] {
113
+ width: 100%;
114
+ height: 100%;
115
+ }
116
+ .rp-select__clear[data-v-9838513c] {
117
+ position: absolute;
118
+ inset: 0;
119
+ z-index: 1;
120
+ color: var(--rp-color-control-icon);
121
+ opacity: 0;
122
+ pointer-events: none;
123
+ transition: color var(--rp-transition-fast), opacity var(--rp-transition-fast);
124
+ }
125
+ .rp-select__clear[data-v-9838513c]:hover {
126
+ color: var(--rp-color-control-fg);
127
+ }
128
+ .rp-select__trigger:hover .rp-select__clear[data-v-9838513c] {
129
+ opacity: 1;
130
+ pointer-events: auto;
131
+ }
132
+ .rp-select__trigger:hover .rp-select__clear + .rp-select__arrow[data-v-9838513c] {
133
+ opacity: 0;
134
+ }
135
+ .rp-select__dropdown[data-v-9838513c] {
73
136
  position: absolute;
74
137
  top: calc(100% + var(--rp-spacing-1));
75
138
  left: 0;
76
139
  right: 0;
77
- z-index: var(--rp-z-index-dropdown);
140
+ z-index: 100;
78
141
  background-color: var(--rp-color-surface-raised);
79
142
  border: var(--rp-border-width-thin) solid var(--rp-color-border);
80
- border-radius: var(--rp-radius-lg);
143
+ border-radius: var(--_rp-select-radius);
81
144
  box-shadow: var(--rp-shadow-md);
82
145
  padding: var(--rp-spacing-1) 0;
83
- max-height: var(--rp-component-menu-max-height);
146
+ max-height: 240px;
84
147
  overflow-y: auto;
148
+ padding: var(--rp-spacing-1);
85
149
  }
86
- .rp-select__option[data-v-692ef421] {
150
+ .rp-select__option[data-v-9838513c] {
87
151
  display: flex;
88
152
  align-items: center;
89
153
  padding: var(--rp-spacing-2) var(--rp-spacing-4);
154
+ border-radius: calc(var(--_rp-select-radius) - var(--rp-spacing-1));
90
155
  font-size: var(--rp-font-size-base);
91
156
  cursor: pointer;
92
157
  transition: background-color var(--rp-transition-fast), color var(--rp-transition-fast);
93
- color: var(--rp-color-text);
158
+ color: var(--rp-color-control-fg);
94
159
  }
95
- .rp-select__option--focused[data-v-692ef421] {
160
+ .rp-select__option--focused[data-v-9838513c] {
96
161
  background-color: var(--rp-color-surface-hover);
97
162
  }
98
- .rp-select__option--selected[data-v-692ef421] {
163
+ .rp-select__option--selected[data-v-9838513c] {
99
164
  color: var(--rp-color-primary-fg);
100
165
  font-weight: var(--rp-font-weight-medium);
101
166
  }
102
- .rp-select__option--disabled[data-v-692ef421] {
167
+ .rp-select__option--disabled[data-v-9838513c] {
103
168
  color: var(--rp-color-text-disabled);
104
169
  cursor: not-allowed;
105
170
  }
106
- .rp-select__empty[data-v-692ef421] {
171
+ .rp-select__empty[data-v-9838513c] {
107
172
  display: flex;
108
173
  align-items: center;
109
174
  justify-content: center;
@@ -111,12 +176,12 @@
111
176
  color: var(--rp-color-text-secondary);
112
177
  font-size: var(--rp-font-size-base);
113
178
  }
114
- .rp-select-dropdown-enter-active[data-v-692ef421],
115
- .rp-select-dropdown-leave-active[data-v-692ef421] {
179
+ .rp-select-dropdown-enter-active[data-v-9838513c],
180
+ .rp-select-dropdown-leave-active[data-v-9838513c] {
116
181
  transition: opacity var(--rp-transition-fast), transform var(--rp-transition-fast);
117
182
  }
118
- .rp-select-dropdown-enter-from[data-v-692ef421],
119
- .rp-select-dropdown-leave-to[data-v-692ef421] {
183
+ .rp-select-dropdown-enter-from[data-v-9838513c],
184
+ .rp-select-dropdown-leave-to[data-v-9838513c] {
120
185
  opacity: 0;
121
186
  transform: translateY(calc(-1 * var(--rp-spacing-1)));
122
187
  }
package/dist/select.js CHANGED
@@ -1,30 +1,26 @@
1
1
  import './select.css';
2
2
  import { n as bem, t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
3
3
  import { t as useControlState } from "./useControlState.js";
4
- import { VaporTransition, child, computed, createComponent, createFor, createIf, createInvoker, createSelector, createSlot, createTemplateRefSetter, defineVaporComponent, delegateEvents, extend, next, nextTick, on, onBeforeUnmount, onMounted, ref, renderEffect, setAttr, setClass, setClassName, setInsertionState, setProp, setText, setValue, template, toDisplayString, txt, unref, useId, watch } from "vue";
5
- //#region src/components/_internal/icons/ChevronDownIcon.vue?vue&type=script&setup=true&vapor=true&lang.ts
6
- var t0$1 = template("<svg viewBox=\"0 0 16 16\"fill=none stroke=currentColor stroke-width=1.5><path d=\"M4 6l4 4 4-4\">", 3, 1);
7
- //#endregion
8
- //#region src/components/_internal/icons/ChevronDownIcon.vue
9
- var ChevronDownIcon_default = /* @__PURE__ */ defineVaporComponent({
10
- name: "ChevronDownIcon",
11
- __name: "ChevronDownIcon",
12
- setup(__props) {
13
- return t0$1();
14
- }
15
- });
16
- //#endregion
17
- //#region src/components/_internal/optionList.ts
18
- function hasOptionListValue(value) {
19
- return value != null && value !== "";
20
- }
21
- function getOptionListDisplayLabel(options, value) {
22
- if (!hasOptionListValue(value)) return "";
23
- return options?.find((option) => option.value === value)?.label ?? "";
4
+ import { VaporTransition, child, computed, createComponent, createFor, createIf, createInvoker, createSelector, createSlot, createTemplateRefSetter, defineVaporComponent, delegateEvents, extend, markRaw, next, nextTick, on, onBeforeUnmount, onMounted, ref, renderEffect, setAttr, setClass, setClassName, setInsertionState, setProp, setText, setValue, template, toDisplayString, txt, unref, useId, watch, withModifiers, withVaporModifiers } from "vue";
5
+ //#region ~icons/lucide/chevrons-up-down
6
+ var t0$2 = template("<svg viewBox=\"0 0 24 24\"width=1.2em height=1.2em><path fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=2 d=\"m7 15l5 5l5-5M7 9l5-5l5 5\">", 3, 1);
7
+ function render$1(_ctx) {
8
+ return t0$2();
24
9
  }
25
- function getOptionListActiveDescendantId(baseId, focusedIndex) {
26
- return focusedIndex < 0 ? void 0 : `${baseId}-option-${focusedIndex}`;
10
+ var chevrons_up_down_default = markRaw(defineVaporComponent({
11
+ name: "lucide-chevrons-up-down",
12
+ render: render$1
13
+ }));
14
+ //#endregion
15
+ //#region ~icons/lucide/x
16
+ var t0$1 = template("<svg viewBox=\"0 0 24 24\"width=1.2em height=1.2em><path fill=none stroke=currentColor stroke-linecap=round stroke-linejoin=round stroke-width=2 d=\"M18 6L6 18M6 6l12 12\">", 3, 1);
17
+ function render(_ctx) {
18
+ return t0$1();
27
19
  }
20
+ var x_default = markRaw(defineVaporComponent({
21
+ name: "lucide-x",
22
+ render
23
+ }));
28
24
  //#endregion
29
25
  //#region src/composables/useClickOutside.ts
30
26
  function useClickOutside(target, active, callback) {
@@ -66,7 +62,15 @@ function useListNavigation(options) {
66
62
  localFocusedIndex.value = index;
67
63
  return;
68
64
  }
69
- const next = direction === 1 ? indexes.find((i) => i > index) : [...indexes].reverse().find((i) => i < index);
65
+ let next;
66
+ if (direction === 1) next = indexes.find((i) => i > index);
67
+ else for (let i = indexes.length - 1; i >= 0; i -= 1) {
68
+ const candidate = indexes[i];
69
+ if (candidate < index) {
70
+ next = candidate;
71
+ break;
72
+ }
73
+ }
70
74
  if (next !== void 0) localFocusedIndex.value = next;
71
75
  else if (loop) localFocusedIndex.value = direction === 1 ? indexes[0] : indexes[indexes.length - 1];
72
76
  }
@@ -86,7 +90,8 @@ function useListNavigation(options) {
86
90
  }
87
91
  function moveFocus(delta) {
88
92
  if (localFocusedIndex.value < 0) {
89
- delta === 1 ? focusFirst() : focusLast();
93
+ if (delta === 1) focusFirst();
94
+ else focusLast();
90
95
  return;
91
96
  }
92
97
  setNearest(localFocusedIndex.value + delta, delta);
@@ -102,6 +107,16 @@ function useListNavigation(options) {
102
107
  }
103
108
  //#endregion
104
109
  //#region src/components/select/useSelect.ts
110
+ function hasSelectValue(value) {
111
+ return value != null && value !== "";
112
+ }
113
+ function getSelectDisplayLabel(options, value) {
114
+ if (!hasSelectValue(value)) return "";
115
+ return options?.find((option) => option.value === value)?.label ?? "";
116
+ }
117
+ function getSelectActiveDescendantId(baseId, focusedIndex) {
118
+ return focusedIndex < 0 ? void 0 : `${baseId}-option-${focusedIndex}`;
119
+ }
105
120
  function useSelect(props, emitUpdate) {
106
121
  const selectRef = ref(null);
107
122
  const triggerRef = ref(null);
@@ -115,14 +130,16 @@ function useSelect(props, emitUpdate) {
115
130
  isSelected: (item) => item.value === props.modelValue
116
131
  });
117
132
  const focusedIndex = navigation.focusedIndex;
118
- const activeDescendantId = computed(() => getOptionListActiveDescendantId(selectId, focusedIndex.value));
133
+ const activeDescendantId = computed(() => getSelectActiveDescendantId(selectId, focusedIndex.value));
119
134
  const rootClass = computed(() => bem("rp-select", {
120
135
  open: isOpen.value,
136
+ [`radius-${props.radius}`]: Boolean(props.radius),
121
137
  disabled: control.disabled,
122
138
  invalid: control.invalid
123
139
  }));
124
- const hasValue = computed(() => hasOptionListValue(props.modelValue));
125
- const displayLabel = computed(() => getOptionListDisplayLabel(props.options, props.modelValue));
140
+ const hasValue = computed(() => hasSelectValue(props.modelValue));
141
+ const displayLabel = computed(() => getSelectDisplayLabel(props.options, props.modelValue));
142
+ const canClear = computed(() => Boolean(props.clearable && hasValue.value && !control.disabled));
126
143
  function focusTrigger() {
127
144
  nextTick(() => triggerRef.value?.focus());
128
145
  }
@@ -148,6 +165,12 @@ function useSelect(props, emitUpdate) {
148
165
  close();
149
166
  focusTrigger();
150
167
  }
168
+ function clearSelection() {
169
+ if (!canClear.value) return;
170
+ emitUpdate(null);
171
+ close();
172
+ focusTrigger();
173
+ }
151
174
  function onOptionMouseenter(option, index) {
152
175
  if (!option.disabled) focusedIndex.value = index;
153
176
  }
@@ -213,21 +236,24 @@ function useSelect(props, emitUpdate) {
213
236
  rootClass,
214
237
  hasValue,
215
238
  displayLabel,
239
+ canClear,
216
240
  toggle,
217
241
  selectOption,
242
+ clearSelection,
218
243
  onOptionMouseenter,
219
244
  onTriggerKeydown
220
245
  };
221
246
  }
222
247
  //#endregion
223
248
  //#region src/components/select/select.vue?vue&type=script&setup=true&vapor=true&lang.ts
224
- var t0 = template("<input data-v-692ef421 type=hidden>");
225
- var t1 = template("No options", 2);
226
- var t2 = template("<div data-v-692ef421 class=rp-select__empty>");
227
- var t3 = template("<div data-v-692ef421 role=option> ");
228
- var t4 = template("<div data-v-692ef421 class=rp-select__dropdown role=listbox>");
229
- var t5 = template("<div data-v-692ef421><div data-v-692ef421 class=rp-select__trigger role=combobox aria-haspopup=listbox><span data-v-692ef421> </span><span data-v-692ef421>", 1);
230
- delegateEvents("click", "keydown");
249
+ var t0 = template("<input data-v-9838513c type=hidden>");
250
+ var t1 = template("<button data-v-9838513c type=button class=rp-select__clear aria-label=\"Clear selection\"tabindex=-1></button>");
251
+ var t2 = template("No options", 2);
252
+ var t3 = template("<div data-v-9838513c class=rp-select__empty>");
253
+ var t4 = template("<div data-v-9838513c role=option> ");
254
+ var t5 = template("<div data-v-9838513c class=rp-select__dropdown role=listbox>");
255
+ var t6 = template("<div data-v-9838513c><div data-v-9838513c class=rp-select__trigger role=combobox aria-haspopup=listbox><span data-v-9838513c> </span><span data-v-9838513c class=rp-select__indicator><span data-v-9838513c class=rp-select__arrow aria-hidden=true>", 1);
256
+ delegateEvents("mousedown", "click", "keydown");
231
257
  //#endregion
232
258
  //#region src/components/select/select.vue
233
259
  var select_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -238,7 +264,12 @@ var select_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
238
264
  name: {},
239
265
  modelValue: {},
240
266
  options: { default: () => [] },
267
+ radius: {},
241
268
  placeholder: { default: "Select..." },
269
+ clearable: {
270
+ type: Boolean,
271
+ default: false
272
+ },
242
273
  disabled: {
243
274
  type: Boolean,
244
275
  default: void 0
@@ -259,16 +290,17 @@ var select_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
259
290
  setup(__props, { emit: __emit }) {
260
291
  const props = __props;
261
292
  const emit = __emit;
262
- const { selectRef, triggerRef, isOpen, selectId, listboxId, control, visibleOptions, focusedIndex, activeDescendantId, rootClass, hasValue, displayLabel, toggle, selectOption, onOptionMouseenter, onTriggerKeydown } = useSelect(props, (value) => {
293
+ const { selectRef, triggerRef, isOpen, selectId, listboxId, control, visibleOptions, focusedIndex, activeDescendantId, rootClass, hasValue, displayLabel, canClear, toggle, selectOption, clearSelection, onOptionMouseenter, onTriggerKeydown } = useSelect(props, (value) => {
263
294
  emit("update:modelValue", value);
264
295
  });
265
296
  const _setTemplateRef = createTemplateRefSetter();
266
- const n20 = t5();
267
- const n6 = child(n20, 1);
268
- const n3 = child(n6);
269
- const n5 = next(n3, 1);
270
- renderEffect(() => setClass(n20, unref(rootClass)));
271
- setInsertionState(n20, 0, 0);
297
+ const n25 = t6();
298
+ const n11 = child(n25, 1);
299
+ const n3 = child(n11);
300
+ const n10 = next(n3, 1);
301
+ const n9 = child(n10, 1);
302
+ renderEffect(() => setClass(n25, unref(rootClass)));
303
+ setInsertionState(n25, 0, 0);
272
304
  createIf(() => __props.name, () => {
273
305
  const n2 = t0();
274
306
  renderEffect(() => {
@@ -283,49 +315,57 @@ var select_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
283
315
  const _control = unref(control);
284
316
  const _isOpen = unref(isOpen);
285
317
  const _control_disabled = _control.disabled;
286
- setProp(n6, "id", _control.id);
287
- setAttr(n6, "aria-expanded", _isOpen);
288
- setAttr(n6, "aria-activedescendant", unref(activeDescendantId));
289
- setAttr(n6, "aria-controls", unref(listboxId));
290
- setAttr(n6, "aria-disabled", _control_disabled || void 0);
291
- setAttr(n6, "aria-invalid", _control.invalid || void 0);
292
- setAttr(n6, "aria-required", _control.required || void 0);
293
- setAttr(n6, "aria-label", __props.ariaLabel || void 0);
294
- setAttr(n6, "aria-labelledby", _control.ariaLabelledby);
295
- setAttr(n6, "aria-describedby", _control.ariaDescribedby);
296
- setAttr(n6, "data-state", _isOpen ? "open" : "closed");
297
- setAttr(n6, "data-disabled", _control_disabled || void 0);
298
- setProp(n6, "tabindex", _control_disabled ? -1 : 0);
318
+ setProp(n11, "id", _control.id);
319
+ setAttr(n11, "aria-expanded", _isOpen);
320
+ setAttr(n11, "aria-activedescendant", unref(activeDescendantId));
321
+ setAttr(n11, "aria-controls", unref(listboxId));
322
+ setAttr(n11, "aria-disabled", _control_disabled || void 0);
323
+ setAttr(n11, "aria-invalid", _control.invalid || void 0);
324
+ setAttr(n11, "aria-required", _control.required || void 0);
325
+ setAttr(n11, "aria-label", __props.ariaLabel || void 0);
326
+ setAttr(n11, "aria-labelledby", _control.ariaLabelledby);
327
+ setAttr(n11, "aria-describedby", _control.ariaDescribedby);
328
+ setAttr(n11, "data-state", _isOpen ? "open" : "closed");
329
+ setAttr(n11, "data-disabled", _control_disabled || void 0);
330
+ setProp(n11, "tabindex", _control_disabled ? -1 : 0);
299
331
  setClassName(n3, !unref(hasValue) ? 1 : 0, " rp-select__placeholder", "rp-select__value");
300
332
  setText(x3, toDisplayString(unref(displayLabel) || __props.placeholder));
301
- setClassName(n5, _isOpen ? 1 : 0, " rp-select__arrow--open", "rp-select__arrow");
302
333
  });
303
- setInsertionState(n5, null, 0);
304
- createComponent(unref(ChevronDownIcon_default));
305
- n6.$evtclick = createInvoker((e) => unref(toggle)(e));
306
- n6.$evtkeydown = createInvoker((e) => unref(onTriggerKeydown)(e));
307
- _setTemplateRef(n6, triggerRef, null, "triggerRef");
308
- setInsertionState(n20, null, 2);
334
+ setInsertionState(n10, 0, 0);
335
+ createIf(() => unref(canClear), () => {
336
+ const n7 = t1();
337
+ setInsertionState(n7, null, 0);
338
+ createComponent(unref(x_default));
339
+ n7.$evtmousedown = withVaporModifiers(() => {}, ["prevent"]);
340
+ on(n7, "click", withModifiers((e) => unref(clearSelection)(e), ["stop"]));
341
+ return n7;
342
+ });
343
+ setInsertionState(n9, null, 0);
344
+ createComponent(unref(chevrons_up_down_default));
345
+ n11.$evtclick = createInvoker((e) => unref(toggle)(e));
346
+ n11.$evtkeydown = createInvoker((e) => unref(onTriggerKeydown)(e));
347
+ _setTemplateRef(n11, triggerRef, null, "triggerRef");
348
+ setInsertionState(n25, null, 2);
309
349
  createComponent(VaporTransition, { name: "rp-select-dropdown" }, extend(() => {
310
350
  return createIf(() => unref(isOpen), () => {
311
- const n18 = t4();
312
- renderEffect(() => setProp(n18, "id", unref(listboxId)));
313
- setInsertionState(n18, null, 0);
351
+ const n23 = t5();
352
+ renderEffect(() => setProp(n23, "id", unref(listboxId)));
353
+ setInsertionState(n23, null, 0);
314
354
  createIf(() => unref(visibleOptions).length === 0, () => {
315
- const n14 = t2();
316
- setInsertionState(n14, null, 0);
355
+ const n19 = t3();
356
+ setInsertionState(n19, null, 0);
317
357
  createSlot("empty", null, () => {
318
- return t1();
358
+ return t2();
319
359
  }, 1);
320
- return n14;
360
+ return n19;
321
361
  });
322
- setInsertionState(n18, null, 1);
323
- const _selector15 = createSelector(() => __props.modelValue);
362
+ setInsertionState(n23, null, 1);
363
+ const _selector20 = createSelector(() => __props.modelValue);
324
364
  createFor(() => unref(visibleOptions), (_for_item0, _for_key0) => {
325
- const n17 = t3();
326
- const x17 = txt(n17);
327
- n17.$evtclick = createInvoker(() => unref(selectOption)(_for_item0.value));
328
- on(n17, "mouseenter", () => unref(onOptionMouseenter)(_for_item0.value, _for_key0.value));
365
+ const n22 = t4();
366
+ const x22 = txt(n22);
367
+ n22.$evtclick = createInvoker(() => unref(selectOption)(_for_item0.value));
368
+ on(n22, "mouseenter", () => unref(onOptionMouseenter)(_for_item0.value, _for_key0.value));
329
369
  let _index, _option, _modelValue, _option_disabled, _option_value;
330
370
  renderEffect(() => {
331
371
  _index = _for_key0.value;
@@ -333,29 +373,29 @@ var select_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
333
373
  _modelValue = __props.modelValue;
334
374
  _option_disabled = _option.disabled;
335
375
  _option_value = _option.value;
336
- setProp(n17, "id", `${unref(selectId)}-option-${_index}`);
337
- setAttr(n17, "aria-disabled", _option_disabled || void 0);
338
- setAttr(n17, "data-selected", _option_value === _modelValue || void 0);
339
- setAttr(n17, "data-disabled", _option_disabled || void 0);
340
- setClass(n17, ["rp-select__option", {
376
+ setProp(n22, "id", `${unref(selectId)}-option-${_index}`);
377
+ setAttr(n22, "aria-disabled", _option_disabled || void 0);
378
+ setAttr(n22, "data-selected", _option_value === _modelValue || void 0);
379
+ setAttr(n22, "data-disabled", _option_disabled || void 0);
380
+ setClass(n22, ["rp-select__option", {
341
381
  "rp-select__option--selected": _option_value === _modelValue,
342
382
  "rp-select__option--focused": _index === unref(focusedIndex),
343
383
  "rp-select__option--disabled": _option_disabled
344
384
  }]);
345
- setText(x17, toDisplayString(_option.label));
385
+ setText(x22, toDisplayString(_option.label));
346
386
  });
347
- _selector15(_option.value, () => {
348
- setAttr(n17, "aria-selected", _option.value === _modelValue);
387
+ _selector20(_option.value, () => {
388
+ setAttr(n22, "aria-selected", _option.value === _modelValue);
349
389
  });
350
- return n17;
351
- }, (option, index) => option.value, 8).onReset(_selector15.reset);
352
- return n18;
390
+ return n22;
391
+ }, (option, index) => option.value, 8).onReset(_selector20.reset);
392
+ return n23;
353
393
  }, null, 129);
354
394
  }, { _: 8 }));
355
- _setTemplateRef(n20, selectRef, null, "selectRef");
356
- return n20;
395
+ _setTemplateRef(n25, selectRef, null, "selectRef");
396
+ return n25;
357
397
  }
358
- }), [["__scopeId", "data-v-692ef421"]]);
398
+ }), [["__scopeId", "data-v-9838513c"]]);
359
399
  //#endregion
360
400
  export { select_default as t };
361
401