ropav 0.0.7 → 0.0.8

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 (73) hide show
  1. package/dist/accordion.js +0 -2
  2. package/dist/badge.js +0 -2
  3. package/dist/bem.js +0 -2
  4. package/dist/button-group.js +0 -2
  5. package/dist/button.js +0 -2
  6. package/dist/card.css +40 -20
  7. package/dist/card.js +69 -38
  8. package/dist/checkbox.js +0 -2
  9. package/dist/collapse.css +6 -6
  10. package/dist/collapse.js +3 -9
  11. package/dist/componentColors.js +0 -2
  12. package/dist/components/card/card.d.ts +4 -0
  13. package/dist/components/card/types.d.ts +4 -0
  14. package/dist/components/collapse/types.d.ts +0 -2
  15. package/dist/components/field/useField.d.ts +1 -0
  16. package/dist/components/modal/types.d.ts +0 -1
  17. package/dist/components/popover/types.d.ts +4 -1
  18. package/dist/components/popover/usePopover.d.ts +5 -2
  19. package/dist/dropdown-menu.js +0 -2
  20. package/dist/field.css +11 -8
  21. package/dist/field.js +46 -23
  22. package/dist/icon-button.js +0 -2
  23. package/dist/input.js +0 -2
  24. package/dist/modal.css +28 -28
  25. package/dist/modal.js +9 -15
  26. package/dist/overlay.js +0 -2
  27. package/dist/popover.css +16 -16
  28. package/dist/popover.js +17 -7
  29. package/dist/progress.js +0 -2
  30. package/dist/radio.js +0 -2
  31. package/dist/select.js +0 -2
  32. package/dist/slider.js +0 -2
  33. package/dist/switch.js +0 -2
  34. package/dist/tabs.js +0 -2
  35. package/dist/textarea.js +0 -2
  36. package/dist/tooltip.js +0 -2
  37. package/dist/useButtonColor.js +0 -2
  38. package/dist/useClickOutside.js +0 -2
  39. package/dist/useCollapse.js +1 -3
  40. package/dist/useControlState.js +0 -2
  41. package/dist/useRequiredInject.js +0 -2
  42. package/dist/x.js +0 -2
  43. package/package.json +6 -2
  44. package/dist/accordion.js.map +0 -1
  45. package/dist/badge.js.map +0 -1
  46. package/dist/bem.js.map +0 -1
  47. package/dist/button-group.js.map +0 -1
  48. package/dist/button.js.map +0 -1
  49. package/dist/card.js.map +0 -1
  50. package/dist/checkbox.js.map +0 -1
  51. package/dist/collapse.js.map +0 -1
  52. package/dist/componentColors.js.map +0 -1
  53. package/dist/dropdown-menu.js.map +0 -1
  54. package/dist/field.js.map +0 -1
  55. package/dist/icon-button.js.map +0 -1
  56. package/dist/input.js.map +0 -1
  57. package/dist/modal.js.map +0 -1
  58. package/dist/overlay.js.map +0 -1
  59. package/dist/popover.js.map +0 -1
  60. package/dist/progress.js.map +0 -1
  61. package/dist/radio.js.map +0 -1
  62. package/dist/select.js.map +0 -1
  63. package/dist/slider.js.map +0 -1
  64. package/dist/switch.js.map +0 -1
  65. package/dist/tabs.js.map +0 -1
  66. package/dist/textarea.js.map +0 -1
  67. package/dist/tooltip.js.map +0 -1
  68. package/dist/useButtonColor.js.map +0 -1
  69. package/dist/useClickOutside.js.map +0 -1
  70. package/dist/useCollapse.js.map +0 -1
  71. package/dist/useControlState.js.map +0 -1
  72. package/dist/useRequiredInject.js.map +0 -1
  73. package/dist/x.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"slider.js","names":[],"sources":["../src/components/slider/types.ts","../src/components/slider/useSlider.ts","../src/components/slider/slider.vue","../src/components/slider/slider.vue"],"sourcesContent":["import type { TooltipProps } from '../tooltip/types';\n\nexport const sliderColors = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger',\n 'info',\n 'neutral',\n] as const;\n\nexport const sliderSizes = ['xs', 'sm', 'md', 'lg', 'xl'] as const;\n\nexport const sliderOrientations = ['horizontal', 'vertical'] as const;\n\nexport type SliderPresetColor = (typeof sliderColors)[number];\n\nexport type SliderColor = SliderPresetColor | (string & {});\n\nexport type SliderSize = (typeof sliderSizes)[number];\n\nexport type SliderOrientation = (typeof sliderOrientations)[number];\n\nexport type SliderValueFormatter = (value: number) => string | number;\n\nexport type SliderTooltipMode = 'hover' | 'always';\n\nexport type SliderTooltipOptions = Pick<\n TooltipProps,\n 'id' | 'placement' | 'color' | 'offset' | 'openDelay' | 'arrow'\n> & {\n mode?: SliderTooltipMode;\n};\n\nexport type SliderTooltip = false | SliderTooltipMode | SliderTooltipOptions;\n\nexport type SliderMarkColor = SliderColor;\n\nexport interface SliderMark {\n value: number;\n label?: string | number;\n color?: SliderMarkColor;\n hidden?: boolean;\n}\n\nexport type SliderMarkInput = number | SliderMark;\n\nexport interface SliderThumbStyle {\n size?: number | string;\n border?: number | string;\n padding?: number | string;\n}\n\nexport interface SliderProps {\n id?: string;\n name?: string;\n modelValue: number;\n min?: number;\n max?: number;\n step?: number | 'any';\n marks?: SliderMarkInput[];\n thumbStyle?: SliderThumbStyle;\n tooltip?: SliderTooltip;\n formatValue?: SliderValueFormatter;\n color?: SliderColor;\n size?: SliderSize;\n orientation?: SliderOrientation;\n disabled?: boolean;\n required?: boolean;\n invalid?: boolean;\n valid?: boolean;\n ariaLabel?: string;\n ariaValueText?: string | SliderValueFormatter;\n describedby?: string;\n labelledby?: string;\n}\n","import { computed, type CSSProperties } from 'vue';\nimport { useDelayedOpen } from '@/composables/useDelayedOpen';\nimport { useControlState } from '@/composables/useControlState';\nimport { bem } from '@/utils/bem';\nimport { sliderColors } from './types';\nimport type {\n SliderMark,\n SliderMarkInput,\n SliderProps,\n SliderTooltipMode,\n SliderTooltipOptions,\n} from './types';\n\ntype SliderStateProps = Readonly<\n SliderProps & {\n min: number;\n max: number;\n step: number | 'any';\n tooltip: NonNullable<SliderProps['tooltip']>;\n orientation: NonNullable<SliderProps['orientation']>;\n }\n>;\n\nconst sliderColorNames = new Set<string>(sliderColors);\n\nconst sliderMarkColorProperties = [\n '--_rp-slider-mark-color',\n '--_rp-slider-mark-label-color',\n '--_rp-slider-mark-filled-label-color',\n '--_rp-slider-mark-ring-color',\n] as const;\n\nexport function normalizeSliderValue(\n value: number,\n min: number,\n max: number,\n step: number | 'any',\n) {\n const bounds = normalizeSliderBounds(min, max);\n const safeStep = normalizeSliderStep(step);\n const safeValue = Number.isFinite(value) ? value : bounds.min;\n const clamped = Math.min(bounds.max, Math.max(bounds.min, safeValue));\n\n if (safeStep === 'any') return clamped;\n\n const steps = Math.round((clamped - bounds.min) / safeStep);\n const snapped = bounds.min + steps * safeStep;\n\n return Math.min(bounds.max, Math.max(bounds.min, Number(snapped.toFixed(10))));\n}\n\nexport function normalizeSliderBounds(min: number, max: number) {\n const safeMin = Number.isFinite(min) ? min : 0;\n const safeMax = Number.isFinite(max) ? max : safeMin;\n\n return safeMax >= safeMin ? { min: safeMin, max: safeMax } : { min: safeMax, max: safeMin };\n}\n\nexport function normalizeSliderStep(step: number | 'any') {\n return step === 'any' || (Number.isFinite(step) && step > 0) ? step : 'any';\n}\n\nexport function getSliderValuePercent(value: number, min: number, max: number) {\n if (max <= min) return 0;\n\n const percent = ((value - min) / (max - min)) * 100;\n return Math.min(100, Math.max(0, percent));\n}\n\nfunction getSliderMarkColorValue(color: SliderMark['color']) {\n if (!color) return undefined;\n\n return sliderColorNames.has(color) ? `var(--rp-color-${color})` : color;\n}\n\nfunction isSliderPresetColor(color: SliderProps['color']) {\n return Boolean(color && sliderColorNames.has(color));\n}\n\nfunction getSliderCustomColorValue(color: SliderProps['color']) {\n if (!color || isSliderPresetColor(color)) return undefined;\n\n return color;\n}\n\nfunction setSliderStyleValue(\n style: CSSProperties,\n property: `--_rp-slider-${string}`,\n value: string | undefined,\n) {\n if (value) {\n style[property] = value;\n }\n}\n\nfunction getSliderMarkStyle(percent: number, color: SliderMark['color']) {\n const style: CSSProperties = {\n '--_rp-slider-mark-position': `${percent}%`,\n };\n const colorValue = getSliderMarkColorValue(color);\n\n for (const property of sliderMarkColorProperties) {\n setSliderStyleValue(style, property, colorValue);\n }\n\n return style;\n}\n\nfunction normalizeSliderMark(mark: SliderMarkInput): SliderMark {\n return typeof mark === 'number' ? { value: mark } : mark;\n}\n\nfunction normalizeSliderMarks(\n marks: SliderMarkInput[] | undefined,\n min: number,\n max: number,\n valuePercent: number,\n) {\n return (marks ?? []).flatMap((markInput, index) => {\n const mark = normalizeSliderMark(markInput);\n if (mark.hidden) return [];\n\n const value = Number(mark.value);\n if (!Number.isFinite(value)) return [];\n\n const percent = getSliderValuePercent(value, min, max);\n\n return {\n key: `${value}-${index}`,\n value,\n label: mark.label,\n hasLabel: mark.label != null,\n filled: percent <= valuePercent,\n style: getSliderMarkStyle(percent, mark.color),\n };\n });\n}\n\nfunction getSliderLengthValue(value: number | string | undefined) {\n if (value == null || value === '') return undefined;\n if (typeof value === 'number') return Number.isFinite(value) ? `${value}px` : undefined;\n\n return value;\n}\n\nfunction getSliderBorderValue(value: number | string | undefined) {\n if (value == null || value === '') return undefined;\n if (typeof value === 'number') {\n return Number.isFinite(value)\n ? `${value}px solid var(--_rp-slider-thumb-border)`\n : undefined;\n }\n\n return value;\n}\n\nconst sliderThumbStyleProps = [\n ['--_rp-slider-thumb-size', 'size', getSliderLengthValue],\n ['--_rp-slider-thumb-border-style', 'border', getSliderBorderValue],\n ['--_rp-slider-thumb-padding', 'padding', getSliderLengthValue],\n] as const;\n\nfunction getSliderTrackStyle(props: SliderStateProps, valuePercent: number) {\n const style: CSSProperties = {\n '--_rp-slider-percent': `${valuePercent}%`,\n '--_rp-slider-ratio': `${valuePercent / 100}`,\n };\n\n setSliderStyleValue(style, '--_rp-slider-custom-color', getSliderCustomColorValue(props.color));\n\n for (const [property, propName, getValue] of sliderThumbStyleProps) {\n setSliderStyleValue(style, property, getValue(props.thumbStyle?.[propName]));\n }\n\n return style;\n}\n\nfunction getFormattedSliderValue(value: number, formatter: SliderProps['formatValue']) {\n return formatter ? formatter(value) : value;\n}\n\nfunction getSliderAriaValueText(\n value: number,\n ariaValueText: SliderProps['ariaValueText'],\n formatter: SliderProps['formatValue'],\n) {\n if (typeof ariaValueText === 'function') return String(ariaValueText(value));\n if (ariaValueText != null && ariaValueText !== '') return String(ariaValueText);\n if (formatter) return String(formatter(value));\n\n return undefined;\n}\n\nfunction getSliderTooltipOptions(\n tooltip: NonNullable<SliderProps['tooltip']>,\n): SliderTooltipOptions {\n return typeof tooltip === 'object' ? tooltip : {};\n}\n\nfunction getSliderTooltipMode(\n tooltip: NonNullable<SliderProps['tooltip']>,\n): SliderTooltipMode | false {\n if (tooltip === false) return false;\n if (typeof tooltip === 'object') return tooltip.mode ?? 'hover';\n\n return tooltip;\n}\n\nexport function useSlider(props: SliderStateProps, emitUpdate: (value: number) => void) {\n const control = useControlState(props);\n\n const bounds = computed(() => normalizeSliderBounds(props.min, props.max));\n const nativeStep = computed(() => normalizeSliderStep(props.step));\n\n const normalizedValue = computed(() =>\n normalizeSliderValue(\n props.modelValue,\n bounds.value.min,\n bounds.value.max,\n nativeStep.value,\n ),\n );\n\n const valuePercent = computed(() =>\n getSliderValuePercent(normalizedValue.value, bounds.value.min, bounds.value.max),\n );\n\n const formattedValue = computed(() =>\n getFormattedSliderValue(normalizedValue.value, props.formatValue),\n );\n\n const ariaValueText = computed(() =>\n getSliderAriaValueText(normalizedValue.value, props.ariaValueText, props.formatValue),\n );\n\n const markItems = computed(() =>\n normalizeSliderMarks(props.marks, bounds.value.min, bounds.value.max, valuePercent.value),\n );\n\n const tooltipOptions = computed(() => getSliderTooltipOptions(props.tooltip));\n const tooltipMode = computed(() => getSliderTooltipMode(props.tooltip));\n const tooltipOpenDelay = computed(() => tooltipOptions.value.openDelay ?? 0);\n const {\n isOpen: delayedTooltipOpen,\n open: openDelayedTooltip,\n closeImmediate: closeDelayedTooltip,\n } = useDelayedOpen({\n openDelay: () => tooltipOpenDelay.value,\n disabled: () => tooltipMode.value !== 'hover' || control.disabled,\n });\n\n const hasMarkLabels = computed(() => markItems.value.some((mark) => mark.hasLabel));\n const tooltipVisible = computed(() => tooltipMode.value !== false);\n const tooltipAlwaysVisible = computed(() => tooltipMode.value === 'always');\n const tooltipOpen = computed(\n () =>\n tooltipAlwaysVisible.value ||\n (tooltipMode.value === 'hover' && delayedTooltipOpen.value && !control.disabled),\n );\n const tooltipPlacement = computed(\n () => tooltipOptions.value.placement ?? (props.orientation === 'vertical' ? 'left' : 'top'),\n );\n const tooltipId = computed(() => tooltipOptions.value.id);\n const tooltipColor = computed(() => tooltipOptions.value.color);\n const tooltipOffset = computed(() => tooltipOptions.value.offset);\n const tooltipArrow = computed(() => tooltipOptions.value.arrow ?? false);\n const tooltipContent = computed(() => String(formattedValue.value));\n\n const rootClass = computed(() =>\n bem('rp-slider', {\n [`color-${props.color}`]: isSliderPresetColor(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n vertical: props.orientation === 'vertical',\n marked: markItems.value.length > 0,\n 'marks-with-labels': hasMarkLabels.value,\n 'tooltip-always-visible': tooltipAlwaysVisible.value,\n disabled: control.disabled,\n invalid: control.invalid,\n valid: control.valid && !control.invalid,\n }),\n );\n\n const trackStyle = computed<CSSProperties>(() =>\n getSliderTrackStyle(props, valuePercent.value),\n );\n\n function onInput(e: Event) {\n if (control.disabled) return;\n\n const input = e.target as HTMLInputElement;\n emitUpdate(\n normalizeSliderValue(\n input.valueAsNumber,\n bounds.value.min,\n bounds.value.max,\n nativeStep.value,\n ),\n );\n }\n\n function openTooltip() {\n if (tooltipMode.value === 'hover' && !control.disabled) openDelayedTooltip();\n }\n\n function closeTooltip() {\n closeDelayedTooltip();\n }\n\n function onTooltipKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') closeTooltip();\n }\n\n return {\n control,\n nativeMin: computed(() => bounds.value.min),\n nativeMax: computed(() => bounds.value.max),\n nativeStep,\n rootClass,\n normalizedValue,\n valuePercent,\n formattedValue,\n ariaValueText,\n markItems,\n trackStyle,\n tooltipVisible,\n tooltipOpen,\n tooltipPlacement,\n tooltipId,\n tooltipColor,\n tooltipOffset,\n tooltipOpenDelay,\n tooltipArrow,\n tooltipContent,\n onInput,\n openTooltip,\n closeTooltip,\n onTooltipKeydown,\n };\n}\n","<template>\n <label\n :class=\"[rootClass, { 'rp-slider--custom-thumb': $slots.thumb }]\"\n :data-disabled=\"control.disabled || undefined\"\n :style=\"trackStyle\"\n >\n <span v-if=\"$slots.default || $slots.value\" class=\"rp-slider__header\">\n <span v-if=\"$slots.default\" class=\"rp-slider__label\">\n <slot />\n </span>\n <span v-if=\"$slots.value\" class=\"rp-slider__value\" aria-hidden=\"true\">\n <slot\n name=\"value\"\n :value=\"normalizedValue\"\n :formatted-value=\"formattedValue\"\n :percent=\"valuePercent\"\n />\n </span>\n </span>\n <span\n class=\"rp-slider__track\"\n @mouseenter=\"openTooltip\"\n @mouseleave=\"closeTooltip\"\n @focusin=\"openTooltip\"\n @focusout=\"closeTooltip\"\n @keydown=\"onTooltipKeydown\"\n >\n <span class=\"rp-slider__bar\" aria-hidden=\"true\" />\n\n <input\n :id=\"control.id\"\n :name=\"name\"\n class=\"rp-slider__native\"\n type=\"range\"\n :value=\"normalizedValue\"\n :min=\"nativeMin\"\n :max=\"nativeMax\"\n :step=\"nativeStep\"\n :orient=\"orientation === 'vertical' ? 'vertical' : undefined\"\n :disabled=\"control.disabled || undefined\"\n :required=\"control.required || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-orientation=\"orientation === 'vertical' ? 'vertical' : undefined\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n :aria-valuetext=\"ariaValueText\"\n @input=\"onInput\"\n />\n\n <span v-if=\"markItems.length\" class=\"rp-slider__marks\" aria-hidden=\"true\">\n <span\n v-for=\"mark in markItems\"\n :key=\"mark.key\"\n class=\"rp-slider__mark\"\n :class=\"{ 'rp-slider__mark--filled': mark.filled }\"\n :style=\"mark.style\"\n >\n <span class=\"rp-slider__mark-dot\" />\n <span v-if=\"mark.hasLabel\" class=\"rp-slider__mark-label\">\n {{ mark.label }}\n </span>\n </span>\n </span>\n\n <span v-if=\"$slots.thumb\" class=\"rp-slider__thumb\" aria-hidden=\"true\">\n <span class=\"rp-slider__thumb-content\">\n <slot\n name=\"thumb\"\n :value=\"normalizedValue\"\n :formatted-value=\"formattedValue\"\n :percent=\"valuePercent\"\n />\n </span>\n </span>\n\n <Tooltip\n v-if=\"tooltipVisible\"\n :id=\"tooltipId\"\n class=\"rp-slider__tooltip\"\n :content=\"tooltipContent\"\n :placement=\"tooltipPlacement\"\n :color=\"tooltipColor\"\n :offset=\"tooltipOffset\"\n :open=\"tooltipOpen\"\n :open-delay=\"tooltipOpenDelay\"\n :arrow=\"tooltipArrow\"\n decorative\n >\n <span class=\"rp-slider__tooltip-anchor\" aria-hidden=\"true\" />\n </Tooltip>\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport Tooltip from '../tooltip/tooltip.vue';\nimport type { SliderProps } from './types';\nimport { useSlider } from './useSlider';\n\ndefineOptions({ name: 'RpSlider' });\n\nconst props = withDefaults(defineProps<SliderProps>(), {\n min: 0,\n max: 100,\n step: 1,\n marks: () => [],\n tooltip: 'hover',\n orientation: 'horizontal',\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n valid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number];\n}>();\n\nconst {\n control,\n nativeMin,\n nativeMax,\n nativeStep,\n rootClass,\n normalizedValue,\n valuePercent,\n formattedValue,\n ariaValueText,\n markItems,\n trackStyle,\n tooltipVisible,\n tooltipOpen,\n tooltipPlacement,\n tooltipId,\n tooltipColor,\n tooltipOffset,\n tooltipOpenDelay,\n tooltipArrow,\n tooltipContent,\n onInput,\n openTooltip,\n closeTooltip,\n onTooltipKeydown,\n} = useSlider(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./slider.scss\" lang=\"scss\" scoped></style>\n","<template>\n <label\n :class=\"[rootClass, { 'rp-slider--custom-thumb': $slots.thumb }]\"\n :data-disabled=\"control.disabled || undefined\"\n :style=\"trackStyle\"\n >\n <span v-if=\"$slots.default || $slots.value\" class=\"rp-slider__header\">\n <span v-if=\"$slots.default\" class=\"rp-slider__label\">\n <slot />\n </span>\n <span v-if=\"$slots.value\" class=\"rp-slider__value\" aria-hidden=\"true\">\n <slot\n name=\"value\"\n :value=\"normalizedValue\"\n :formatted-value=\"formattedValue\"\n :percent=\"valuePercent\"\n />\n </span>\n </span>\n <span\n class=\"rp-slider__track\"\n @mouseenter=\"openTooltip\"\n @mouseleave=\"closeTooltip\"\n @focusin=\"openTooltip\"\n @focusout=\"closeTooltip\"\n @keydown=\"onTooltipKeydown\"\n >\n <span class=\"rp-slider__bar\" aria-hidden=\"true\" />\n\n <input\n :id=\"control.id\"\n :name=\"name\"\n class=\"rp-slider__native\"\n type=\"range\"\n :value=\"normalizedValue\"\n :min=\"nativeMin\"\n :max=\"nativeMax\"\n :step=\"nativeStep\"\n :orient=\"orientation === 'vertical' ? 'vertical' : undefined\"\n :disabled=\"control.disabled || undefined\"\n :required=\"control.required || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-orientation=\"orientation === 'vertical' ? 'vertical' : undefined\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n :aria-valuetext=\"ariaValueText\"\n @input=\"onInput\"\n />\n\n <span v-if=\"markItems.length\" class=\"rp-slider__marks\" aria-hidden=\"true\">\n <span\n v-for=\"mark in markItems\"\n :key=\"mark.key\"\n class=\"rp-slider__mark\"\n :class=\"{ 'rp-slider__mark--filled': mark.filled }\"\n :style=\"mark.style\"\n >\n <span class=\"rp-slider__mark-dot\" />\n <span v-if=\"mark.hasLabel\" class=\"rp-slider__mark-label\">\n {{ mark.label }}\n </span>\n </span>\n </span>\n\n <span v-if=\"$slots.thumb\" class=\"rp-slider__thumb\" aria-hidden=\"true\">\n <span class=\"rp-slider__thumb-content\">\n <slot\n name=\"thumb\"\n :value=\"normalizedValue\"\n :formatted-value=\"formattedValue\"\n :percent=\"valuePercent\"\n />\n </span>\n </span>\n\n <Tooltip\n v-if=\"tooltipVisible\"\n :id=\"tooltipId\"\n class=\"rp-slider__tooltip\"\n :content=\"tooltipContent\"\n :placement=\"tooltipPlacement\"\n :color=\"tooltipColor\"\n :offset=\"tooltipOffset\"\n :open=\"tooltipOpen\"\n :open-delay=\"tooltipOpenDelay\"\n :arrow=\"tooltipArrow\"\n decorative\n >\n <span class=\"rp-slider__tooltip-anchor\" aria-hidden=\"true\" />\n </Tooltip>\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport Tooltip from '../tooltip/tooltip.vue';\nimport type { SliderProps } from './types';\nimport { useSlider } from './useSlider';\n\ndefineOptions({ name: 'RpSlider' });\n\nconst props = withDefaults(defineProps<SliderProps>(), {\n min: 0,\n max: 100,\n step: 1,\n marks: () => [],\n tooltip: 'hover',\n orientation: 'horizontal',\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n valid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number];\n}>();\n\nconst {\n control,\n nativeMin,\n nativeMax,\n nativeStep,\n rootClass,\n normalizedValue,\n valuePercent,\n formattedValue,\n ariaValueText,\n markItems,\n trackStyle,\n tooltipVisible,\n tooltipOpen,\n tooltipPlacement,\n tooltipId,\n tooltipColor,\n tooltipOffset,\n tooltipOpenDelay,\n tooltipArrow,\n tooltipContent,\n onInput,\n openTooltip,\n closeTooltip,\n onTooltipKeydown,\n} = useSlider(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./slider.scss\" lang=\"scss\" scoped></style>\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"switch.js","names":[],"sources":["../src/components/switch/useSwitch.ts","../src/components/switch/switch.vue","../src/components/switch/switch.vue"],"sourcesContent":["import { computed, type CSSProperties } from 'vue';\nimport { useControlState } from '@/composables/useControlState';\nimport { getComponentCustomColor, isComponentPresetColor } from '@/utils/componentColors';\nimport { bem } from '@/utils/bem';\nimport type { SwitchProps } from './types';\n\nfunction getSwitchColorStyle(color: SwitchProps['color']) {\n const customColor = getComponentCustomColor(color);\n if (!customColor) return undefined;\n\n return {\n '--_rp-switch-custom-color': customColor,\n } satisfies CSSProperties;\n}\n\nexport function useSwitch(props: Readonly<SwitchProps>, emitUpdate: (value: boolean) => void) {\n const control = useControlState(props);\n\n const rootClass = computed(() =>\n bem('rp-switch', {\n checked: props.modelValue,\n disabled: control.disabled,\n invalid: control.invalid,\n [`color-${props.color}`]: isComponentPresetColor(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n }),\n );\n\n const rootStyle = computed(() => getSwitchColorStyle(props.color));\n\n function onChange(e: Event) {\n emitUpdate((e.target as HTMLInputElement).checked);\n }\n\n return {\n control,\n rootClass,\n rootStyle,\n onChange,\n };\n}\n","<template>\n <label\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :data-disabled=\"control.disabled || undefined\"\n :data-state=\"modelValue ? 'checked' : 'unchecked'\"\n >\n <input\n :id=\"control.id\"\n :name=\"name\"\n type=\"checkbox\"\n class=\"rp-switch__native\"\n role=\"switch\"\n :checked=\"modelValue\"\n :disabled=\"control.disabled || undefined\"\n :required=\"control.required || undefined\"\n :aria-checked=\"modelValue\"\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 @change=\"onChange\"\n />\n <span class=\"rp-switch__track\">\n <span class=\"rp-switch__thumb\" />\n </span>\n <span v-if=\"$slots.default\" class=\"rp-switch__label\">\n <slot />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useSwitch } from './useSwitch';\nimport type { SwitchProps } from './types';\n\ndefineOptions({ name: 'RpSwitch' });\n\nconst props = withDefaults(defineProps<SwitchProps>(), {\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean];\n}>();\n\nconst { control, rootClass, rootStyle, onChange } = useSwitch(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./switch.scss\" lang=\"scss\" scoped></style>\n","<template>\n <label\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :data-disabled=\"control.disabled || undefined\"\n :data-state=\"modelValue ? 'checked' : 'unchecked'\"\n >\n <input\n :id=\"control.id\"\n :name=\"name\"\n type=\"checkbox\"\n class=\"rp-switch__native\"\n role=\"switch\"\n :checked=\"modelValue\"\n :disabled=\"control.disabled || undefined\"\n :required=\"control.required || undefined\"\n :aria-checked=\"modelValue\"\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 @change=\"onChange\"\n />\n <span class=\"rp-switch__track\">\n <span class=\"rp-switch__thumb\" />\n </span>\n <span v-if=\"$slots.default\" class=\"rp-switch__label\">\n <slot />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useSwitch } from './useSwitch';\nimport type { SwitchProps } from './types';\n\ndefineOptions({ name: 'RpSwitch' });\n\nconst props = withDefaults(defineProps<SwitchProps>(), {\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean];\n}>();\n\nconst { control, rootClass, rootStyle, onChange } = useSwitch(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./switch.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;;AAMA,SAAS,oBAAoB,OAA6B;CACtD,MAAM,cAAc,wBAAwB,KAAK;CACjD,IAAI,CAAC,aAAa,OAAO,KAAA;CAEzB,OAAO,EACH,6BAA6B,YACjC;AACJ;AAEA,SAAgB,UAAU,OAA8B,YAAsC;CAC1F,MAAM,UAAU,gBAAgB,KAAK;CAErC,MAAM,YAAY,eACd,IAAI,aAAa;EACb,SAAS,MAAM;EACf,UAAU,QAAQ;EAClB,SAAS,QAAQ;GAChB,SAAS,MAAM,UAAU,uBAAuB,MAAM,KAAK;GAC3D,QAAQ,MAAM,SAAS,QAAQ,MAAM,IAAI;CAC9C,CAAC,CACL;CAEA,MAAM,YAAY,eAAe,oBAAoB,MAAM,KAAK,CAAC;CAEjE,SAAS,SAAS,GAAU;EACxB,WAAY,EAAE,OAA4B,OAAO;CACrD;CAEA,OAAO;EACH;EACA;EACA;EACA;CACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECDA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,WAAW,WAAW,aAAa,UAAU,QAAQ,UAAU;GAC5E,KAAK,qBAAqB,KAAK;EACnC,CAAC;;;SA7BY,WAAM,MAAE,MAAA,QAAA,CAAQ,CAAA,CAAA,CAAA;;;;;;gBApBb,MAAA,SAAA,CAAS;gBACT,MAAA,SAAA,CAAS;eAChB,iBAAe,qBAAoB,KAAA,CAAS;eAC5C,cAAY,cAAU,YAAA,WAAA;eAGlB,MAAI,SAAO,EAAA;eACX,QAAM,QAAA,IAAI;eAIV,WAAS,WAAU;eACnB,YAAU,qBAAoB,KAAA,CAAS;eACvC,YAAU,qBAAoB,KAAA,CAAS;eACvC,gBAAc,WAAU;eACxB,cAAY,QAAA,aAAa,KAAA,CAAS;eAClC,mBAAiB,SAAO,cAAA;eACxB,oBAAkB,SAAO,eAAA;eACzB,gBAAc,SAAO,WAAY,KAAA,CAAS;eAC1C,iBAAe,qBAAoB,KAAA,CAAS;;;iBAMrC,OAAM,eAAA"}
package/dist/tabs.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tabs.js","names":[],"sources":["../src/components/tabs/useTabs.ts","../src/components/tabs/tabs.vue","../src/components/tabs/tabs.vue","../src/components/tabs/tabs-content.vue","../src/components/tabs/tabs-content.vue","../src/components/tabs/tabs-list.vue","../src/components/tabs/tabs-list.vue","../src/components/tabs/tabs-trigger.vue","../src/components/tabs/tabs-trigger.vue"],"sourcesContent":["import {\n computed,\n onBeforeUnmount,\n onMounted,\n provide,\n ref,\n shallowRef,\n useId,\n watch,\n type InjectionKey,\n} from 'vue';\nimport { useRequiredInject } from '@/composables/useRequiredInject';\nimport { bem } from '@/utils/bem';\nimport type {\n TabsActivationMode,\n TabsContentProps,\n TabsContentRootProps,\n TabsContentSlotProps,\n TabsListProps,\n TabsListRootProps,\n TabsListSlotProps,\n TabsOrientation,\n TabsPlacement,\n TabsProps,\n TabsRootProps,\n TabsSize,\n TabsSlotProps,\n TabsState,\n TabsTriggerAlign,\n TabsTriggerProps,\n TabsTriggerRootProps,\n TabsTriggerSlotProps,\n TabsValue,\n TabsVariant,\n UseTabsContentReturn,\n UseTabsListReturn,\n UseTabsReturn,\n UseTabsTriggerReturn,\n} from './types';\n\nconst TABLIST_SELECTOR = '.rp-tabs-list';\nconst TRIGGER_SELECTOR = '.rp-tabs-trigger';\n\nconst DEFAULT_SIZE: TabsSize = 'md';\nconst DEFAULT_VARIANT: TabsVariant = 'line';\nconst DEFAULT_ORIENTATION: TabsOrientation = 'horizontal';\nconst DEFAULT_PLACEMENT: TabsPlacement = 'left';\nconst DEFAULT_ACTIVATION_MODE: TabsActivationMode = 'automatic';\n\ntype NavigationDirection = 1 | -1;\n\ninterface TabsRegistration {\n id: string;\n value: TabsValue;\n}\n\ninterface TabsTriggerRegistration extends TabsRegistration {\n disabled: boolean;\n}\n\ninterface TabsContext {\n selectedValue: TabsValue | null;\n size: TabsSize;\n variant: TabsVariant;\n disabled: boolean;\n orientation: TabsOrientation;\n placement: TabsPlacement;\n align?: TabsTriggerAlign;\n activationMode: TabsActivationMode;\n unmountOnExit: boolean;\n ariaLabel?: string;\n describedby?: string;\n labelledby?: string;\n isSelected: (value: TabsValue) => boolean;\n selectValue: (value: TabsValue) => void;\n getFocusableValue: () => TabsValue | null;\n getTriggerId: (value: TabsValue) => string | undefined;\n getContentId: (value: TabsValue) => string | undefined;\n getTriggerValue: (id: string) => TabsValue | undefined;\n registerTrigger: (registration: TabsTriggerRegistration) => void;\n unregisterTrigger: (id: string) => void;\n registerContent: (registration: TabsRegistration) => void;\n unregisterContent: (id: string) => void;\n onListKeydown: (event: KeyboardEvent) => void;\n}\n\nconst tabsKey = Symbol('tabs') as InjectionKey<TabsContext>;\n\nconst ORIENTATION_NAVIGATION_KEYS: Record<\n TabsOrientation,\n Partial<Record<string, NavigationDirection>>\n> = {\n horizontal: { ArrowRight: 1, ArrowLeft: -1 },\n vertical: { ArrowDown: 1, ArrowUp: -1 },\n};\n\nfunction optionalAttr<T extends boolean | string | undefined>(value: T): T | undefined {\n return value || undefined;\n}\n\nfunction toTabsState(active: boolean): TabsState {\n return active ? 'active' : 'inactive';\n}\n\nfunction getDefaultAlign(orientation: TabsOrientation): TabsTriggerAlign {\n return orientation === 'vertical' ? 'left' : 'center';\n}\n\nfunction getAriaProps(label?: string, labelledby?: string, describedby?: string) {\n return {\n 'aria-label': optionalAttr(label),\n 'aria-labelledby': optionalAttr(labelledby),\n 'aria-describedby': optionalAttr(describedby),\n };\n}\n\nfunction getOrientationClasses(disabled: boolean, orientation: TabsOrientation) {\n return { disabled, [orientation]: true };\n}\n\nfunction getPlacementClasses(orientation: TabsOrientation, placement: TabsPlacement) {\n return { [`placement-${placement}`]: orientation === 'vertical' };\n}\n\nfunction getStateClasses(active: boolean) {\n return { active, inactive: !active };\n}\n\nfunction getTriggerClasses(\n active: boolean,\n disabled: boolean,\n orientation: TabsOrientation,\n placement: TabsPlacement,\n align: TabsTriggerAlign | undefined,\n) {\n return {\n ...getStateClasses(active),\n ...getOrientationClasses(disabled, orientation),\n ...getPlacementClasses(orientation, placement),\n ...(align ? { [`align-${align}`]: true } : {}),\n };\n}\n\nfunction findRegistration<T extends TabsRegistration>(\n entries: T[],\n value: TabsValue | null | undefined,\n) {\n if (value == null) return undefined;\n return entries.find((entry) => entry.value === value);\n}\n\nfunction upsertRegistration<T extends { id: string }>(entries: T[], entry: T) {\n const index = entries.findIndex((current) => current.id === entry.id);\n if (index < 0) return [...entries, entry];\n\n const nextEntries = entries.slice();\n nextEntries[index] = entry;\n return nextEntries;\n}\n\nfunction useTabsRegistry<T extends { id: string }>() {\n const items = shallowRef<T[]>([]);\n\n return {\n items,\n register(entry: T) {\n items.value = upsertRegistration(items.value, entry);\n },\n unregister(id: string) {\n items.value = items.value.filter((item) => item.id !== id);\n },\n };\n}\n\nfunction useTabsRegistration<T extends { id: string }>(\n getRegistration: () => T,\n register: (registration: T) => void,\n unregister: (id: string) => void,\n watchSource: () => readonly unknown[],\n) {\n const registeredId = ref<string | null>(null);\n\n function syncRegistration() {\n const registration = getRegistration();\n if (registeredId.value && registeredId.value !== registration.id) {\n unregister(registeredId.value);\n }\n\n register(registration);\n registeredId.value = registration.id;\n }\n\n onMounted(syncRegistration);\n watch(watchSource, syncRegistration);\n\n onBeforeUnmount(() => {\n if (registeredId.value) unregister(registeredId.value);\n });\n}\n\nfunction getTabsTrigger(event: KeyboardEvent, list: HTMLElement) {\n const target = event.target;\n const trigger =\n target instanceof Element ? target.closest<HTMLButtonElement>(TRIGGER_SELECTOR) : undefined;\n\n return trigger?.closest(TABLIST_SELECTOR) === list ? trigger : undefined;\n}\n\nfunction getTabsTriggers(list: HTMLElement) {\n return Array.from(list.querySelectorAll<HTMLButtonElement>(TRIGGER_SELECTOR)).filter(\n (trigger) => trigger.closest(TABLIST_SELECTOR) === list && !trigger.disabled,\n );\n}\n\nfunction getNextTrigger(\n list: HTMLElement,\n currentTrigger: HTMLButtonElement,\n key: string,\n orientation: TabsOrientation,\n) {\n const triggers = getTabsTriggers(list);\n const currentIndex = triggers.indexOf(currentTrigger);\n if (currentIndex === -1 || triggers.length === 0) return undefined;\n\n if (key === 'Home') return triggers[0];\n if (key === 'End') return triggers[triggers.length - 1];\n\n const direction = ORIENTATION_NAVIGATION_KEYS[orientation][key];\n if (!direction) return undefined;\n\n return triggers[(currentIndex + direction + triggers.length) % triggers.length];\n}\n\nfunction useTabsItem(\n componentName: string,\n props: Readonly<{ id?: string; value: TabsValue }>,\n suffix: string,\n) {\n const group = useRequiredInject(tabsKey, componentName);\n const generatedId = useId();\n const id = computed(() => props.id ?? `${generatedId}-${suffix}`);\n const isSelected = computed(() => group.isSelected(props.value));\n const state = computed<TabsState>(() => toTabsState(isSelected.value));\n\n return { group, id, isSelected, state };\n}\n\nexport function useTabs(\n props: Readonly<TabsProps>,\n emitUpdate: (value: TabsValue) => void,\n): UseTabsReturn {\n const triggerRegistry = useTabsRegistry<TabsTriggerRegistration>();\n const contentRegistry = useTabsRegistry<TabsRegistration>();\n const { items: triggers, unregister: unregisterTrigger } = triggerRegistry;\n const {\n items: contents,\n register: registerContent,\n unregister: unregisterContent,\n } = contentRegistry;\n\n const isControlled = computed(() => props.modelValue !== undefined);\n const uncontrolledValue = ref<TabsValue | null>(props.defaultValue ?? null);\n const isDisabled = computed(() => Boolean(props.disabled));\n const size = computed<TabsSize>(() => props.size ?? DEFAULT_SIZE);\n const variant = computed<TabsVariant>(() => props.variant ?? DEFAULT_VARIANT);\n const orientation = computed<TabsOrientation>(() => props.orientation ?? DEFAULT_ORIENTATION);\n const placement = computed<TabsPlacement>(() => props.placement ?? DEFAULT_PLACEMENT);\n const align = computed<TabsTriggerAlign | undefined>(() => props.align);\n const activationMode = computed<TabsActivationMode>(\n () => props.activationMode ?? DEFAULT_ACTIVATION_MODE,\n );\n const selectedValue = computed<TabsValue | null>(() =>\n isControlled.value ? (props.modelValue ?? null) : uncontrolledValue.value,\n );\n const firstEnabledTrigger = computed(() => triggers.value.find((trigger) => !trigger.disabled));\n const selectedEnabledTrigger = computed(() => {\n const trigger = findRegistration(triggers.value, selectedValue.value);\n return trigger && !trigger.disabled ? trigger : undefined;\n });\n\n const rootClass = computed(() =>\n bem(\n 'rp-tabs',\n `size-${size.value}`,\n variant.value,\n getOrientationClasses(isDisabled.value, orientation.value),\n getPlacementClasses(orientation.value, placement.value),\n ),\n );\n\n const rootProps = computed<TabsRootProps>(() => ({\n id: props.id,\n class: rootClass.value,\n 'data-disabled': optionalAttr(isDisabled.value),\n 'data-size': size.value,\n 'data-variant': variant.value,\n 'data-orientation': orientation.value,\n 'data-placement': optionalAttr(\n orientation.value === 'vertical' ? placement.value : undefined,\n ),\n 'data-activation-mode': activationMode.value,\n ...getAriaProps(props.ariaLabel, props.labelledby, props.describedby),\n }));\n\n const slotProps = computed<TabsSlotProps>(() => ({\n value: selectedValue.value,\n size: size.value,\n variant: variant.value,\n disabled: isDisabled.value,\n placement: placement.value,\n align: align.value ?? getDefaultAlign(orientation.value),\n select: selectValue,\n }));\n\n function syncUncontrolledValue() {\n if (isControlled.value || isDisabled.value) return;\n\n const selectedTrigger = findRegistration(triggers.value, selectedValue.value);\n if (selectedValue.value != null && !selectedTrigger?.disabled) return;\n\n uncontrolledValue.value = firstEnabledTrigger.value?.value ?? null;\n }\n\n function setValue(value: TabsValue) {\n if (isDisabled.value || value === selectedValue.value) return;\n\n if (!isControlled.value) uncontrolledValue.value = value;\n emitUpdate(value);\n }\n\n function selectValue(value: TabsValue) {\n const trigger = findRegistration(triggers.value, value);\n if (isDisabled.value || trigger?.disabled) return;\n\n setValue(value);\n }\n\n const getFocusableValue = () =>\n selectedEnabledTrigger.value?.value ?? firstEnabledTrigger.value?.value ?? null;\n const getTriggerId = (value: TabsValue) => findRegistration(triggers.value, value)?.id;\n const getContentId = (value: TabsValue) => findRegistration(contents.value, value)?.id;\n const getTriggerValue = (id: string) =>\n triggers.value.find((trigger) => trigger.id === id)?.value;\n\n function registerTrigger(registration: TabsTriggerRegistration) {\n triggerRegistry.register(registration);\n syncUncontrolledValue();\n }\n\n function onListKeydown(event: KeyboardEvent) {\n const list = event.currentTarget as HTMLElement | null;\n if (!list || isDisabled.value) return;\n\n const trigger = getTabsTrigger(event, list);\n if (!trigger) return;\n\n const nextTrigger = getNextTrigger(list, trigger, event.key, orientation.value);\n if (!nextTrigger) return;\n\n event.preventDefault();\n nextTrigger.focus();\n\n const nextValue = getTriggerValue(nextTrigger.id);\n if (nextValue !== undefined && activationMode.value === 'automatic') {\n selectValue(nextValue);\n }\n }\n\n provide<TabsContext>(tabsKey, {\n get selectedValue() {\n return selectedValue.value;\n },\n get disabled() {\n return isDisabled.value;\n },\n get size() {\n return size.value;\n },\n get variant() {\n return variant.value;\n },\n get orientation() {\n return orientation.value;\n },\n get placement() {\n return placement.value;\n },\n get align() {\n return align.value;\n },\n get activationMode() {\n return activationMode.value;\n },\n get unmountOnExit() {\n return Boolean(props.unmountOnExit);\n },\n get ariaLabel() {\n return props.ariaLabel;\n },\n get describedby() {\n return props.describedby;\n },\n get labelledby() {\n return props.labelledby;\n },\n isSelected(value) {\n return selectedValue.value === value;\n },\n selectValue,\n getFocusableValue,\n getTriggerId,\n getContentId,\n getTriggerValue,\n registerTrigger,\n unregisterTrigger,\n registerContent,\n unregisterContent,\n onListKeydown,\n });\n\n return { rootClass, rootProps, slotProps, selectedValue, selectValue };\n}\n\nexport function useTabsList(props: Readonly<TabsListProps>): UseTabsListReturn {\n const group = useRequiredInject(tabsKey, 'RpTabsList');\n\n const rootClass = computed(() =>\n bem(\n 'rp-tabs-list',\n group.variant,\n getOrientationClasses(group.disabled, group.orientation),\n getPlacementClasses(group.orientation, group.placement),\n ),\n );\n\n const rootProps = computed<TabsListRootProps>(() => ({\n id: props.id,\n class: rootClass.value,\n role: 'tablist',\n 'data-disabled': optionalAttr(group.disabled),\n 'data-variant': group.variant,\n 'data-orientation': group.orientation,\n 'data-placement': optionalAttr(\n group.orientation === 'vertical' ? group.placement : undefined,\n ),\n 'aria-orientation': group.orientation,\n ...getAriaProps(\n props.ariaLabel ?? group.ariaLabel,\n props.ariaLabelledby ?? group.labelledby,\n props.ariaDescribedby ?? group.describedby,\n ),\n onKeydown: group.onListKeydown,\n }));\n\n const slotProps = computed<TabsListSlotProps>(() => ({\n disabled: group.disabled,\n variant: group.variant,\n orientation: group.orientation,\n placement: group.placement,\n }));\n\n return { rootClass, rootProps, slotProps };\n}\n\nexport function useTabsTrigger(props: Readonly<TabsTriggerProps>): UseTabsTriggerReturn {\n const { group, id, isSelected, state } = useTabsItem('RpTabsTrigger', props, 'tab');\n const isDisabled = computed(() => Boolean(group.disabled || props.disabled));\n const isFocusable = computed(\n () => group.getFocusableValue() === props.value && !isDisabled.value,\n );\n const align = computed<TabsTriggerAlign | undefined>(() => props.align ?? group.align);\n const effectiveAlign = computed(() => align.value ?? getDefaultAlign(group.orientation));\n\n const rootClass = computed(() =>\n bem(\n 'rp-tabs-trigger',\n `size-${group.size}`,\n group.variant,\n getTriggerClasses(\n isSelected.value,\n isDisabled.value,\n group.orientation,\n group.placement,\n align.value,\n ),\n ),\n );\n\n const rootProps = computed<TabsTriggerRootProps>(() => ({\n id: id.value,\n class: rootClass.value,\n role: 'tab',\n type: 'button',\n disabled: optionalAttr(isDisabled.value),\n tabIndex: isFocusable.value ? 0 : -1,\n 'data-state': state.value,\n 'data-disabled': optionalAttr(isDisabled.value),\n 'data-variant': group.variant,\n 'data-align': optionalAttr(align.value),\n 'aria-selected': isSelected.value,\n 'aria-controls': group.getContentId(props.value),\n 'aria-disabled': optionalAttr(isDisabled.value),\n onClick: select,\n onFocus,\n onKeydown,\n }));\n\n const slotProps = computed<TabsTriggerSlotProps>(() => ({\n value: props.value,\n selected: isSelected.value,\n size: group.size,\n variant: group.variant,\n disabled: isDisabled.value,\n align: effectiveAlign.value,\n select,\n }));\n\n useTabsRegistration(\n () => ({\n id: id.value,\n value: props.value,\n disabled: isDisabled.value,\n }),\n group.registerTrigger,\n group.unregisterTrigger,\n () => [id.value, props.value, isDisabled.value] as const,\n );\n\n function select() {\n if (!isDisabled.value) group.selectValue(props.value);\n }\n\n function onFocus() {\n if (group.activationMode === 'automatic') select();\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n\n event.preventDefault();\n select();\n }\n\n return { id, state, isSelected, isDisabled, rootClass, rootProps, slotProps, select };\n}\n\nexport function useTabsContent(props: Readonly<TabsContentProps>): UseTabsContentReturn {\n const { group, id, isSelected, state } = useTabsItem('RpTabsContent', props, 'tabpanel');\n const shouldUnmountOnExit = computed(() => props.unmountOnExit ?? group.unmountOnExit);\n const shouldRenderContent = computed(() => !shouldUnmountOnExit.value || isSelected.value);\n\n const rootClass = computed(() =>\n bem('rp-tabs-content', getStateClasses(isSelected.value), {\n vertical: group.orientation === 'vertical',\n }),\n );\n\n const rootProps = computed<TabsContentRootProps>(() => ({\n id: id.value,\n class: rootClass.value,\n role: 'tabpanel',\n tabIndex: 0,\n hidden: optionalAttr(!isSelected.value),\n 'data-state': state.value,\n ...getAriaProps(\n props.ariaLabel,\n props.ariaLabelledby ?? group.getTriggerId(props.value),\n props.ariaDescribedby,\n ),\n }));\n\n const slotProps = computed<TabsContentSlotProps>(() => ({\n value: props.value,\n selected: isSelected.value,\n }));\n\n useTabsRegistration(\n () => ({\n id: id.value,\n value: props.value,\n }),\n group.registerContent,\n group.unregisterContent,\n () => [id.value, props.value] as const,\n );\n\n return { id, state, isSelected, shouldRenderContent, rootClass, rootProps, slotProps };\n}\n","<template>\n <div v-bind=\"rootProps\">\n <slot v-bind=\"slotProps\" />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabs } from './useTabs';\nimport type { TabsProps, TabsValue } from './types';\n\ndefineOptions({ name: 'RpTabs' });\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n modelValue: undefined,\n defaultValue: undefined,\n size: 'md',\n variant: 'line',\n orientation: 'horizontal',\n placement: 'left',\n activationMode: 'automatic',\n disabled: false,\n unmountOnExit: false,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TabsValue];\n}>();\n\nconst { rootProps, slotProps } = useTabs(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./tabs.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div v-bind=\"rootProps\">\n <slot v-bind=\"slotProps\" />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabs } from './useTabs';\nimport type { TabsProps, TabsValue } from './types';\n\ndefineOptions({ name: 'RpTabs' });\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n modelValue: undefined,\n defaultValue: undefined,\n size: 'md',\n variant: 'line',\n orientation: 'horizontal',\n placement: 'left',\n activationMode: 'automatic',\n disabled: false,\n unmountOnExit: false,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TabsValue];\n}>();\n\nconst { rootProps, slotProps } = useTabs(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./tabs.scss\" lang=\"scss\" scoped></style>\n","<template>\n <section v-if=\"shouldRenderContent\" v-bind=\"rootProps\">\n <slot v-bind=\"slotProps\" />\n </section>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabsContent } from './useTabs';\nimport type { TabsContentProps } from './types';\n\ndefineOptions({ name: 'RpTabsContent' });\n\nconst props = withDefaults(defineProps<TabsContentProps>(), {\n unmountOnExit: undefined,\n});\n\nconst { rootProps, slotProps, shouldRenderContent } = useTabsContent(props);\n</script>\n\n<style src=\"./tabs-content.scss\" lang=\"scss\" scoped></style>\n","<template>\n <section v-if=\"shouldRenderContent\" v-bind=\"rootProps\">\n <slot v-bind=\"slotProps\" />\n </section>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabsContent } from './useTabs';\nimport type { TabsContentProps } from './types';\n\ndefineOptions({ name: 'RpTabsContent' });\n\nconst props = withDefaults(defineProps<TabsContentProps>(), {\n unmountOnExit: undefined,\n});\n\nconst { rootProps, slotProps, shouldRenderContent } = useTabsContent(props);\n</script>\n\n<style src=\"./tabs-content.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div v-bind=\"rootProps\">\n <slot v-bind=\"slotProps\" />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabsList } from './useTabs';\nimport type { TabsListProps } from './types';\n\ndefineOptions({ name: 'RpTabsList' });\n\nconst props = defineProps<TabsListProps>();\n\nconst { rootProps, slotProps } = useTabsList(props);\n</script>\n\n<style src=\"./tabs-list.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div v-bind=\"rootProps\">\n <slot v-bind=\"slotProps\" />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabsList } from './useTabs';\nimport type { TabsListProps } from './types';\n\ndefineOptions({ name: 'RpTabsList' });\n\nconst props = defineProps<TabsListProps>();\n\nconst { rootProps, slotProps } = useTabsList(props);\n</script>\n\n<style src=\"./tabs-list.scss\" lang=\"scss\" scoped></style>\n","<template>\n <button v-bind=\"rootProps\">\n <slot v-bind=\"slotProps\" />\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabsTrigger } from './useTabs';\nimport type { TabsTriggerProps } from './types';\n\ndefineOptions({ name: 'RpTabsTrigger' });\n\nconst props = withDefaults(defineProps<TabsTriggerProps>(), {\n disabled: false,\n});\n\nconst { rootProps, slotProps } = useTabsTrigger(props);\n</script>\n\n<style src=\"./tabs-trigger.scss\" lang=\"scss\" scoped></style>\n","<template>\n <button v-bind=\"rootProps\">\n <slot v-bind=\"slotProps\" />\n </button>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTabsTrigger } from './useTabs';\nimport type { TabsTriggerProps } from './types';\n\ndefineOptions({ name: 'RpTabsTrigger' });\n\nconst props = withDefaults(defineProps<TabsTriggerProps>(), {\n disabled: false,\n});\n\nconst { rootProps, slotProps } = useTabsTrigger(props);\n</script>\n\n<style src=\"./tabs-trigger.scss\" lang=\"scss\" scoped></style>\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"textarea.js","names":[],"sources":["../src/components/textarea/useTextarea.ts","../src/components/textarea/textarea.vue","../src/components/textarea/textarea.vue"],"sourcesContent":["import { computed, nextTick, onMounted, ref, watch } from 'vue';\nimport { useControlState } from '@/composables/useControlState';\nimport { bem } from '@/utils/bem';\nimport type { TextareaProps } from './types';\n\nconst MIN_ROWS = 1;\nconst NATIVE_TEXTAREA_SELECTOR = '.rp-textarea__native';\nconst INTERACTIVE_SELECTOR = [\n 'button',\n 'a[href]',\n 'input',\n 'select',\n `textarea:not(${NATIVE_TEXTAREA_SELECTOR})`,\n '[contenteditable=\"true\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\ninterface AutosizeRows {\n minRows: number;\n maxRows: number | undefined;\n}\n\ninterface TextareaMetrics {\n lineHeight: number;\n paddingHeight: number;\n borderHeight: number;\n}\n\nfunction isInteractiveElement(target: Element) {\n return Boolean(target.closest(INTERACTIVE_SELECTOR));\n}\n\nfunction normalizeRows(value: number | undefined, fallback?: number) {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(MIN_ROWS, Math.floor(value));\n}\n\nfunction getPixelValue(value: string) {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction getLineHeight(styles: CSSStyleDeclaration) {\n const lineHeight = getPixelValue(styles.lineHeight);\n if (lineHeight > 0) return lineHeight;\n\n const fontSize = getPixelValue(styles.fontSize);\n return fontSize > 0 ? fontSize * 1.2 : 0;\n}\n\nfunction getTextareaMetrics(textarea: HTMLTextAreaElement): TextareaMetrics {\n const styles = getComputedStyle(textarea);\n\n return {\n lineHeight: getLineHeight(styles),\n paddingHeight: getPixelValue(styles.paddingTop) + getPixelValue(styles.paddingBottom),\n borderHeight:\n getPixelValue(styles.borderTopWidth) + getPixelValue(styles.borderBottomWidth),\n };\n}\n\nfunction getRowsHeight(metrics: TextareaMetrics, rows: number) {\n return rows * metrics.lineHeight + metrics.paddingHeight + metrics.borderHeight;\n}\n\nfunction getAutosizeMeasurement(textarea: HTMLTextAreaElement, rows: AutosizeRows) {\n const metrics = getTextareaMetrics(textarea);\n const maxHeight = rows.maxRows === undefined ? undefined : getRowsHeight(metrics, rows.maxRows);\n\n return {\n contentHeight: textarea.scrollHeight + metrics.borderHeight,\n minHeight: getRowsHeight(metrics, rows.minRows),\n maxHeight,\n };\n}\n\nfunction resetTextareaHeight(textarea: HTMLTextAreaElement) {\n textarea.style.height = '';\n textarea.style.overflowY = '';\n}\n\nexport function useTextarea(props: Readonly<TextareaProps>, emitUpdate: (value: string) => void) {\n const textareaRef = ref<HTMLTextAreaElement | null>(null);\n const control = useControlState(props);\n\n const autosizeRows = computed<AutosizeRows>(() => {\n const minRows =\n normalizeRows(props.minRows, normalizeRows(props.rows, MIN_ROWS)) ?? MIN_ROWS;\n const maxRows = normalizeRows(props.maxRows);\n\n return {\n minRows,\n maxRows: maxRows === undefined ? undefined : Math.max(minRows, maxRows),\n };\n });\n\n const nativeRows = computed(() => (props.autosize ? autosizeRows.value.minRows : props.rows));\n\n const rootClass = computed(() =>\n bem('rp-textarea', {\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n [`resize-${props.resize}`]: props.resize !== undefined && props.resize !== 'none',\n autosize: props.autosize,\n disabled: control.disabled,\n invalid: control.invalid,\n valid: control.valid && !control.invalid,\n readonly: props.readonly,\n }),\n );\n\n const autosizeWatchSource = computed(() => [\n props.modelValue,\n props.autosize,\n props.minRows,\n props.maxRows,\n props.rows,\n props.size,\n ]);\n\n function syncTextareaHeight() {\n const textarea = textareaRef.value;\n if (!textarea) return;\n\n if (!props.autosize) {\n resetTextareaHeight(textarea);\n return;\n }\n\n textarea.style.height = 'auto';\n\n const { contentHeight, minHeight, maxHeight } = getAutosizeMeasurement(\n textarea,\n autosizeRows.value,\n );\n const heightLimit = maxHeight ?? Number.POSITIVE_INFINITY;\n const nextHeight = Math.min(Math.max(contentHeight, minHeight), heightLimit);\n\n textarea.style.height = `${nextHeight}px`;\n textarea.style.overflowY =\n maxHeight !== undefined && contentHeight > maxHeight ? 'auto' : 'hidden';\n }\n\n function scheduleTextareaHeightSync() {\n void nextTick(syncTextareaHeight);\n }\n\n function onInput(e: Event) {\n emitUpdate((e.target as HTMLTextAreaElement).value);\n syncTextareaHeight();\n }\n\n function focusTextarea(e: MouseEvent) {\n if (control.disabled) return;\n\n const target = e.target;\n if (target instanceof Element && isInteractiveElement(target)) return;\n\n textareaRef.value?.focus();\n }\n\n onMounted(scheduleTextareaHeightSync);\n\n watch(autosizeWatchSource, scheduleTextareaHeightSync);\n\n return {\n textareaRef,\n control,\n rootClass,\n nativeRows,\n onInput,\n focusTextarea,\n };\n}\n","<template>\n <div :class=\"rootClass\" @mousedown=\"focusTextarea\">\n <textarea\n :id=\"control.id\"\n ref=\"textareaRef\"\n :name=\"name\"\n class=\"rp-textarea__native\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :rows=\"nativeRows\"\n :disabled=\"control.disabled || undefined\"\n :readonly=\"readonly || undefined\"\n :required=\"control.required || 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 @input=\"onInput\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTextarea } from './useTextarea';\nimport type { TextareaProps } from './types';\n\ndefineOptions({ name: 'RpTextarea' });\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '',\n rows: 3,\n resize: 'none',\n autosize: false,\n minRows: undefined,\n maxRows: undefined,\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n valid: undefined,\n readonly: false,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n}>();\n\nconst { textareaRef, control, rootClass, nativeRows, onInput, focusTextarea } = useTextarea(\n props,\n (value) => {\n emit('update:modelValue', value);\n },\n);\n\nvoid textareaRef;\n</script>\n\n<style src=\"./textarea.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div :class=\"rootClass\" @mousedown=\"focusTextarea\">\n <textarea\n :id=\"control.id\"\n ref=\"textareaRef\"\n :name=\"name\"\n class=\"rp-textarea__native\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :rows=\"nativeRows\"\n :disabled=\"control.disabled || undefined\"\n :readonly=\"readonly || undefined\"\n :required=\"control.required || 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 @input=\"onInput\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTextarea } from './useTextarea';\nimport type { TextareaProps } from './types';\n\ndefineOptions({ name: 'RpTextarea' });\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '',\n rows: 3,\n resize: 'none',\n autosize: false,\n minRows: undefined,\n maxRows: undefined,\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n valid: undefined,\n readonly: false,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string];\n}>();\n\nconst { textareaRef, control, rootClass, nativeRows, onInput, focusTextarea } = useTextarea(\n props,\n (value) => {\n emit('update:modelValue', value);\n },\n);\n\nvoid textareaRef;\n</script>\n\n<style src=\"./textarea.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;AAKA,IAAM,WAAW;AAEjB,IAAM,uBAAuB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;AACJ,CAAC,CAAC,KAAK,GAAG;AAaV,SAAS,qBAAqB,QAAiB;CAC3C,OAAO,QAAQ,OAAO,QAAQ,oBAAoB,CAAC;AACvD;AAEA,SAAS,cAAc,OAA2B,UAAmB;CACjE,IAAI,UAAU,KAAA,KAAa,CAAC,OAAO,SAAS,KAAK,GAAG,OAAO;CAC3D,OAAO,KAAK,IAAI,UAAU,KAAK,MAAM,KAAK,CAAC;AAC/C;AAEA,SAAS,cAAc,OAAe;CAClC,MAAM,SAAS,OAAO,WAAW,KAAK;CACtC,OAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC9C;AAEA,SAAS,cAAc,QAA6B;CAChD,MAAM,aAAa,cAAc,OAAO,UAAU;CAClD,IAAI,aAAa,GAAG,OAAO;CAE3B,MAAM,WAAW,cAAc,OAAO,QAAQ;CAC9C,OAAO,WAAW,IAAI,WAAW,MAAM;AAC3C;AAEA,SAAS,mBAAmB,UAAgD;CACxE,MAAM,SAAS,iBAAiB,QAAQ;CAExC,OAAO;EACH,YAAY,cAAc,MAAM;EAChC,eAAe,cAAc,OAAO,UAAU,IAAI,cAAc,OAAO,aAAa;EACpF,cACI,cAAc,OAAO,cAAc,IAAI,cAAc,OAAO,iBAAiB;CACrF;AACJ;AAEA,SAAS,cAAc,SAA0B,MAAc;CAC3D,OAAO,OAAO,QAAQ,aAAa,QAAQ,gBAAgB,QAAQ;AACvE;AAEA,SAAS,uBAAuB,UAA+B,MAAoB;CAC/E,MAAM,UAAU,mBAAmB,QAAQ;CAC3C,MAAM,YAAY,KAAK,YAAY,KAAA,IAAY,KAAA,IAAY,cAAc,SAAS,KAAK,OAAO;CAE9F,OAAO;EACH,eAAe,SAAS,eAAe,QAAQ;EAC/C,WAAW,cAAc,SAAS,KAAK,OAAO;EAC9C;CACJ;AACJ;AAEA,SAAS,oBAAoB,UAA+B;CACxD,SAAS,MAAM,SAAS;CACxB,SAAS,MAAM,YAAY;AAC/B;AAEA,SAAgB,YAAY,OAAgC,YAAqC;CAC7F,MAAM,cAAc,IAAgC,IAAI;CACxD,MAAM,UAAU,gBAAgB,KAAK;CAErC,MAAM,eAAe,eAA6B;EAC9C,MAAM,UACF,cAAc,MAAM,SAAS,cAAc,MAAM,MAAM,QAAQ,CAAC,KAAK;EACzE,MAAM,UAAU,cAAc,MAAM,OAAO;EAE3C,OAAO;GACH;GACA,SAAS,YAAY,KAAA,IAAY,KAAA,IAAY,KAAK,IAAI,SAAS,OAAO;EAC1E;CACJ,CAAC;CAED,MAAM,aAAa,eAAgB,MAAM,WAAW,aAAa,MAAM,UAAU,MAAM,IAAK;CAE5F,MAAM,YAAY,eACd,IAAI,eAAe;GACd,QAAQ,MAAM,SAAS,QAAQ,MAAM,IAAI;GACzC,UAAU,MAAM,WAAW,QAAQ,MAAM,MAAM;GAC/C,UAAU,MAAM,WAAW,MAAM,WAAW,KAAA,KAAa,MAAM,WAAW;EAC3E,UAAU,MAAM;EAChB,UAAU,QAAQ;EAClB,SAAS,QAAQ;EACjB,OAAO,QAAQ,SAAS,CAAC,QAAQ;EACjC,UAAU,MAAM;CACpB,CAAC,CACL;CAEA,MAAM,sBAAsB,eAAe;EACvC,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;CACV,CAAC;CAED,SAAS,qBAAqB;EAC1B,MAAM,WAAW,YAAY;EAC7B,IAAI,CAAC,UAAU;EAEf,IAAI,CAAC,MAAM,UAAU;GACjB,oBAAoB,QAAQ;GAC5B;EACJ;EAEA,SAAS,MAAM,SAAS;EAExB,MAAM,EAAE,eAAe,WAAW,cAAc,uBAC5C,UACA,aAAa,KACjB;EACA,MAAM,cAAc,aAAa,OAAO;EACxC,MAAM,aAAa,KAAK,IAAI,KAAK,IAAI,eAAe,SAAS,GAAG,WAAW;EAE3E,SAAS,MAAM,SAAS,GAAG,WAAW;EACtC,SAAS,MAAM,YACX,cAAc,KAAA,KAAa,gBAAgB,YAAY,SAAS;CACxE;CAEA,SAAS,6BAA6B;EAClC,SAAc,kBAAkB;CACpC;CAEA,SAAS,QAAQ,GAAU;EACvB,WAAY,EAAE,OAA+B,KAAK;EAClD,mBAAmB;CACvB;CAEA,SAAS,cAAc,GAAe;EAClC,IAAI,QAAQ,UAAU;EAEtB,MAAM,SAAS,EAAE;EACjB,IAAI,kBAAkB,WAAW,qBAAqB,MAAM,GAAG;EAE/D,YAAY,OAAO,MAAM;CAC7B;CAEA,UAAU,0BAA0B;CAEpC,MAAM,qBAAqB,0BAA0B;CAErD,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EChJA,MAAM,QAAQ;EAcd,MAAM,OAAO;EAIb,MAAM,EAAE,aAAa,SAAS,WAAW,YAAY,SAAS,kBAAkB,YAC5E,QACC,UAAU;GACP,KAAK,qBAAqB,KAAK;EACnC,CACJ;;;;sCAlCoB,MAAA,OAAA,CAAO,CAAA,CAAA,CAAA;;0CAjBa,MAAA,aAAA,CAAa,CAAA,CAAA,CAAA;;;;gBAApC,MAAA,SAAA,CAAS;eAEb,MAAI,SAAO,EAAA;eAEX,QAAM,QAAA,IAAI;gBAEH,QAAA,UAAU;eACjB,eAAa,QAAA,WAAW;eACxB,QAAM,MAAA,UAAA,CAAU;eAChB,YAAU,SAAO,YAAa,KAAA,CAAS;eACvC,YAAU,QAAA,YAAY,KAAA,CAAS;eAC/B,YAAU,qBAAoB,KAAA,CAAS;eACvC,cAAY,QAAA,aAAa,KAAA,CAAS;eAClC,mBAAiB,SAAO,cAAA;eACxB,oBAAkB,SAAO,eAAA;eACzB,gBAAc,SAAO,WAAY,KAAA,CAAS;eAC1C,iBAAe,qBAAoB,KAAA,CAAS"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tooltip.js","names":[],"sources":["../src/composables/useDelayedOpen.ts","../src/components/tooltip/useTooltip.ts","../src/components/tooltip/tooltip.vue","../src/components/tooltip/tooltip.vue"],"sourcesContent":["import { computed, onBeforeUnmount, ref } from 'vue';\n\nexport interface UseDelayedOpenOptions {\n open?: boolean | (() => boolean | undefined);\n openDelay?: number | (() => number | undefined);\n disabled?: boolean | (() => boolean | undefined);\n onOpenChange?: (open: boolean) => void;\n}\n\nfunction readOption<T>(value: T | (() => T | undefined) | undefined, fallback: T): T {\n return typeof value === 'function'\n ? ((value as () => T | undefined)() ?? fallback)\n : (value ?? fallback);\n}\n\nfunction readOptional<T>(value: T | (() => T | undefined) | undefined): T | undefined {\n return typeof value === 'function' ? (value as () => T | undefined)() : value;\n}\n\nexport function useDelayedOpen(options: UseDelayedOpenOptions = {}) {\n const uncontrolledOpen = ref(false);\n let openTimer: ReturnType<typeof setTimeout> | null = null;\n\n const isOpen = computed(() => readOptional(options.open) ?? uncontrolledOpen.value);\n\n function clearTimers() {\n if (openTimer) {\n clearTimeout(openTimer);\n openTimer = null;\n }\n }\n\n function isDisabled() {\n return readOption(options.disabled, false);\n }\n\n function setOpen(nextOpen: boolean) {\n const previousOpen = isOpen.value;\n if (readOptional(options.open) === undefined) uncontrolledOpen.value = nextOpen;\n if (previousOpen !== nextOpen) options.onOpenChange?.(nextOpen);\n }\n\n function open() {\n if (isDisabled()) return;\n const delay = readOption(options.openDelay, 0);\n if (delay <= 0) {\n setOpen(true);\n return;\n }\n if (openTimer) clearTimeout(openTimer);\n openTimer = setTimeout(() => {\n setOpen(true);\n openTimer = null;\n }, delay);\n }\n\n function closeImmediate() {\n clearTimers();\n setOpen(false);\n }\n\n onBeforeUnmount(clearTimers);\n\n return {\n isOpen,\n open,\n closeImmediate,\n };\n}\n","import {\n computed,\n isRef,\n onBeforeUnmount,\n onMounted,\n ref,\n useId,\n useSlots,\n watch,\n type CSSProperties,\n} from 'vue';\nimport { useDelayedOpen } from '@/composables/useDelayedOpen';\nimport { getComponentCustomColor, isComponentPresetColor } from '@/utils/componentColors';\nimport { bem } from '@/utils/bem';\nimport type { TooltipOffset, TooltipPlacement, TooltipProps, TooltipTriggerProps } from './types';\n\ninterface TooltipPosition {\n x: number;\n y: number;\n}\n\nfunction isHTMLElement(value: unknown): value is HTMLElement {\n return typeof HTMLElement !== 'undefined' && value instanceof HTMLElement;\n}\n\nfunction getTargetPosition(rect: DOMRect, placement: TooltipPlacement): TooltipPosition {\n switch (placement) {\n case 'right':\n return { x: rect.right, y: rect.top + rect.height / 2 };\n case 'bottom':\n return { x: rect.left + rect.width / 2, y: rect.bottom };\n case 'left':\n return { x: rect.left, y: rect.top + rect.height / 2 };\n case 'top':\n default:\n return { x: rect.left + rect.width / 2, y: rect.top };\n }\n}\n\nfunction resolveOffsetStyle(offset: TooltipOffset | undefined): CSSProperties | undefined {\n if (offset == null) return undefined;\n\n if (typeof offset === 'number') {\n return {\n '--_rp-tooltip-main-axis-offset': `${offset}px`,\n };\n }\n\n const style: CSSProperties = {};\n\n if (offset.mainAxis != null) {\n style['--_rp-tooltip-main-axis-offset'] = `${offset.mainAxis}px`;\n }\n\n if (offset.crossAxis != null) {\n style['--_rp-tooltip-cross-axis-offset'] = `${offset.crossAxis}px`;\n }\n\n return Object.keys(style).length > 0 ? style : undefined;\n}\n\nfunction resolveTooltipColorStyle(color: TooltipProps['color']): CSSProperties | undefined {\n const customColor = getComponentCustomColor(color);\n if (!customColor) return undefined;\n\n return {\n '--_rp-tooltip-bg': customColor,\n '--_rp-tooltip-fg': 'var(--rp-color-on-primary)',\n };\n}\n\nexport function useTooltip(\n props: Readonly<TooltipProps>,\n emitOpenChange?: (open: boolean) => void,\n) {\n const slots = useSlots();\n const generatedId = useId();\n const targetElement = ref<HTMLElement | null>(null);\n const targetPosition = ref<TooltipPosition | null>(null);\n\n let isMounted = false;\n let removeTargetListeners: (() => void) | undefined;\n let removePositionListeners: (() => void) | undefined;\n let describedTarget: HTMLElement | null = null;\n let previousTargetDescribedby: string | null = null;\n\n const tooltipId = computed(() => props.id ?? `${generatedId}-tooltip`);\n const placement = computed(() => props.placement ?? 'top');\n const isTargetMode = computed(() => props.target != null && props.target !== '');\n const hasContent = computed(() => Boolean(props.content || slots.content));\n const isDecorative = computed(() => Boolean(props.decorative));\n const isDisabled = computed(() => Boolean(props.disabled || !hasContent.value));\n const shouldRenderContent = computed(() => !isDisabled.value);\n const shouldDescribeContent = computed(() => shouldRenderContent.value && !isDecorative.value);\n\n const { isOpen, open, closeImmediate } = useDelayedOpen({\n open: () => props.open,\n openDelay: () => props.openDelay ?? 300,\n disabled: () => isDisabled.value,\n onOpenChange: emitOpenChange,\n });\n\n const isVisible = computed(() => isOpen.value && !isDisabled.value);\n\n const rootClass = computed(() =>\n bem('rp-tooltip', {\n [`placement-${placement.value}`]: true,\n [`color-${props.color}`]: isComponentPresetColor(props.color),\n arrow: props.arrow,\n target: isTargetMode.value,\n open: isVisible.value,\n disabled: props.disabled,\n }),\n );\n\n const triggerProps = computed<TooltipTriggerProps>(() => ({\n 'aria-describedby': shouldDescribeContent.value ? tooltipId.value : undefined,\n }));\n\n const contentRole = computed(() => (isDecorative.value ? undefined : 'tooltip'));\n const contentAriaHidden = computed(() => (isDecorative.value ? 'true' : undefined));\n\n const contentStyle = computed<CSSProperties | undefined>(() => {\n const style: CSSProperties = {\n ...resolveOffsetStyle(props.offset),\n ...resolveTooltipColorStyle(props.color),\n };\n\n if (!isTargetMode.value || !targetPosition.value) {\n return Object.keys(style).length > 0 ? style : undefined;\n }\n\n return {\n ...style,\n '--_rp-tooltip-target-x': `${targetPosition.value.x}px`,\n '--_rp-tooltip-target-y': `${targetPosition.value.y}px`,\n };\n });\n\n function openTooltip() {\n open();\n }\n\n function closeTooltip() {\n closeImmediate();\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') closeTooltip();\n }\n\n function readTarget() {\n return isRef(props.target) ? props.target.value : props.target;\n }\n\n function resolveTarget() {\n const target = readTarget();\n if (!target) return null;\n\n if (typeof target === 'string') {\n if (typeof document === 'undefined') return null;\n\n try {\n const element = document.querySelector(target);\n return isHTMLElement(element) ? element : null;\n } catch {\n return null;\n }\n }\n\n return isHTMLElement(target) ? target : null;\n }\n\n function restoreTargetDescription() {\n if (!describedTarget) return;\n\n if (previousTargetDescribedby) {\n describedTarget.setAttribute('aria-describedby', previousTargetDescribedby);\n } else {\n describedTarget.removeAttribute('aria-describedby');\n }\n\n describedTarget = null;\n previousTargetDescribedby = null;\n }\n\n function syncTargetDescription() {\n restoreTargetDescription();\n\n if (!isTargetMode.value || !shouldDescribeContent.value || !targetElement.value) return;\n\n describedTarget = targetElement.value;\n previousTargetDescribedby = describedTarget.getAttribute('aria-describedby');\n\n const ids = (previousTargetDescribedby ?? '').split(/\\s+/).filter(Boolean);\n if (!ids.includes(tooltipId.value)) ids.push(tooltipId.value);\n describedTarget.setAttribute('aria-describedby', ids.join(' '));\n }\n\n function updateTargetPosition() {\n if (!isTargetMode.value || !targetElement.value) {\n targetPosition.value = null;\n return;\n }\n\n targetPosition.value = getTargetPosition(\n targetElement.value.getBoundingClientRect(),\n placement.value,\n );\n }\n\n function onTargetOpen() {\n updateTargetPosition();\n openTooltip();\n }\n\n function bindTargetListeners(element: HTMLElement) {\n removeTargetListeners?.();\n\n element.addEventListener('mouseenter', onTargetOpen);\n element.addEventListener('mouseleave', closeTooltip);\n element.addEventListener('focusin', onTargetOpen);\n element.addEventListener('focusout', closeTooltip);\n element.addEventListener('keydown', onKeydown);\n\n removeTargetListeners = () => {\n element.removeEventListener('mouseenter', onTargetOpen);\n element.removeEventListener('mouseleave', closeTooltip);\n element.removeEventListener('focusin', onTargetOpen);\n element.removeEventListener('focusout', closeTooltip);\n element.removeEventListener('keydown', onKeydown);\n removeTargetListeners = undefined;\n };\n }\n\n function removeViewportListeners() {\n removePositionListeners?.();\n removePositionListeners = undefined;\n }\n\n function bindViewportListeners() {\n if (typeof window === 'undefined' || removePositionListeners) return;\n\n window.addEventListener('resize', updateTargetPosition);\n window.addEventListener('scroll', updateTargetPosition, true);\n\n removePositionListeners = () => {\n window.removeEventListener('resize', updateTargetPosition);\n window.removeEventListener('scroll', updateTargetPosition, true);\n };\n }\n\n function syncTarget() {\n if (!isTargetMode.value) {\n removeTargetListeners?.();\n removeViewportListeners();\n restoreTargetDescription();\n targetElement.value = null;\n targetPosition.value = null;\n return;\n }\n\n const nextTarget = resolveTarget();\n if (targetElement.value === nextTarget) {\n syncTargetDescription();\n updateTargetPosition();\n return;\n }\n\n removeTargetListeners?.();\n removeViewportListeners();\n restoreTargetDescription();\n targetElement.value = nextTarget;\n\n if (!nextTarget) {\n targetPosition.value = null;\n return;\n }\n\n bindTargetListeners(nextTarget);\n syncTargetDescription();\n updateTargetPosition();\n }\n\n watch(isDisabled, (disabled) => {\n if (disabled) closeTooltip();\n });\n\n watch(\n () => readTarget(),\n () => {\n if (isMounted) syncTarget();\n },\n { flush: 'post' },\n );\n\n watch([isTargetMode, shouldDescribeContent, tooltipId], () => {\n if (isMounted) syncTargetDescription();\n });\n\n watch([placement, isVisible], () => {\n if (isMounted && isVisible.value) updateTargetPosition();\n });\n\n watch(isVisible, (visible) => {\n if (!isMounted || !isTargetMode.value) return;\n\n if (visible) {\n updateTargetPosition();\n bindViewportListeners();\n } else {\n removeViewportListeners();\n }\n });\n\n onMounted(() => {\n isMounted = true;\n syncTarget();\n });\n\n onBeforeUnmount(() => {\n isMounted = false;\n removeTargetListeners?.();\n removeViewportListeners();\n restoreTargetDescription();\n });\n\n return {\n tooltipId,\n isOpen,\n isVisible,\n isTargetMode,\n shouldRenderContent,\n rootClass,\n triggerProps,\n contentRole,\n contentAriaHidden,\n contentStyle,\n openTooltip,\n closeTooltip,\n onKeydown,\n };\n}\n","<template>\n <span\n :class=\"rootClass\"\n @mouseenter=\"openTooltip\"\n @mouseleave=\"closeTooltip\"\n @focusin=\"openTooltip\"\n @focusout=\"closeTooltip\"\n @keydown=\"onKeydown\"\n >\n <slot v-if=\"!isTargetMode\" :trigger-props=\"triggerProps\" />\n\n <Transition name=\"rp-tooltip-content\">\n <span\n v-if=\"shouldRenderContent\"\n v-show=\"isVisible\"\n :id=\"tooltipId\"\n class=\"rp-tooltip__content\"\n :role=\"contentRole\"\n :aria-hidden=\"contentAriaHidden\"\n :style=\"contentStyle\"\n >\n <slot name=\"content\">{{ content }}</slot>\n </span>\n </Transition>\n </span>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTooltip } from './useTooltip';\nimport type { TooltipProps } from './types';\n\ndefineOptions({ name: 'RpTooltip' });\n\nconst props = withDefaults(defineProps<TooltipProps>(), {\n content: '',\n placement: 'top',\n open: undefined,\n openDelay: 300,\n arrow: false,\n disabled: false,\n decorative: false,\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n}>();\n\nconst {\n tooltipId,\n isVisible,\n isTargetMode,\n shouldRenderContent,\n rootClass,\n triggerProps,\n contentRole,\n contentAriaHidden,\n contentStyle,\n openTooltip,\n closeTooltip,\n onKeydown,\n} = useTooltip(props, (open) => {\n emit('update:open', open);\n});\n</script>\n\n<style src=\"./tooltip.scss\" lang=\"scss\" scoped></style>\n","<template>\n <span\n :class=\"rootClass\"\n @mouseenter=\"openTooltip\"\n @mouseleave=\"closeTooltip\"\n @focusin=\"openTooltip\"\n @focusout=\"closeTooltip\"\n @keydown=\"onKeydown\"\n >\n <slot v-if=\"!isTargetMode\" :trigger-props=\"triggerProps\" />\n\n <Transition name=\"rp-tooltip-content\">\n <span\n v-if=\"shouldRenderContent\"\n v-show=\"isVisible\"\n :id=\"tooltipId\"\n class=\"rp-tooltip__content\"\n :role=\"contentRole\"\n :aria-hidden=\"contentAriaHidden\"\n :style=\"contentStyle\"\n >\n <slot name=\"content\">{{ content }}</slot>\n </span>\n </Transition>\n </span>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useTooltip } from './useTooltip';\nimport type { TooltipProps } from './types';\n\ndefineOptions({ name: 'RpTooltip' });\n\nconst props = withDefaults(defineProps<TooltipProps>(), {\n content: '',\n placement: 'top',\n open: undefined,\n openDelay: 300,\n arrow: false,\n disabled: false,\n decorative: false,\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n}>();\n\nconst {\n tooltipId,\n isVisible,\n isTargetMode,\n shouldRenderContent,\n rootClass,\n triggerProps,\n contentRole,\n contentAriaHidden,\n contentStyle,\n openTooltip,\n closeTooltip,\n onKeydown,\n} = useTooltip(props, (open) => {\n emit('update:open', open);\n});\n</script>\n\n<style src=\"./tooltip.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;AASA,SAAS,WAAc,OAA8C,UAAgB;CACjF,OAAO,OAAO,UAAU,aAChB,MAA8B,KAAK,WACpC,SAAS;AACpB;AAEA,SAAS,aAAgB,OAA6D;CAClF,OAAO,OAAO,UAAU,aAAc,MAA8B,IAAI;AAC5E;AAEA,SAAgB,eAAe,UAAiC,CAAC,GAAG;CAChE,MAAM,mBAAmB,IAAI,KAAK;CAClC,IAAI,YAAkD;CAEtD,MAAM,SAAS,eAAe,aAAa,QAAQ,IAAI,KAAK,iBAAiB,KAAK;CAElF,SAAS,cAAc;EACnB,IAAI,WAAW;GACX,aAAa,SAAS;GACtB,YAAY;EAChB;CACJ;CAEA,SAAS,aAAa;EAClB,OAAO,WAAW,QAAQ,UAAU,KAAK;CAC7C;CAEA,SAAS,QAAQ,UAAmB;EAChC,MAAM,eAAe,OAAO;EAC5B,IAAI,aAAa,QAAQ,IAAI,MAAM,KAAA,GAAW,iBAAiB,QAAQ;EACvE,IAAI,iBAAiB,UAAU,QAAQ,eAAe,QAAQ;CAClE;CAEA,SAAS,OAAO;EACZ,IAAI,WAAW,GAAG;EAClB,MAAM,QAAQ,WAAW,QAAQ,WAAW,CAAC;EAC7C,IAAI,SAAS,GAAG;GACZ,QAAQ,IAAI;GACZ;EACJ;EACA,IAAI,WAAW,aAAa,SAAS;EACrC,YAAY,iBAAiB;GACzB,QAAQ,IAAI;GACZ,YAAY;EAChB,GAAG,KAAK;CACZ;CAEA,SAAS,iBAAiB;EACtB,YAAY;EACZ,QAAQ,KAAK;CACjB;CAEA,gBAAgB,WAAW;CAE3B,OAAO;EACH;EACA;EACA;CACJ;AACJ;;;AC/CA,SAAS,cAAc,OAAsC;CACzD,OAAO,OAAO,gBAAgB,eAAe,iBAAiB;AAClE;AAEA,SAAS,kBAAkB,MAAe,WAA8C;CACpF,QAAQ,WAAR;EACI,KAAK,SACD,OAAO;GAAE,GAAG,KAAK;GAAO,GAAG,KAAK,MAAM,KAAK,SAAS;EAAE;EAC1D,KAAK,UACD,OAAO;GAAE,GAAG,KAAK,OAAO,KAAK,QAAQ;GAAG,GAAG,KAAK;EAAO;EAC3D,KAAK,QACD,OAAO;GAAE,GAAG,KAAK;GAAM,GAAG,KAAK,MAAM,KAAK,SAAS;EAAE;EAEzD,SACI,OAAO;GAAE,GAAG,KAAK,OAAO,KAAK,QAAQ;GAAG,GAAG,KAAK;EAAI;CAC5D;AACJ;AAEA,SAAS,mBAAmB,QAA8D;CACtF,IAAI,UAAU,MAAM,OAAO,KAAA;CAE3B,IAAI,OAAO,WAAW,UAClB,OAAO,EACH,kCAAkC,GAAG,OAAO,IAChD;CAGJ,MAAM,QAAuB,CAAC;CAE9B,IAAI,OAAO,YAAY,MACnB,MAAM,oCAAoC,GAAG,OAAO,SAAS;CAGjE,IAAI,OAAO,aAAa,MACpB,MAAM,qCAAqC,GAAG,OAAO,UAAU;CAGnE,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,IAAI,QAAQ,KAAA;AACnD;AAEA,SAAS,yBAAyB,OAAyD;CACvF,MAAM,cAAc,wBAAwB,KAAK;CACjD,IAAI,CAAC,aAAa,OAAO,KAAA;CAEzB,OAAO;EACH,oBAAoB;EACpB,oBAAoB;CACxB;AACJ;AAEA,SAAgB,WACZ,OACA,gBACF;CACE,MAAM,QAAQ,SAAS;CACvB,MAAM,cAAc,MAAM;CAC1B,MAAM,gBAAgB,IAAwB,IAAI;CAClD,MAAM,iBAAiB,IAA4B,IAAI;CAEvD,IAAI,YAAY;CAChB,IAAI;CACJ,IAAI;CACJ,IAAI,kBAAsC;CAC1C,IAAI,4BAA2C;CAE/C,MAAM,YAAY,eAAe,MAAM,MAAM,GAAG,YAAY,SAAS;CACrE,MAAM,YAAY,eAAe,MAAM,aAAa,KAAK;CACzD,MAAM,eAAe,eAAe,MAAM,UAAU,QAAQ,MAAM,WAAW,EAAE;CAC/E,MAAM,aAAa,eAAe,QAAQ,MAAM,WAAW,MAAM,OAAO,CAAC;CACzE,MAAM,eAAe,eAAe,QAAQ,MAAM,UAAU,CAAC;CAC7D,MAAM,aAAa,eAAe,QAAQ,MAAM,YAAY,CAAC,WAAW,KAAK,CAAC;CAC9E,MAAM,sBAAsB,eAAe,CAAC,WAAW,KAAK;CAC5D,MAAM,wBAAwB,eAAe,oBAAoB,SAAS,CAAC,aAAa,KAAK;CAE7F,MAAM,EAAE,QAAQ,MAAM,mBAAmB,eAAe;EACpD,YAAY,MAAM;EAClB,iBAAiB,MAAM,aAAa;EACpC,gBAAgB,WAAW;EAC3B,cAAc;CAClB,CAAC;CAED,MAAM,YAAY,eAAe,OAAO,SAAS,CAAC,WAAW,KAAK;CAElE,MAAM,YAAY,eACd,IAAI,cAAc;GACb,aAAa,UAAU,UAAU;GACjC,SAAS,MAAM,UAAU,uBAAuB,MAAM,KAAK;EAC5D,OAAO,MAAM;EACb,QAAQ,aAAa;EACrB,MAAM,UAAU;EAChB,UAAU,MAAM;CACpB,CAAC,CACL;CAEA,MAAM,eAAe,gBAAqC,EACtD,oBAAoB,sBAAsB,QAAQ,UAAU,QAAQ,KAAA,EACxE,EAAE;CAEF,MAAM,cAAc,eAAgB,aAAa,QAAQ,KAAA,IAAY,SAAU;CAC/E,MAAM,oBAAoB,eAAgB,aAAa,QAAQ,SAAS,KAAA,CAAU;CAElF,MAAM,eAAe,eAA0C;EAC3D,MAAM,QAAuB;GACzB,GAAG,mBAAmB,MAAM,MAAM;GAClC,GAAG,yBAAyB,MAAM,KAAK;EAC3C;EAEA,IAAI,CAAC,aAAa,SAAS,CAAC,eAAe,OACvC,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,IAAI,QAAQ,KAAA;EAGnD,OAAO;GACH,GAAG;GACH,0BAA0B,GAAG,eAAe,MAAM,EAAE;GACpD,0BAA0B,GAAG,eAAe,MAAM,EAAE;EACxD;CACJ,CAAC;CAED,SAAS,cAAc;EACnB,KAAK;CACT;CAEA,SAAS,eAAe;EACpB,eAAe;CACnB;CAEA,SAAS,UAAU,OAAsB;EACrC,IAAI,MAAM,QAAQ,UAAU,aAAa;CAC7C;CAEA,SAAS,aAAa;EAClB,OAAO,MAAM,MAAM,MAAM,IAAI,MAAM,OAAO,QAAQ,MAAM;CAC5D;CAEA,SAAS,gBAAgB;EACrB,MAAM,SAAS,WAAW;EAC1B,IAAI,CAAC,QAAQ,OAAO;EAEpB,IAAI,OAAO,WAAW,UAAU;GAC5B,IAAI,OAAO,aAAa,aAAa,OAAO;GAE5C,IAAI;IACA,MAAM,UAAU,SAAS,cAAc,MAAM;IAC7C,OAAO,cAAc,OAAO,IAAI,UAAU;GAC9C,QAAQ;IACJ,OAAO;GACX;EACJ;EAEA,OAAO,cAAc,MAAM,IAAI,SAAS;CAC5C;CAEA,SAAS,2BAA2B;EAChC,IAAI,CAAC,iBAAiB;EAEtB,IAAI,2BACA,gBAAgB,aAAa,oBAAoB,yBAAyB;OAE1E,gBAAgB,gBAAgB,kBAAkB;EAGtD,kBAAkB;EAClB,4BAA4B;CAChC;CAEA,SAAS,wBAAwB;EAC7B,yBAAyB;EAEzB,IAAI,CAAC,aAAa,SAAS,CAAC,sBAAsB,SAAS,CAAC,cAAc,OAAO;EAEjF,kBAAkB,cAAc;EAChC,4BAA4B,gBAAgB,aAAa,kBAAkB;EAE3E,MAAM,OAAO,6BAA6B,GAAA,CAAI,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO;EACzE,IAAI,CAAC,IAAI,SAAS,UAAU,KAAK,GAAG,IAAI,KAAK,UAAU,KAAK;EAC5D,gBAAgB,aAAa,oBAAoB,IAAI,KAAK,GAAG,CAAC;CAClE;CAEA,SAAS,uBAAuB;EAC5B,IAAI,CAAC,aAAa,SAAS,CAAC,cAAc,OAAO;GAC7C,eAAe,QAAQ;GACvB;EACJ;EAEA,eAAe,QAAQ,kBACnB,cAAc,MAAM,sBAAsB,GAC1C,UAAU,KACd;CACJ;CAEA,SAAS,eAAe;EACpB,qBAAqB;EACrB,YAAY;CAChB;CAEA,SAAS,oBAAoB,SAAsB;EAC/C,wBAAwB;EAExB,QAAQ,iBAAiB,cAAc,YAAY;EACnD,QAAQ,iBAAiB,cAAc,YAAY;EACnD,QAAQ,iBAAiB,WAAW,YAAY;EAChD,QAAQ,iBAAiB,YAAY,YAAY;EACjD,QAAQ,iBAAiB,WAAW,SAAS;EAE7C,8BAA8B;GAC1B,QAAQ,oBAAoB,cAAc,YAAY;GACtD,QAAQ,oBAAoB,cAAc,YAAY;GACtD,QAAQ,oBAAoB,WAAW,YAAY;GACnD,QAAQ,oBAAoB,YAAY,YAAY;GACpD,QAAQ,oBAAoB,WAAW,SAAS;GAChD,wBAAwB,KAAA;EAC5B;CACJ;CAEA,SAAS,0BAA0B;EAC/B,0BAA0B;EAC1B,0BAA0B,KAAA;CAC9B;CAEA,SAAS,wBAAwB;EAC7B,IAAI,OAAO,WAAW,eAAe,yBAAyB;EAE9D,OAAO,iBAAiB,UAAU,oBAAoB;EACtD,OAAO,iBAAiB,UAAU,sBAAsB,IAAI;EAE5D,gCAAgC;GAC5B,OAAO,oBAAoB,UAAU,oBAAoB;GACzD,OAAO,oBAAoB,UAAU,sBAAsB,IAAI;EACnE;CACJ;CAEA,SAAS,aAAa;EAClB,IAAI,CAAC,aAAa,OAAO;GACrB,wBAAwB;GACxB,wBAAwB;GACxB,yBAAyB;GACzB,cAAc,QAAQ;GACtB,eAAe,QAAQ;GACvB;EACJ;EAEA,MAAM,aAAa,cAAc;EACjC,IAAI,cAAc,UAAU,YAAY;GACpC,sBAAsB;GACtB,qBAAqB;GACrB;EACJ;EAEA,wBAAwB;EACxB,wBAAwB;EACxB,yBAAyB;EACzB,cAAc,QAAQ;EAEtB,IAAI,CAAC,YAAY;GACb,eAAe,QAAQ;GACvB;EACJ;EAEA,oBAAoB,UAAU;EAC9B,sBAAsB;EACtB,qBAAqB;CACzB;CAEA,MAAM,aAAa,aAAa;EAC5B,IAAI,UAAU,aAAa;CAC/B,CAAC;CAED,YACU,WAAW,SACX;EACF,IAAI,WAAW,WAAW;CAC9B,GACA,EAAE,OAAO,OAAO,CACpB;CAEA,MAAM;EAAC;EAAc;EAAuB;CAAS,SAAS;EAC1D,IAAI,WAAW,sBAAsB;CACzC,CAAC;CAED,MAAM,CAAC,WAAW,SAAS,SAAS;EAChC,IAAI,aAAa,UAAU,OAAO,qBAAqB;CAC3D,CAAC;CAED,MAAM,YAAY,YAAY;EAC1B,IAAI,CAAC,aAAa,CAAC,aAAa,OAAO;EAEvC,IAAI,SAAS;GACT,qBAAqB;GACrB,sBAAsB;EAC1B,OACI,wBAAwB;CAEhC,CAAC;CAED,gBAAgB;EACZ,YAAY;EACZ,WAAW;CACf,CAAC;CAED,sBAAsB;EAClB,YAAY;EACZ,wBAAwB;EACxB,wBAAwB;EACxB,yBAAyB;CAC7B,CAAC;CAED,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECrTA,MAAM,QAAQ;EAUd,MAAM,OAAO;EAIb,MAAM,EACF,WACA,WACA,cACA,qBACA,WACA,cACA,aACA,mBACA,cACA,aACA,cACA,cACA,WAAW,QAAQ,SAAS;GAC5B,KAAK,eAAe,IAAI;EAC5B,CAAC;;mCA5De,MAAA,SAAA,CAAS,CAAA;;kBAOJ,MAAA,YAAA,SAAY;kCAAG,oBAAe,MAAA,YAAA,EAAY,GAAA,MAAA,CAAA;;;;GAE3C,MAAK;GAAjB,WAYa;;yBAVC,MAAA,mBAAA,SAAmB;;;iBAExB,MAAI,MAAA,SAAA,CAAS;iBAEb,QAAM,MAAA,WAAA,CAAW;iBACjB,eAAa,MAAA,iBAAA,CAAiB;kBACvB,MAAA,YAAA,CAAY;;;eAEd,WAAc,YAAA;;oDAAI,QAAA,OAAO,CAAA,CAAA;;;yBAPvB,MAAA,SAAA,CAAS;;;;UAXxB,eAAU,MAAE,MAAA,WAAA,CAAW,CAAA,CAAA,CAAA;UACvB,eAAU,MAAE,MAAA,YAAA,CAAY,CAAA,CAAA,CAAA;yCACf,MAAA,WAAA,CAAW,CAAA,CAAA,CAAA;0CACV,MAAA,YAAA,CAAY,CAAA,CAAA,CAAA;yCACb,MAAA,SAAA,CAAS,CAAA,CAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useButtonColor.js","names":[],"sources":["../src/components/button/useButtonColor.ts"],"sourcesContent":["import type { CSSProperties } from 'vue';\nimport { getComponentCustomColor } from '@/utils/componentColors';\nimport type { ButtonColor } from './types';\n\nexport function getButtonColorStyle(color: ButtonColor | undefined) {\n const customColor = getComponentCustomColor(color);\n if (!customColor) return undefined;\n\n return {\n '--_rp-button-custom-color': customColor,\n '--_rp-button-custom-hover': `color-mix(in srgb, ${customColor} 90%, #111111)`,\n '--_rp-button-custom-active': `color-mix(in srgb, ${customColor} 80%, #111111)`,\n '--_rp-button-custom-on': 'var(--rp-color-on-primary)',\n '--_rp-button-custom-subtle-bg': `color-mix(in srgb, ${customColor} 12%, transparent)`,\n '--_rp-button-custom-subtle-bg-hover': `color-mix(in srgb, ${customColor} 18%, transparent)`,\n '--_rp-button-custom-subtle-bg-active': `color-mix(in srgb, ${customColor} 24%, transparent)`,\n '--_rp-button-custom-border': `color-mix(in srgb, ${customColor} 45%, transparent)`,\n '--_rp-button-custom-border-hover': `color-mix(in srgb, ${customColor} 62%, transparent)`,\n '--_rp-button-custom-fg': customColor,\n } satisfies CSSProperties;\n}\n"],"mappings":";;;;;;;;;;;;;AAIA,SAAgB,oBAAoB,OAAgC;CAChE,MAAM,cAAc,wBAAwB,KAAK;CACjD,IAAI,CAAC,aAAa,OAAO,KAAA;CAEzB,OAAO;EACH,6BAA6B;EAC7B,6BAA6B,sBAAsB,YAAY;EAC/D,8BAA8B,sBAAsB,YAAY;EAChE,0BAA0B;EAC1B,iCAAiC,sBAAsB,YAAY;EACnE,uCAAuC,sBAAsB,YAAY;EACzE,wCAAwC,sBAAsB,YAAY;EAC1E,8BAA8B,sBAAsB,YAAY;EAChE,oCAAoC,sBAAsB,YAAY;EACtE,0BAA0B;CAC9B;AACJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useClickOutside.js","names":[],"sources":["../src/composables/useClickOutside.ts"],"sourcesContent":["import { watch, onMounted, onBeforeUnmount, type Ref } from 'vue';\n\nexport function useClickOutside(\n target: Ref<HTMLElement | null>,\n active: Readonly<Ref<boolean>>,\n callback: () => void,\n) {\n let isListening = false;\n let stopWatch: (() => void) | undefined;\n\n function handler(e: MouseEvent) {\n if (target.value && !target.value.contains(e.target as Node)) {\n callback();\n }\n }\n\n function setListening(value: boolean) {\n if (typeof document === 'undefined' || value === isListening) return;\n isListening = value;\n\n if (value) {\n document.addEventListener('click', handler, true);\n } else {\n document.removeEventListener('click', handler, true);\n }\n }\n\n onMounted(() => {\n stopWatch = watch(active, setListening, { immediate: true });\n });\n\n onBeforeUnmount(() => {\n stopWatch?.();\n setListening(false);\n });\n}\n"],"mappings":";;AAEA,SAAgB,gBACZ,QACA,QACA,UACF;CACE,IAAI,cAAc;CAClB,IAAI;CAEJ,SAAS,QAAQ,GAAe;EAC5B,IAAI,OAAO,SAAS,CAAC,OAAO,MAAM,SAAS,EAAE,MAAc,GACvD,SAAS;CAEjB;CAEA,SAAS,aAAa,OAAgB;EAClC,IAAI,OAAO,aAAa,eAAe,UAAU,aAAa;EAC9D,cAAc;EAEd,IAAI,OACA,SAAS,iBAAiB,SAAS,SAAS,IAAI;OAEhD,SAAS,oBAAoB,SAAS,SAAS,IAAI;CAE3D;CAEA,gBAAgB;EACZ,YAAY,MAAM,QAAQ,cAAc,EAAE,WAAW,KAAK,CAAC;CAC/D,CAAC;CAED,sBAAsB;EAClB,YAAY;EACZ,aAAa,KAAK;CACtB,CAAC;AACL"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCollapse.js","names":[],"sources":["../src/components/collapse/useCollapse.ts"],"sourcesContent":["import { computed, ref, toValue, useId } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type {\n CollapseContentProps,\n CollapseContentRole,\n CollapseOption,\n CollapseRootProps,\n CollapseSlotProps,\n CollapseState,\n CollapseTriggerProps,\n CollapseTriggerSlotProps,\n UseCollapseOptions,\n UseCollapseReturn,\n} from './types';\n\nconst DEFAULT_ROLE: CollapseContentRole = 'region';\n\nfunction optionValue<T>(value: CollapseOption<T | undefined> | undefined) {\n return toValue(value);\n}\n\nexport function useCollapse(\n options: Readonly<UseCollapseOptions> = {},\n emitOpenChange?: (open: boolean) => void,\n): UseCollapseReturn {\n const generatedId = useId();\n const uncontrolledOpen = ref(Boolean(optionValue<boolean>(options.defaultOpen)));\n\n const id = computed(() => optionValue<string>(options.id) ?? `${generatedId}-collapse`);\n const controlledOpen = computed(() => optionValue<boolean>(options.open));\n const isDisabled = computed(() => Boolean(optionValue<boolean>(options.disabled)));\n const isOpen = computed(() => Boolean(controlledOpen.value ?? uncontrolledOpen.value));\n const state = computed<CollapseState>(() => (isOpen.value ? 'open' : 'closed'));\n const shouldRenderContent = computed(\n () => !optionValue<boolean>(options.unmountOnExit) || isOpen.value,\n );\n\n const rootClass = computed(() =>\n bem('rp-collapse', {\n open: isOpen.value,\n closed: !isOpen.value,\n disabled: isDisabled.value,\n }),\n );\n\n const rootProps = computed<CollapseRootProps>(() => ({\n class: rootClass.value,\n 'data-state': state.value,\n 'data-disabled': isDisabled.value || undefined,\n }));\n\n const contentSlotProps = computed<CollapseSlotProps>(() => ({\n isOpen: isOpen.value,\n open,\n close,\n toggle,\n }));\n\n const triggerProps = computed<CollapseTriggerProps>(() => ({\n type: 'button',\n disabled: isDisabled.value || undefined,\n 'aria-controls': id.value,\n 'aria-expanded': isOpen.value,\n 'aria-disabled': isDisabled.value || undefined,\n onClick: onTriggerClick,\n }));\n\n const contentProps = computed<CollapseContentProps>(() => ({\n class: 'rp-collapse__content',\n id: id.value,\n role: optionValue<CollapseContentRole>(options.role) ?? DEFAULT_ROLE,\n 'data-state': state.value,\n 'aria-hidden': isOpen.value ? undefined : 'true',\n 'aria-label': optionValue<string>(options.ariaLabel) || undefined,\n 'aria-labelledby': optionValue<string>(options.ariaLabelledby) || undefined,\n 'aria-describedby': optionValue<string>(options.ariaDescribedby) || undefined,\n }));\n\n const triggerSlotProps = computed<CollapseTriggerSlotProps>(() => ({\n triggerProps: triggerProps.value,\n ...contentSlotProps.value,\n }));\n\n function setOpen(nextOpen: boolean) {\n if (isDisabled.value || nextOpen === isOpen.value) return;\n\n if (controlledOpen.value === undefined) uncontrolledOpen.value = nextOpen;\n options.onOpenChange?.(nextOpen);\n emitOpenChange?.(nextOpen);\n }\n\n function open() {\n setOpen(true);\n }\n\n function close() {\n setOpen(false);\n }\n\n function toggle() {\n setOpen(!isOpen.value);\n }\n\n function onTriggerClick() {\n toggle();\n }\n\n return {\n id,\n state,\n isDisabled,\n isOpen,\n shouldRenderContent,\n rootClass,\n rootProps,\n triggerProps,\n contentProps,\n triggerSlotProps,\n contentSlotProps,\n setOpen,\n open,\n close,\n toggle,\n };\n}\n"],"mappings":";;;AAeA,IAAM,eAAoC;AAE1C,SAAS,YAAe,OAAkD;CACtE,OAAO,QAAQ,KAAK;AACxB;AAEA,SAAgB,YACZ,UAAwC,CAAC,GACzC,gBACiB;CACjB,MAAM,cAAc,MAAM;CAC1B,MAAM,mBAAmB,IAAI,QAAQ,YAAqB,QAAQ,WAAW,CAAC,CAAC;CAE/E,MAAM,KAAK,eAAe,YAAoB,QAAQ,EAAE,KAAK,GAAG,YAAY,UAAU;CACtF,MAAM,iBAAiB,eAAe,YAAqB,QAAQ,IAAI,CAAC;CACxE,MAAM,aAAa,eAAe,QAAQ,YAAqB,QAAQ,QAAQ,CAAC,CAAC;CACjF,MAAM,SAAS,eAAe,QAAQ,eAAe,SAAS,iBAAiB,KAAK,CAAC;CACrF,MAAM,QAAQ,eAA+B,OAAO,QAAQ,SAAS,QAAS;CAC9E,MAAM,sBAAsB,eAClB,CAAC,YAAqB,QAAQ,aAAa,KAAK,OAAO,KACjE;CAEA,MAAM,YAAY,eACd,IAAI,eAAe;EACf,MAAM,OAAO;EACb,QAAQ,CAAC,OAAO;EAChB,UAAU,WAAW;CACzB,CAAC,CACL;CAEA,MAAM,YAAY,gBAAmC;EACjD,OAAO,UAAU;EACjB,cAAc,MAAM;EACpB,iBAAiB,WAAW,SAAS,KAAA;CACzC,EAAE;CAEF,MAAM,mBAAmB,gBAAmC;EACxD,QAAQ,OAAO;EACf;EACA;EACA;CACJ,EAAE;CAEF,MAAM,eAAe,gBAAsC;EACvD,MAAM;EACN,UAAU,WAAW,SAAS,KAAA;EAC9B,iBAAiB,GAAG;EACpB,iBAAiB,OAAO;EACxB,iBAAiB,WAAW,SAAS,KAAA;EACrC,SAAS;CACb,EAAE;CAEF,MAAM,eAAe,gBAAsC;EACvD,OAAO;EACP,IAAI,GAAG;EACP,MAAM,YAAiC,QAAQ,IAAI,KAAK;EACxD,cAAc,MAAM;EACpB,eAAe,OAAO,QAAQ,KAAA,IAAY;EAC1C,cAAc,YAAoB,QAAQ,SAAS,KAAK,KAAA;EACxD,mBAAmB,YAAoB,QAAQ,cAAc,KAAK,KAAA;EAClE,oBAAoB,YAAoB,QAAQ,eAAe,KAAK,KAAA;CACxE,EAAE;CAEF,MAAM,mBAAmB,gBAA0C;EAC/D,cAAc,aAAa;EAC3B,GAAG,iBAAiB;CACxB,EAAE;CAEF,SAAS,QAAQ,UAAmB;EAChC,IAAI,WAAW,SAAS,aAAa,OAAO,OAAO;EAEnD,IAAI,eAAe,UAAU,KAAA,GAAW,iBAAiB,QAAQ;EACjE,QAAQ,eAAe,QAAQ;EAC/B,iBAAiB,QAAQ;CAC7B;CAEA,SAAS,OAAO;EACZ,QAAQ,IAAI;CAChB;CAEA,SAAS,QAAQ;EACb,QAAQ,KAAK;CACjB;CAEA,SAAS,SAAS;EACd,QAAQ,CAAC,OAAO,KAAK;CACzB;CAEA,SAAS,iBAAiB;EACtB,OAAO;CACX;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useControlState.js","names":[],"sources":["../src/composables/useControlState.ts"],"sourcesContent":["import { computed } from 'vue';\n\nexport interface ControlStateOptions {\n id?: string;\n disabled?: boolean;\n required?: boolean;\n invalid?: boolean;\n valid?: boolean;\n describedby?: string;\n labelledby?: string;\n}\n\nexport interface ControlState {\n id: string | undefined;\n disabled: boolean;\n required: boolean;\n invalid: boolean;\n valid: boolean;\n ariaDescribedby: string | undefined;\n ariaLabelledby: string | undefined;\n}\n\nfunction mergeIds(...values: Array<string | undefined>): string | undefined {\n const ids = values.flatMap((value) => value?.split(/\\s+/) ?? []).filter(Boolean);\n return ids.length > 0 ? Array.from(new Set(ids)).join(' ') : undefined;\n}\n\nexport function useControlState(options: ControlStateOptions = {}): ControlState {\n const id = computed(() => options.id);\n const disabled = computed(() => options.disabled ?? false);\n const required = computed(() => options.required ?? false);\n const invalid = computed(() => options.invalid ?? false);\n const valid = computed(() => options.valid ?? false);\n\n const ariaDescribedby = computed(() => mergeIds(options.describedby));\n const ariaLabelledby = computed(() => mergeIds(options.labelledby));\n\n return {\n get id() {\n return id.value;\n },\n get disabled() {\n return disabled.value;\n },\n get required() {\n return required.value;\n },\n get invalid() {\n return invalid.value;\n },\n get valid() {\n return valid.value;\n },\n get ariaDescribedby() {\n return ariaDescribedby.value;\n },\n get ariaLabelledby() {\n return ariaLabelledby.value;\n },\n };\n}\n"],"mappings":";;AAsBA,SAAS,SAAS,GAAG,QAAuD;CACxE,MAAM,MAAM,OAAO,SAAS,UAAU,OAAO,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,OAAO;CAC/E,OAAO,IAAI,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAA;AACjE;AAEA,SAAgB,gBAAgB,UAA+B,CAAC,GAAiB;CAC7E,MAAM,KAAK,eAAe,QAAQ,EAAE;CACpC,MAAM,WAAW,eAAe,QAAQ,YAAY,KAAK;CACzD,MAAM,WAAW,eAAe,QAAQ,YAAY,KAAK;CACzD,MAAM,UAAU,eAAe,QAAQ,WAAW,KAAK;CACvD,MAAM,QAAQ,eAAe,QAAQ,SAAS,KAAK;CAEnD,MAAM,kBAAkB,eAAe,SAAS,QAAQ,WAAW,CAAC;CACpE,MAAM,iBAAiB,eAAe,SAAS,QAAQ,UAAU,CAAC;CAElE,OAAO;EACH,IAAI,KAAK;GACL,OAAO,GAAG;EACd;EACA,IAAI,WAAW;GACX,OAAO,SAAS;EACpB;EACA,IAAI,WAAW;GACX,OAAO,SAAS;EACpB;EACA,IAAI,UAAU;GACV,OAAO,QAAQ;EACnB;EACA,IAAI,QAAQ;GACR,OAAO,MAAM;EACjB;EACA,IAAI,kBAAkB;GAClB,OAAO,gBAAgB;EAC3B;EACA,IAAI,iBAAiB;GACjB,OAAO,eAAe;EAC1B;CACJ;AACJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useRequiredInject.js","names":[],"sources":["../src/composables/useRequiredInject.ts"],"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"],"mappings":";;AAEA,SAAgB,kBAAqB,KAAsB,eAA0B;CACjF,MAAM,QAAQ,OAAO,GAAG;CACxB,IAAI,SAAS,MACT,MAAM,IAAI,MACN,YAAY,cAAc,qDAC9B;CAEJ,OAAO;AACX"}
package/dist/x.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"x.js","names":[],"sources":[],"mappings":""}