ropav 0.0.7 → 0.0.9

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 (191) hide show
  1. package/dist/accordion.css +10 -10
  2. package/dist/accordion.js +2 -4
  3. package/dist/alert.css +109 -0
  4. package/dist/alert.js +168 -0
  5. package/dist/aspect-ratio.css +17 -0
  6. package/dist/aspect-ratio.js +26 -0
  7. package/dist/avatar.css +97 -0
  8. package/dist/avatar.js +161 -0
  9. package/dist/badge.css +40 -115
  10. package/dist/badge.js +19 -18
  11. package/dist/base.css +609 -180
  12. package/dist/bem.js +0 -2
  13. package/dist/button-group.js +0 -2
  14. package/dist/button-link.css +161 -0
  15. package/dist/button-link.js +108 -0
  16. package/dist/button.css +50 -229
  17. package/dist/button.js +7 -11
  18. package/dist/card.css +50 -30
  19. package/dist/card.js +69 -38
  20. package/dist/check.js +12 -0
  21. package/dist/checkbox.css +16 -57
  22. package/dist/checkbox.js +14 -33
  23. package/dist/collapse.css +8 -8
  24. package/dist/collapse.js +4 -10
  25. package/dist/color-input.css +108 -0
  26. package/dist/color-input.js +344 -0
  27. package/dist/color-picker.css +304 -0
  28. package/dist/color-picker.js +717 -0
  29. package/dist/color-picker2.js +18 -0
  30. package/dist/color-swatch.css +50 -0
  31. package/dist/color-swatch.js +73 -0
  32. package/dist/color.js +190 -0
  33. package/dist/componentColors.js +206 -15
  34. package/dist/components/alert/alert.d.ts +30 -0
  35. package/dist/components/alert/index.d.ts +3 -0
  36. package/dist/components/alert/index.js +2 -0
  37. package/dist/components/alert/types.d.ts +20 -0
  38. package/dist/components/alert/useAlertColor.d.ts +3 -0
  39. package/dist/components/aspect-ratio/aspect-ratio.d.ts +21 -0
  40. package/dist/components/aspect-ratio/index.d.ts +2 -0
  41. package/dist/components/aspect-ratio/index.js +2 -0
  42. package/dist/components/aspect-ratio/types.d.ts +3 -0
  43. package/dist/components/avatar/avatar.d.ts +24 -0
  44. package/dist/components/avatar/index.d.ts +3 -0
  45. package/dist/components/avatar/index.js +2 -0
  46. package/dist/components/avatar/types.d.ts +20 -0
  47. package/dist/components/avatar/useAvatarColor.d.ts +3 -0
  48. package/dist/components/badge/types.d.ts +2 -1
  49. package/dist/components/badge/useBadgeColor.d.ts +3 -8
  50. package/dist/components/button/types.d.ts +1 -0
  51. package/dist/components/button/useButtonColor.d.ts +3 -13
  52. package/dist/components/button-link/button-link.d.ts +27 -0
  53. package/dist/components/button-link/index.d.ts +2 -0
  54. package/dist/components/button-link/index.js +2 -0
  55. package/dist/components/button-link/types.d.ts +20 -0
  56. package/dist/components/card/card.d.ts +4 -0
  57. package/dist/components/card/types.d.ts +4 -0
  58. package/dist/components/checkbox/types.d.ts +1 -0
  59. package/dist/components/checkbox/useCheckbox.d.ts +2 -4
  60. package/dist/components/collapse/types.d.ts +0 -2
  61. package/dist/components/color-input/color-input.d.ts +29 -0
  62. package/dist/components/color-input/index.d.ts +2 -0
  63. package/dist/components/color-input/index.js +2 -0
  64. package/dist/components/color-input/types.d.ts +34 -0
  65. package/dist/components/color-input/useColorInput.d.ts +27 -0
  66. package/dist/components/color-input/useColorInputEyeDropper.d.ts +13 -0
  67. package/dist/components/color-input/useColorInputPopover.d.ts +11 -0
  68. package/dist/components/color-input/useColorInputValue.d.ts +8 -0
  69. package/dist/components/color-picker/color-picker-saturation.d.ts +21 -0
  70. package/dist/components/color-picker/color-picker-slider.d.ts +21 -0
  71. package/dist/components/color-picker/color-picker-utils.d.ts +23 -0
  72. package/dist/components/color-picker/color-picker.d.ts +23 -0
  73. package/dist/components/color-picker/index.d.ts +3 -0
  74. package/dist/components/color-picker/index.js +3 -0
  75. package/dist/components/color-picker/types.d.ts +39 -0
  76. package/dist/components/color-picker/useColorPickerDrag.d.ts +11 -0
  77. package/dist/components/color-picker/useColorPickerSwatches.d.ts +21 -0
  78. package/dist/components/color-picker/useColorPickerValue.d.ts +15 -0
  79. package/dist/components/color-swatch/color-swatch.d.ts +21 -0
  80. package/dist/components/color-swatch/index.d.ts +2 -0
  81. package/dist/components/color-swatch/index.js +2 -0
  82. package/dist/components/color-swatch/types.d.ts +6 -0
  83. package/dist/components/color-swatch/useColorSwatchColor.d.ts +5 -0
  84. package/dist/components/dropdown-menu/dropdown-menu.d.ts +2 -2
  85. package/dist/components/dropdown-menu/useDropdownMenu.d.ts +1 -1
  86. package/dist/components/dropdown-menu/useDropdownMenuNavigation.d.ts +1 -1
  87. package/dist/components/dropdown-menu/useDropdownSubmenus.d.ts +1 -1
  88. package/dist/components/field/types.d.ts +0 -2
  89. package/dist/components/field/useField.d.ts +1 -2
  90. package/dist/components/icon-button/types.d.ts +1 -0
  91. package/dist/components/input/types.d.ts +3 -0
  92. package/dist/components/modal/types.d.ts +0 -1
  93. package/dist/components/number-input/index.d.ts +2 -0
  94. package/dist/components/number-input/index.js +2 -0
  95. package/dist/components/number-input/number-input.d.ts +29 -0
  96. package/dist/components/number-input/types.d.ts +34 -0
  97. package/dist/components/number-input/useNumberInput.d.ts +31 -0
  98. package/dist/components/popover/index.d.ts +1 -0
  99. package/dist/components/popover/index.js +2 -1
  100. package/dist/components/popover/types.d.ts +6 -2
  101. package/dist/components/popover/usePopover.d.ts +5 -2
  102. package/dist/components/progress/types.d.ts +1 -1
  103. package/dist/components/radio/types.d.ts +3 -0
  104. package/dist/components/radio/useRadio.d.ts +2 -4
  105. package/dist/components/select/index.d.ts +1 -1
  106. package/dist/components/select/types.d.ts +3 -0
  107. package/dist/components/slider/index.d.ts +2 -1
  108. package/dist/components/slider/index.js +2 -2
  109. package/dist/components/slider/range-slider.d.ts +45 -0
  110. package/dist/components/slider/types.d.ts +14 -2
  111. package/dist/components/slider/useRangeSlider.d.ts +59 -0
  112. package/dist/components/slider/useRangeSliderTooltipCollision.d.ts +7 -0
  113. package/dist/components/slider/useRangeSliderTooltipTransition.d.ts +4 -0
  114. package/dist/components/switch/useSwitch.d.ts +2 -3
  115. package/dist/components/tooltip/types.d.ts +1 -0
  116. package/dist/dropdown-menu.css +17 -17
  117. package/dist/dropdown-menu.js +0 -2
  118. package/dist/field.css +17 -17
  119. package/dist/field.js +56 -51
  120. package/dist/icon-button.css +57 -236
  121. package/dist/icon-button.js +5 -8
  122. package/dist/index.d.ts +8 -0
  123. package/dist/index.js +16 -4
  124. package/dist/input.css +40 -46
  125. package/dist/input.js +39 -23
  126. package/dist/minus.js +12 -0
  127. package/dist/modal.css +37 -37
  128. package/dist/modal.js +10 -16
  129. package/dist/number-input.css +86 -0
  130. package/dist/number-input.js +350 -0
  131. package/dist/overlay.css +5 -5
  132. package/dist/overlay.js +3 -5
  133. package/dist/popover.css +62 -29
  134. package/dist/popover.js +25 -12
  135. package/dist/popover2.js +17 -0
  136. package/dist/progress.css +9 -30
  137. package/dist/progress.js +3 -8
  138. package/dist/radio.css +34 -62
  139. package/dist/radio.js +28 -18
  140. package/dist/select.css +105 -61
  141. package/dist/select.js +12 -10
  142. package/dist/slider.css +508 -41
  143. package/dist/slider.js +1122 -50
  144. package/dist/switch.css +19 -44
  145. package/dist/switch.js +4 -7
  146. package/dist/tabs.css +36 -36
  147. package/dist/tabs.js +1 -3
  148. package/dist/textarea.css +33 -25
  149. package/dist/textarea.js +0 -2
  150. package/dist/tooltip.css +7 -35
  151. package/dist/tooltip.js +13 -10
  152. package/dist/useButtonColor.js +16 -16
  153. package/dist/useClickOutside.js +0 -2
  154. package/dist/useCollapse.js +1 -3
  155. package/dist/useControlState.js +0 -2
  156. package/dist/useRequiredInject.js +0 -2
  157. package/dist/x.js +0 -2
  158. package/package.json +43 -7
  159. package/src/styles/_mixins.scss +25 -41
  160. package/src/styles/_tokens.scss +615 -182
  161. package/src/styles/_variables.scss +177 -49
  162. package/dist/accordion.js.map +0 -1
  163. package/dist/badge.js.map +0 -1
  164. package/dist/bem.js.map +0 -1
  165. package/dist/button-group.js.map +0 -1
  166. package/dist/button.js.map +0 -1
  167. package/dist/card.js.map +0 -1
  168. package/dist/checkbox.js.map +0 -1
  169. package/dist/collapse.js.map +0 -1
  170. package/dist/componentColors.js.map +0 -1
  171. package/dist/dropdown-menu.js.map +0 -1
  172. package/dist/field.js.map +0 -1
  173. package/dist/icon-button.js.map +0 -1
  174. package/dist/input.js.map +0 -1
  175. package/dist/modal.js.map +0 -1
  176. package/dist/overlay.js.map +0 -1
  177. package/dist/popover.js.map +0 -1
  178. package/dist/progress.js.map +0 -1
  179. package/dist/radio.js.map +0 -1
  180. package/dist/select.js.map +0 -1
  181. package/dist/slider.js.map +0 -1
  182. package/dist/switch.js.map +0 -1
  183. package/dist/tabs.js.map +0 -1
  184. package/dist/textarea.js.map +0 -1
  185. package/dist/tooltip.js.map +0 -1
  186. package/dist/useButtonColor.js.map +0 -1
  187. package/dist/useClickOutside.js.map +0 -1
  188. package/dist/useCollapse.js.map +0 -1
  189. package/dist/useControlState.js.map +0 -1
  190. package/dist/useRequiredInject.js.map +0 -1
  191. package/dist/x.js.map +0 -1
package/dist/input.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"input.js","names":[],"sources":["../src/components/input/useInput.ts","../src/components/input/input.vue","../src/components/input/input.vue"],"sourcesContent":["import { computed, ref } from 'vue';\nimport { useControlState } from '@/composables/useControlState';\nimport { bem } from '@/utils/bem';\nimport type { InputProps } from './types';\n\nconst NATIVE_INPUT_SELECTOR = '.rp-input__native';\nconst INTERACTIVE_SELECTOR = [\n 'button',\n 'a[href]',\n `input:not(${NATIVE_INPUT_SELECTOR})`,\n 'select',\n 'textarea',\n '[contenteditable=\"true\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\nfunction isInteractiveElement(target: Element) {\n return Boolean(target.closest(INTERACTIVE_SELECTOR));\n}\n\nexport function useInput(props: Readonly<InputProps>, emitUpdate: (value: string) => void) {\n const inputRef = ref<HTMLInputElement | null>(null);\n const control = useControlState(props);\n\n const rootClass = computed(() =>\n bem('rp-input', {\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n disabled: control.disabled,\n invalid: control.invalid,\n valid: control.valid && !control.invalid,\n readonly: props.readonly,\n }),\n );\n\n function onInput(e: Event) {\n emitUpdate((e.target as HTMLInputElement).value);\n }\n\n function focusInput(e: MouseEvent) {\n if (control.disabled) return;\n\n const target = e.target;\n if (target instanceof Element && isInteractiveElement(target)) return;\n\n inputRef.value?.focus();\n }\n\n return {\n inputRef,\n control,\n rootClass,\n onInput,\n focusInput,\n };\n}\n","<template>\n <label :class=\"rootClass\" @mousedown=\"focusInput\">\n <span v-if=\"$slots.left\" class=\"rp-input__left\">\n <slot name=\"left\" />\n </span>\n <input\n :id=\"control.id\"\n ref=\"inputRef\"\n :name=\"name\"\n class=\"rp-input__native\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\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 <span v-if=\"$slots.right\" class=\"rp-input__right\">\n <slot name=\"right\" />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useInput } from './useInput';\nimport type { InputProps } from './types';\n\ndefineOptions({ name: 'RpInput' });\n\nconst props = withDefaults(defineProps<InputProps>(), {\n type: 'text',\n placeholder: '',\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 { inputRef, control, rootClass, onInput, focusInput } = useInput(props, (value) => {\n emit('update:modelValue', value);\n});\n\nvoid inputRef;\n</script>\n\n<style src=\"./input.scss\" lang=\"scss\" scoped></style>\n","<template>\n <label :class=\"rootClass\" @mousedown=\"focusInput\">\n <span v-if=\"$slots.left\" class=\"rp-input__left\">\n <slot name=\"left\" />\n </span>\n <input\n :id=\"control.id\"\n ref=\"inputRef\"\n :name=\"name\"\n class=\"rp-input__native\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\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 <span v-if=\"$slots.right\" class=\"rp-input__right\">\n <slot name=\"right\" />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useInput } from './useInput';\nimport type { InputProps } from './types';\n\ndefineOptions({ name: 'RpInput' });\n\nconst props = withDefaults(defineProps<InputProps>(), {\n type: 'text',\n placeholder: '',\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 { inputRef, control, rootClass, onInput, focusInput } = useInput(props, (value) => {\n emit('update:modelValue', value);\n});\n\nvoid inputRef;\n</script>\n\n<style src=\"./input.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;AAMA,IAAM,uBAAuB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;AACJ,CAAC,CAAC,KAAK,GAAG;AAEV,SAAS,qBAAqB,QAAiB;CAC3C,OAAO,QAAQ,OAAO,QAAQ,oBAAoB,CAAC;AACvD;AAEA,SAAgB,SAAS,OAA6B,YAAqC;CACvF,MAAM,WAAW,IAA6B,IAAI;CAClD,MAAM,UAAU,gBAAgB,KAAK;CAErC,MAAM,YAAY,eACd,IAAI,YAAY;GACX,QAAQ,MAAM,SAAS,QAAQ,MAAM,IAAI;GACzC,UAAU,MAAM,WAAW,QAAQ,MAAM,MAAM;EAChD,UAAU,QAAQ;EAClB,SAAS,QAAQ;EACjB,OAAO,QAAQ,SAAS,CAAC,QAAQ;EACjC,UAAU,MAAM;CACpB,CAAC,CACL;CAEA,SAAS,QAAQ,GAAU;EACvB,WAAY,EAAE,OAA4B,KAAK;CACnD;CAEA,SAAS,WAAW,GAAe;EAC/B,IAAI,QAAQ,UAAU;EAEtB,MAAM,SAAS,EAAE;EACjB,IAAI,kBAAkB,WAAW,qBAAqB,MAAM,GAAG;EAE/D,SAAS,OAAO,MAAM;CAC1B;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;CACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECpBA,MAAM,QAAQ;EAUd,MAAM,OAAO;EAIb,MAAM,EAAE,UAAU,SAAS,WAAW,SAAS,eAAe,SAAS,QAAQ,UAAU;GACrF,KAAK,qBAAqB,KAAK;EACnC,CAAC;;;;kCAlDkB,MAAA,SAAA,CAAS,CAAA;;iBACR,OAAM,YAAA;;;cACR,QAAW,MAAA,MAAA,CAAA;;;sCAkBT,MAAA,OAAA,CAAO,CAAA,CAAA,CAAA;;;;;eAfd,MAAI,SAAO,EAAA;eAEX,QAAM,QAAA,IAAI;eAEV,QAAM,QAAA,IAAI;gBACH,QAAA,UAAU;eACjB,eAAa,QAAA,WAAW;eACxB,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;;;iBAGrC,OAAM,aAAA;;;cACR,SAAY,MAAA,MAAA,CAAA;;;0CAvBY,MAAA,UAAA,CAAU,CAAA,CAAA,CAAA"}
package/dist/modal.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"modal.js","names":[],"sources":["../src/components/modal/useModal.ts","../src/components/modal/modal.vue","../src/components/modal/modal.vue"],"sourcesContent":["import {\n computed,\n isRef,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useSlots,\n useId,\n watch,\n type CSSProperties,\n} from 'vue';\nimport { bem } from '@/utils/bem';\nimport type {\n ModalInitialFocus,\n ModalPresetSize,\n ModalProps,\n ModalRole,\n ModalSize,\n ModalSlotProps,\n} from './types';\n\nlet bodyScrollLockCount = 0;\nlet previousBodyOverflow = '';\nconst activeModalStack: symbol[] = [];\n\ntype Cleanup = () => void;\n\nconst DEFAULT_ROLE: ModalRole = 'dialog';\nconst DEFAULT_SIZE: ModalSize = 'md';\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'textarea:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\nconst MODAL_PRESET_SIZES = new Set<ModalPresetSize>(['sm', 'md', 'lg', 'xl', 'full']);\n\nfunction isHTMLElement(value: unknown): value is HTMLElement {\n return typeof HTMLElement !== 'undefined' && value instanceof HTMLElement;\n}\n\nfunction isModalPresetSize(size: string): size is ModalPresetSize {\n return MODAL_PRESET_SIZES.has(size as ModalPresetSize);\n}\n\nfunction isFocusable(element: HTMLElement) {\n if (element.getAttribute('aria-hidden') === 'true') return false;\n if (element.hasAttribute('disabled')) return false;\n return element.tabIndex >= 0;\n}\n\nfunction getFocusableElements(panel: HTMLElement | null) {\n if (!panel) return [];\n return [...panel.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)].filter(isFocusable);\n}\n\nfunction focusElement(element: HTMLElement | null | undefined) {\n if (!element) return;\n\n try {\n element.focus({ preventScroll: true });\n } catch {\n element.focus();\n }\n}\n\nfunction lockBodyScroll(): Cleanup | undefined {\n if (typeof document === 'undefined') return undefined;\n\n if (bodyScrollLockCount === 0) {\n previousBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n bodyScrollLockCount += 1;\n\n return () => {\n bodyScrollLockCount = Math.max(0, bodyScrollLockCount - 1);\n if (bodyScrollLockCount === 0) document.body.style.overflow = previousBodyOverflow;\n };\n}\n\nfunction readInitialFocus(initialFocus: ModalInitialFocus | null | undefined) {\n return isRef(initialFocus) ? initialFocus.value : initialFocus;\n}\n\nfunction queryPanelElement(panel: HTMLElement, selector: string) {\n try {\n const element = panel.querySelector(selector);\n return isHTMLElement(element) ? element : null;\n } catch {\n return null;\n }\n}\n\nexport function useModal(props: Readonly<ModalProps>, emitOpenChange?: (open: boolean) => void) {\n const slots = useSlots();\n const generatedId = useId();\n const panelRef = ref<HTMLElement | null>(null);\n const uncontrolledOpen = ref(Boolean(props.defaultOpen));\n const modalToken = Symbol('modal');\n\n let isMounted = false;\n let isActiveModal = false;\n let previousActiveElement: HTMLElement | null = null;\n let removeDocumentListeners: Cleanup | undefined;\n let unlockScroll: Cleanup | undefined;\n\n const modalId = computed(() => props.id ?? `${generatedId}-modal`);\n const titleId = computed(() => `${modalId.value}-title`);\n const descriptionId = computed(() => `${modalId.value}-description`);\n const role = computed(() => props.role ?? DEFAULT_ROLE);\n const size = computed(() => props.size || DEFAULT_SIZE);\n const isPresetSize = computed(() => isModalPresetSize(size.value));\n const isOpen = computed(() => props.open ?? uncontrolledOpen.value);\n const shouldRender = computed(() => Boolean(props.keepMounted || isOpen.value));\n const hasCustomHeader = computed(() => Boolean(slots.header));\n const hasHeader = computed(() =>\n Boolean(hasCustomHeader.value || props.title || props.description),\n );\n const hasFooter = computed(() => Boolean(slots.footer));\n const showCloseButton = computed(() => props.showCloseButton);\n\n const headerId = computed(() =>\n hasCustomHeader.value && !props.ariaLabel ? titleId.value : undefined,\n );\n const ariaLabelledby = computed(() => {\n if (props.ariaLabel) return undefined;\n return hasCustomHeader.value || props.title ? titleId.value : undefined;\n });\n const ariaDescribedby = computed(() =>\n props.description && !hasCustomHeader.value ? descriptionId.value : undefined,\n );\n const ariaLabel = computed(() =>\n ariaLabelledby.value ? undefined : props.ariaLabel || undefined,\n );\n\n const rootClass = computed(() =>\n bem('rp-modal', {\n [`size-${size.value}`]: isPresetSize.value,\n 'size-custom': !isPresetSize.value,\n open: isOpen.value,\n }),\n );\n\n const rootStyle = computed<CSSProperties | undefined>(() => {\n if (isPresetSize.value) return undefined;\n\n return {\n '--_rp-modal-width': size.value,\n };\n });\n\n const stateClass = computed(() => ({\n 'rp-modal--closable': showCloseButton.value,\n 'rp-modal--headerless': !hasHeader.value,\n }));\n\n const slotProps = computed<ModalSlotProps>(() => ({\n isOpen: isOpen.value,\n open: openModal,\n close: closeModal,\n toggle: toggleModal,\n }));\n\n function setOpen(nextOpen: boolean) {\n if (nextOpen === isOpen.value) return;\n if (props.open === undefined) uncontrolledOpen.value = nextOpen;\n emitOpenChange?.(nextOpen);\n }\n\n function openModal() {\n setOpen(true);\n }\n\n function closeModal() {\n setOpen(false);\n }\n\n function toggleModal() {\n setOpen(!isOpen.value);\n }\n\n function resolveInitialFocus() {\n const initialFocus = readInitialFocus(props.initialFocus);\n const panel = panelRef.value;\n if (!initialFocus || !panel) return null;\n\n if (typeof initialFocus === 'string') {\n return queryPanelElement(panel, initialFocus);\n }\n\n return panel.contains(initialFocus) ? initialFocus : null;\n }\n\n function focusInitialElement() {\n const firstFocusable = getFocusableElements(panelRef.value)[0];\n focusElement(resolveInitialFocus() ?? firstFocusable ?? panelRef.value);\n }\n\n function addToStack() {\n if (!activeModalStack.includes(modalToken)) activeModalStack.push(modalToken);\n }\n\n function removeFromStack() {\n const index = activeModalStack.indexOf(modalToken);\n if (index !== -1) activeModalStack.splice(index, 1);\n }\n\n function isTopModal() {\n return activeModalStack[activeModalStack.length - 1] === modalToken;\n }\n\n function trapFocus(event: KeyboardEvent) {\n const panel = panelRef.value;\n if (!panel) return;\n\n const focusableElements = getFocusableElements(panel);\n if (focusableElements.length === 0) {\n event.preventDefault();\n focusElement(panel);\n return;\n }\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n const activeElement = document.activeElement;\n const isInsidePanel = activeElement instanceof Node && panel.contains(activeElement);\n\n if (!isInsidePanel) {\n event.preventDefault();\n focusElement(firstElement);\n return;\n }\n\n if (event.shiftKey && activeElement === firstElement) {\n event.preventDefault();\n focusElement(lastElement);\n return;\n }\n\n if (!event.shiftKey && activeElement === lastElement) {\n event.preventDefault();\n focusElement(firstElement);\n }\n }\n\n function onDocumentKeydown(event: KeyboardEvent) {\n if (!isOpen.value || !isTopModal()) return;\n\n if (event.key === 'Escape') {\n if (props.closeOnEscape === false) return;\n event.preventDefault();\n closeModal();\n return;\n }\n\n if (event.key === 'Tab') trapFocus(event);\n }\n\n function bindDocumentListeners() {\n if (typeof document === 'undefined' || removeDocumentListeners) return;\n\n document.addEventListener('keydown', onDocumentKeydown);\n\n removeDocumentListeners = () => {\n document.removeEventListener('keydown', onDocumentKeydown);\n removeDocumentListeners = undefined;\n };\n }\n\n function restoreFocus() {\n if (props.returnFocus === false) {\n previousActiveElement = null;\n return;\n }\n\n if (previousActiveElement?.isConnected) focusElement(previousActiveElement);\n previousActiveElement = null;\n }\n\n function activateModal() {\n if (isActiveModal) return;\n\n isActiveModal = true;\n addToStack();\n\n if (typeof document !== 'undefined') {\n const activeElement = document.activeElement;\n previousActiveElement = isHTMLElement(activeElement) ? activeElement : null;\n }\n\n bindDocumentListeners();\n if (props.preventScroll !== false) unlockScroll = lockBodyScroll();\n void nextTick(() => {\n if (isActiveModal) focusInitialElement();\n });\n }\n\n function deactivateModal() {\n if (!isActiveModal) return;\n\n isActiveModal = false;\n removeFromStack();\n removeDocumentListeners?.();\n unlockScroll?.();\n unlockScroll = undefined;\n restoreFocus();\n }\n\n function onOverlayClick(event: MouseEvent) {\n if (props.closeOnOverlayClick === false || event.target !== event.currentTarget) return;\n closeModal();\n }\n\n onMounted(() => {\n isMounted = true;\n if (isOpen.value) activateModal();\n });\n\n onBeforeUnmount(() => {\n deactivateModal();\n });\n\n watch(isOpen, (nextOpen) => {\n if (!isMounted) return;\n if (nextOpen) activateModal();\n else deactivateModal();\n });\n\n return {\n panelRef,\n modalId,\n titleId,\n descriptionId,\n role,\n isOpen,\n shouldRender,\n hasHeader,\n hasFooter,\n showCloseButton,\n headerId,\n ariaLabelledby,\n ariaDescribedby,\n ariaLabel,\n rootClass,\n rootStyle,\n stateClass,\n slotProps,\n openModal,\n closeModal,\n toggleModal,\n onOverlayClick,\n };\n}\n","<template>\n <Transition name=\"rp-modal\">\n <div\n v-if=\"shouldRender\"\n v-show=\"isOpen\"\n :class=\"[rootClass, stateClass]\"\n :style=\"rootStyle\"\n >\n <Overlay\n v-bind=\"overlayProps\"\n class=\"rp-modal__overlay\"\n :z-index=\"0\"\n interactive\n @click=\"onOverlayClick\"\n />\n\n <section\n :id=\"modalId\"\n ref=\"panelRef\"\n class=\"rp-modal__panel\"\n :role=\"role\"\n aria-modal=\"true\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"ariaLabelledby\"\n :aria-describedby=\"ariaDescribedby\"\n tabindex=\"-1\"\n >\n <div v-if=\"hasHeader\" class=\"rp-modal__header\" :id=\"headerId\">\n <slot name=\"header\" v-bind=\"slotProps\">\n <div class=\"rp-modal__heading\">\n <h2 v-if=\"title\" :id=\"titleId\" class=\"rp-modal__title\">\n {{ title }}\n </h2>\n <p v-if=\"description\" :id=\"descriptionId\" class=\"rp-modal__description\">\n {{ description }}\n </p>\n </div>\n </slot>\n </div>\n\n <IconButton\n v-if=\"showCloseButton\"\n class=\"rp-modal__close\"\n :ariaLabel=\"closeLabel\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"closeModal\"\n >\n <IconX />\n </IconButton>\n\n <div v-if=\"$slots.default\" class=\"rp-modal__body\">\n <slot v-bind=\"slotProps\" />\n </div>\n\n <div v-if=\"hasFooter\" class=\"rp-modal__footer\">\n <slot name=\"footer\" v-bind=\"slotProps\" />\n </div>\n </section>\n </div>\n </Transition>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport IconX from '~icons/lucide/x';\nimport IconButton from '../icon-button/icon-button.vue';\nimport Overlay from '../overlay/overlay.vue';\nimport { useModal } from './useModal';\nimport type { ModalProps } from './types';\n\ndefineOptions({ name: 'RpModal' });\n\nconst props = withDefaults(defineProps<ModalProps>(), {\n open: undefined,\n defaultOpen: false,\n title: '',\n description: '',\n ariaLabel: '',\n closeLabel: 'Close modal',\n role: 'dialog',\n size: 'md',\n initialFocus: null,\n closeOnOverlayClick: true,\n closeOnEscape: true,\n showCloseButton: true,\n overlayProps: () => ({}),\n preventScroll: true,\n returnFocus: true,\n keepMounted: false,\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n}>();\n\nconst {\n panelRef,\n modalId,\n titleId,\n descriptionId,\n role,\n isOpen,\n shouldRender,\n hasHeader,\n hasFooter,\n showCloseButton,\n headerId,\n ariaLabelledby,\n ariaDescribedby,\n ariaLabel,\n rootClass,\n rootStyle,\n stateClass,\n slotProps,\n closeModal,\n onOverlayClick,\n} = useModal(props, (open) => {\n emit('update:open', open);\n});\n\nvoid panelRef;\n</script>\n\n<style src=\"./modal.scss\" lang=\"scss\" scoped></style>\n","<template>\n <Transition name=\"rp-modal\">\n <div\n v-if=\"shouldRender\"\n v-show=\"isOpen\"\n :class=\"[rootClass, stateClass]\"\n :style=\"rootStyle\"\n >\n <Overlay\n v-bind=\"overlayProps\"\n class=\"rp-modal__overlay\"\n :z-index=\"0\"\n interactive\n @click=\"onOverlayClick\"\n />\n\n <section\n :id=\"modalId\"\n ref=\"panelRef\"\n class=\"rp-modal__panel\"\n :role=\"role\"\n aria-modal=\"true\"\n :aria-label=\"ariaLabel\"\n :aria-labelledby=\"ariaLabelledby\"\n :aria-describedby=\"ariaDescribedby\"\n tabindex=\"-1\"\n >\n <div v-if=\"hasHeader\" class=\"rp-modal__header\" :id=\"headerId\">\n <slot name=\"header\" v-bind=\"slotProps\">\n <div class=\"rp-modal__heading\">\n <h2 v-if=\"title\" :id=\"titleId\" class=\"rp-modal__title\">\n {{ title }}\n </h2>\n <p v-if=\"description\" :id=\"descriptionId\" class=\"rp-modal__description\">\n {{ description }}\n </p>\n </div>\n </slot>\n </div>\n\n <IconButton\n v-if=\"showCloseButton\"\n class=\"rp-modal__close\"\n :ariaLabel=\"closeLabel\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"closeModal\"\n >\n <IconX />\n </IconButton>\n\n <div v-if=\"$slots.default\" class=\"rp-modal__body\">\n <slot v-bind=\"slotProps\" />\n </div>\n\n <div v-if=\"hasFooter\" class=\"rp-modal__footer\">\n <slot name=\"footer\" v-bind=\"slotProps\" />\n </div>\n </section>\n </div>\n </Transition>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport IconX from '~icons/lucide/x';\nimport IconButton from '../icon-button/icon-button.vue';\nimport Overlay from '../overlay/overlay.vue';\nimport { useModal } from './useModal';\nimport type { ModalProps } from './types';\n\ndefineOptions({ name: 'RpModal' });\n\nconst props = withDefaults(defineProps<ModalProps>(), {\n open: undefined,\n defaultOpen: false,\n title: '',\n description: '',\n ariaLabel: '',\n closeLabel: 'Close modal',\n role: 'dialog',\n size: 'md',\n initialFocus: null,\n closeOnOverlayClick: true,\n closeOnEscape: true,\n showCloseButton: true,\n overlayProps: () => ({}),\n preventScroll: true,\n returnFocus: true,\n keepMounted: false,\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n}>();\n\nconst {\n panelRef,\n modalId,\n titleId,\n descriptionId,\n role,\n isOpen,\n shouldRender,\n hasHeader,\n hasFooter,\n showCloseButton,\n headerId,\n ariaLabelledby,\n ariaDescribedby,\n ariaLabel,\n rootClass,\n rootStyle,\n stateClass,\n slotProps,\n closeModal,\n onOverlayClick,\n} = useModal(props, (open) => {\n emit('update:open', open);\n});\n\nvoid panelRef;\n</script>\n\n<style src=\"./modal.scss\" lang=\"scss\" scoped></style>\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlay.js","names":[],"sources":["../src/components/overlay/useOverlay.ts","../src/components/overlay/overlay.vue","../src/components/overlay/overlay.vue"],"sourcesContent":["import { computed, type CSSProperties } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type { OverlayProps } from './types';\n\nfunction getBlurValue(blur: OverlayProps['blur']) {\n if (blur == null || blur === '') return undefined;\n\n if (typeof blur === 'number') {\n if (!Number.isFinite(blur) || blur < 0) return undefined;\n\n return `${blur}px`;\n }\n\n return blur;\n}\n\nexport function useOverlay(props: Readonly<OverlayProps>) {\n const isRendered = computed(() => !props.disabled);\n const hasGradient = computed(() => Boolean(props.gradient));\n\n const normalizedOpacity = computed(() => {\n const opacity = props.opacity;\n if (opacity === undefined || !Number.isFinite(opacity)) return 1;\n\n return Math.min(1, Math.max(0, opacity));\n });\n\n const blurValue = computed(() => getBlurValue(props.blur));\n const hasBlur = computed(() => Boolean(blurValue.value));\n\n const rootClass = computed(() =>\n bem('rp-overlay', {\n gradient: hasGradient.value,\n blurred: hasBlur.value,\n interactive: props.interactive,\n }),\n );\n\n const rootStyle = computed<CSSProperties>(() => {\n const style: CSSProperties = {\n '--_rp-overlay-z-index': props.zIndex,\n };\n\n if (blurValue.value) {\n style['--_rp-overlay-blur'] = blurValue.value;\n }\n\n if (hasGradient.value) {\n return {\n ...style,\n backgroundImage: props.gradient,\n };\n }\n\n return {\n ...style,\n '--_rp-overlay-color': props.color,\n '--_rp-overlay-opacity': normalizedOpacity.value,\n };\n });\n\n return {\n isRendered,\n rootClass,\n rootStyle,\n };\n}\n","<template>\n <div v-if=\"isRendered\" :class=\"rootClass\" :style=\"rootStyle\" aria-hidden=\"true\" />\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useOverlay } from './useOverlay';\nimport type { OverlayProps } from './types';\n\ndefineOptions({ name: 'RpOverlay' });\n\nconst props = withDefaults(defineProps<OverlayProps>(), {\n color: 'var(--rp-color-overlay)',\n opacity: 1,\n gradient: '',\n zIndex: 1,\n interactive: false,\n disabled: false,\n});\n\nconst { isRendered, rootClass, rootStyle } = useOverlay(props);\n</script>\n\n<style src=\"./overlay.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div v-if=\"isRendered\" :class=\"rootClass\" :style=\"rootStyle\" aria-hidden=\"true\" />\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useOverlay } from './useOverlay';\nimport type { OverlayProps } from './types';\n\ndefineOptions({ name: 'RpOverlay' });\n\nconst props = withDefaults(defineProps<OverlayProps>(), {\n color: 'var(--rp-color-overlay)',\n opacity: 1,\n gradient: '',\n zIndex: 1,\n interactive: false,\n disabled: false,\n});\n\nconst { isRendered, rootClass, rootStyle } = useOverlay(props);\n</script>\n\n<style src=\"./overlay.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;AAIA,SAAS,aAAa,MAA4B;CAC9C,IAAI,QAAQ,QAAQ,SAAS,IAAI,OAAO,KAAA;CAExC,IAAI,OAAO,SAAS,UAAU;EAC1B,IAAI,CAAC,OAAO,SAAS,IAAI,KAAK,OAAO,GAAG,OAAO,KAAA;EAE/C,OAAO,GAAG,KAAK;CACnB;CAEA,OAAO;AACX;AAEA,SAAgB,WAAW,OAA+B;CACtD,MAAM,aAAa,eAAe,CAAC,MAAM,QAAQ;CACjD,MAAM,cAAc,eAAe,QAAQ,MAAM,QAAQ,CAAC;CAE1D,MAAM,oBAAoB,eAAe;EACrC,MAAM,UAAU,MAAM;EACtB,IAAI,YAAY,KAAA,KAAa,CAAC,OAAO,SAAS,OAAO,GAAG,OAAO;EAE/D,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC;CAC3C,CAAC;CAED,MAAM,YAAY,eAAe,aAAa,MAAM,IAAI,CAAC;CACzD,MAAM,UAAU,eAAe,QAAQ,UAAU,KAAK,CAAC;CAiCvD,OAAO;EACH;EACA,WAjCc,eACd,IAAI,cAAc;GACd,UAAU,YAAY;GACtB,SAAS,QAAQ;GACjB,aAAa,MAAM;EACvB,CAAC,CA4BD;EACA,WA1Bc,eAA8B;GAC5C,MAAM,QAAuB,EACzB,yBAAyB,MAAM,OACnC;GAEA,IAAI,UAAU,OACV,MAAM,wBAAwB,UAAU;GAG5C,IAAI,YAAY,OACZ,OAAO;IACH,GAAG;IACH,iBAAiB,MAAM;GAC3B;GAGJ,OAAO;IACH,GAAG;IACH,uBAAuB,MAAM;IAC7B,yBAAyB,kBAAkB;GAC/C;EACJ,CAKI;CACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;EC/CA,MAAM,EAAE,YAAY,WAAW,cAAc,WAAW,OAAK;wBAlB9C,MAAA,UAAA,SAAU;;;iBAAU,MAAA,SAAA,CAAS;iBAAU,MAAA,SAAA,CAAS"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"popover.js","names":[],"sources":["../src/components/popover/usePopover.ts","../src/components/popover/popover.vue","../src/components/popover/popover.vue"],"sourcesContent":["import { computed, isRef, onMounted, ref, useId, useSlots, watch, type CSSProperties } from 'vue';\nimport { bem } from '@/utils/bem';\nimport type {\n PopoverContentSlotProps,\n PopoverOffset,\n PopoverPlacement,\n PopoverProps,\n PopoverRole,\n PopoverSlotProps,\n PopoverTriggerProps,\n} from './types';\n\ninterface PopoverPosition {\n x: number;\n y: number;\n}\n\ntype PopoverCssVariable =\n | '--_rp-popover-main-axis-offset'\n | '--_rp-popover-cross-axis-offset'\n | '--_rp-popover-target-x'\n | '--_rp-popover-target-y';\n\nconst DEFAULT_PLACEMENT: PopoverPlacement = 'bottom';\nconst DEFAULT_ROLE: PopoverRole = 'dialog';\nconst TARGET_ATTRIBUTES = ['aria-controls', 'aria-expanded', 'aria-haspopup'] as const;\n\ntype TargetAttribute = (typeof TARGET_ATTRIBUTES)[number];\n\nfunction isHTMLElement(value: unknown): value is HTMLElement {\n return typeof HTMLElement !== 'undefined' && value instanceof HTMLElement;\n}\n\nfunction getTargetPosition(rect: DOMRect, placement: PopoverPlacement): PopoverPosition {\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n switch (placement) {\n case 'right':\n return { x: rect.right, y: centerY };\n case 'bottom':\n return { x: centerX, y: rect.bottom };\n case 'left':\n return { x: rect.left, y: centerY };\n case 'top':\n default:\n return { x: centerX, y: rect.top };\n }\n}\n\nfunction setPixelVar(\n style: CSSProperties,\n variable: PopoverCssVariable,\n value: number | undefined,\n) {\n if (value != null) style[variable] = `${value}px`;\n}\n\nfunction styleOrUndefined(style: CSSProperties): CSSProperties | undefined {\n return Object.keys(style).length > 0 ? style : undefined;\n}\n\nfunction resolveOffsetStyle(offset: PopoverOffset | undefined): CSSProperties | undefined {\n if (offset == null) return undefined;\n\n const style: CSSProperties = {};\n\n if (typeof offset === 'number') {\n setPixelVar(style, '--_rp-popover-main-axis-offset', offset);\n return style;\n }\n\n setPixelVar(style, '--_rp-popover-main-axis-offset', offset.mainAxis);\n setPixelVar(style, '--_rp-popover-cross-axis-offset', offset.crossAxis);\n\n return styleOrUndefined(style);\n}\n\nfunction addIdReference(currentValue: string | null, id: string) {\n const ids = (currentValue ?? '').split(/\\s+/).filter(Boolean);\n if (!ids.includes(id)) ids.push(id);\n return ids.join(' ');\n}\n\nfunction snapshotAttributes(element: HTMLElement) {\n const snapshot = {} as Record<TargetAttribute, string | null>;\n\n for (const attribute of TARGET_ATTRIBUTES) {\n snapshot[attribute] = element.getAttribute(attribute);\n }\n\n return snapshot;\n}\n\nfunction restoreAttributes(element: HTMLElement, snapshot: Record<TargetAttribute, string | null>) {\n for (const attribute of TARGET_ATTRIBUTES) {\n const value = snapshot[attribute];\n if (value == null) element.removeAttribute(attribute);\n else element.setAttribute(attribute, value);\n }\n}\n\nfunction applyTargetAttributes(\n element: HTMLElement,\n snapshot: Record<TargetAttribute, string | null>,\n options: {\n id: string;\n expanded: boolean;\n role: PopoverRole;\n },\n) {\n element.setAttribute('aria-controls', addIdReference(snapshot['aria-controls'], options.id));\n element.setAttribute('aria-expanded', String(options.expanded));\n element.setAttribute('aria-haspopup', options.role);\n}\n\nfunction resolveTargetElement(target: string | HTMLElement | null | undefined): HTMLElement | null {\n if (!target) return null;\n\n if (typeof target !== 'string') return isHTMLElement(target) ? target : null;\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\nexport function usePopover(\n props: Readonly<PopoverProps>,\n emitOpenChange?: (open: boolean) => void,\n) {\n const slots = useSlots();\n const generatedId = useId();\n const rootRef = ref<HTMLElement | null>(null);\n const targetElement = ref<HTMLElement | null>(null);\n const targetPosition = ref<PopoverPosition | null>(null);\n const uncontrolledOpen = ref(false);\n\n const popoverId = computed(() => props.id ?? `${generatedId}-popover`);\n const placement = computed(() => props.placement ?? DEFAULT_PLACEMENT);\n const popoverRole = computed(() => props.role ?? DEFAULT_ROLE);\n const isTargetMode = computed(() => props.target != null && props.target !== '');\n const hasContent = computed(() =>\n Boolean(slots.content || (isTargetMode.value && slots.default)),\n );\n const isDisabled = computed(() => Boolean(props.disabled || !hasContent.value));\n const isOpen = computed(() => props.open ?? uncontrolledOpen.value);\n const isVisible = computed(() => isOpen.value && !isDisabled.value);\n const shouldRenderContent = computed(() => !isDisabled.value);\n const shouldWireTarget = computed(() => isTargetMode.value && !isDisabled.value);\n\n const rootClass = computed(() =>\n bem('rp-popover', {\n [`placement-${placement.value}`]: true,\n target: isTargetMode.value,\n open: isVisible.value,\n disabled: props.disabled,\n }),\n );\n\n const contentStyle = computed<CSSProperties | undefined>(() => {\n const style: CSSProperties = {\n ...resolveOffsetStyle(props.offset),\n };\n\n if (isTargetMode.value && targetPosition.value) {\n setPixelVar(style, '--_rp-popover-target-x', targetPosition.value.x);\n setPixelVar(style, '--_rp-popover-target-y', targetPosition.value.y);\n }\n\n return styleOrUndefined(style);\n });\n\n const triggerProps = computed<PopoverTriggerProps>(() => ({\n 'aria-controls': isDisabled.value ? undefined : popoverId.value,\n 'aria-expanded': isDisabled.value ? undefined : isVisible.value,\n 'aria-haspopup': isDisabled.value ? undefined : popoverRole.value,\n onClick: onTriggerClick,\n onKeydown: onTriggerKeydown,\n }));\n\n const contentSlotProps = computed<PopoverContentSlotProps>(() => ({\n isOpen: isVisible.value,\n open: openPopover,\n close: closePopover,\n toggle: togglePopover,\n }));\n\n const slotProps = computed<PopoverSlotProps>(() => ({\n triggerProps: triggerProps.value,\n ...contentSlotProps.value,\n }));\n\n function setOpen(nextOpen: boolean) {\n const previousOpen = isOpen.value;\n if (props.open === undefined) uncontrolledOpen.value = nextOpen;\n if (previousOpen !== nextOpen) emitOpenChange?.(nextOpen);\n }\n\n function openPopover() {\n if (isDisabled.value) return;\n updateTargetPosition();\n setOpen(true);\n }\n\n function closePopover() {\n setOpen(false);\n }\n\n function togglePopover() {\n if (isVisible.value) closePopover();\n else openPopover();\n }\n\n function onTriggerClick() {\n togglePopover();\n }\n\n function onTriggerKeydown(event: KeyboardEvent) {\n if (event.key !== 'Escape') return;\n event.stopPropagation();\n closePopover();\n }\n\n function onTargetClick() {\n togglePopover();\n }\n\n function readTarget() {\n return isRef(props.target) ? props.target.value : props.target;\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 isEventInsidePopover(event: Event) {\n const eventTarget = event.target;\n if (typeof Node === 'undefined' || !(eventTarget instanceof Node)) return false;\n\n return Boolean(\n rootRef.value?.contains(eventTarget) || targetElement.value?.contains(eventTarget),\n );\n }\n\n function onDocumentClick(event: MouseEvent) {\n if (props.closeOnOutsideClick === false || isEventInsidePopover(event)) return;\n closePopover();\n }\n\n function onDocumentKeydown(event: KeyboardEvent) {\n if (props.closeOnEscape === false || event.key !== 'Escape') return;\n closePopover();\n }\n\n function syncTargetElement() {\n const nextTarget = isTargetMode.value ? resolveTargetElement(readTarget()) : null;\n\n if (targetElement.value !== nextTarget) {\n targetElement.value = nextTarget;\n }\n\n if (!nextTarget) {\n targetPosition.value = null;\n return;\n }\n\n if (isVisible.value) updateTargetPosition();\n }\n\n watch(isDisabled, (disabled) => {\n if (disabled) closePopover();\n });\n\n watch(\n () => readTarget(),\n () => syncTargetElement(),\n { flush: 'post' },\n );\n\n watch(\n [shouldWireTarget, targetElement],\n ([shouldWire, target], _previous, onCleanup) => {\n if (!shouldWire || !target) return;\n\n target.addEventListener('click', onTargetClick);\n onCleanup(() => {\n target.removeEventListener('click', onTargetClick);\n });\n },\n { flush: 'sync' },\n );\n\n watch(\n [shouldWireTarget, targetElement, popoverId, popoverRole, isVisible],\n ([shouldWire, target], _previous, onCleanup) => {\n if (!shouldWire || !target) return;\n\n const snapshot = snapshotAttributes(target);\n applyTargetAttributes(target, snapshot, {\n id: popoverId.value,\n expanded: isVisible.value,\n role: popoverRole.value,\n });\n\n onCleanup(() => {\n restoreAttributes(target, snapshot);\n });\n },\n { flush: 'sync' },\n );\n\n watch(\n [isVisible, isTargetMode, targetElement],\n ([visible, targetMode, target], _previous, onCleanup) => {\n if (!visible || !targetMode || !target || typeof window === 'undefined') return;\n\n window.addEventListener('resize', updateTargetPosition);\n window.addEventListener('scroll', updateTargetPosition, true);\n\n onCleanup(() => {\n window.removeEventListener('resize', updateTargetPosition);\n window.removeEventListener('scroll', updateTargetPosition, true);\n });\n },\n { flush: 'sync' },\n );\n\n watch(\n isVisible,\n (visible, _previous, onCleanup) => {\n if (!visible || typeof document === 'undefined') return;\n\n document.addEventListener('click', onDocumentClick, true);\n document.addEventListener('keydown', onDocumentKeydown);\n\n onCleanup(() => {\n document.removeEventListener('click', onDocumentClick, true);\n document.removeEventListener('keydown', onDocumentKeydown);\n });\n },\n { flush: 'sync', immediate: true },\n );\n\n watch(\n [targetElement, placement, isVisible],\n () => {\n if (isVisible.value) updateTargetPosition();\n },\n { flush: 'sync' },\n );\n\n onMounted(syncTargetElement);\n\n return {\n rootRef,\n popoverId,\n isOpen,\n isVisible,\n isTargetMode,\n popoverRole,\n shouldRenderContent,\n rootClass,\n contentStyle,\n triggerProps,\n slotProps,\n contentSlotProps,\n openPopover,\n closePopover,\n togglePopover,\n onTriggerKeydown,\n };\n}\n","<template>\n <span ref=\"rootRef\" :class=\"rootClass\">\n <slot\n v-if=\"!isTargetMode\"\n :trigger-props=\"slotProps.triggerProps\"\n :is-open=\"slotProps.isOpen\"\n :open=\"slotProps.open\"\n :close=\"slotProps.close\"\n :toggle=\"slotProps.toggle\"\n />\n\n <Transition name=\"rp-popover-content\">\n <section\n v-if=\"shouldRenderContent\"\n v-show=\"isVisible\"\n :id=\"popoverId\"\n class=\"rp-popover__content\"\n :role=\"popoverRole\"\n :style=\"contentStyle\"\n >\n <slot\n name=\"content\"\n :is-open=\"contentSlotProps.isOpen\"\n :open=\"contentSlotProps.open\"\n :close=\"contentSlotProps.close\"\n :toggle=\"contentSlotProps.toggle\"\n >\n <slot\n v-if=\"isTargetMode\"\n :is-open=\"contentSlotProps.isOpen\"\n :open=\"contentSlotProps.open\"\n :close=\"contentSlotProps.close\"\n :toggle=\"contentSlotProps.toggle\"\n />\n </slot>\n </section>\n </Transition>\n </span>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { usePopover } from './usePopover';\nimport type { PopoverProps } from './types';\n\ndefineOptions({ name: 'RpPopover' });\n\nconst props = withDefaults(defineProps<PopoverProps>(), {\n placement: 'bottom',\n open: undefined,\n disabled: false,\n role: 'dialog',\n closeOnOutsideClick: true,\n closeOnEscape: true,\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n}>();\n\nconst {\n rootRef,\n popoverId,\n isVisible,\n isTargetMode,\n popoverRole,\n shouldRenderContent,\n rootClass,\n contentStyle,\n slotProps,\n contentSlotProps,\n} = usePopover(props, (open) => {\n emit('update:open', open);\n});\n\nvoid rootRef;\n</script>\n\n<style src=\"./popover.scss\" lang=\"scss\" scoped></style>\n","<template>\n <span ref=\"rootRef\" :class=\"rootClass\">\n <slot\n v-if=\"!isTargetMode\"\n :trigger-props=\"slotProps.triggerProps\"\n :is-open=\"slotProps.isOpen\"\n :open=\"slotProps.open\"\n :close=\"slotProps.close\"\n :toggle=\"slotProps.toggle\"\n />\n\n <Transition name=\"rp-popover-content\">\n <section\n v-if=\"shouldRenderContent\"\n v-show=\"isVisible\"\n :id=\"popoverId\"\n class=\"rp-popover__content\"\n :role=\"popoverRole\"\n :style=\"contentStyle\"\n >\n <slot\n name=\"content\"\n :is-open=\"contentSlotProps.isOpen\"\n :open=\"contentSlotProps.open\"\n :close=\"contentSlotProps.close\"\n :toggle=\"contentSlotProps.toggle\"\n >\n <slot\n v-if=\"isTargetMode\"\n :is-open=\"contentSlotProps.isOpen\"\n :open=\"contentSlotProps.open\"\n :close=\"contentSlotProps.close\"\n :toggle=\"contentSlotProps.toggle\"\n />\n </slot>\n </section>\n </Transition>\n </span>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { usePopover } from './usePopover';\nimport type { PopoverProps } from './types';\n\ndefineOptions({ name: 'RpPopover' });\n\nconst props = withDefaults(defineProps<PopoverProps>(), {\n placement: 'bottom',\n open: undefined,\n disabled: false,\n role: 'dialog',\n closeOnOutsideClick: true,\n closeOnEscape: true,\n});\n\nconst emit = defineEmits<{\n 'update:open': [value: boolean];\n}>();\n\nconst {\n rootRef,\n popoverId,\n isVisible,\n isTargetMode,\n popoverRole,\n shouldRenderContent,\n rootClass,\n contentStyle,\n slotProps,\n contentSlotProps,\n} = usePopover(props, (open) => {\n emit('update:open', open);\n});\n\nvoid rootRef;\n</script>\n\n<style src=\"./popover.scss\" lang=\"scss\" scoped></style>\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress.js","names":[],"sources":["../src/components/progress/useProgress.ts","../src/components/progress/progress.vue","../src/components/progress/progress.vue","../src/components/progress/types.ts"],"sourcesContent":["import { computed, type CSSProperties } from 'vue';\nimport { useControlState } from '@/composables/useControlState';\nimport { bem } from '@/utils/bem';\nimport { getComponentCustomColor, isComponentPresetColor } from '@/utils/componentColors';\nimport type { ProgressProps } from './types';\n\ntype ProgressStateProps = Readonly<\n ProgressProps & {\n min: number;\n max: number;\n indeterminate: boolean;\n showValue: boolean;\n }\n>;\n\nexport function normalizeProgressBounds(min: number, max: number) {\n const safeMin = Number.isFinite(min) ? min : 0;\n const safeMax = Number.isFinite(max) ? max : 100;\n\n return safeMax >= safeMin ? { min: safeMin, max: safeMax } : { min: safeMax, max: safeMin };\n}\n\nexport function normalizeProgressValue(value: number | null | undefined, min: number, max: number) {\n const safeValue = Number.isFinite(value) ? Number(value) : min;\n\n return Math.min(max, Math.max(min, safeValue));\n}\n\nexport function getProgressValuePercent(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 getFormattedProgressValue(\n value: number,\n percent: number,\n formatter: ProgressProps['formatValue'],\n) {\n return formatter ? formatter(value, percent) : `${Math.round(percent)}%`;\n}\n\nfunction getProgressAriaValueText(\n value: number,\n percent: number,\n ariaValueText: ProgressProps['ariaValueText'],\n formatter: ProgressProps['formatValue'],\n) {\n if (typeof ariaValueText === 'function') return String(ariaValueText(value, percent));\n if (ariaValueText != null && ariaValueText !== '') return String(ariaValueText);\n if (formatter) return String(formatter(value, percent));\n\n return undefined;\n}\n\nfunction setProgressStyleValue(\n style: CSSProperties,\n property: `--_rp-progress-${string}`,\n value: string | undefined,\n) {\n if (value) {\n style[property] = value;\n }\n}\n\nexport function useProgress(props: ProgressStateProps) {\n const control = useControlState(props);\n\n const bounds = computed(() => normalizeProgressBounds(props.min, props.max));\n const isIndeterminate = computed(() => props.indeterminate || props.value == null);\n const normalizedValue = computed(() =>\n normalizeProgressValue(props.value, bounds.value.min, bounds.value.max),\n );\n const valuePercent = computed(() =>\n getProgressValuePercent(normalizedValue.value, bounds.value.min, bounds.value.max),\n );\n const formattedValue = computed(() =>\n getFormattedProgressValue(normalizedValue.value, valuePercent.value, props.formatValue),\n );\n const ariaValueText = computed(() =>\n isIndeterminate.value\n ? undefined\n : getProgressAriaValueText(\n normalizedValue.value,\n valuePercent.value,\n props.ariaValueText,\n props.formatValue,\n ),\n );\n const rootClass = computed(() =>\n bem('rp-progress', {\n [`color-${props.color}`]: isComponentPresetColor(props.color),\n [`size-${props.size}`]: Boolean(props.size),\n [`radius-${props.radius}`]: Boolean(props.radius),\n indeterminate: isIndeterminate.value,\n }),\n );\n const rootStyle = computed<CSSProperties>(() => {\n const style: CSSProperties = {\n '--_rp-progress-value': `${valuePercent.value}%`,\n '--_rp-progress-ratio': `${valuePercent.value / 100}`,\n };\n\n setProgressStyleValue(\n style,\n '--_rp-progress-custom-color',\n getComponentCustomColor(props.color),\n );\n\n return style;\n });\n\n return {\n control,\n rootClass,\n rootStyle,\n isIndeterminate,\n normalizedValue,\n valuePercent,\n formattedValue,\n ariaValueText,\n ariaValueMin: computed(() => (isIndeterminate.value ? undefined : bounds.value.min)),\n ariaValueMax: computed(() => (isIndeterminate.value ? undefined : bounds.value.max)),\n ariaValueNow: computed(() => (isIndeterminate.value ? undefined : normalizedValue.value)),\n };\n}\n","<template>\n <div\n :id=\"control.id\"\n :class=\"rootClass\"\n :style=\"rootStyle\"\n role=\"progressbar\"\n :data-state=\"isIndeterminate ? 'indeterminate' : 'determinate'\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-valuemin=\"ariaValueMin\"\n :aria-valuemax=\"ariaValueMax\"\n :aria-valuenow=\"ariaValueNow\"\n :aria-valuetext=\"ariaValueText\"\n >\n <span\n v-if=\"$slots.default || (!isIndeterminate && ($slots.value || showValue))\"\n class=\"rp-progress__header\"\n >\n <span v-if=\"$slots.default\" class=\"rp-progress__label\">\n <slot />\n </span>\n <span\n v-if=\"!isIndeterminate && ($slots.value || showValue)\"\n class=\"rp-progress__value\"\n aria-hidden=\"true\"\n >\n <slot\n v-if=\"$slots.value\"\n name=\"value\"\n :value=\"normalizedValue\"\n :formatted-value=\"formattedValue\"\n :percent=\"valuePercent\"\n />\n <template v-else>{{ formattedValue }}</template>\n </span>\n </span>\n <span class=\"rp-progress__track\" aria-hidden=\"true\">\n <span class=\"rp-progress__indicator\" />\n </span>\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport type { ProgressProps } from './types';\nimport { useProgress } from './useProgress';\n\ndefineOptions({ name: 'RpProgress' });\n\nconst props = withDefaults(defineProps<ProgressProps>(), {\n min: 0,\n max: 100,\n indeterminate: false,\n showValue: false,\n});\n\nconst {\n control,\n rootClass,\n rootStyle,\n isIndeterminate,\n normalizedValue,\n valuePercent,\n formattedValue,\n ariaValueText,\n ariaValueMin,\n ariaValueMax,\n ariaValueNow,\n} = useProgress(props);\n</script>\n\n<style src=\"./progress.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n :id=\"control.id\"\n :class=\"rootClass\"\n :style=\"rootStyle\"\n role=\"progressbar\"\n :data-state=\"isIndeterminate ? 'indeterminate' : 'determinate'\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-valuemin=\"ariaValueMin\"\n :aria-valuemax=\"ariaValueMax\"\n :aria-valuenow=\"ariaValueNow\"\n :aria-valuetext=\"ariaValueText\"\n >\n <span\n v-if=\"$slots.default || (!isIndeterminate && ($slots.value || showValue))\"\n class=\"rp-progress__header\"\n >\n <span v-if=\"$slots.default\" class=\"rp-progress__label\">\n <slot />\n </span>\n <span\n v-if=\"!isIndeterminate && ($slots.value || showValue)\"\n class=\"rp-progress__value\"\n aria-hidden=\"true\"\n >\n <slot\n v-if=\"$slots.value\"\n name=\"value\"\n :value=\"normalizedValue\"\n :formatted-value=\"formattedValue\"\n :percent=\"valuePercent\"\n />\n <template v-else>{{ formattedValue }}</template>\n </span>\n </span>\n <span class=\"rp-progress__track\" aria-hidden=\"true\">\n <span class=\"rp-progress__indicator\" />\n </span>\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport type { ProgressProps } from './types';\nimport { useProgress } from './useProgress';\n\ndefineOptions({ name: 'RpProgress' });\n\nconst props = withDefaults(defineProps<ProgressProps>(), {\n min: 0,\n max: 100,\n indeterminate: false,\n showValue: false,\n});\n\nconst {\n control,\n rootClass,\n rootStyle,\n isIndeterminate,\n normalizedValue,\n valuePercent,\n formattedValue,\n ariaValueText,\n ariaValueMin,\n ariaValueMax,\n ariaValueNow,\n} = useProgress(props);\n</script>\n\n<style src=\"./progress.scss\" lang=\"scss\" scoped></style>\n","import { componentColors, type ComponentColorValue } from '../../utils/componentColors';\n\nexport const progressColors = componentColors;\n\nexport const progressSizes = ['xs', 'sm', 'md', 'lg', 'xl'] as const;\n\nexport const progressRadiuses = ['none', 'xs', 'sm', 'md', 'lg', 'xl', 'full'] as const;\n\nexport type ProgressColor = ComponentColorValue;\n\nexport type ProgressSize = (typeof progressSizes)[number];\n\nexport type ProgressRadius = (typeof progressRadiuses)[number];\n\nexport type ProgressValueFormatter = (value: number, percent: number) => string | number;\n\nexport interface ProgressProps {\n id?: string;\n value?: number | null;\n min?: number;\n max?: number;\n color?: ProgressColor;\n size?: ProgressSize;\n radius?: ProgressRadius;\n indeterminate?: boolean;\n showValue?: boolean;\n formatValue?: ProgressValueFormatter;\n ariaLabel?: string;\n ariaValueText?: string | ProgressValueFormatter;\n describedby?: string;\n labelledby?: string;\n}\n"],"mappings":"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"}
package/dist/radio.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"radio.js","names":[],"sources":["../src/components/radio/types.ts","../src/components/radio/useRadio.ts","../src/components/radio/radio.vue","../src/components/radio/radio.vue","../src/components/radio/radio-group.vue","../src/components/radio/radio-group.vue"],"sourcesContent":["import type { InjectionKey } from 'vue';\nimport type { ComponentColorValue } from '../../utils/componentColors';\n\nexport type RadioColor = ComponentColorValue;\n\nexport type RadioSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport type RadioVariant = 'solid' | 'outline';\n\nexport interface RadioProps {\n value: string | number;\n variant?: RadioVariant;\n color?: RadioColor;\n size?: RadioSize;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n id?: string;\n name?: string;\n modelValue: string | number | null;\n variant?: RadioVariant;\n color?: RadioColor;\n size?: RadioSize;\n disabled?: boolean;\n required?: boolean;\n invalid?: boolean;\n ariaLabel?: string;\n describedby?: string;\n labelledby?: string;\n}\n\nexport interface RadioGroupContext {\n modelValue: string | number | null;\n name: string;\n disabled: boolean;\n required: boolean;\n variant?: RadioVariant;\n color?: RadioColor;\n size?: RadioSize;\n select: (value: string | number) => void;\n}\n\nexport const radioGroupKey = Symbol('radioGroup') as InjectionKey<RadioGroupContext>;\n","import { computed, provide, useId, type CSSProperties } from 'vue';\nimport { useControlState } from '@/composables/useControlState';\nimport { useRequiredInject } from '@/composables/useRequiredInject';\nimport { getComponentCustomColor, isComponentPresetColor } from '@/utils/componentColors';\nimport { bem } from '@/utils/bem';\nimport { radioGroupKey } from './types';\nimport type { RadioGroupContext, RadioGroupProps, RadioProps } from './types';\n\nfunction getRadioColorStyle(color: RadioProps['color']) {\n const customColor = getComponentCustomColor(color);\n if (!customColor) return undefined;\n\n return {\n '--_rp-radio-custom-color': customColor,\n '--_rp-radio-custom-on-color': 'var(--rp-color-on-primary)',\n } satisfies CSSProperties;\n}\n\nexport function useRadio(props: Readonly<RadioProps>) {\n const group = useRequiredInject(radioGroupKey, 'RpRadio');\n const isChecked = computed(() => group.modelValue === props.value);\n const isDisabled = computed(() => props.disabled || group.disabled);\n const variant = computed(() => props.variant ?? group.variant);\n const color = computed(() => props.color ?? group.color);\n const size = computed(() => props.size ?? group.size);\n\n const rootClass = computed(() =>\n bem('rp-radio', {\n checked: isChecked.value,\n disabled: isDisabled.value,\n [variant.value ?? '']: Boolean(variant.value),\n [`color-${color.value}`]: isComponentPresetColor(color.value),\n [`size-${size.value}`]: Boolean(size.value),\n }),\n );\n\n const rootStyle = computed(() => getRadioColorStyle(color.value));\n\n function onSelect() {\n if (isDisabled.value) return;\n group.select(props.value);\n }\n\n return {\n group,\n isChecked,\n isDisabled,\n rootClass,\n rootStyle,\n onSelect,\n };\n}\n\nexport function useRadioGroup(\n props: Readonly<RadioGroupProps>,\n emitUpdate: (value: string | number | null) => void,\n) {\n const control = useControlState(props);\n\n const rootClass = computed(() =>\n bem('rp-radio-group', {\n disabled: control.disabled,\n invalid: control.invalid,\n }),\n );\n\n const generatedName = useId();\n const groupName = computed(() => props.name ?? `${control.id ?? generatedName}-radio`);\n\n provide<RadioGroupContext>(radioGroupKey, {\n get modelValue() {\n return props.modelValue;\n },\n get name() {\n return groupName.value;\n },\n get disabled() {\n return control.disabled;\n },\n get required() {\n return control.required;\n },\n get variant() {\n return props.variant;\n },\n get color() {\n return props.color;\n },\n get size() {\n return props.size;\n },\n select(value) {\n emitUpdate(value);\n },\n });\n\n return {\n control,\n rootClass,\n };\n}\n","<template>\n <label\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :data-disabled=\"isDisabled || undefined\"\n :data-state=\"isChecked ? 'checked' : 'unchecked'\"\n >\n <input\n type=\"radio\"\n class=\"rp-radio__native\"\n :name=\"group.name\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled || undefined\"\n :required=\"group.required || undefined\"\n @change=\"onSelect\"\n />\n <span class=\"rp-radio__dot\" />\n <span v-if=\"$slots.default\" class=\"rp-radio__label\">\n <slot />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadio } from './useRadio';\nimport type { RadioProps } from './types';\n\ndefineOptions({ name: 'RpRadio' });\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n variant: undefined,\n color: undefined,\n size: undefined,\n disabled: false,\n});\n\nconst { group, isChecked, isDisabled, rootClass, rootStyle, onSelect } = useRadio(props);\n</script>\n\n<style src=\"./radio.scss\" lang=\"scss\" scoped></style>\n","<template>\n <label\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :data-disabled=\"isDisabled || undefined\"\n :data-state=\"isChecked ? 'checked' : 'unchecked'\"\n >\n <input\n type=\"radio\"\n class=\"rp-radio__native\"\n :name=\"group.name\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"isDisabled || undefined\"\n :required=\"group.required || undefined\"\n @change=\"onSelect\"\n />\n <span class=\"rp-radio__dot\" />\n <span v-if=\"$slots.default\" class=\"rp-radio__label\">\n <slot />\n </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadio } from './useRadio';\nimport type { RadioProps } from './types';\n\ndefineOptions({ name: 'RpRadio' });\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n variant: undefined,\n color: undefined,\n size: undefined,\n disabled: false,\n});\n\nconst { group, isChecked, isDisabled, rootClass, rootStyle, onSelect } = useRadio(props);\n</script>\n\n<style src=\"./radio.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n :id=\"control.id\"\n :class=\"rootClass\"\n role=\"radiogroup\"\n :data-disabled=\"control.disabled || undefined\"\n :data-invalid=\"control.invalid || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadioGroup } from './useRadio';\nimport type { RadioGroupProps } from './types';\n\ndefineOptions({ name: 'RpRadioGroup' });\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n variant: undefined,\n color: undefined,\n size: undefined,\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n}>();\n\nconst { control, rootClass } = useRadioGroup(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./radio-group.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div\n :id=\"control.id\"\n :class=\"rootClass\"\n role=\"radiogroup\"\n :data-disabled=\"control.disabled || undefined\"\n :data-invalid=\"control.invalid || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport { useRadioGroup } from './useRadio';\nimport type { RadioGroupProps } from './types';\n\ndefineOptions({ name: 'RpRadioGroup' });\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n variant: undefined,\n color: undefined,\n size: undefined,\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n}>();\n\nconst { control, rootClass } = useRadioGroup(props, (value) => {\n emit('update:modelValue', value);\n});\n</script>\n\n<style src=\"./radio-group.scss\" lang=\"scss\" scoped></style>\n"],"mappings":";;;;;;;AA2CA,IAAa,gBAAgB,OAAO,YAAY;;;ACnChD,SAAS,mBAAmB,OAA4B;CACpD,MAAM,cAAc,wBAAwB,KAAK;CACjD,IAAI,CAAC,aAAa,OAAO,KAAA;CAEzB,OAAO;EACH,4BAA4B;EAC5B,+BAA+B;CACnC;AACJ;AAEA,SAAgB,SAAS,OAA6B;CAClD,MAAM,QAAQ,kBAAkB,eAAe,SAAS;CACxD,MAAM,YAAY,eAAe,MAAM,eAAe,MAAM,KAAK;CACjE,MAAM,aAAa,eAAe,MAAM,YAAY,MAAM,QAAQ;CAClE,MAAM,UAAU,eAAe,MAAM,WAAW,MAAM,OAAO;CAC7D,MAAM,QAAQ,eAAe,MAAM,SAAS,MAAM,KAAK;CACvD,MAAM,OAAO,eAAe,MAAM,QAAQ,MAAM,IAAI;CAEpD,MAAM,YAAY,eACd,IAAI,YAAY;EACZ,SAAS,UAAU;EACnB,UAAU,WAAW;GACpB,QAAQ,SAAS,KAAK,QAAQ,QAAQ,KAAK;GAC3C,SAAS,MAAM,UAAU,uBAAuB,MAAM,KAAK;GAC3D,QAAQ,KAAK,UAAU,QAAQ,KAAK,KAAK;CAC9C,CAAC,CACL;CAEA,MAAM,YAAY,eAAe,mBAAmB,MAAM,KAAK,CAAC;CAEhE,SAAS,WAAW;EAChB,IAAI,WAAW,OAAO;EACtB,MAAM,OAAO,MAAM,KAAK;CAC5B;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ;AAEA,SAAgB,cACZ,OACA,YACF;CACE,MAAM,UAAU,gBAAgB,KAAK;CAErC,MAAM,YAAY,eACd,IAAI,kBAAkB;EAClB,UAAU,QAAQ;EAClB,SAAS,QAAQ;CACrB,CAAC,CACL;CAEA,MAAM,gBAAgB,MAAM;CAC5B,MAAM,YAAY,eAAe,MAAM,QAAQ,GAAG,QAAQ,MAAM,cAAc,OAAO;CAErF,QAA2B,eAAe;EACtC,IAAI,aAAa;GACb,OAAO,MAAM;EACjB;EACA,IAAI,OAAO;GACP,OAAO,UAAU;EACrB;EACA,IAAI,WAAW;GACX,OAAO,QAAQ;EACnB;EACA,IAAI,WAAW;GACX,OAAO,QAAQ;EACnB;EACA,IAAI,UAAU;GACV,OAAO,MAAM;EACjB;EACA,IAAI,QAAQ;GACR,OAAO,MAAM;EACjB;EACA,IAAI,OAAO;GACP,OAAO,MAAM;EACjB;EACA,OAAO,OAAO;GACV,WAAW,KAAK;EACpB;CACJ,CAAC;CAED,OAAO;EACH;EACA;CACJ;AACJ;;;;;;;;;;;;;;;;;;;;;EC/DA,MAAM,EAAE,OAAO,WAAW,YAAY,WAAW,WAAW,aAAa,SAAS,OAAK;;;SAtB1E,WAAM,MAAE,MAAA,QAAA,CAAQ,CAAA,CAAA,CAAA;;;;gBAbb,MAAA,SAAA,CAAS;gBACT,MAAA,SAAA,CAAS;eAChB,iBAAe,MAAA,UAAA,KAAc,KAAA,CAAS;eACtC,cAAY,aAAS,YAAA,WAAA;eAKjB,QAAM,OAAK,IAAA;gBACJ,QAAA,KAAK;eACZ,WAAS,UAAS;eAClB,YAAU,MAAA,UAAA,KAAc,KAAA,CAAS;eACjC,YAAU,OAAK,YAAa,KAAA,CAAS;;;iBAI9B,OAAM,eAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEK1B,MAAM,QAAQ;EASd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,cAAc,cAAc,QAAQ,UAAU;GAC3D,KAAK,qBAAqB,KAAK;EACnC,CAAC;;;;;eApCQ,MAAI,SAAO,EAAA;gBACJ,MAAA,SAAA,CAAS;eAEhB,iBAAe,SAAO,YAAa,KAAA,CAAS;eAC5C,gBAAc,oBAAmB,KAAA,CAAS;eAC1C,cAAY,QAAA,aAAa,KAAA,CAAS;eAClC,mBAAiB,SAAO,cAAA;eACxB,oBAAkB,SAAO,eAAA;eACzB,gBAAc,oBAAmB,KAAA,CAAS;eAC1C,iBAAe,SAAO,YAAa,KAAA,CAAS"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"select.js","names":[],"sources":["../src/composables/useListNavigation.ts","../src/components/select/useSelect.ts","../src/components/select/select.vue","../src/components/select/select.vue"],"sourcesContent":["import { computed, ref } from 'vue';\n\nexport interface ListNavigationItem {\n disabled?: boolean;\n}\n\nexport interface UseListNavigationOptions<T extends ListNavigationItem> {\n items: () => T[];\n isSelected?: (item: T) => boolean;\n loop?: boolean;\n}\n\nexport function useListNavigation<T extends ListNavigationItem>(\n options: UseListNavigationOptions<T>,\n) {\n const localFocusedIndex = ref(-1);\n const loop = options.loop ?? true;\n\n const enabledIndexes = computed(() =>\n options\n .items()\n .map((item, index) => (item.disabled ? -1 : index))\n .filter((index) => index >= 0),\n );\n\n function resetFocus() {\n localFocusedIndex.value = -1;\n }\n\n function setNearest(index: number, direction: 1 | -1) {\n const indexes = enabledIndexes.value;\n if (indexes.length === 0) {\n resetFocus();\n return;\n }\n\n if (options.items()[index] && !options.items()[index]?.disabled) {\n localFocusedIndex.value = index;\n return;\n }\n\n let next: number | undefined;\n if (direction === 1) {\n next = indexes.find((i) => i > index);\n } else {\n for (let i = indexes.length - 1; i >= 0; i -= 1) {\n const candidate = indexes[i]!;\n if (candidate < index) {\n next = candidate;\n break;\n }\n }\n }\n\n if (next !== undefined) {\n localFocusedIndex.value = next;\n } else if (loop) {\n localFocusedIndex.value = direction === 1 ? indexes[0]! : indexes[indexes.length - 1]!;\n }\n }\n\n function focusSelected() {\n const items = options.items();\n const selectedIndex = options.isSelected\n ? items.findIndex((item) => options.isSelected!(item) && !item.disabled)\n : -1;\n if (selectedIndex >= 0) {\n localFocusedIndex.value = selectedIndex;\n } else {\n focusFirst();\n }\n }\n\n function focusFirst() {\n const first = enabledIndexes.value[0];\n localFocusedIndex.value = first ?? -1;\n }\n\n function focusLast() {\n const indexes = enabledIndexes.value;\n localFocusedIndex.value = indexes[indexes.length - 1] ?? -1;\n }\n\n function moveFocus(delta: 1 | -1) {\n if (localFocusedIndex.value < 0) {\n if (delta === 1) {\n focusFirst();\n } else {\n focusLast();\n }\n return;\n }\n setNearest(localFocusedIndex.value + delta, delta);\n }\n\n return {\n focusedIndex: localFocusedIndex,\n resetFocus,\n focusSelected,\n focusFirst,\n focusLast,\n moveFocus,\n };\n}\n","import { computed, nextTick, ref, useId } from 'vue';\nimport { useClickOutside } from '@/composables/useClickOutside';\nimport { useControlState } from '@/composables/useControlState';\nimport { useListNavigation } from '@/composables/useListNavigation';\nimport { bem } from '@/utils/bem';\nimport type { SelectOption, SelectProps } from './types';\n\ntype SelectValue = string | number | null;\n\nfunction hasSelectValue(value: SelectValue) {\n return value != null && value !== '';\n}\n\nfunction getSelectDisplayLabel(options: SelectOption[] | undefined, value: SelectValue) {\n if (!hasSelectValue(value)) return '';\n return options?.find((option) => option.value === value)?.label ?? '';\n}\n\nfunction getSelectActiveDescendantId(baseId: string, focusedIndex: number) {\n return focusedIndex < 0 ? undefined : `${baseId}-option-${focusedIndex}`;\n}\n\nexport function useSelect(props: Readonly<SelectProps>, emitUpdate: (value: SelectValue) => void) {\n const selectRef = ref<HTMLElement | null>(null);\n const triggerRef = ref<HTMLElement | null>(null);\n const isOpen = ref(false);\n\n const selectId = useId();\n const listboxId = `${selectId}-listbox`;\n\n const control = useControlState(props);\n const visibleOptions = computed(() => props.options ?? []);\n\n const navigation = useListNavigation<SelectOption>({\n items: () => visibleOptions.value,\n isSelected: (item) => item.value === props.modelValue,\n });\n\n const focusedIndex = navigation.focusedIndex;\n const activeDescendantId = computed(() =>\n getSelectActiveDescendantId(selectId, focusedIndex.value),\n );\n\n const rootClass = computed(() =>\n bem('rp-select', {\n open: isOpen.value,\n [`radius-${props.radius}`]: Boolean(props.radius),\n disabled: control.disabled,\n invalid: control.invalid,\n }),\n );\n\n const hasValue = computed(() => hasSelectValue(props.modelValue));\n const displayLabel = computed(() => getSelectDisplayLabel(props.options, props.modelValue));\n const canClear = computed(() =>\n Boolean(props.clearable && hasValue.value && !control.disabled),\n );\n\n function focusTrigger() {\n nextTick(() => triggerRef.value?.focus());\n }\n\n function open() {\n if (control.disabled || isOpen.value) return;\n isOpen.value = true;\n navigation.focusSelected();\n }\n\n function close() {\n isOpen.value = false;\n navigation.resetFocus();\n }\n\n function toggle() {\n if (control.disabled) return;\n if (isOpen.value) {\n close();\n focusTrigger();\n } else {\n open();\n }\n }\n\n function selectOption(option: SelectOption) {\n if (option.disabled) return;\n emitUpdate(option.value);\n close();\n focusTrigger();\n }\n\n function clearSelection() {\n if (!canClear.value) return;\n emitUpdate(null);\n close();\n focusTrigger();\n }\n\n function onOptionMouseenter(option: SelectOption, index: number) {\n if (!option.disabled) focusedIndex.value = index;\n }\n\n function selectFocusedOption() {\n if (focusedIndex.value < 0 || focusedIndex.value >= visibleOptions.value.length) return;\n selectOption(visibleOptions.value[focusedIndex.value]!);\n }\n\n function onTriggerKeydown(e: KeyboardEvent) {\n if (control.disabled) return;\n\n switch (e.key) {\n case 'Enter':\n e.preventDefault();\n if (!isOpen.value) open();\n else selectFocusedOption();\n break;\n case ' ':\n e.preventDefault();\n if (!isOpen.value) open();\n else selectFocusedOption();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen.value) open();\n else navigation.moveFocus(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen.value) {\n open();\n navigation.focusLast();\n } else {\n navigation.moveFocus(-1);\n }\n break;\n case 'Home':\n if (isOpen.value) {\n e.preventDefault();\n navigation.focusFirst();\n }\n break;\n case 'End':\n if (isOpen.value) {\n e.preventDefault();\n navigation.focusLast();\n }\n break;\n case 'Delete':\n case 'Backspace':\n if (canClear.value) {\n e.preventDefault();\n clearSelection();\n }\n break;\n case 'Escape':\n e.preventDefault();\n close();\n focusTrigger();\n break;\n }\n }\n\n useClickOutside(selectRef, isOpen, close);\n\n return {\n selectRef,\n triggerRef,\n isOpen,\n selectId,\n listboxId,\n control,\n visibleOptions,\n focusedIndex,\n activeDescendantId,\n rootClass,\n hasValue,\n displayLabel,\n canClear,\n toggle,\n selectOption,\n clearSelection,\n onOptionMouseenter,\n onTriggerKeydown,\n };\n}\n","<template>\n <div :class=\"rootClass\" ref=\"selectRef\">\n <input\n v-if=\"name\"\n type=\"hidden\"\n :name=\"name\"\n :value=\"modelValue ?? ''\"\n :disabled=\"control.disabled || undefined\"\n />\n <div\n :id=\"control.id\"\n ref=\"triggerRef\"\n class=\"rp-select__trigger\"\n role=\"combobox\"\n :aria-expanded=\"isOpen\"\n aria-haspopup=\"listbox\"\n :aria-activedescendant=\"activeDescendantId\"\n :aria-controls=\"listboxId\"\n :aria-disabled=\"control.disabled || undefined\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n :data-disabled=\"control.disabled || undefined\"\n :tabindex=\"control.disabled ? -1 : 0\"\n @click=\"toggle\"\n @keydown=\"onTriggerKeydown\"\n >\n <span class=\"rp-select__value\" :class=\"{ 'rp-select__placeholder': !hasValue }\">\n {{ displayLabel || placeholder }}\n </span>\n\n <span class=\"rp-select__indicator\">\n <button\n v-if=\"canClear\"\n type=\"button\"\n class=\"rp-select__clear\"\n aria-label=\"Clear selection\"\n tabindex=\"-1\"\n @mousedown.prevent\n @click.stop=\"clearSelection\"\n >\n <XIcon />\n </button>\n <span class=\"rp-select__arrow\" aria-hidden=\"true\">\n <ChevronsUpDownIcon />\n </span>\n </span>\n </div>\n\n <Transition name=\"rp-select-dropdown\">\n <div v-if=\"isOpen\" class=\"rp-select__dropdown\" role=\"listbox\" :id=\"listboxId\">\n <div v-if=\"visibleOptions.length === 0\" class=\"rp-select__empty\">\n <slot name=\"empty\">No options</slot>\n </div>\n <div\n v-for=\"(option, index) in visibleOptions\"\n :key=\"option.value\"\n role=\"option\"\n :id=\"`${selectId}-option-${index}`\"\n :aria-selected=\"option.value === modelValue\"\n :aria-disabled=\"option.disabled || undefined\"\n :data-selected=\"option.value === modelValue || undefined\"\n :data-disabled=\"option.disabled || undefined\"\n :class=\"[\n 'rp-select__option',\n {\n 'rp-select__option--selected': option.value === modelValue,\n 'rp-select__option--focused': index === focusedIndex,\n 'rp-select__option--disabled': option.disabled,\n },\n ]\"\n @click=\"selectOption(option)\"\n @mouseenter=\"onOptionMouseenter(option, index)\"\n >\n {{ option.label }}\n </div>\n </div>\n </Transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport ChevronsUpDownIcon from '~icons/lucide/chevrons-up-down';\nimport XIcon from '~icons/lucide/x';\nimport { useSelect } from './useSelect';\nimport type { SelectProps } from './types';\n\ndefineOptions({ name: 'RpSelect' });\n\nconst props = withDefaults(defineProps<SelectProps>(), {\n options: () => [],\n placeholder: 'Select...',\n clearable: false,\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n}>();\n\nconst {\n selectRef,\n triggerRef,\n isOpen,\n selectId,\n listboxId,\n control,\n visibleOptions,\n focusedIndex,\n activeDescendantId,\n rootClass,\n hasValue,\n displayLabel,\n canClear,\n toggle,\n selectOption,\n clearSelection,\n onOptionMouseenter,\n onTriggerKeydown,\n} = useSelect(props, (value) => {\n emit('update:modelValue', value);\n});\n\nvoid selectRef;\nvoid triggerRef;\n</script>\n\n<style src=\"./select.scss\" lang=\"scss\" scoped></style>\n","<template>\n <div :class=\"rootClass\" ref=\"selectRef\">\n <input\n v-if=\"name\"\n type=\"hidden\"\n :name=\"name\"\n :value=\"modelValue ?? ''\"\n :disabled=\"control.disabled || undefined\"\n />\n <div\n :id=\"control.id\"\n ref=\"triggerRef\"\n class=\"rp-select__trigger\"\n role=\"combobox\"\n :aria-expanded=\"isOpen\"\n aria-haspopup=\"listbox\"\n :aria-activedescendant=\"activeDescendantId\"\n :aria-controls=\"listboxId\"\n :aria-disabled=\"control.disabled || undefined\"\n :aria-invalid=\"control.invalid || undefined\"\n :aria-required=\"control.required || undefined\"\n :aria-label=\"ariaLabel || undefined\"\n :aria-labelledby=\"control.ariaLabelledby\"\n :aria-describedby=\"control.ariaDescribedby\"\n :data-state=\"isOpen ? 'open' : 'closed'\"\n :data-disabled=\"control.disabled || undefined\"\n :tabindex=\"control.disabled ? -1 : 0\"\n @click=\"toggle\"\n @keydown=\"onTriggerKeydown\"\n >\n <span class=\"rp-select__value\" :class=\"{ 'rp-select__placeholder': !hasValue }\">\n {{ displayLabel || placeholder }}\n </span>\n\n <span class=\"rp-select__indicator\">\n <button\n v-if=\"canClear\"\n type=\"button\"\n class=\"rp-select__clear\"\n aria-label=\"Clear selection\"\n tabindex=\"-1\"\n @mousedown.prevent\n @click.stop=\"clearSelection\"\n >\n <XIcon />\n </button>\n <span class=\"rp-select__arrow\" aria-hidden=\"true\">\n <ChevronsUpDownIcon />\n </span>\n </span>\n </div>\n\n <Transition name=\"rp-select-dropdown\">\n <div v-if=\"isOpen\" class=\"rp-select__dropdown\" role=\"listbox\" :id=\"listboxId\">\n <div v-if=\"visibleOptions.length === 0\" class=\"rp-select__empty\">\n <slot name=\"empty\">No options</slot>\n </div>\n <div\n v-for=\"(option, index) in visibleOptions\"\n :key=\"option.value\"\n role=\"option\"\n :id=\"`${selectId}-option-${index}`\"\n :aria-selected=\"option.value === modelValue\"\n :aria-disabled=\"option.disabled || undefined\"\n :data-selected=\"option.value === modelValue || undefined\"\n :data-disabled=\"option.disabled || undefined\"\n :class=\"[\n 'rp-select__option',\n {\n 'rp-select__option--selected': option.value === modelValue,\n 'rp-select__option--focused': index === focusedIndex,\n 'rp-select__option--disabled': option.disabled,\n },\n ]\"\n @click=\"selectOption(option)\"\n @mouseenter=\"onOptionMouseenter(option, index)\"\n >\n {{ option.label }}\n </div>\n </div>\n </Transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup vapor>\nimport ChevronsUpDownIcon from '~icons/lucide/chevrons-up-down';\nimport XIcon from '~icons/lucide/x';\nimport { useSelect } from './useSelect';\nimport type { SelectProps } from './types';\n\ndefineOptions({ name: 'RpSelect' });\n\nconst props = withDefaults(defineProps<SelectProps>(), {\n options: () => [],\n placeholder: 'Select...',\n clearable: false,\n disabled: undefined,\n required: undefined,\n invalid: undefined,\n});\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null];\n}>();\n\nconst {\n selectRef,\n triggerRef,\n isOpen,\n selectId,\n listboxId,\n control,\n visibleOptions,\n focusedIndex,\n activeDescendantId,\n rootClass,\n hasValue,\n displayLabel,\n canClear,\n toggle,\n selectOption,\n clearSelection,\n onOptionMouseenter,\n onTriggerKeydown,\n} = useSelect(props, (value) => {\n emit('update:modelValue', value);\n});\n\nvoid selectRef;\nvoid triggerRef;\n</script>\n\n<style src=\"./select.scss\" lang=\"scss\" scoped></style>\n"],"mappings":"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"}
@@ -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":"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"}
@@ -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":"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"}
@@ -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"}